koffi 0.9.4 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (823) hide show
  1. package/LICENSE.txt +661 -0
  2. package/README.md +50 -8
  3. package/package.json +24 -6
  4. package/src/call.hh +2 -1
  5. package/src/call_arm32.cc +498 -0
  6. package/src/call_arm32_fwd.S +108 -0
  7. package/src/call_arm64.cc +57 -57
  8. package/src/call_arm64_fwd.S +24 -29
  9. package/src/call_x64_sysv.cc +29 -43
  10. package/src/call_x64_win.cc +37 -40
  11. package/src/call_x86.cc +46 -59
  12. package/src/ffi.cc +29 -27
  13. package/src/ffi.hh +19 -12
  14. package/src/util.cc +58 -24
  15. package/src/util.hh +103 -19
  16. package/test/qemu/.gitkeep +0 -0
  17. package/test/registry/machines.json +112 -0
  18. package/test/registry/sha256sum.txt +21 -0
  19. package/test/test.js +493 -0
  20. package/vendor/dragonbox/CMakeLists.txt +122 -122
  21. package/vendor/dragonbox/LICENSE-Apache2-LLVM +218 -218
  22. package/vendor/dragonbox/LICENSE-Boost +23 -23
  23. package/vendor/dragonbox/README.md +277 -277
  24. package/vendor/dragonbox/cmake/dragonboxConfig.cmake +1 -1
  25. package/vendor/dragonbox/include/dragonbox/dragonbox.h +6 -2
  26. package/vendor/dragonbox/include/dragonbox/dragonbox_to_chars.h +108 -108
  27. package/vendor/dragonbox/other_files/Dragonbox.pdf +0 -0
  28. package/vendor/dragonbox/other_files/unknown_win64_vc2019.html +539 -539
  29. package/vendor/dragonbox/source/dragonbox_to_chars.cpp +303 -303
  30. package/vendor/dragonbox/subproject/3rdparty/grisu_exact/CMakeLists.txt +23 -23
  31. package/vendor/dragonbox/subproject/3rdparty/grisu_exact/fp_to_chars.cpp +238 -238
  32. package/vendor/dragonbox/subproject/3rdparty/grisu_exact/fp_to_chars.h +95 -95
  33. package/vendor/dragonbox/subproject/3rdparty/grisu_exact/grisu_exact.h +2666 -2666
  34. package/vendor/dragonbox/subproject/3rdparty/ryu/CMakeLists.txt +16 -16
  35. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/common.h +114 -114
  36. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/d2s.c +509 -509
  37. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/d2s_full_table.h +367 -367
  38. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/d2s_intrinsics.h +357 -357
  39. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/digit_table.h +35 -35
  40. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/f2s.c +345 -345
  41. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/f2s_full_table.h +55 -55
  42. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/f2s_intrinsics.h +128 -128
  43. package/vendor/dragonbox/subproject/3rdparty/ryu/ryu/ryu.h +46 -46
  44. package/vendor/dragonbox/subproject/3rdparty/schubfach/CMakeLists.txt +21 -21
  45. package/vendor/dragonbox/subproject/3rdparty/schubfach/schubfach_32.cc +699 -699
  46. package/vendor/dragonbox/subproject/3rdparty/schubfach/schubfach_32.h +31 -31
  47. package/vendor/dragonbox/subproject/3rdparty/schubfach/schubfach_64.cc +1354 -1354
  48. package/vendor/dragonbox/subproject/3rdparty/schubfach/schubfach_64.h +31 -31
  49. package/vendor/dragonbox/subproject/3rdparty/shaded_plots/example_shaded_plots.m +68 -68
  50. package/vendor/dragonbox/subproject/3rdparty/shaded_plots/license.txt +25 -25
  51. package/vendor/dragonbox/subproject/3rdparty/shaded_plots/plot_distribution.m +92 -92
  52. package/vendor/dragonbox/subproject/3rdparty/shaded_plots/plot_distribution_prctile.m +121 -121
  53. package/vendor/dragonbox/subproject/3rdparty/shaded_plots/plot_histogram_shaded.m +99 -99
  54. package/vendor/dragonbox/subproject/3rdparty/shaded_plots/plot_shaded.m +93 -93
  55. package/vendor/dragonbox/subproject/benchmark/CMakeLists.txt +64 -64
  56. package/vendor/dragonbox/subproject/benchmark/include/benchmark.h +40 -40
  57. package/vendor/dragonbox/subproject/benchmark/matlab/plot_benchmarks.m +21 -21
  58. package/vendor/dragonbox/subproject/benchmark/matlab/plot_digit_benchmark.m +78 -78
  59. package/vendor/dragonbox/subproject/benchmark/matlab/plot_uniform_benchmark.m +95 -95
  60. package/vendor/dragonbox/subproject/benchmark/source/benchmark.cpp +237 -237
  61. package/vendor/dragonbox/subproject/benchmark/source/dragonbox.cpp +30 -30
  62. package/vendor/dragonbox/subproject/benchmark/source/grisu_exact.cpp +36 -36
  63. package/vendor/dragonbox/subproject/benchmark/source/ryu.cpp +27 -27
  64. package/vendor/dragonbox/subproject/benchmark/source/schubfach.cpp +31 -31
  65. package/vendor/dragonbox/subproject/common/CMakeLists.txt +41 -41
  66. package/vendor/dragonbox/subproject/common/include/best_rational_approx.h +96 -96
  67. package/vendor/dragonbox/subproject/common/include/big_uint.h +217 -217
  68. package/vendor/dragonbox/subproject/common/include/continued_fractions.h +173 -173
  69. package/vendor/dragonbox/subproject/common/include/good_rational_approx.h +266 -266
  70. package/vendor/dragonbox/subproject/common/include/random_float.h +182 -182
  71. package/vendor/dragonbox/subproject/common/include/rational_continued_fractions.h +56 -56
  72. package/vendor/dragonbox/subproject/common/source/big_uint.cpp +601 -601
  73. package/vendor/dragonbox/subproject/meta/CMakeLists.txt +40 -40
  74. package/vendor/dragonbox/subproject/meta/results/binary32_generated_cache.txt +81 -81
  75. package/vendor/dragonbox/subproject/meta/results/binary64_compressed_cache_error_table.txt +9 -9
  76. package/vendor/dragonbox/subproject/meta/results/binary64_generated_cache.txt +622 -622
  77. package/vendor/dragonbox/subproject/meta/source/generate_cache.cpp +126 -126
  78. package/vendor/dragonbox/subproject/meta/source/live_test.cpp +81 -81
  79. package/vendor/dragonbox/subproject/meta/source/perf_test.cpp +104 -104
  80. package/vendor/dragonbox/subproject/meta/source/sandbox.cpp +20 -20
  81. package/vendor/dragonbox/subproject/test/CMakeLists.txt +69 -69
  82. package/vendor/dragonbox/subproject/test/results/plot_required_bits.m +17 -17
  83. package/vendor/dragonbox/subproject/test/source/test_all_shorter_interval_cases.cpp +88 -88
  84. package/vendor/dragonbox/subproject/test/source/uniform_random_test.cpp +95 -95
  85. package/vendor/dragonbox/subproject/test/source/verify_cache_precision.cpp +337 -337
  86. package/vendor/dragonbox/subproject/test/source/verify_compressed_cache.cpp +154 -154
  87. package/vendor/dragonbox/subproject/test/source/verify_fast_multiplication.cpp +168 -168
  88. package/vendor/dragonbox/subproject/test/source/verify_log_computation.cpp +251 -251
  89. package/vendor/dragonbox/subproject/test/source/verify_magic_division.cpp +113 -113
  90. package/vendor/libcc/libcc.cc +36 -18
  91. package/vendor/libcc/libcc.hh +23 -1
  92. package/vendor/raylib/BINDINGS.md +123 -0
  93. package/vendor/raylib/CHANGELOG +1495 -0
  94. package/vendor/raylib/CMakeLists.txt +33 -0
  95. package/vendor/raylib/CMakeOptions.txt +87 -0
  96. package/vendor/raylib/CONTRIBUTING.md +76 -0
  97. package/vendor/raylib/CONTRIBUTORS.md +63 -0
  98. package/vendor/raylib/CONVENTIONS.md +95 -0
  99. package/vendor/raylib/HISTORY.md +364 -0
  100. package/vendor/raylib/LICENSE +16 -0
  101. package/vendor/raylib/README.md +141 -0
  102. package/vendor/raylib/ROADMAP.md +76 -0
  103. package/vendor/raylib/SPONSORS.md +68 -0
  104. package/vendor/raylib/cmake/AddIfFlagCompiles.cmake +12 -0
  105. package/vendor/raylib/cmake/BuildOptions.cmake +18 -0
  106. package/vendor/raylib/cmake/CompileDefinitions.cmake +110 -0
  107. package/vendor/raylib/cmake/CompilerFlags.cmake +79 -0
  108. package/vendor/raylib/cmake/EnumOption.cmake +9 -0
  109. package/vendor/raylib/cmake/GlfwImport.cmake +34 -0
  110. package/vendor/raylib/cmake/InstallConfigurations.cmake +29 -0
  111. package/vendor/raylib/cmake/JoinPaths.cmake +26 -0
  112. package/vendor/raylib/cmake/LibraryConfigurations.cmake +108 -0
  113. package/vendor/raylib/cmake/LibraryPathToLinkerFlags.cmake +24 -0
  114. package/vendor/raylib/cmake/PackConfigurations.cmake +13 -0
  115. package/vendor/raylib/cmake/PopulateConfigVariablesLocally.cmake +11 -0
  116. package/vendor/raylib/cmake/raylib-config-version.cmake +21 -0
  117. package/vendor/raylib/cmake/raylib-config.cmake +76 -0
  118. package/vendor/raylib/examples/CMakeLists.txt +139 -0
  119. package/vendor/raylib/examples/Makefile +565 -0
  120. package/vendor/raylib/examples/Makefile.Android +405 -0
  121. package/vendor/raylib/examples/Makefile.Web +1053 -0
  122. package/vendor/raylib/examples/README.md +203 -0
  123. package/vendor/raylib/examples/audio/audio_module_playing.c +146 -0
  124. package/vendor/raylib/examples/audio/audio_module_playing.png +0 -0
  125. package/vendor/raylib/examples/audio/audio_multichannel_sound.c +73 -0
  126. package/vendor/raylib/examples/audio/audio_multichannel_sound.png +0 -0
  127. package/vendor/raylib/examples/audio/audio_music_stream.c +93 -0
  128. package/vendor/raylib/examples/audio/audio_music_stream.png +0 -0
  129. package/vendor/raylib/examples/audio/audio_raw_stream.c +167 -0
  130. package/vendor/raylib/examples/audio/audio_raw_stream.png +0 -0
  131. package/vendor/raylib/examples/audio/audio_sound_loading.c +64 -0
  132. package/vendor/raylib/examples/audio/audio_sound_loading.png +0 -0
  133. package/vendor/raylib/examples/audio/resources/LICENSE.md +10 -0
  134. package/vendor/raylib/examples/audio/resources/coin.wav +0 -0
  135. package/vendor/raylib/examples/audio/resources/country.mp3 +0 -0
  136. package/vendor/raylib/examples/audio/resources/mini1111.xm +0 -0
  137. package/vendor/raylib/examples/audio/resources/sound.wav +0 -0
  138. package/vendor/raylib/examples/audio/resources/spring.wav +0 -0
  139. package/vendor/raylib/examples/audio/resources/target.flac +0 -0
  140. package/vendor/raylib/examples/audio/resources/target.ogg +0 -0
  141. package/vendor/raylib/examples/audio/resources/weird.wav +0 -0
  142. package/vendor/raylib/examples/build.zig +86 -0
  143. package/vendor/raylib/examples/core/core_2d_camera.c +132 -0
  144. package/vendor/raylib/examples/core/core_2d_camera.png +0 -0
  145. package/vendor/raylib/examples/core/core_2d_camera_platformer.c +293 -0
  146. package/vendor/raylib/examples/core/core_2d_camera_platformer.png +0 -0
  147. package/vendor/raylib/examples/core/core_2d_camera_smooth_pixelperfect.png +0 -0
  148. package/vendor/raylib/examples/core/core_3d_camera_first_person.c +97 -0
  149. package/vendor/raylib/examples/core/core_3d_camera_first_person.png +0 -0
  150. package/vendor/raylib/examples/core/core_3d_camera_free.c +83 -0
  151. package/vendor/raylib/examples/core/core_3d_camera_free.png +0 -0
  152. package/vendor/raylib/examples/core/core_3d_camera_mode.c +73 -0
  153. package/vendor/raylib/examples/core/core_3d_camera_mode.png +0 -0
  154. package/vendor/raylib/examples/core/core_3d_picking.c +107 -0
  155. package/vendor/raylib/examples/core/core_3d_picking.png +0 -0
  156. package/vendor/raylib/examples/core/core_basic_screen_manager.c +150 -0
  157. package/vendor/raylib/examples/core/core_basic_screen_manager.png +0 -0
  158. package/vendor/raylib/examples/core/core_basic_window.c +62 -0
  159. package/vendor/raylib/examples/core/core_basic_window.png +0 -0
  160. package/vendor/raylib/examples/core/core_basic_window_web.c +85 -0
  161. package/vendor/raylib/examples/core/core_custom_frame_control.c +125 -0
  162. package/vendor/raylib/examples/core/core_custom_frame_control.png +0 -0
  163. package/vendor/raylib/examples/core/core_custom_logging.c +84 -0
  164. package/vendor/raylib/examples/core/core_custom_logging.png +0 -0
  165. package/vendor/raylib/examples/core/core_drop_files.c +76 -0
  166. package/vendor/raylib/examples/core/core_drop_files.png +0 -0
  167. package/vendor/raylib/examples/core/core_input_gamepad.c +195 -0
  168. package/vendor/raylib/examples/core/core_input_gamepad.png +0 -0
  169. package/vendor/raylib/examples/core/core_input_gestures.c +115 -0
  170. package/vendor/raylib/examples/core/core_input_gestures.png +0 -0
  171. package/vendor/raylib/examples/core/core_input_keys.c +59 -0
  172. package/vendor/raylib/examples/core/core_input_keys.png +0 -0
  173. package/vendor/raylib/examples/core/core_input_mouse.c +65 -0
  174. package/vendor/raylib/examples/core/core_input_mouse.png +0 -0
  175. package/vendor/raylib/examples/core/core_input_mouse_wheel.c +58 -0
  176. package/vendor/raylib/examples/core/core_input_mouse_wheel.png +0 -0
  177. package/vendor/raylib/examples/core/core_input_multitouch.c +70 -0
  178. package/vendor/raylib/examples/core/core_input_multitouch.png +0 -0
  179. package/vendor/raylib/examples/core/core_loading_thread.c +147 -0
  180. package/vendor/raylib/examples/core/core_loading_thread.png +0 -0
  181. package/vendor/raylib/examples/core/core_quat_conversion.c +132 -0
  182. package/vendor/raylib/examples/core/core_quat_conversion.png +0 -0
  183. package/vendor/raylib/examples/core/core_random_values.c +67 -0
  184. package/vendor/raylib/examples/core/core_random_values.png +0 -0
  185. package/vendor/raylib/examples/core/core_scissor_test.c +71 -0
  186. package/vendor/raylib/examples/core/core_scissor_test.png +0 -0
  187. package/vendor/raylib/examples/core/core_smooth_pixelperfect.c +117 -0
  188. package/vendor/raylib/examples/core/core_smooth_pixelperfect.png +0 -0
  189. package/vendor/raylib/examples/core/core_split_screen.c +155 -0
  190. package/vendor/raylib/examples/core/core_split_screen.png +0 -0
  191. package/vendor/raylib/examples/core/core_storage_values.c +87 -0
  192. package/vendor/raylib/examples/core/core_storage_values.png +0 -0
  193. package/vendor/raylib/examples/core/core_vr_simulator.c +143 -0
  194. package/vendor/raylib/examples/core/core_vr_simulator.png +0 -0
  195. package/vendor/raylib/examples/core/core_window_flags.c +191 -0
  196. package/vendor/raylib/examples/core/core_window_flags.png +0 -0
  197. package/vendor/raylib/examples/core/core_window_letterbox.c +112 -0
  198. package/vendor/raylib/examples/core/core_window_letterbox.png +0 -0
  199. package/vendor/raylib/examples/core/core_world_screen.c +78 -0
  200. package/vendor/raylib/examples/core/core_world_screen.png +0 -0
  201. package/vendor/raylib/examples/core/resources/LICENSE.md +4 -0
  202. package/vendor/raylib/examples/core/resources/distortion100.fs +52 -0
  203. package/vendor/raylib/examples/core/resources/distortion330.fs +53 -0
  204. package/vendor/raylib/examples/core/resources/ps3.png +0 -0
  205. package/vendor/raylib/examples/core/resources/xbox.png +0 -0
  206. package/vendor/raylib/examples/examples_template.c +100 -0
  207. package/vendor/raylib/examples/models/models_animation.c +114 -0
  208. package/vendor/raylib/examples/models/models_animation.png +0 -0
  209. package/vendor/raylib/examples/models/models_billboard.c +75 -0
  210. package/vendor/raylib/examples/models/models_billboard.png +0 -0
  211. package/vendor/raylib/examples/models/models_box_collisions.c +121 -0
  212. package/vendor/raylib/examples/models/models_box_collisions.png +0 -0
  213. package/vendor/raylib/examples/models/models_cubicmap.c +87 -0
  214. package/vendor/raylib/examples/models/models_cubicmap.png +0 -0
  215. package/vendor/raylib/examples/models/models_first_person_maze.c +122 -0
  216. package/vendor/raylib/examples/models/models_first_person_maze.png +0 -0
  217. package/vendor/raylib/examples/models/models_geometric_shapes.c +80 -0
  218. package/vendor/raylib/examples/models/models_geometric_shapes.png +0 -0
  219. package/vendor/raylib/examples/models/models_heightmap.c +82 -0
  220. package/vendor/raylib/examples/models/models_heightmap.png +0 -0
  221. package/vendor/raylib/examples/models/models_loading.c +146 -0
  222. package/vendor/raylib/examples/models/models_loading.png +0 -0
  223. package/vendor/raylib/examples/models/models_loading_gltf.c +105 -0
  224. package/vendor/raylib/examples/models/models_loading_gltf.png +0 -0
  225. package/vendor/raylib/examples/models/models_loading_vox.c +130 -0
  226. package/vendor/raylib/examples/models/models_loading_vox.png +0 -0
  227. package/vendor/raylib/examples/models/models_mesh_generation.c +179 -0
  228. package/vendor/raylib/examples/models/models_mesh_generation.png +0 -0
  229. package/vendor/raylib/examples/models/models_mesh_picking.c +223 -0
  230. package/vendor/raylib/examples/models/models_mesh_picking.png +0 -0
  231. package/vendor/raylib/examples/models/models_orthographic_projection.c +99 -0
  232. package/vendor/raylib/examples/models/models_orthographic_projection.png +0 -0
  233. package/vendor/raylib/examples/models/models_rlgl_solar_system.c +172 -0
  234. package/vendor/raylib/examples/models/models_rlgl_solar_system.png +0 -0
  235. package/vendor/raylib/examples/models/models_skybox.c +262 -0
  236. package/vendor/raylib/examples/models/models_skybox.png +0 -0
  237. package/vendor/raylib/examples/models/models_waving_cubes.c +112 -0
  238. package/vendor/raylib/examples/models/models_waving_cubes.png +0 -0
  239. package/vendor/raylib/examples/models/models_yaw_pitch_roll.c +117 -0
  240. package/vendor/raylib/examples/models/models_yaw_pitch_roll.png +0 -0
  241. package/vendor/raylib/examples/models/resources/LICENSE.md +23 -0
  242. package/vendor/raylib/examples/models/resources/billboard.png +0 -0
  243. package/vendor/raylib/examples/models/resources/cubicmap.png +0 -0
  244. package/vendor/raylib/examples/models/resources/cubicmap_atlas.png +0 -0
  245. package/vendor/raylib/examples/models/resources/dresden_square_1k.hdr +0 -0
  246. package/vendor/raylib/examples/models/resources/dresden_square_2k.hdr +0 -0
  247. package/vendor/raylib/examples/models/resources/heightmap.png +0 -0
  248. package/vendor/raylib/examples/models/resources/models/gltf/AnimatedMorphCube.glb +0 -0
  249. package/vendor/raylib/examples/models/resources/models/gltf/AnimatedTriangle.gltf +118 -0
  250. package/vendor/raylib/examples/models/resources/models/gltf/BoxAnimated.glb +0 -0
  251. package/vendor/raylib/examples/models/resources/models/gltf/LICENSE +23 -0
  252. package/vendor/raylib/examples/models/resources/models/gltf/girl.glb +0 -0
  253. package/vendor/raylib/examples/models/resources/models/gltf/raylib_32x32.glb +0 -0
  254. package/vendor/raylib/examples/models/resources/models/gltf/rigged_figure.glb +0 -0
  255. package/vendor/raylib/examples/models/resources/models/gltf/vertex_colored_object.glb +0 -0
  256. package/vendor/raylib/examples/models/resources/models/iqm/guy.blend +0 -0
  257. package/vendor/raylib/examples/models/resources/models/iqm/guy.iqm +0 -0
  258. package/vendor/raylib/examples/models/resources/models/iqm/guyanim.iqm +0 -0
  259. package/vendor/raylib/examples/models/resources/models/iqm/guytex.png +0 -0
  260. package/vendor/raylib/examples/models/resources/models/iqm/vertex_colored_object.iqm +0 -0
  261. package/vendor/raylib/examples/models/resources/models/obj/bridge.obj +1725 -0
  262. package/vendor/raylib/examples/models/resources/models/obj/bridge_diffuse.png +0 -0
  263. package/vendor/raylib/examples/models/resources/models/obj/castle.obj +12919 -0
  264. package/vendor/raylib/examples/models/resources/models/obj/castle_diffuse.png +0 -0
  265. package/vendor/raylib/examples/models/resources/models/obj/cube.obj +68 -0
  266. package/vendor/raylib/examples/models/resources/models/obj/cube_diffuse.png +0 -0
  267. package/vendor/raylib/examples/models/resources/models/obj/house.obj +4564 -0
  268. package/vendor/raylib/examples/models/resources/models/obj/house_diffuse.png +0 -0
  269. package/vendor/raylib/examples/models/resources/models/obj/market.obj +7301 -0
  270. package/vendor/raylib/examples/models/resources/models/obj/market_diffuse.png +0 -0
  271. package/vendor/raylib/examples/models/resources/models/obj/plane.obj +10858 -0
  272. package/vendor/raylib/examples/models/resources/models/obj/plane_diffuse.png +0 -0
  273. package/vendor/raylib/examples/models/resources/models/obj/turret.obj +1888 -0
  274. package/vendor/raylib/examples/models/resources/models/obj/turret_diffuse.png +0 -0
  275. package/vendor/raylib/examples/models/resources/models/obj/well.obj +1030 -0
  276. package/vendor/raylib/examples/models/resources/models/obj/well_diffuse.png +0 -0
  277. package/vendor/raylib/examples/models/resources/models/vox/LICENSE +9 -0
  278. package/vendor/raylib/examples/models/resources/models/vox/chr_knight.vox +0 -0
  279. package/vendor/raylib/examples/models/resources/models/vox/chr_sword.vox +0 -0
  280. package/vendor/raylib/examples/models/resources/models/vox/monu9.vox +0 -0
  281. package/vendor/raylib/examples/models/resources/shaders/glsl100/cubemap.fs +29 -0
  282. package/vendor/raylib/examples/models/resources/shaders/glsl100/cubemap.vs +20 -0
  283. package/vendor/raylib/examples/models/resources/shaders/glsl100/skybox.fs +31 -0
  284. package/vendor/raylib/examples/models/resources/shaders/glsl100/skybox.vs +24 -0
  285. package/vendor/raylib/examples/models/resources/shaders/glsl330/cubemap.fs +30 -0
  286. package/vendor/raylib/examples/models/resources/shaders/glsl330/cubemap.vs +20 -0
  287. package/vendor/raylib/examples/models/resources/shaders/glsl330/skybox.fs +30 -0
  288. package/vendor/raylib/examples/models/resources/shaders/glsl330/skybox.vs +24 -0
  289. package/vendor/raylib/examples/models/resources/skybox.png +0 -0
  290. package/vendor/raylib/examples/models/rlights.h +183 -0
  291. package/vendor/raylib/examples/others/easings.h +263 -0
  292. package/vendor/raylib/examples/others/easings_testbed.c +227 -0
  293. package/vendor/raylib/examples/others/embedded_files_loading.c +103 -0
  294. package/vendor/raylib/examples/others/external/include/GLFW/glfw3.h +5538 -0
  295. package/vendor/raylib/examples/others/external/include/GLFW/glfw3native.h +572 -0
  296. package/vendor/raylib/examples/others/external/include/glad.h +5466 -0
  297. package/vendor/raylib/examples/others/external/lib/libglfw3.a +0 -0
  298. package/vendor/raylib/examples/others/raudio_standalone.c +152 -0
  299. package/vendor/raylib/examples/others/raylib_opengl_interop.c +152 -0
  300. package/vendor/raylib/examples/others/raylib_opengl_interop.png +0 -0
  301. package/vendor/raylib/examples/others/resources/audio/country.mp3 +0 -0
  302. package/vendor/raylib/examples/others/resources/audio/target.ogg +0 -0
  303. package/vendor/raylib/examples/others/resources/audio/weird.wav +0 -0
  304. package/vendor/raylib/examples/others/resources/audio_data.h +4893 -0
  305. package/vendor/raylib/examples/others/resources/image_data.h +9848 -0
  306. package/vendor/raylib/examples/others/resources/shaders/glsl100/point_particle.fs +16 -0
  307. package/vendor/raylib/examples/others/resources/shaders/glsl100/point_particle.vs +24 -0
  308. package/vendor/raylib/examples/others/resources/shaders/glsl330/point_particle.fs +17 -0
  309. package/vendor/raylib/examples/others/resources/shaders/glsl330/point_particle.vs +24 -0
  310. package/vendor/raylib/examples/others/resources/shaders/glsl430/gol.glsl +41 -0
  311. package/vendor/raylib/examples/others/resources/shaders/glsl430/gol_render.glsl +29 -0
  312. package/vendor/raylib/examples/others/resources/shaders/glsl430/gol_transfert.glsl +51 -0
  313. package/vendor/raylib/examples/others/rlgl_compute_shader.c +173 -0
  314. package/vendor/raylib/examples/others/rlgl_standalone.c +469 -0
  315. package/vendor/raylib/examples/physics/physics_demo.c +128 -0
  316. package/vendor/raylib/examples/physics/physics_demo.png +0 -0
  317. package/vendor/raylib/examples/physics/physics_friction.c +142 -0
  318. package/vendor/raylib/examples/physics/physics_friction.png +0 -0
  319. package/vendor/raylib/examples/physics/physics_movement.c +128 -0
  320. package/vendor/raylib/examples/physics/physics_movement.png +0 -0
  321. package/vendor/raylib/examples/physics/physics_restitution.c +129 -0
  322. package/vendor/raylib/examples/physics/physics_restitution.png +0 -0
  323. package/vendor/raylib/examples/physics/physics_shatter.c +111 -0
  324. package/vendor/raylib/examples/physics/physics_shatter.png +0 -0
  325. package/vendor/raylib/examples/raylib_compile_execute.bat +32 -0
  326. package/vendor/raylib/examples/raylib_makefile_example.bat +27 -0
  327. package/vendor/raylib/examples/shaders/resources/LICENSE.md +11 -0
  328. package/vendor/raylib/examples/shaders/resources/fudesumi.png +0 -0
  329. package/vendor/raylib/examples/shaders/resources/mask.png +0 -0
  330. package/vendor/raylib/examples/shaders/resources/models/barracks.obj +22251 -0
  331. package/vendor/raylib/examples/shaders/resources/models/barracks_diffuse.png +0 -0
  332. package/vendor/raylib/examples/shaders/resources/models/church.obj +5116 -0
  333. package/vendor/raylib/examples/shaders/resources/models/church_diffuse.png +0 -0
  334. package/vendor/raylib/examples/shaders/resources/models/watermill.obj +5316 -0
  335. package/vendor/raylib/examples/shaders/resources/models/watermill_diffuse.png +0 -0
  336. package/vendor/raylib/examples/shaders/resources/plasma.png +0 -0
  337. package/vendor/raylib/examples/shaders/resources/raysan.png +0 -0
  338. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base.fs +23 -0
  339. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base.vs +26 -0
  340. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base_lighting.vs +59 -0
  341. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/base_lighting_instanced.vs +36 -0
  342. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/bloom.fs +39 -0
  343. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/blur.fs +34 -0
  344. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/color_mix.fs +26 -0
  345. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/cross_hatching.fs +47 -0
  346. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/cross_stitching.fs +57 -0
  347. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/cubes_panning.fs +60 -0
  348. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/depth.fs +26 -0
  349. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/distortion.fs +54 -0
  350. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/dream_vision.fs +37 -0
  351. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/eratosthenes.fs +60 -0
  352. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/fisheye.fs +43 -0
  353. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/fog.fs +94 -0
  354. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/grayscale.fs +25 -0
  355. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/julia_set.fs +83 -0
  356. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/lighting.fs +81 -0
  357. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/mask.fs +24 -0
  358. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/outline.fs +34 -0
  359. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/palette_switch.fs +41 -0
  360. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/pixelizer.fs +32 -0
  361. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/posterization.fs +29 -0
  362. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/predator.fs +31 -0
  363. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/raymarching.fs +431 -0
  364. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/reload.fs +39 -0
  365. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/scanlines.fs +44 -0
  366. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/sobel.fs +40 -0
  367. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/spotlight.fs +77 -0
  368. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/swirl.fs +46 -0
  369. package/vendor/raylib/examples/shaders/resources/shaders/glsl100/wave.fs +36 -0
  370. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/base.fs +22 -0
  371. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/base.vs +26 -0
  372. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/base_lighting.vs +59 -0
  373. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/bloom.fs +37 -0
  374. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/blur.fs +32 -0
  375. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/cross_hatching.fs +45 -0
  376. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/cross_stitching.fs +55 -0
  377. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/distortion.fs +52 -0
  378. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/dream_vision.fs +35 -0
  379. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/fisheye.fs +41 -0
  380. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/fog.fs +92 -0
  381. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/grayscale.fs +23 -0
  382. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/palette_switch.fs +27 -0
  383. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/pixelizer.fs +30 -0
  384. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/posterization.fs +27 -0
  385. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/predator.fs +29 -0
  386. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/scanlines.fs +42 -0
  387. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/sobel.fs +38 -0
  388. package/vendor/raylib/examples/shaders/resources/shaders/glsl120/swirl.fs +44 -0
  389. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base.fs +25 -0
  390. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base.vs +26 -0
  391. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base_lighting.vs +32 -0
  392. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/base_lighting_instanced.vs +36 -0
  393. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/bloom.fs +40 -0
  394. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/blur.fs +35 -0
  395. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/color_mix.fs +27 -0
  396. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/cross_hatching.fs +48 -0
  397. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/cross_stitching.fs +59 -0
  398. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/cubes_panning.fs +61 -0
  399. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/depth.fs +27 -0
  400. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/distortion.fs +56 -0
  401. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/dream_vision.fs +34 -0
  402. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/eratosthenes.fs +59 -0
  403. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/fisheye.fs +40 -0
  404. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/fog.fs +95 -0
  405. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/grayscale.fs +26 -0
  406. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/julia_set.fs +81 -0
  407. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/lighting.fs +82 -0
  408. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/mask.fs +22 -0
  409. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/outline.fs +35 -0
  410. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/overdraw.fs +26 -0
  411. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/palette_switch.fs +30 -0
  412. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/pixelizer.fs +33 -0
  413. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/posterization.fs +31 -0
  414. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/predator.fs +32 -0
  415. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/raymarching.fs +430 -0
  416. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/reload.fs +40 -0
  417. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/scanlines.fs +49 -0
  418. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/sobel.fs +41 -0
  419. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/spotlight.fs +65 -0
  420. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/swirl.fs +47 -0
  421. package/vendor/raylib/examples/shaders/resources/shaders/glsl330/wave.fs +37 -0
  422. package/vendor/raylib/examples/shaders/resources/space.png +0 -0
  423. package/vendor/raylib/examples/shaders/resources/texel_checker.png +0 -0
  424. package/vendor/raylib/examples/shaders/rlights.h +183 -0
  425. package/vendor/raylib/examples/shaders/shaders_basic_lighting.c +152 -0
  426. package/vendor/raylib/examples/shaders/shaders_basic_lighting.png +0 -0
  427. package/vendor/raylib/examples/shaders/shaders_custom_uniform.c +127 -0
  428. package/vendor/raylib/examples/shaders/shaders_custom_uniform.png +0 -0
  429. package/vendor/raylib/examples/shaders/shaders_eratosthenes.c +92 -0
  430. package/vendor/raylib/examples/shaders/shaders_eratosthenes.png +0 -0
  431. package/vendor/raylib/examples/shaders/shaders_fog.c +160 -0
  432. package/vendor/raylib/examples/shaders/shaders_fog.png +0 -0
  433. package/vendor/raylib/examples/shaders/shaders_hot_reloading.c +130 -0
  434. package/vendor/raylib/examples/shaders/shaders_hot_reloading.png +0 -0
  435. package/vendor/raylib/examples/shaders/shaders_julia_set.c +191 -0
  436. package/vendor/raylib/examples/shaders/shaders_julia_set.png +0 -0
  437. package/vendor/raylib/examples/shaders/shaders_mesh_instancing.c +224 -0
  438. package/vendor/raylib/examples/shaders/shaders_mesh_instancing.png +0 -0
  439. package/vendor/raylib/examples/shaders/shaders_model_shader.c +103 -0
  440. package/vendor/raylib/examples/shaders/shaders_model_shader.png +0 -0
  441. package/vendor/raylib/examples/shaders/shaders_multi_sample2d.c +105 -0
  442. package/vendor/raylib/examples/shaders/shaders_multi_sample2d.png +0 -0
  443. package/vendor/raylib/examples/shaders/shaders_palette_switch.c +147 -0
  444. package/vendor/raylib/examples/shaders/shaders_palette_switch.png +0 -0
  445. package/vendor/raylib/examples/shaders/shaders_postprocessing.c +170 -0
  446. package/vendor/raylib/examples/shaders/shaders_postprocessing.png +0 -0
  447. package/vendor/raylib/examples/shaders/shaders_raymarching.c +113 -0
  448. package/vendor/raylib/examples/shaders/shaders_raymarching.png +0 -0
  449. package/vendor/raylib/examples/shaders/shaders_shapes_textures.c +116 -0
  450. package/vendor/raylib/examples/shaders/shaders_shapes_textures.png +0 -0
  451. package/vendor/raylib/examples/shaders/shaders_simple_mask.c +144 -0
  452. package/vendor/raylib/examples/shaders/shaders_simple_mask.png +0 -0
  453. package/vendor/raylib/examples/shaders/shaders_spotlight.c +254 -0
  454. package/vendor/raylib/examples/shaders/shaders_spotlight.png +0 -0
  455. package/vendor/raylib/examples/shaders/shaders_texture_drawing.c +80 -0
  456. package/vendor/raylib/examples/shaders/shaders_texture_drawing.png +0 -0
  457. package/vendor/raylib/examples/shaders/shaders_texture_outline.c +97 -0
  458. package/vendor/raylib/examples/shaders/shaders_texture_outline.png +0 -0
  459. package/vendor/raylib/examples/shaders/shaders_texture_waves.c +110 -0
  460. package/vendor/raylib/examples/shaders/shaders_texture_waves.png +0 -0
  461. package/vendor/raylib/examples/shapes/shapes_basic_shapes.c +78 -0
  462. package/vendor/raylib/examples/shapes/shapes_basic_shapes.png +0 -0
  463. package/vendor/raylib/examples/shapes/shapes_bouncing_ball.c +76 -0
  464. package/vendor/raylib/examples/shapes/shapes_bouncing_ball.png +0 -0
  465. package/vendor/raylib/examples/shapes/shapes_collision_area.c +108 -0
  466. package/vendor/raylib/examples/shapes/shapes_collision_area.png +0 -0
  467. package/vendor/raylib/examples/shapes/shapes_colors_palette.c +99 -0
  468. package/vendor/raylib/examples/shapes/shapes_colors_palette.png +0 -0
  469. package/vendor/raylib/examples/shapes/shapes_draw_circle_sector.c +83 -0
  470. package/vendor/raylib/examples/shapes/shapes_draw_circle_sector.png +0 -0
  471. package/vendor/raylib/examples/shapes/shapes_draw_rectangle_rounded.c +89 -0
  472. package/vendor/raylib/examples/shapes/shapes_draw_rectangle_rounded.png +0 -0
  473. package/vendor/raylib/examples/shapes/shapes_draw_ring.c +96 -0
  474. package/vendor/raylib/examples/shapes/shapes_draw_ring.png +0 -0
  475. package/vendor/raylib/examples/shapes/shapes_easings_ball_anim.c +110 -0
  476. package/vendor/raylib/examples/shapes/shapes_easings_ball_anim.png +0 -0
  477. package/vendor/raylib/examples/shapes/shapes_easings_box_anim.c +136 -0
  478. package/vendor/raylib/examples/shapes/shapes_easings_box_anim.png +0 -0
  479. package/vendor/raylib/examples/shapes/shapes_easings_rectangle_array.c +118 -0
  480. package/vendor/raylib/examples/shapes/shapes_easings_rectangle_array.png +0 -0
  481. package/vendor/raylib/examples/shapes/shapes_following_eyes.c +104 -0
  482. package/vendor/raylib/examples/shapes/shapes_following_eyes.png +0 -0
  483. package/vendor/raylib/examples/shapes/shapes_lines_bezier.c +59 -0
  484. package/vendor/raylib/examples/shapes/shapes_lines_bezier.png +0 -0
  485. package/vendor/raylib/examples/shapes/shapes_logo_raylib.c +56 -0
  486. package/vendor/raylib/examples/shapes/shapes_logo_raylib.png +0 -0
  487. package/vendor/raylib/examples/shapes/shapes_logo_raylib_anim.c +160 -0
  488. package/vendor/raylib/examples/shapes/shapes_logo_raylib_anim.png +0 -0
  489. package/vendor/raylib/examples/shapes/shapes_rectangle_scaling.c +94 -0
  490. package/vendor/raylib/examples/shapes/shapes_rectangle_scaling.png +0 -0
  491. package/vendor/raylib/examples/text/resources/KAISG.ttf +0 -0
  492. package/vendor/raylib/examples/text/resources/LICENSE.md +20 -0
  493. package/vendor/raylib/examples/text/resources/anonymous_pro_bold.ttf +0 -0
  494. package/vendor/raylib/examples/text/resources/custom_alagard.png +0 -0
  495. package/vendor/raylib/examples/text/resources/custom_jupiter_crash.png +0 -0
  496. package/vendor/raylib/examples/text/resources/custom_mecha.png +0 -0
  497. package/vendor/raylib/examples/text/resources/dejavu.fnt +1115 -0
  498. package/vendor/raylib/examples/text/resources/dejavu.png +0 -0
  499. package/vendor/raylib/examples/text/resources/fonts/alagard.png +0 -0
  500. package/vendor/raylib/examples/text/resources/fonts/alpha_beta.png +0 -0
  501. package/vendor/raylib/examples/text/resources/fonts/jupiter_crash.png +0 -0
  502. package/vendor/raylib/examples/text/resources/fonts/mecha.png +0 -0
  503. package/vendor/raylib/examples/text/resources/fonts/pixantiqua.png +0 -0
  504. package/vendor/raylib/examples/text/resources/fonts/pixelplay.png +0 -0
  505. package/vendor/raylib/examples/text/resources/fonts/romulus.png +0 -0
  506. package/vendor/raylib/examples/text/resources/fonts/setback.png +0 -0
  507. package/vendor/raylib/examples/text/resources/noto_cjk.fnt +580 -0
  508. package/vendor/raylib/examples/text/resources/noto_cjk.png +0 -0
  509. package/vendor/raylib/examples/text/resources/pixantiqua.fnt +188 -0
  510. package/vendor/raylib/examples/text/resources/pixantiqua.png +0 -0
  511. package/vendor/raylib/examples/text/resources/pixantiqua.ttf +0 -0
  512. package/vendor/raylib/examples/text/resources/shaders/glsl100/alpha_discard.fs +20 -0
  513. package/vendor/raylib/examples/text/resources/shaders/glsl100/sdf.fs +25 -0
  514. package/vendor/raylib/examples/text/resources/shaders/glsl330/alpha_discard.fs +19 -0
  515. package/vendor/raylib/examples/text/resources/shaders/glsl330/sdf.fs +26 -0
  516. package/vendor/raylib/examples/text/resources/symbola.fnt +191 -0
  517. package/vendor/raylib/examples/text/resources/symbola.png +0 -0
  518. package/vendor/raylib/examples/text/text_draw_3d.c +739 -0
  519. package/vendor/raylib/examples/text/text_draw_3d.png +0 -0
  520. package/vendor/raylib/examples/text/text_font_filters.c +134 -0
  521. package/vendor/raylib/examples/text/text_font_filters.png +0 -0
  522. package/vendor/raylib/examples/text/text_font_loading.c +91 -0
  523. package/vendor/raylib/examples/text/text_font_loading.png +0 -0
  524. package/vendor/raylib/examples/text/text_font_sdf.c +141 -0
  525. package/vendor/raylib/examples/text/text_font_sdf.png +0 -0
  526. package/vendor/raylib/examples/text/text_font_spritefont.c +85 -0
  527. package/vendor/raylib/examples/text/text_font_spritefont.png +0 -0
  528. package/vendor/raylib/examples/text/text_format_text.c +62 -0
  529. package/vendor/raylib/examples/text/text_format_text.png +0 -0
  530. package/vendor/raylib/examples/text/text_input_box.c +127 -0
  531. package/vendor/raylib/examples/text/text_input_box.png +0 -0
  532. package/vendor/raylib/examples/text/text_raylib_fonts.c +105 -0
  533. package/vendor/raylib/examples/text/text_raylib_fonts.png +0 -0
  534. package/vendor/raylib/examples/text/text_rectangle_bounds.c +264 -0
  535. package/vendor/raylib/examples/text/text_rectangle_bounds.png +0 -0
  536. package/vendor/raylib/examples/text/text_unicode.c +465 -0
  537. package/vendor/raylib/examples/text/text_unicode.png +0 -0
  538. package/vendor/raylib/examples/text/text_writing_anim.c +62 -0
  539. package/vendor/raylib/examples/text/text_writing_anim.png +0 -0
  540. package/vendor/raylib/examples/textures/resources/KAISG.ttf +0 -0
  541. package/vendor/raylib/examples/textures/resources/LICENSE.md +18 -0
  542. package/vendor/raylib/examples/textures/resources/boom.wav +0 -0
  543. package/vendor/raylib/examples/textures/resources/button.png +0 -0
  544. package/vendor/raylib/examples/textures/resources/buttonfx.wav +0 -0
  545. package/vendor/raylib/examples/textures/resources/cat.png +0 -0
  546. package/vendor/raylib/examples/textures/resources/custom_jupiter_crash.png +0 -0
  547. package/vendor/raylib/examples/textures/resources/cyberpunk_street_background.png +0 -0
  548. package/vendor/raylib/examples/textures/resources/cyberpunk_street_foreground.png +0 -0
  549. package/vendor/raylib/examples/textures/resources/cyberpunk_street_midground.png +0 -0
  550. package/vendor/raylib/examples/textures/resources/explosion.png +0 -0
  551. package/vendor/raylib/examples/textures/resources/fudesumi.png +0 -0
  552. package/vendor/raylib/examples/textures/resources/fudesumi.raw +0 -0
  553. package/vendor/raylib/examples/textures/resources/ninepatch_button.png +0 -0
  554. package/vendor/raylib/examples/textures/resources/parrots.png +0 -0
  555. package/vendor/raylib/examples/textures/resources/patterns.png +0 -0
  556. package/vendor/raylib/examples/textures/resources/raylib_logo.png +0 -0
  557. package/vendor/raylib/examples/textures/resources/scarfy.png +0 -0
  558. package/vendor/raylib/examples/textures/resources/spark_flame.png +0 -0
  559. package/vendor/raylib/examples/textures/resources/wabbit_alpha.png +0 -0
  560. package/vendor/raylib/examples/textures/textures_background_scrolling.c +87 -0
  561. package/vendor/raylib/examples/textures/textures_background_scrolling.png +0 -0
  562. package/vendor/raylib/examples/textures/textures_blend_modes.c +93 -0
  563. package/vendor/raylib/examples/textures/textures_blend_modes.png +0 -0
  564. package/vendor/raylib/examples/textures/textures_bunnymark.c +120 -0
  565. package/vendor/raylib/examples/textures/textures_bunnymark.png +0 -0
  566. package/vendor/raylib/examples/textures/textures_draw_tiled.c +165 -0
  567. package/vendor/raylib/examples/textures/textures_draw_tiled.png +0 -0
  568. package/vendor/raylib/examples/textures/textures_image_drawing.c +91 -0
  569. package/vendor/raylib/examples/textures/textures_image_drawing.png +0 -0
  570. package/vendor/raylib/examples/textures/textures_image_generation.c +102 -0
  571. package/vendor/raylib/examples/textures/textures_image_generation.png +0 -0
  572. package/vendor/raylib/examples/textures/textures_image_loading.c +64 -0
  573. package/vendor/raylib/examples/textures/textures_image_loading.png +0 -0
  574. package/vendor/raylib/examples/textures/textures_image_processing.c +169 -0
  575. package/vendor/raylib/examples/textures/textures_image_processing.png +0 -0
  576. package/vendor/raylib/examples/textures/textures_image_text.c +83 -0
  577. package/vendor/raylib/examples/textures/textures_image_text.png +0 -0
  578. package/vendor/raylib/examples/textures/textures_logo_raylib.c +57 -0
  579. package/vendor/raylib/examples/textures/textures_logo_raylib.png +0 -0
  580. package/vendor/raylib/examples/textures/textures_mouse_painting.c +221 -0
  581. package/vendor/raylib/examples/textures/textures_mouse_painting.png +0 -0
  582. package/vendor/raylib/examples/textures/textures_npatch_drawing.c +109 -0
  583. package/vendor/raylib/examples/textures/textures_npatch_drawing.png +0 -0
  584. package/vendor/raylib/examples/textures/textures_particles_blending.c +135 -0
  585. package/vendor/raylib/examples/textures/textures_particles_blending.png +0 -0
  586. package/vendor/raylib/examples/textures/textures_polygon.c +100 -0
  587. package/vendor/raylib/examples/textures/textures_polygon.png +0 -0
  588. package/vendor/raylib/examples/textures/textures_raw_data.c +99 -0
  589. package/vendor/raylib/examples/textures/textures_raw_data.png +0 -0
  590. package/vendor/raylib/examples/textures/textures_rectangle.c +99 -0
  591. package/vendor/raylib/examples/textures/textures_rectangle.png +0 -0
  592. package/vendor/raylib/examples/textures/textures_sprite_button.c +97 -0
  593. package/vendor/raylib/examples/textures/textures_sprite_button.png +0 -0
  594. package/vendor/raylib/examples/textures/textures_sprite_explosion.c +120 -0
  595. package/vendor/raylib/examples/textures/textures_sprite_explosion.png +0 -0
  596. package/vendor/raylib/examples/textures/textures_srcrec_dstrec.c +82 -0
  597. package/vendor/raylib/examples/textures/textures_srcrec_dstrec.png +0 -0
  598. package/vendor/raylib/examples/textures/textures_to_image.c +68 -0
  599. package/vendor/raylib/examples/textures/textures_to_image.png +0 -0
  600. package/vendor/raylib/logo/raylib.ico +0 -0
  601. package/vendor/raylib/logo/raylib_128x128.png +0 -0
  602. package/vendor/raylib/logo/raylib_144x144.png +0 -0
  603. package/vendor/raylib/logo/raylib_16x16.png +0 -0
  604. package/vendor/raylib/logo/raylib_180x180.png +0 -0
  605. package/vendor/raylib/logo/raylib_24x24.png +0 -0
  606. package/vendor/raylib/logo/raylib_256x256.png +0 -0
  607. package/vendor/raylib/logo/raylib_32x32.png +0 -0
  608. package/vendor/raylib/logo/raylib_36x36.png +0 -0
  609. package/vendor/raylib/logo/raylib_48x48.png +0 -0
  610. package/vendor/raylib/logo/raylib_512x512.png +0 -0
  611. package/vendor/raylib/logo/raylib_64x64.png +0 -0
  612. package/vendor/raylib/logo/raylib_72x72.png +0 -0
  613. package/vendor/raylib/logo/raylib_96x96.png +0 -0
  614. package/vendor/raylib/logo/raylib_logo_animation.gif +0 -0
  615. package/vendor/raylib/parser/LICENSE +16 -0
  616. package/vendor/raylib/parser/README.md +63 -0
  617. package/vendor/raylib/parser/raylib_api.json +6668 -0
  618. package/vendor/raylib/parser/raylib_api.txt +3568 -0
  619. package/vendor/raylib/parser/raylib_api.xml +2509 -0
  620. package/vendor/raylib/parser/raylib_parser.c +1003 -0
  621. package/vendor/raylib/projects/4coder/Makefile +401 -0
  622. package/vendor/raylib/projects/4coder/Makefile.Android +300 -0
  623. package/vendor/raylib/projects/4coder/main.c +39 -0
  624. package/vendor/raylib/projects/4coder/project.4coder +54 -0
  625. package/vendor/raylib/projects/Builder/README.md +24 -0
  626. package/vendor/raylib/projects/Builder/examples/README.md +1 -0
  627. package/vendor/raylib/projects/Builder/examples/meson.build +25 -0
  628. package/vendor/raylib/projects/Builder/meson.build +25 -0
  629. package/vendor/raylib/projects/CMake/CMakeLists.txt +44 -0
  630. package/vendor/raylib/projects/CMake/core_basic_window.c +62 -0
  631. package/vendor/raylib/projects/CodeBlocks/README.md +22 -0
  632. package/vendor/raylib/projects/CodeBlocks/compiler_settings.png +0 -0
  633. package/vendor/raylib/projects/CodeBlocks/core_basic_window.c +58 -0
  634. package/vendor/raylib/projects/CodeBlocks/core_basic_window.cbp +137 -0
  635. package/vendor/raylib/projects/Geany/core_basic_window.c +52 -0
  636. package/vendor/raylib/projects/Geany/raylib.c.tags +452 -0
  637. package/vendor/raylib/projects/Geany/raylib_compile_execute.bat +21 -0
  638. package/vendor/raylib/projects/Geany/raylib_compile_sources.bat +42 -0
  639. package/vendor/raylib/projects/Geany/raylib_project.geany +41 -0
  640. package/vendor/raylib/projects/Notepad++/README.md +19 -0
  641. package/vendor/raylib/projects/Notepad++/c_raylib.xml +3104 -0
  642. package/vendor/raylib/projects/Notepad++/npes_saved_mingw.txt +0 -0
  643. package/vendor/raylib/projects/Notepad++/npes_saved_tcc.txt +0 -0
  644. package/vendor/raylib/projects/Notepad++/npes_saved_w64devkit.txt +0 -0
  645. package/vendor/raylib/projects/Notepad++/npes_saved_zig.txt +0 -0
  646. package/vendor/raylib/projects/Notepad++/raylib_npp_parser/raylib_npp.xml +3060 -0
  647. package/vendor/raylib/projects/Notepad++/raylib_npp_parser/raylib_npp_parser.c +150 -0
  648. package/vendor/raylib/projects/Notepad++/raylib_npp_parser/raylib_to_parse.h +631 -0
  649. package/vendor/raylib/projects/README.md +18 -0
  650. package/vendor/raylib/projects/SublimeText/README.md +13 -0
  651. package/vendor/raylib/projects/SublimeText/raylib.sublime-build +13 -0
  652. package/vendor/raylib/projects/SublimeText/raylib.sublime-project +8 -0
  653. package/vendor/raylib/projects/VS2019/raylib/raylib.rc +0 -0
  654. package/vendor/raylib/projects/VS2019/raylib/resource.h +14 -0
  655. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.c +437 -0
  656. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/android_native_app_glue.h +344 -0
  657. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.NativeActivity/main.c +64 -0
  658. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/AndroidManifest.xml +22 -0
  659. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/build.xml +90 -0
  660. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/project.properties +3 -0
  661. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/raylib_android.Packaging.androidproj +134 -0
  662. package/vendor/raylib/projects/VS2019-Android/raylib_android/raylib_android.Packaging/res/values/strings.xml +4 -0
  663. package/vendor/raylib/projects/VSCode/.vscode/c_cpp_properties.json +63 -0
  664. package/vendor/raylib/projects/VSCode/.vscode/launch.json +60 -0
  665. package/vendor/raylib/projects/VSCode/.vscode/settings.json +11 -0
  666. package/vendor/raylib/projects/VSCode/.vscode/tasks.json +71 -0
  667. package/vendor/raylib/projects/VSCode/Makefile +408 -0
  668. package/vendor/raylib/projects/VSCode/Makefile.Android +300 -0
  669. package/vendor/raylib/projects/VSCode/main.c +83 -0
  670. package/vendor/raylib/projects/VSCode/main.code-workspace +16 -0
  671. package/vendor/raylib/projects/scripts/README.md +68 -0
  672. package/vendor/raylib/projects/scripts/build-linux.sh +169 -0
  673. package/vendor/raylib/projects/scripts/build-osx.sh +171 -0
  674. package/vendor/raylib/projects/scripts/build-rpi.sh +169 -0
  675. package/vendor/raylib/projects/scripts/build-windows.bat +219 -0
  676. package/vendor/raylib/projects/scripts/core_basic_window.c +61 -0
  677. package/vendor/raylib/raylib.pc.in +13 -0
  678. package/vendor/raylib/src/CMakeLists.txt +121 -0
  679. package/vendor/raylib/src/Makefile +696 -0
  680. package/vendor/raylib/src/build.zig +60 -0
  681. package/vendor/raylib/src/config.h +230 -0
  682. package/vendor/raylib/src/external/cgltf.h +6501 -0
  683. package/vendor/raylib/src/external/dirent.h +183 -0
  684. package/vendor/raylib/src/external/dr_flac.h +12269 -0
  685. package/vendor/raylib/src/external/dr_mp3.h +4787 -0
  686. package/vendor/raylib/src/external/dr_wav.h +8019 -0
  687. package/vendor/raylib/src/external/glad.h +8640 -0
  688. package/vendor/raylib/src/external/glfw/.mailmap +10 -0
  689. package/vendor/raylib/src/external/glfw/CMake/GenerateMappings.cmake +33 -0
  690. package/vendor/raylib/src/external/glfw/CMake/Info.plist.in +38 -0
  691. package/vendor/raylib/src/external/glfw/CMake/MacOSXBundleInfo.plist.in +38 -0
  692. package/vendor/raylib/src/external/glfw/CMake/cmake_uninstall.cmake.in +29 -0
  693. package/vendor/raylib/src/external/glfw/CMake/glfw3.pc.in +13 -0
  694. package/vendor/raylib/src/external/glfw/CMake/glfw3Config.cmake.in +3 -0
  695. package/vendor/raylib/src/external/glfw/CMake/i686-w64-mingw32-clang.cmake +13 -0
  696. package/vendor/raylib/src/external/glfw/CMake/i686-w64-mingw32.cmake +13 -0
  697. package/vendor/raylib/src/external/glfw/CMake/modules/FindEpollShim.cmake +17 -0
  698. package/vendor/raylib/src/external/glfw/CMake/modules/FindOSMesa.cmake +18 -0
  699. package/vendor/raylib/src/external/glfw/CMake/modules/FindWaylandProtocols.cmake +26 -0
  700. package/vendor/raylib/src/external/glfw/CMake/modules/FindXKBCommon.cmake +34 -0
  701. package/vendor/raylib/src/external/glfw/CMake/x86_64-w64-mingw32-clang.cmake +13 -0
  702. package/vendor/raylib/src/external/glfw/CMake/x86_64-w64-mingw32.cmake +13 -0
  703. package/vendor/raylib/src/external/glfw/CMakeLists.txt +323 -0
  704. package/vendor/raylib/src/external/glfw/LICENSE.md +23 -0
  705. package/vendor/raylib/src/external/glfw/README.md +477 -0
  706. package/vendor/raylib/src/external/glfw/deps/getopt.c +230 -0
  707. package/vendor/raylib/src/external/glfw/deps/getopt.h +57 -0
  708. package/vendor/raylib/src/external/glfw/deps/glad/gl.h +3840 -0
  709. package/vendor/raylib/src/external/glfw/deps/glad/khrplatform.h +282 -0
  710. package/vendor/raylib/src/external/glfw/deps/glad/vk_platform.h +92 -0
  711. package/vendor/raylib/src/external/glfw/deps/glad/vulkan.h +3480 -0
  712. package/vendor/raylib/src/external/glfw/deps/glad_gl.c +1791 -0
  713. package/vendor/raylib/src/external/glfw/deps/glad_vulkan.c +593 -0
  714. package/vendor/raylib/src/external/glfw/deps/mingw/_mingw_dxhelper.h +117 -0
  715. package/vendor/raylib/src/external/glfw/deps/mingw/dinput.h +2467 -0
  716. package/vendor/raylib/src/external/glfw/deps/mingw/xinput.h +239 -0
  717. package/vendor/raylib/src/external/glfw/deps/vs2008/stdint.h +247 -0
  718. package/vendor/raylib/src/external/glfw/include/GLFW/glfw3.h +6075 -0
  719. package/vendor/raylib/src/external/glfw/include/GLFW/glfw3native.h +530 -0
  720. package/vendor/raylib/src/external/glfw/src/CMakeLists.txt +246 -0
  721. package/vendor/raylib/src/external/glfw/src/cocoa_init.m +620 -0
  722. package/vendor/raylib/src/external/glfw/src/cocoa_joystick.h +46 -0
  723. package/vendor/raylib/src/external/glfw/src/cocoa_joystick.m +483 -0
  724. package/vendor/raylib/src/external/glfw/src/cocoa_monitor.m +631 -0
  725. package/vendor/raylib/src/external/glfw/src/cocoa_platform.h +206 -0
  726. package/vendor/raylib/src/external/glfw/src/cocoa_time.c +62 -0
  727. package/vendor/raylib/src/external/glfw/src/cocoa_window.m +1923 -0
  728. package/vendor/raylib/src/external/glfw/src/context.c +756 -0
  729. package/vendor/raylib/src/external/glfw/src/egl_context.c +846 -0
  730. package/vendor/raylib/src/external/glfw/src/egl_context.h +229 -0
  731. package/vendor/raylib/src/external/glfw/src/glfw.rc.in +30 -0
  732. package/vendor/raylib/src/external/glfw/src/glfw_config.h.in +58 -0
  733. package/vendor/raylib/src/external/glfw/src/glx_context.c +699 -0
  734. package/vendor/raylib/src/external/glfw/src/glx_context.h +181 -0
  735. package/vendor/raylib/src/external/glfw/src/init.c +357 -0
  736. package/vendor/raylib/src/external/glfw/src/input.c +1406 -0
  737. package/vendor/raylib/src/external/glfw/src/internal.h +799 -0
  738. package/vendor/raylib/src/external/glfw/src/linux_joystick.c +428 -0
  739. package/vendor/raylib/src/external/glfw/src/linux_joystick.h +59 -0
  740. package/vendor/raylib/src/external/glfw/src/mappings.h +1550 -0
  741. package/vendor/raylib/src/external/glfw/src/mappings.h.in +73 -0
  742. package/vendor/raylib/src/external/glfw/src/monitor.c +542 -0
  743. package/vendor/raylib/src/external/glfw/src/nsgl_context.h +66 -0
  744. package/vendor/raylib/src/external/glfw/src/nsgl_context.m +369 -0
  745. package/vendor/raylib/src/external/glfw/src/null_init.c +57 -0
  746. package/vendor/raylib/src/external/glfw/src/null_joystick.c +53 -0
  747. package/vendor/raylib/src/external/glfw/src/null_joystick.h +31 -0
  748. package/vendor/raylib/src/external/glfw/src/null_monitor.c +159 -0
  749. package/vendor/raylib/src/external/glfw/src/null_platform.h +89 -0
  750. package/vendor/raylib/src/external/glfw/src/null_window.c +670 -0
  751. package/vendor/raylib/src/external/glfw/src/osmesa_context.c +372 -0
  752. package/vendor/raylib/src/external/glfw/src/osmesa_context.h +90 -0
  753. package/vendor/raylib/src/external/glfw/src/posix_thread.c +105 -0
  754. package/vendor/raylib/src/external/glfw/src/posix_thread.h +51 -0
  755. package/vendor/raylib/src/external/glfw/src/posix_time.c +90 -0
  756. package/vendor/raylib/src/external/glfw/src/posix_time.h +44 -0
  757. package/vendor/raylib/src/external/glfw/src/vulkan.c +332 -0
  758. package/vendor/raylib/src/external/glfw/src/wgl_context.c +798 -0
  759. package/vendor/raylib/src/external/glfw/src/wgl_context.h +160 -0
  760. package/vendor/raylib/src/external/glfw/src/win32_init.c +636 -0
  761. package/vendor/raylib/src/external/glfw/src/win32_joystick.c +753 -0
  762. package/vendor/raylib/src/external/glfw/src/win32_joystick.h +53 -0
  763. package/vendor/raylib/src/external/glfw/src/win32_monitor.c +537 -0
  764. package/vendor/raylib/src/external/glfw/src/win32_platform.h +462 -0
  765. package/vendor/raylib/src/external/glfw/src/win32_thread.c +99 -0
  766. package/vendor/raylib/src/external/glfw/src/win32_time.c +76 -0
  767. package/vendor/raylib/src/external/glfw/src/win32_window.c +2405 -0
  768. package/vendor/raylib/src/external/glfw/src/window.c +1114 -0
  769. package/vendor/raylib/src/external/glfw/src/wl_init.c +1310 -0
  770. package/vendor/raylib/src/external/glfw/src/wl_monitor.c +231 -0
  771. package/vendor/raylib/src/external/glfw/src/wl_platform.h +352 -0
  772. package/vendor/raylib/src/external/glfw/src/wl_window.c +1814 -0
  773. package/vendor/raylib/src/external/glfw/src/x11_init.c +1500 -0
  774. package/vendor/raylib/src/external/glfw/src/x11_monitor.c +614 -0
  775. package/vendor/raylib/src/external/glfw/src/x11_platform.h +798 -0
  776. package/vendor/raylib/src/external/glfw/src/x11_window.c +3310 -0
  777. package/vendor/raylib/src/external/glfw/src/xkb_unicode.c +942 -0
  778. package/vendor/raylib/src/external/glfw/src/xkb_unicode.h +28 -0
  779. package/vendor/raylib/src/external/jar_mod.h +1596 -0
  780. package/vendor/raylib/src/external/jar_xm.h +2470 -0
  781. package/vendor/raylib/src/external/miniaudio.h +70273 -0
  782. package/vendor/raylib/src/external/msf_gif.h +717 -0
  783. package/vendor/raylib/src/external/par_shapes.h +2155 -0
  784. package/vendor/raylib/src/external/sdefl.h +696 -0
  785. package/vendor/raylib/src/external/sinfl.h +584 -0
  786. package/vendor/raylib/src/external/stb_image.h +7897 -0
  787. package/vendor/raylib/src/external/stb_image_resize.h +2634 -0
  788. package/vendor/raylib/src/external/stb_image_write.h +1724 -0
  789. package/vendor/raylib/src/external/stb_rect_pack.h +623 -0
  790. package/vendor/raylib/src/external/stb_truetype.h +5077 -0
  791. package/vendor/raylib/src/external/stb_vorbis.h +5475 -0
  792. package/vendor/raylib/src/external/tinyobj_loader_c.h +1589 -0
  793. package/vendor/raylib/src/external/vox_loader.h +710 -0
  794. package/vendor/raylib/src/extras/easings.h +263 -0
  795. package/vendor/raylib/src/extras/physac.h +1977 -0
  796. package/vendor/raylib/src/extras/raygui.h +4342 -0
  797. package/vendor/raylib/src/extras/rmem.h +751 -0
  798. package/vendor/raylib/src/raudio.c +2380 -0
  799. package/vendor/raylib/src/raudio.h +198 -0
  800. package/vendor/raylib/src/raylib.dll.rc +27 -0
  801. package/vendor/raylib/src/raylib.dll.rc.data +0 -0
  802. package/vendor/raylib/src/raylib.h +1536 -0
  803. package/vendor/raylib/src/raylib.ico +0 -0
  804. package/vendor/raylib/src/raylib.rc +27 -0
  805. package/vendor/raylib/src/raylib.rc.data +0 -0
  806. package/vendor/raylib/src/raymath.h +1853 -0
  807. package/vendor/raylib/src/rcamera.h +567 -0
  808. package/vendor/raylib/src/rcore.c +6772 -0
  809. package/vendor/raylib/src/rgestures.h +566 -0
  810. package/vendor/raylib/src/rglfw.c +126 -0
  811. package/vendor/raylib/src/rlgl.h +4677 -0
  812. package/vendor/raylib/src/rmodels.c +5041 -0
  813. package/vendor/raylib/src/rshapes.c +1759 -0
  814. package/vendor/raylib/src/rtext.c +1790 -0
  815. package/vendor/raylib/src/rtextures.c +4761 -0
  816. package/vendor/raylib/src/shell.html +328 -0
  817. package/vendor/raylib/src/utils.c +433 -0
  818. package/vendor/raylib/src/utils.h +81 -0
  819. package/vendor/sqlite3/shell.c +23487 -0
  820. package/vendor/sqlite3/sqlite3.c +239246 -0
  821. package/vendor/sqlite3/sqlite3.h +12802 -0
  822. package/vendor/sqlite3/sqlite3ext.h +689 -0
  823. package/CMakeLists.txt +0 -60
@@ -0,0 +1,1790 @@
1
+ /**********************************************************************************************
2
+ *
3
+ * rtext - Basic functions to load fonts and draw text
4
+ *
5
+ * CONFIGURATION:
6
+ *
7
+ * #define SUPPORT_FILEFORMAT_FNT
8
+ * #define SUPPORT_FILEFORMAT_TTF
9
+ * Selected desired fileformats to be supported for loading. Some of those formats are
10
+ * supported by default, to remove support, just comment unrequired #define in this module
11
+ *
12
+ * #define SUPPORT_DEFAULT_FONT
13
+ * Load default raylib font on initialization to be used by DrawText() and MeasureText().
14
+ * If no default font loaded, DrawTextEx() and MeasureTextEx() are required.
15
+ *
16
+ * #define TEXTSPLIT_MAX_TEXT_BUFFER_LENGTH
17
+ * TextSplit() function static buffer max size
18
+ *
19
+ * #define MAX_TEXTSPLIT_COUNT
20
+ * TextSplit() function static substrings pointers array (pointing to static buffer)
21
+ *
22
+ *
23
+ * DEPENDENCIES:
24
+ * stb_truetype - Load TTF file and rasterize characters data
25
+ * stb_rect_pack - Rectangles packing algorythms, required for font atlas generation
26
+ *
27
+ *
28
+ * LICENSE: zlib/libpng
29
+ *
30
+ * Copyright (c) 2013-2021 Ramon Santamaria (@raysan5)
31
+ *
32
+ * This software is provided "as-is", without any express or implied warranty. In no event
33
+ * will the authors be held liable for any damages arising from the use of this software.
34
+ *
35
+ * Permission is granted to anyone to use this software for any purpose, including commercial
36
+ * applications, and to alter it and redistribute it freely, subject to the following restrictions:
37
+ *
38
+ * 1. The origin of this software must not be misrepresented; you must not claim that you
39
+ * wrote the original software. If you use this software in a product, an acknowledgment
40
+ * in the product documentation would be appreciated but is not required.
41
+ *
42
+ * 2. Altered source versions must be plainly marked as such, and must not be misrepresented
43
+ * as being the original software.
44
+ *
45
+ * 3. This notice may not be removed or altered from any source distribution.
46
+ *
47
+ **********************************************************************************************/
48
+
49
+ #include "raylib.h" // Declares module functions
50
+
51
+ // Check if config flags have been externally provided on compilation line
52
+ #if !defined(EXTERNAL_CONFIG_FLAGS)
53
+ #include "config.h" // Defines module configuration flags
54
+ #endif
55
+
56
+ #include "utils.h" // Required for: LoadFileText()
57
+ #include "rlgl.h" // OpenGL abstraction layer to OpenGL 1.1, 2.1, 3.3+ or ES2 -> Only DrawTextPro()
58
+
59
+ #include <stdlib.h> // Required for: malloc(), free()
60
+ #include <stdio.h> // Required for: vsprintf()
61
+ #include <string.h> // Required for: strcmp(), strstr(), strcpy(), strncpy() [Used in TextReplace()], sscanf() [Used in LoadBMFont()]
62
+ #include <stdarg.h> // Required for: va_list, va_start(), vsprintf(), va_end() [Used in TextFormat()]
63
+ #include <ctype.h> // Requried for: toupper(), tolower() [Used in TextToUpper(), TextToLower()]
64
+
65
+ #if defined(SUPPORT_FILEFORMAT_TTF)
66
+ #define STB_RECT_PACK_IMPLEMENTATION
67
+ #include "external/stb_rect_pack.h" // Required for: ttf font rectangles packaging
68
+
69
+ #define STBTT_STATIC
70
+ #define STB_TRUETYPE_IMPLEMENTATION
71
+ #include "external/stb_truetype.h" // Required for: ttf font data reading
72
+ #endif
73
+
74
+ //----------------------------------------------------------------------------------
75
+ // Defines and Macros
76
+ //----------------------------------------------------------------------------------
77
+ #ifndef MAX_TEXT_BUFFER_LENGTH
78
+ #define MAX_TEXT_BUFFER_LENGTH 1024 // Size of internal static buffers used on some functions:
79
+ // TextFormat(), TextSubtext(), TextToUpper(), TextToLower(), TextToPascal(), TextSplit()
80
+ #endif
81
+ #ifndef MAX_TEXT_UNICODE_CHARS
82
+ #define MAX_TEXT_UNICODE_CHARS 512 // Maximum number of unicode codepoints: GetCodepoints()
83
+ #endif
84
+ #ifndef MAX_TEXTSPLIT_COUNT
85
+ #define MAX_TEXTSPLIT_COUNT 128 // Maximum number of substrings to split: TextSplit()
86
+ #endif
87
+
88
+ //----------------------------------------------------------------------------------
89
+ // Types and Structures Definition
90
+ //----------------------------------------------------------------------------------
91
+ // ...
92
+
93
+ //----------------------------------------------------------------------------------
94
+ // Global variables
95
+ //----------------------------------------------------------------------------------
96
+ #if defined(SUPPORT_DEFAULT_FONT)
97
+ // Default font provided by raylib
98
+ // NOTE: Default font is loaded on InitWindow() and disposed on CloseWindow() [module: core]
99
+ static Font defaultFont = { 0 };
100
+ #endif
101
+
102
+ //----------------------------------------------------------------------------------
103
+ // Other Modules Functions Declaration (required by text)
104
+ //----------------------------------------------------------------------------------
105
+ //...
106
+
107
+ //----------------------------------------------------------------------------------
108
+ // Module specific Functions Declaration
109
+ //----------------------------------------------------------------------------------
110
+ #if defined(SUPPORT_FILEFORMAT_FNT)
111
+ static Font LoadBMFont(const char *fileName); // Load a BMFont file (AngelCode font file)
112
+ #endif
113
+
114
+ #if defined(SUPPORT_DEFAULT_FONT)
115
+ extern void LoadFontDefault(void);
116
+ extern void UnloadFontDefault(void);
117
+ #endif
118
+
119
+ //----------------------------------------------------------------------------------
120
+ // Module Functions Definition
121
+ //----------------------------------------------------------------------------------
122
+ #if defined(SUPPORT_DEFAULT_FONT)
123
+
124
+ // Load raylib default font
125
+ extern void LoadFontDefault(void)
126
+ {
127
+ #define BIT_CHECK(a,b) ((a) & (1u << (b)))
128
+
129
+ // NOTE: Using UTF-8 encoding table for Unicode U+0000..U+00FF Basic Latin + Latin-1 Supplement
130
+ // Ref: http://www.utf8-chartable.de/unicode-utf8-table.pl
131
+
132
+ defaultFont.glyphCount = 224; // Number of chars included in our default font
133
+ defaultFont.glyphPadding = 0; // Characters padding
134
+
135
+ // Default font is directly defined here (data generated from a sprite font image)
136
+ // This way, we reconstruct Font without creating large global variables
137
+ // This data is automatically allocated to Stack and automatically deallocated at the end of this function
138
+ unsigned int defaultFontData[512] = {
139
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200020, 0x0001b000, 0x00000000, 0x00000000, 0x8ef92520, 0x00020a00, 0x7dbe8000, 0x1f7df45f,
140
+ 0x4a2bf2a0, 0x0852091e, 0x41224000, 0x10041450, 0x2e292020, 0x08220812, 0x41222000, 0x10041450, 0x10f92020, 0x3efa084c, 0x7d22103c, 0x107df7de,
141
+ 0xe8a12020, 0x08220832, 0x05220800, 0x10450410, 0xa4a3f000, 0x08520832, 0x05220400, 0x10450410, 0xe2f92020, 0x0002085e, 0x7d3e0281, 0x107df41f,
142
+ 0x00200000, 0x8001b000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
143
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xc0000fbe, 0xfbf7e00f, 0x5fbf7e7d, 0x0050bee8, 0x440808a2, 0x0a142fe8, 0x50810285, 0x0050a048,
144
+ 0x49e428a2, 0x0a142828, 0x40810284, 0x0048a048, 0x10020fbe, 0x09f7ebaf, 0xd89f3e84, 0x0047a04f, 0x09e48822, 0x0a142aa1, 0x50810284, 0x0048a048,
145
+ 0x04082822, 0x0a142fa0, 0x50810285, 0x0050a248, 0x00008fbe, 0xfbf42021, 0x5f817e7d, 0x07d09ce8, 0x00008000, 0x00000fe0, 0x00000000, 0x00000000,
146
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x000c0180,
147
+ 0xdfbf4282, 0x0bfbf7ef, 0x42850505, 0x004804bf, 0x50a142c6, 0x08401428, 0x42852505, 0x00a808a0, 0x50a146aa, 0x08401428, 0x42852505, 0x00081090,
148
+ 0x5fa14a92, 0x0843f7e8, 0x7e792505, 0x00082088, 0x40a15282, 0x08420128, 0x40852489, 0x00084084, 0x40a16282, 0x0842022a, 0x40852451, 0x00088082,
149
+ 0xc0bf4282, 0xf843f42f, 0x7e85fc21, 0x3e0900bf, 0x00000000, 0x00000004, 0x00000000, 0x000c0180, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
150
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000402, 0x41482000, 0x00000000, 0x00000800,
151
+ 0x04000404, 0x4100203c, 0x00000000, 0x00000800, 0xf7df7df0, 0x514bef85, 0xbefbefbe, 0x04513bef, 0x14414500, 0x494a2885, 0xa28a28aa, 0x04510820,
152
+ 0xf44145f0, 0x474a289d, 0xa28a28aa, 0x04510be0, 0x14414510, 0x494a2884, 0xa28a28aa, 0x02910a00, 0xf7df7df0, 0xd14a2f85, 0xbefbe8aa, 0x011f7be0,
153
+ 0x00000000, 0x00400804, 0x20080000, 0x00000000, 0x00000000, 0x00600f84, 0x20080000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
154
+ 0xac000000, 0x00000f01, 0x00000000, 0x00000000, 0x24000000, 0x00000f01, 0x00000000, 0x06000000, 0x24000000, 0x00000f01, 0x00000000, 0x09108000,
155
+ 0x24fa28a2, 0x00000f01, 0x00000000, 0x013e0000, 0x2242252a, 0x00000f52, 0x00000000, 0x038a8000, 0x2422222a, 0x00000f29, 0x00000000, 0x010a8000,
156
+ 0x2412252a, 0x00000f01, 0x00000000, 0x010a8000, 0x24fbe8be, 0x00000f01, 0x00000000, 0x0ebe8000, 0xac020000, 0x00000f01, 0x00000000, 0x00048000,
157
+ 0x0003e000, 0x00000f00, 0x00000000, 0x00008000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000038, 0x8443b80e, 0x00203a03,
158
+ 0x02bea080, 0xf0000020, 0xc452208a, 0x04202b02, 0xf8029122, 0x07f0003b, 0xe44b388e, 0x02203a02, 0x081e8a1c, 0x0411e92a, 0xf4420be0, 0x01248202,
159
+ 0xe8140414, 0x05d104ba, 0xe7c3b880, 0x00893a0a, 0x283c0e1c, 0x04500902, 0xc4400080, 0x00448002, 0xe8208422, 0x04500002, 0x80400000, 0x05200002,
160
+ 0x083e8e00, 0x04100002, 0x804003e0, 0x07000042, 0xf8008400, 0x07f00003, 0x80400000, 0x04000022, 0x00000000, 0x00000000, 0x80400000, 0x04000002,
161
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00800702, 0x1848a0c2, 0x84010000, 0x02920921, 0x01042642, 0x00005121, 0x42023f7f, 0x00291002,
162
+ 0xefc01422, 0x7efdfbf7, 0xefdfa109, 0x03bbbbf7, 0x28440f12, 0x42850a14, 0x20408109, 0x01111010, 0x28440408, 0x42850a14, 0x2040817f, 0x01111010,
163
+ 0xefc78204, 0x7efdfbf7, 0xe7cf8109, 0x011111f3, 0x2850a932, 0x42850a14, 0x2040a109, 0x01111010, 0x2850b840, 0x42850a14, 0xefdfbf79, 0x03bbbbf7,
164
+ 0x001fa020, 0x00000000, 0x00001000, 0x00000000, 0x00002070, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
165
+ 0x08022800, 0x00012283, 0x02430802, 0x01010001, 0x8404147c, 0x20000144, 0x80048404, 0x00823f08, 0xdfbf4284, 0x7e03f7ef, 0x142850a1, 0x0000210a,
166
+ 0x50a14684, 0x528a1428, 0x142850a1, 0x03efa17a, 0x50a14a9e, 0x52521428, 0x142850a1, 0x02081f4a, 0x50a15284, 0x4a221428, 0xf42850a1, 0x03efa14b,
167
+ 0x50a16284, 0x4a521428, 0x042850a1, 0x0228a17a, 0xdfbf427c, 0x7e8bf7ef, 0xf7efdfbf, 0x03efbd0b, 0x00000000, 0x04000000, 0x00000000, 0x00000008,
168
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00200508, 0x00840400, 0x11458122, 0x00014210,
169
+ 0x00514294, 0x51420800, 0x20a22a94, 0x0050a508, 0x00200000, 0x00000000, 0x00050000, 0x08000000, 0xfefbefbe, 0xfbefbefb, 0xfbeb9114, 0x00fbefbe,
170
+ 0x20820820, 0x8a28a20a, 0x8a289114, 0x3e8a28a2, 0xfefbefbe, 0xfbefbe0b, 0x8a289114, 0x008a28a2, 0x228a28a2, 0x08208208, 0x8a289114, 0x088a28a2,
171
+ 0xfefbefbe, 0xfbefbefb, 0xfa2f9114, 0x00fbefbe, 0x00000000, 0x00000040, 0x00000000, 0x00000000, 0x00000000, 0x00000020, 0x00000000, 0x00000000,
172
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00210100, 0x00000004, 0x00000000, 0x00000000, 0x14508200, 0x00001402, 0x00000000, 0x00000000,
173
+ 0x00000010, 0x00000020, 0x00000000, 0x00000000, 0xa28a28be, 0x00002228, 0x00000000, 0x00000000, 0xa28a28aa, 0x000022e8, 0x00000000, 0x00000000,
174
+ 0xa28a28aa, 0x000022a8, 0x00000000, 0x00000000, 0xa28a28aa, 0x000022e8, 0x00000000, 0x00000000, 0xbefbefbe, 0x00003e2f, 0x00000000, 0x00000000,
175
+ 0x00000004, 0x00002028, 0x00000000, 0x00000000, 0x80000000, 0x00003e0f, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
176
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
177
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
178
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
179
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
180
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
181
+ 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 };
182
+
183
+ int charsHeight = 10;
184
+ int charsDivisor = 1; // Every char is separated from the consecutive by a 1 pixel divisor, horizontally and vertically
185
+
186
+ int charsWidth[224] = { 3, 1, 4, 6, 5, 7, 6, 2, 3, 3, 5, 5, 2, 4, 1, 7, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 3, 4, 3, 6,
187
+ 7, 6, 6, 6, 6, 6, 6, 6, 6, 3, 5, 6, 5, 7, 6, 6, 6, 6, 6, 6, 7, 6, 7, 7, 6, 6, 6, 2, 7, 2, 3, 5,
188
+ 2, 5, 5, 5, 5, 5, 4, 5, 5, 1, 2, 5, 2, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 3, 1, 3, 4, 4,
189
+ 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,
190
+ 1, 1, 5, 5, 5, 7, 1, 5, 3, 7, 3, 5, 4, 1, 7, 4, 3, 5, 3, 3, 2, 5, 6, 1, 2, 2, 3, 5, 6, 6, 6, 6,
191
+ 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 6, 6, 3, 3, 3, 3, 7, 6, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 4, 6,
192
+ 5, 5, 5, 5, 5, 5, 9, 5, 5, 5, 5, 5, 2, 2, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 5 };
193
+
194
+ // Re-construct image from defaultFontData and generate OpenGL texture
195
+ //----------------------------------------------------------------------
196
+ Image imFont = {
197
+ .data = calloc(128*128, 2), // 2 bytes per pixel (gray + alpha)
198
+ .width = 128,
199
+ .height = 128,
200
+ .format = PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA,
201
+ .mipmaps = 1
202
+ };
203
+
204
+ // Fill image.data with defaultFontData (convert from bit to pixel!)
205
+ for (int i = 0, counter = 0; i < imFont.width*imFont.height; i += 32)
206
+ {
207
+ for (int j = 31; j >= 0; j--)
208
+ {
209
+ if (BIT_CHECK(defaultFontData[counter], j))
210
+ {
211
+ // NOTE: We are unreferencing data as short, so,
212
+ // we must consider data as little-endian order (alpha + gray)
213
+ ((unsigned short *)imFont.data)[i + j] = 0xffff;
214
+ }
215
+ else ((unsigned short *)imFont.data)[i + j] = 0x00ff;
216
+ }
217
+
218
+ counter++;
219
+ }
220
+
221
+ defaultFont.texture = LoadTextureFromImage(imFont);
222
+
223
+ // Reconstruct charSet using charsWidth[], charsHeight, charsDivisor, glyphCount
224
+ //------------------------------------------------------------------------------
225
+
226
+ // Allocate space for our characters info data
227
+ // NOTE: This memory should be freed at end! --> CloseWindow()
228
+ defaultFont.glyphs = (GlyphInfo *)RL_MALLOC(defaultFont.glyphCount*sizeof(GlyphInfo));
229
+ defaultFont.recs = (Rectangle *)RL_MALLOC(defaultFont.glyphCount*sizeof(Rectangle));
230
+
231
+ int currentLine = 0;
232
+ int currentPosX = charsDivisor;
233
+ int testPosX = charsDivisor;
234
+
235
+ for (int i = 0; i < defaultFont.glyphCount; i++)
236
+ {
237
+ defaultFont.glyphs[i].value = 32 + i; // First char is 32
238
+
239
+ defaultFont.recs[i].x = (float)currentPosX;
240
+ defaultFont.recs[i].y = (float)(charsDivisor + currentLine*(charsHeight + charsDivisor));
241
+ defaultFont.recs[i].width = (float)charsWidth[i];
242
+ defaultFont.recs[i].height = (float)charsHeight;
243
+
244
+ testPosX += (int)(defaultFont.recs[i].width + (float)charsDivisor);
245
+
246
+ if (testPosX >= defaultFont.texture.width)
247
+ {
248
+ currentLine++;
249
+ currentPosX = 2*charsDivisor + charsWidth[i];
250
+ testPosX = currentPosX;
251
+
252
+ defaultFont.recs[i].x = (float)charsDivisor;
253
+ defaultFont.recs[i].y = (float)(charsDivisor + currentLine*(charsHeight + charsDivisor));
254
+ }
255
+ else currentPosX = testPosX;
256
+
257
+ // NOTE: On default font character offsets and xAdvance are not required
258
+ defaultFont.glyphs[i].offsetX = 0;
259
+ defaultFont.glyphs[i].offsetY = 0;
260
+ defaultFont.glyphs[i].advanceX = 0;
261
+
262
+ // Fill character image data from fontClear data
263
+ defaultFont.glyphs[i].image = ImageFromImage(imFont, defaultFont.recs[i]);
264
+ }
265
+
266
+ UnloadImage(imFont);
267
+
268
+ defaultFont.baseSize = (int)defaultFont.recs[0].height;
269
+
270
+ TRACELOG(LOG_INFO, "FONT: Default font loaded successfully (%i glyphs)", defaultFont.glyphCount);
271
+ }
272
+
273
+ // Unload raylib default font
274
+ extern void UnloadFontDefault(void)
275
+ {
276
+ for (int i = 0; i < defaultFont.glyphCount; i++) UnloadImage(defaultFont.glyphs[i].image);
277
+ UnloadTexture(defaultFont.texture);
278
+ RL_FREE(defaultFont.glyphs);
279
+ RL_FREE(defaultFont.recs);
280
+ }
281
+ #endif // SUPPORT_DEFAULT_FONT
282
+
283
+ // Get the default font, useful to be used with extended parameters
284
+ Font GetFontDefault()
285
+ {
286
+ #if defined(SUPPORT_DEFAULT_FONT)
287
+ return defaultFont;
288
+ #else
289
+ Font font = { 0 };
290
+ return font;
291
+ #endif
292
+ }
293
+
294
+ // Load Font from file into GPU memory (VRAM)
295
+ Font LoadFont(const char *fileName)
296
+ {
297
+ // Default values for ttf font generation
298
+ #ifndef FONT_TTF_DEFAULT_SIZE
299
+ #define FONT_TTF_DEFAULT_SIZE 32 // TTF font generation default char size (char-height)
300
+ #endif
301
+ #ifndef FONT_TTF_DEFAULT_NUMCHARS
302
+ #define FONT_TTF_DEFAULT_NUMCHARS 95 // TTF font generation default charset: 95 glyphs (ASCII 32..126)
303
+ #endif
304
+ #ifndef FONT_TTF_DEFAULT_FIRST_CHAR
305
+ #define FONT_TTF_DEFAULT_FIRST_CHAR 32 // TTF font generation default first char for image sprite font (32-Space)
306
+ #endif
307
+ #ifndef FONT_TTF_DEFAULT_CHARS_PADDING
308
+ #define FONT_TTF_DEFAULT_CHARS_PADDING 4 // TTF font generation default chars padding
309
+ #endif
310
+
311
+ Font font = { 0 };
312
+
313
+ #if defined(SUPPORT_FILEFORMAT_TTF)
314
+ if (IsFileExtension(fileName, ".ttf;.otf")) font = LoadFontEx(fileName, FONT_TTF_DEFAULT_SIZE, NULL, FONT_TTF_DEFAULT_NUMCHARS);
315
+ else
316
+ #endif
317
+ #if defined(SUPPORT_FILEFORMAT_FNT)
318
+ if (IsFileExtension(fileName, ".fnt")) font = LoadBMFont(fileName);
319
+ else
320
+ #endif
321
+ {
322
+ Image image = LoadImage(fileName);
323
+ if (image.data != NULL) font = LoadFontFromImage(image, MAGENTA, FONT_TTF_DEFAULT_FIRST_CHAR);
324
+ UnloadImage(image);
325
+ }
326
+
327
+ if (font.texture.id == 0)
328
+ {
329
+ TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load font texture -> Using default font", fileName);
330
+ font = GetFontDefault();
331
+ }
332
+ else SetTextureFilter(font.texture, TEXTURE_FILTER_POINT); // By default we set point filter (best performance)
333
+
334
+ return font;
335
+ }
336
+
337
+ // Load Font from TTF font file with generation parameters
338
+ // NOTE: You can pass an array with desired characters, those characters should be available in the font
339
+ // if array is NULL, default char set is selected 32..126
340
+ Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount)
341
+ {
342
+ Font font = { 0 };
343
+
344
+ // Loading file to memory
345
+ unsigned int fileSize = 0;
346
+ unsigned char *fileData = LoadFileData(fileName, &fileSize);
347
+
348
+ if (fileData != NULL)
349
+ {
350
+ // Loading font from memory data
351
+ font = LoadFontFromMemory(GetFileExtension(fileName), fileData, fileSize, fontSize, fontChars, glyphCount);
352
+
353
+ RL_FREE(fileData);
354
+ }
355
+ else font = GetFontDefault();
356
+
357
+ return font;
358
+ }
359
+
360
+ // Load an Image font file (XNA style)
361
+ Font LoadFontFromImage(Image image, Color key, int firstChar)
362
+ {
363
+ #ifndef MAX_GLYPHS_FROM_IMAGE
364
+ #define MAX_GLYPHS_FROM_IMAGE 256 // Maximum number of glyphs supported on image scan
365
+ #endif
366
+
367
+ #define COLOR_EQUAL(col1, col2) ((col1.r == col2.r) && (col1.g == col2.g) && (col1.b == col2.b) && (col1.a == col2.a))
368
+
369
+ Font font = GetFontDefault();
370
+
371
+ int charSpacing = 0;
372
+ int lineSpacing = 0;
373
+
374
+ int x = 0;
375
+ int y = 0;
376
+
377
+ // We allocate a temporal arrays for chars data measures,
378
+ // once we get the actual number of chars, we copy data to a sized arrays
379
+ int tempCharValues[MAX_GLYPHS_FROM_IMAGE] = { 0 };
380
+ Rectangle tempCharRecs[MAX_GLYPHS_FROM_IMAGE] = { 0 };
381
+
382
+ Color *pixels = LoadImageColors(image);
383
+
384
+ // Parse image data to get charSpacing and lineSpacing
385
+ for (y = 0; y < image.height; y++)
386
+ {
387
+ for (x = 0; x < image.width; x++)
388
+ {
389
+ if (!COLOR_EQUAL(pixels[y*image.width + x], key)) break;
390
+ }
391
+
392
+ if (!COLOR_EQUAL(pixels[y*image.width + x], key)) break;
393
+ }
394
+
395
+ if ((x == 0) || (y == 0)) return font;
396
+
397
+ charSpacing = x;
398
+ lineSpacing = y;
399
+
400
+ int charHeight = 0;
401
+ int j = 0;
402
+
403
+ while (!COLOR_EQUAL(pixels[(lineSpacing + j)*image.width + charSpacing], key)) j++;
404
+
405
+ charHeight = j;
406
+
407
+ // Check array values to get characters: value, x, y, w, h
408
+ int index = 0;
409
+ int lineToRead = 0;
410
+ int xPosToRead = charSpacing;
411
+
412
+ // Parse image data to get rectangle sizes
413
+ while ((lineSpacing + lineToRead*(charHeight + lineSpacing)) < image.height)
414
+ {
415
+ while ((xPosToRead < image.width) &&
416
+ !COLOR_EQUAL((pixels[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*image.width + xPosToRead]), key))
417
+ {
418
+ tempCharValues[index] = firstChar + index;
419
+
420
+ tempCharRecs[index].x = (float)xPosToRead;
421
+ tempCharRecs[index].y = (float)(lineSpacing + lineToRead*(charHeight + lineSpacing));
422
+ tempCharRecs[index].height = (float)charHeight;
423
+
424
+ int charWidth = 0;
425
+
426
+ while (!COLOR_EQUAL(pixels[(lineSpacing + (charHeight+lineSpacing)*lineToRead)*image.width + xPosToRead + charWidth], key)) charWidth++;
427
+
428
+ tempCharRecs[index].width = (float)charWidth;
429
+
430
+ index++;
431
+
432
+ xPosToRead += (charWidth + charSpacing);
433
+ }
434
+
435
+ lineToRead++;
436
+ xPosToRead = charSpacing;
437
+ }
438
+
439
+ // NOTE: We need to remove key color borders from image to avoid weird
440
+ // artifacts on texture scaling when using TEXTURE_FILTER_BILINEAR or TEXTURE_FILTER_TRILINEAR
441
+ for (int i = 0; i < image.height*image.width; i++) if (COLOR_EQUAL(pixels[i], key)) pixels[i] = BLANK;
442
+
443
+ // Create a new image with the processed color data (key color replaced by BLANK)
444
+ Image fontClear = {
445
+ .data = pixels,
446
+ .width = image.width,
447
+ .height = image.height,
448
+ .format = PIXELFORMAT_UNCOMPRESSED_R8G8B8A8,
449
+ .mipmaps = 1
450
+ };
451
+
452
+ // Set font with all data parsed from image
453
+ font.texture = LoadTextureFromImage(fontClear); // Convert processed image to OpenGL texture
454
+ font.glyphCount = index;
455
+ font.glyphPadding = 0;
456
+
457
+ // We got tempCharValues and tempCharsRecs populated with chars data
458
+ // Now we move temp data to sized charValues and charRecs arrays
459
+ font.glyphs = (GlyphInfo *)RL_MALLOC(font.glyphCount*sizeof(GlyphInfo));
460
+ font.recs = (Rectangle *)RL_MALLOC(font.glyphCount*sizeof(Rectangle));
461
+
462
+ for (int i = 0; i < font.glyphCount; i++)
463
+ {
464
+ font.glyphs[i].value = tempCharValues[i];
465
+
466
+ // Get character rectangle in the font atlas texture
467
+ font.recs[i] = tempCharRecs[i];
468
+
469
+ // NOTE: On image based fonts (XNA style), character offsets and xAdvance are not required (set to 0)
470
+ font.glyphs[i].offsetX = 0;
471
+ font.glyphs[i].offsetY = 0;
472
+ font.glyphs[i].advanceX = 0;
473
+
474
+ // Fill character image data from fontClear data
475
+ font.glyphs[i].image = ImageFromImage(fontClear, tempCharRecs[i]);
476
+ }
477
+
478
+ UnloadImage(fontClear); // Unload processed image once converted to texture
479
+
480
+ font.baseSize = (int)font.recs[0].height;
481
+
482
+ return font;
483
+ }
484
+
485
+ // Load font from memory buffer, fileType refers to extension: i.e. ".ttf"
486
+ Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount)
487
+ {
488
+ Font font = { 0 };
489
+
490
+ char fileExtLower[16] = { 0 };
491
+ strcpy(fileExtLower, TextToLower(fileType));
492
+
493
+ #if defined(SUPPORT_FILEFORMAT_TTF)
494
+ if (TextIsEqual(fileExtLower, ".ttf") ||
495
+ TextIsEqual(fileExtLower, ".otf"))
496
+ {
497
+ font.baseSize = fontSize;
498
+ font.glyphCount = (glyphCount > 0)? glyphCount : 95;
499
+ font.glyphPadding = 0;
500
+ font.glyphs = LoadFontData(fileData, dataSize, font.baseSize, fontChars, font.glyphCount, FONT_DEFAULT);
501
+
502
+ if (font.glyphs != NULL)
503
+ {
504
+ font.glyphPadding = FONT_TTF_DEFAULT_CHARS_PADDING;
505
+
506
+ Image atlas = GenImageFontAtlas(font.glyphs, &font.recs, font.glyphCount, font.baseSize, font.glyphPadding, 0);
507
+ font.texture = LoadTextureFromImage(atlas);
508
+
509
+ // Update glyphs[i].image to use alpha, required to be used on ImageDrawText()
510
+ for (int i = 0; i < font.glyphCount; i++)
511
+ {
512
+ UnloadImage(font.glyphs[i].image);
513
+ font.glyphs[i].image = ImageFromImage(atlas, font.recs[i]);
514
+ }
515
+
516
+ UnloadImage(atlas);
517
+
518
+ // TRACELOG(LOG_INFO, "FONT: Font loaded successfully (%i glyphs)", font.glyphCount);
519
+ }
520
+ else font = GetFontDefault();
521
+ }
522
+ #else
523
+ font = GetFontDefault();
524
+ #endif
525
+
526
+ return font;
527
+ }
528
+
529
+ // Load font data for further use
530
+ // NOTE: Requires TTF font memory data and can generate SDF data
531
+ GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount, int type)
532
+ {
533
+ // NOTE: Using some SDF generation default values,
534
+ // trades off precision with ability to handle *smaller* sizes
535
+ #ifndef FONT_SDF_CHAR_PADDING
536
+ #define FONT_SDF_CHAR_PADDING 4 // SDF font generation char padding
537
+ #endif
538
+ #ifndef FONT_SDF_ON_EDGE_VALUE
539
+ #define FONT_SDF_ON_EDGE_VALUE 128 // SDF font generation on edge value
540
+ #endif
541
+ #ifndef FONT_SDF_PIXEL_DIST_SCALE
542
+ #define FONT_SDF_PIXEL_DIST_SCALE 64.0f // SDF font generation pixel distance scale
543
+ #endif
544
+ #ifndef FONT_BITMAP_ALPHA_THRESHOLD
545
+ #define FONT_BITMAP_ALPHA_THRESHOLD 80 // Bitmap (B&W) font generation alpha threshold
546
+ #endif
547
+
548
+ GlyphInfo *chars = NULL;
549
+
550
+ #if defined(SUPPORT_FILEFORMAT_TTF)
551
+ // Load font data (including pixel data) from TTF memory file
552
+ // NOTE: Loaded information should be enough to generate font image atlas, using any packaging method
553
+ if (fileData != NULL)
554
+ {
555
+ bool genFontChars = false;
556
+ stbtt_fontinfo fontInfo = { 0 };
557
+
558
+ if (stbtt_InitFont(&fontInfo, (unsigned char *)fileData, 0)) // Initialize font for data reading
559
+ {
560
+ // Calculate font scale factor
561
+ float scaleFactor = stbtt_ScaleForPixelHeight(&fontInfo, (float)fontSize);
562
+
563
+ // Calculate font basic metrics
564
+ // NOTE: ascent is equivalent to font baseline
565
+ int ascent, descent, lineGap;
566
+ stbtt_GetFontVMetrics(&fontInfo, &ascent, &descent, &lineGap);
567
+
568
+ // In case no chars count provided, default to 95
569
+ glyphCount = (glyphCount > 0)? glyphCount : 95;
570
+
571
+ // Fill fontChars in case not provided externally
572
+ // NOTE: By default we fill glyphCount consecutevely, starting at 32 (Space)
573
+
574
+ if (fontChars == NULL)
575
+ {
576
+ fontChars = (int *)RL_MALLOC(glyphCount*sizeof(int));
577
+ for (int i = 0; i < glyphCount; i++) fontChars[i] = i + 32;
578
+ genFontChars = true;
579
+ }
580
+
581
+ chars = (GlyphInfo *)RL_MALLOC(glyphCount*sizeof(GlyphInfo));
582
+
583
+ // NOTE: Using simple packaging, one char after another
584
+ for (int i = 0; i < glyphCount; i++)
585
+ {
586
+ int chw = 0, chh = 0; // Character width and height (on generation)
587
+ int ch = fontChars[i]; // Character value to get info for
588
+ chars[i].value = ch;
589
+
590
+ // Render a unicode codepoint to a bitmap
591
+ // stbtt_GetCodepointBitmap() -- allocates and returns a bitmap
592
+ // stbtt_GetCodepointBitmapBox() -- how big the bitmap must be
593
+ // stbtt_MakeCodepointBitmap() -- renders into bitmap you provide
594
+
595
+ if (type != FONT_SDF) chars[i].image.data = stbtt_GetCodepointBitmap(&fontInfo, scaleFactor, scaleFactor, ch, &chw, &chh, &chars[i].offsetX, &chars[i].offsetY);
596
+ else if (ch != 32) chars[i].image.data = stbtt_GetCodepointSDF(&fontInfo, scaleFactor, ch, FONT_SDF_CHAR_PADDING, FONT_SDF_ON_EDGE_VALUE, FONT_SDF_PIXEL_DIST_SCALE, &chw, &chh, &chars[i].offsetX, &chars[i].offsetY);
597
+ else chars[i].image.data = NULL;
598
+
599
+ stbtt_GetCodepointHMetrics(&fontInfo, ch, &chars[i].advanceX, NULL);
600
+ chars[i].advanceX = (int)((float)chars[i].advanceX*scaleFactor);
601
+
602
+ // Load characters images
603
+ chars[i].image.width = chw;
604
+ chars[i].image.height = chh;
605
+ chars[i].image.mipmaps = 1;
606
+ chars[i].image.format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE;
607
+
608
+ chars[i].offsetY += (int)((float)ascent*scaleFactor);
609
+
610
+ // NOTE: We create an empty image for space character, it could be further required for atlas packing
611
+ if (ch == 32)
612
+ {
613
+ Image imSpace = {
614
+ .data = calloc(chars[i].advanceX*fontSize, 2),
615
+ .width = chars[i].advanceX,
616
+ .height = fontSize,
617
+ .format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE,
618
+ .mipmaps = 1
619
+ };
620
+
621
+ chars[i].image = imSpace;
622
+ }
623
+
624
+ if (type == FONT_BITMAP)
625
+ {
626
+ // Aliased bitmap (black & white) font generation, avoiding anti-aliasing
627
+ // NOTE: For optimum results, bitmap font should be generated at base pixel size
628
+ for (int p = 0; p < chw*chh; p++)
629
+ {
630
+ if (((unsigned char *)chars[i].image.data)[p] < FONT_BITMAP_ALPHA_THRESHOLD) ((unsigned char *)chars[i].image.data)[p] = 0;
631
+ else ((unsigned char *)chars[i].image.data)[p] = 255;
632
+ }
633
+ }
634
+
635
+ // Get bounding box for character (may be offset to account for chars that dip above or below the line)
636
+ /*
637
+ int chX1, chY1, chX2, chY2;
638
+ stbtt_GetCodepointBitmapBox(&fontInfo, ch, scaleFactor, scaleFactor, &chX1, &chY1, &chX2, &chY2);
639
+
640
+ TRACELOGD("FONT: Character box measures: %i, %i, %i, %i", chX1, chY1, chX2 - chX1, chY2 - chY1);
641
+ TRACELOGD("FONT: Character offsetY: %i", (int)((float)ascent*scaleFactor) + chY1);
642
+ */
643
+ }
644
+ }
645
+ else TRACELOG(LOG_WARNING, "FONT: Failed to process TTF font data");
646
+
647
+ if (genFontChars) RL_FREE(fontChars);
648
+ }
649
+ #endif
650
+
651
+ return chars;
652
+ }
653
+
654
+ // Generate image font atlas using chars info
655
+ // NOTE: Packing method: 0-Default, 1-Skyline
656
+ #if defined(SUPPORT_FILEFORMAT_TTF)
657
+ Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **charRecs, int glyphCount, int fontSize, int padding, int packMethod)
658
+ {
659
+ Image atlas = { 0 };
660
+
661
+ if (chars == NULL)
662
+ {
663
+ TraceLog(LOG_WARNING, "FONT: Provided chars info not valid, returning empty image atlas");
664
+ return atlas;
665
+ }
666
+
667
+ *charRecs = NULL;
668
+
669
+ // In case no chars count provided we suppose default of 95
670
+ glyphCount = (glyphCount > 0)? glyphCount : 95;
671
+
672
+ // NOTE: Rectangles memory is loaded here!
673
+ Rectangle *recs = (Rectangle *)RL_MALLOC(glyphCount*sizeof(Rectangle));
674
+
675
+ // Calculate image size based on required pixel area
676
+ // NOTE 1: Image is forced to be squared and POT... very conservative!
677
+ // NOTE 2: SDF font characters already contain an internal padding,
678
+ // so image size would result bigger than default font type
679
+ float requiredArea = 0;
680
+ for (int i = 0; i < glyphCount; i++) requiredArea += ((chars[i].image.width + 2*padding)*(chars[i].image.height + 2*padding));
681
+ float guessSize = sqrtf(requiredArea)*1.3f;
682
+ int imageSize = (int)powf(2, ceilf(logf((float)guessSize)/logf(2))); // Calculate next POT
683
+
684
+ atlas.width = imageSize; // Atlas bitmap width
685
+ atlas.height = imageSize; // Atlas bitmap height
686
+ atlas.data = (unsigned char *)RL_CALLOC(1, atlas.width*atlas.height); // Create a bitmap to store characters (8 bpp)
687
+ atlas.format = PIXELFORMAT_UNCOMPRESSED_GRAYSCALE;
688
+ atlas.mipmaps = 1;
689
+
690
+ // DEBUG: We can see padding in the generated image setting a gray background...
691
+ //for (int i = 0; i < atlas.width*atlas.height; i++) ((unsigned char *)atlas.data)[i] = 100;
692
+
693
+ if (packMethod == 0) // Use basic packing algorythm
694
+ {
695
+ int offsetX = padding;
696
+ int offsetY = padding;
697
+
698
+ // NOTE: Using simple packaging, one char after another
699
+ for (int i = 0; i < glyphCount; i++)
700
+ {
701
+ // Copy pixel data from fc.data to atlas
702
+ for (int y = 0; y < chars[i].image.height; y++)
703
+ {
704
+ for (int x = 0; x < chars[i].image.width; x++)
705
+ {
706
+ ((unsigned char *)atlas.data)[(offsetY + y)*atlas.width + (offsetX + x)] = ((unsigned char *)chars[i].image.data)[y*chars[i].image.width + x];
707
+ }
708
+ }
709
+
710
+ // Fill chars rectangles in atlas info
711
+ recs[i].x = (float)offsetX;
712
+ recs[i].y = (float)offsetY;
713
+ recs[i].width = (float)chars[i].image.width;
714
+ recs[i].height = (float)chars[i].image.height;
715
+
716
+ // Move atlas position X for next character drawing
717
+ offsetX += (chars[i].image.width + 2*padding);
718
+
719
+ if (offsetX >= (atlas.width - chars[i].image.width - 2*padding))
720
+ {
721
+ offsetX = padding;
722
+
723
+ // NOTE: Be careful on offsetY for SDF fonts, by default SDF
724
+ // use an internal padding of 4 pixels, it means char rectangle
725
+ // height is bigger than fontSize, it could be up to (fontSize + 8)
726
+ offsetY += (fontSize + 2*padding);
727
+
728
+ if (offsetY > (atlas.height - fontSize - padding)) break;
729
+ }
730
+ }
731
+ }
732
+ else if (packMethod == 1) // Use Skyline rect packing algorythm (stb_pack_rect)
733
+ {
734
+ stbrp_context *context = (stbrp_context *)RL_MALLOC(sizeof(*context));
735
+ stbrp_node *nodes = (stbrp_node *)RL_MALLOC(glyphCount*sizeof(*nodes));
736
+
737
+ stbrp_init_target(context, atlas.width, atlas.height, nodes, glyphCount);
738
+ stbrp_rect *rects = (stbrp_rect *)RL_MALLOC(glyphCount*sizeof(stbrp_rect));
739
+
740
+ // Fill rectangles for packaging
741
+ for (int i = 0; i < glyphCount; i++)
742
+ {
743
+ rects[i].id = i;
744
+ rects[i].w = chars[i].image.width + 2*padding;
745
+ rects[i].h = chars[i].image.height + 2*padding;
746
+ }
747
+
748
+ // Package rectangles into atlas
749
+ stbrp_pack_rects(context, rects, glyphCount);
750
+
751
+ for (int i = 0; i < glyphCount; i++)
752
+ {
753
+ // It return char rectangles in atlas
754
+ recs[i].x = rects[i].x + (float)padding;
755
+ recs[i].y = rects[i].y + (float)padding;
756
+ recs[i].width = (float)chars[i].image.width;
757
+ recs[i].height = (float)chars[i].image.height;
758
+
759
+ if (rects[i].was_packed)
760
+ {
761
+ // Copy pixel data from fc.data to atlas
762
+ for (int y = 0; y < chars[i].image.height; y++)
763
+ {
764
+ for (int x = 0; x < chars[i].image.width; x++)
765
+ {
766
+ ((unsigned char *)atlas.data)[(rects[i].y + padding + y)*atlas.width + (rects[i].x + padding + x)] = ((unsigned char *)chars[i].image.data)[y*chars[i].image.width + x];
767
+ }
768
+ }
769
+ }
770
+ else TRACELOG(LOG_WARNING, "FONT: Failed to package character (%i)", i);
771
+ }
772
+
773
+ RL_FREE(rects);
774
+ RL_FREE(nodes);
775
+ RL_FREE(context);
776
+ }
777
+
778
+ // Convert image data from GRAYSCALE to GRAY_ALPHA
779
+ unsigned char *dataGrayAlpha = (unsigned char *)RL_MALLOC(atlas.width*atlas.height*sizeof(unsigned char)*2); // Two channels
780
+
781
+ for (int i = 0, k = 0; i < atlas.width*atlas.height; i++, k += 2)
782
+ {
783
+ dataGrayAlpha[k] = 255;
784
+ dataGrayAlpha[k + 1] = ((unsigned char *)atlas.data)[i];
785
+ }
786
+
787
+ RL_FREE(atlas.data);
788
+ atlas.data = dataGrayAlpha;
789
+ atlas.format = PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA;
790
+
791
+ *charRecs = recs;
792
+
793
+ return atlas;
794
+ }
795
+ #endif
796
+
797
+ // Unload font glyphs info data (RAM)
798
+ void UnloadFontData(GlyphInfo *glyphs, int glyphCount)
799
+ {
800
+ for (int i = 0; i < glyphCount; i++) UnloadImage(glyphs[i].image);
801
+
802
+ RL_FREE(glyphs);
803
+ }
804
+
805
+ // Unload Font from GPU memory (VRAM)
806
+ void UnloadFont(Font font)
807
+ {
808
+ // NOTE: Make sure font is not default font (fallback)
809
+ if (font.texture.id != GetFontDefault().texture.id)
810
+ {
811
+ UnloadFontData(font.glyphs, font.glyphCount);
812
+ UnloadTexture(font.texture);
813
+ RL_FREE(font.recs);
814
+
815
+ TRACELOGD("FONT: Unloaded font data from RAM and VRAM");
816
+ }
817
+ }
818
+
819
+ // Draw current FPS
820
+ // NOTE: Uses default font
821
+ void DrawFPS(int posX, int posY)
822
+ {
823
+ Color color = LIME; // good fps
824
+ int fps = GetFPS();
825
+
826
+ if (fps < 30 && fps >= 15) color = ORANGE; // warning FPS
827
+ else if (fps < 15) color = RED; // bad FPS
828
+
829
+ DrawText(TextFormat("%2i FPS", GetFPS()), posX, posY, 20, color);
830
+ }
831
+
832
+ // Draw text (using default font)
833
+ // NOTE: fontSize work like in any drawing program but if fontSize is lower than font-base-size, then font-base-size is used
834
+ // NOTE: chars spacing is proportional to fontSize
835
+ void DrawText(const char *text, int posX, int posY, int fontSize, Color color)
836
+ {
837
+ // Check if default font has been loaded
838
+ if (GetFontDefault().texture.id != 0)
839
+ {
840
+ Vector2 position = { (float)posX, (float)posY };
841
+
842
+ int defaultFontSize = 10; // Default Font chars height in pixel
843
+ if (fontSize < defaultFontSize) fontSize = defaultFontSize;
844
+ int spacing = fontSize/defaultFontSize;
845
+
846
+ DrawTextEx(GetFontDefault(), text, position, (float)fontSize, (float)spacing, color);
847
+ }
848
+ }
849
+
850
+ // Draw text using Font
851
+ // NOTE: chars spacing is NOT proportional to fontSize
852
+ void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint)
853
+ {
854
+ if (font.texture.id == 0) font = GetFontDefault(); // Security check in case of not valid font
855
+
856
+ int size = TextLength(text); // Total size in bytes of the text, scanned by codepoints in loop
857
+
858
+ int textOffsetY = 0; // Offset between lines (on line break '\n')
859
+ float textOffsetX = 0.0f; // Offset X to next character to draw
860
+
861
+ float scaleFactor = fontSize/font.baseSize; // Character quad scaling factor
862
+
863
+ for (int i = 0; i < size;)
864
+ {
865
+ // Get next codepoint from byte string and glyph index in font
866
+ int codepointByteCount = 0;
867
+ int codepoint = GetCodepoint(&text[i], &codepointByteCount);
868
+ int index = GetGlyphIndex(font, codepoint);
869
+
870
+ // NOTE: Normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f)
871
+ // but we need to draw all of the bad bytes using the '?' symbol moving one byte
872
+ if (codepoint == 0x3f) codepointByteCount = 1;
873
+
874
+ if (codepoint == '\n')
875
+ {
876
+ // NOTE: Fixed line spacing of 1.5 line-height
877
+ // TODO: Support custom line spacing defined by user
878
+ textOffsetY += (int)((font.baseSize + font.baseSize/2)*scaleFactor);
879
+ textOffsetX = 0.0f;
880
+ }
881
+ else
882
+ {
883
+ if ((codepoint != ' ') && (codepoint != '\t'))
884
+ {
885
+ DrawTextCodepoint(font, codepoint, (Vector2){ position.x + textOffsetX, position.y + textOffsetY }, fontSize, tint);
886
+ }
887
+
888
+ if (font.glyphs[index].advanceX == 0) textOffsetX += ((float)font.recs[index].width*scaleFactor + spacing);
889
+ else textOffsetX += ((float)font.glyphs[index].advanceX*scaleFactor + spacing);
890
+ }
891
+
892
+ i += codepointByteCount; // Move text bytes counter to next codepoint
893
+ }
894
+ }
895
+
896
+ // Draw text using Font and pro parameters (rotation)
897
+ void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint)
898
+ {
899
+ rlPushMatrix();
900
+
901
+ rlTranslatef(position.x, position.y, 0.0f);
902
+ rlRotatef(rotation, 0.0f, 0.0f, 1.0f);
903
+ rlTranslatef(-origin.x, -origin.y, 0.0f);
904
+
905
+ DrawTextEx(font, text, (Vector2){ 0.0f, 0.0f }, fontSize, spacing, tint);
906
+
907
+ rlPopMatrix();
908
+ }
909
+
910
+ // Draw one character (codepoint)
911
+ void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint)
912
+ {
913
+ // Character index position in sprite font
914
+ // NOTE: In case a codepoint is not available in the font, index returned points to '?'
915
+ int index = GetGlyphIndex(font, codepoint);
916
+ float scaleFactor = fontSize/font.baseSize; // Character quad scaling factor
917
+
918
+ // Character destination rectangle on screen
919
+ // NOTE: We consider glyphPadding on drawing
920
+ Rectangle dstRec = { position.x + font.glyphs[index].offsetX*scaleFactor - (float)font.glyphPadding*scaleFactor,
921
+ position.y + font.glyphs[index].offsetY*scaleFactor - (float)font.glyphPadding*scaleFactor,
922
+ (font.recs[index].width + 2.0f*font.glyphPadding)*scaleFactor,
923
+ (font.recs[index].height + 2.0f*font.glyphPadding)*scaleFactor };
924
+
925
+ // Character source rectangle from font texture atlas
926
+ // NOTE: We consider chars padding when drawing, it could be required for outline/glow shader effects
927
+ Rectangle srcRec = { font.recs[index].x - (float)font.glyphPadding, font.recs[index].y - (float)font.glyphPadding,
928
+ font.recs[index].width + 2.0f*font.glyphPadding, font.recs[index].height + 2.0f*font.glyphPadding };
929
+
930
+ // Draw the character texture on the screen
931
+ DrawTexturePro(font.texture, srcRec, dstRec, (Vector2){ 0, 0 }, 0.0f, tint);
932
+ }
933
+
934
+ // Measure string width for default font
935
+ int MeasureText(const char *text, int fontSize)
936
+ {
937
+ Vector2 vec = { 0.0f, 0.0f };
938
+
939
+ // Check if default font has been loaded
940
+ if (GetFontDefault().texture.id != 0)
941
+ {
942
+ int defaultFontSize = 10; // Default Font chars height in pixel
943
+ if (fontSize < defaultFontSize) fontSize = defaultFontSize;
944
+ int spacing = fontSize/defaultFontSize;
945
+
946
+ vec = MeasureTextEx(GetFontDefault(), text, (float)fontSize, (float)spacing);
947
+ }
948
+
949
+ return (int)vec.x;
950
+ }
951
+
952
+ // Measure string size for Font
953
+ Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing)
954
+ {
955
+ int size = TextLength(text); // Get size in bytes of text
956
+ int tempByteCounter = 0; // Used to count longer text line num chars
957
+ int byteCounter = 0;
958
+
959
+ float textWidth = 0.0f;
960
+ float tempTextWidth = 0.0f; // Used to count longer text line width
961
+
962
+ float textHeight = (float)font.baseSize;
963
+ float scaleFactor = fontSize/(float)font.baseSize;
964
+
965
+ int letter = 0; // Current character
966
+ int index = 0; // Index position in sprite font
967
+
968
+ for (int i = 0; i < size; i++)
969
+ {
970
+ byteCounter++;
971
+
972
+ int next = 0;
973
+ letter = GetCodepoint(&text[i], &next);
974
+ index = GetGlyphIndex(font, letter);
975
+
976
+ // NOTE: normally we exit the decoding sequence as soon as a bad byte is found (and return 0x3f)
977
+ // but we need to draw all of the bad bytes using the '?' symbol so to not skip any we set next = 1
978
+ if (letter == 0x3f) next = 1;
979
+ i += next - 1;
980
+
981
+ if (letter != '\n')
982
+ {
983
+ if (font.glyphs[index].advanceX != 0) textWidth += font.glyphs[index].advanceX;
984
+ else textWidth += (font.recs[index].width + font.glyphs[index].offsetX);
985
+ }
986
+ else
987
+ {
988
+ if (tempTextWidth < textWidth) tempTextWidth = textWidth;
989
+ byteCounter = 0;
990
+ textWidth = 0;
991
+ textHeight += ((float)font.baseSize*1.5f); // NOTE: Fixed line spacing of 1.5 lines
992
+ }
993
+
994
+ if (tempByteCounter < byteCounter) tempByteCounter = byteCounter;
995
+ }
996
+
997
+ if (tempTextWidth < textWidth) tempTextWidth = textWidth;
998
+
999
+ Vector2 vec = { 0 };
1000
+ vec.x = tempTextWidth*scaleFactor + (float)((tempByteCounter - 1)*spacing); // Adds chars spacing to measure
1001
+ vec.y = textHeight*scaleFactor;
1002
+
1003
+ return vec;
1004
+ }
1005
+
1006
+ // Get index position for a unicode character on font
1007
+ // NOTE: If codepoint is not found in the font it fallbacks to '?'
1008
+ int GetGlyphIndex(Font font, int codepoint)
1009
+ {
1010
+ #ifndef GLYPH_NOTFOUND_CHAR_FALLBACK
1011
+ #define GLYPH_NOTFOUND_CHAR_FALLBACK 63 // Character used if requested codepoint is not found: '?'
1012
+ #endif
1013
+
1014
+ // Support charsets with any characters order
1015
+ #define SUPPORT_UNORDERED_CHARSET
1016
+ #if defined(SUPPORT_UNORDERED_CHARSET)
1017
+ int index = GLYPH_NOTFOUND_CHAR_FALLBACK;
1018
+
1019
+ for (int i = 0; i < font.glyphCount; i++)
1020
+ {
1021
+ if (font.glyphs[i].value == codepoint)
1022
+ {
1023
+ index = i;
1024
+ break;
1025
+ }
1026
+ }
1027
+
1028
+ return index;
1029
+ #else
1030
+ return (codepoint - 32);
1031
+ #endif
1032
+ }
1033
+
1034
+ // Get glyph font info data for a codepoint (unicode character)
1035
+ // NOTE: If codepoint is not found in the font it fallbacks to '?'
1036
+ GlyphInfo GetGlyphInfo(Font font, int codepoint)
1037
+ {
1038
+ GlyphInfo info = { 0 };
1039
+
1040
+ info = font.glyphs[GetGlyphIndex(font, codepoint)];
1041
+
1042
+ return info;
1043
+ }
1044
+
1045
+ // Get glyph rectangle in font atlas for a codepoint (unicode character)
1046
+ // NOTE: If codepoint is not found in the font it fallbacks to '?'
1047
+ Rectangle GetGlyphAtlasRec(Font font, int codepoint)
1048
+ {
1049
+ Rectangle rec = { 0 };
1050
+
1051
+ rec = font.recs[GetGlyphIndex(font, codepoint)];
1052
+
1053
+ return rec;
1054
+ }
1055
+
1056
+ //----------------------------------------------------------------------------------
1057
+ // Text strings management functions
1058
+ //----------------------------------------------------------------------------------
1059
+ // Get text length in bytes, check for \0 character
1060
+ unsigned int TextLength(const char *text)
1061
+ {
1062
+ unsigned int length = 0; //strlen(text)
1063
+
1064
+ if (text != NULL)
1065
+ {
1066
+ while (*text++) length++;
1067
+ }
1068
+
1069
+ return length;
1070
+ }
1071
+
1072
+ // Formatting of text with variables to 'embed'
1073
+ // WARNING: String returned will expire after this function is called MAX_TEXTFORMAT_BUFFERS times
1074
+ const char *TextFormat(const char *text, ...)
1075
+ {
1076
+ #ifndef MAX_TEXTFORMAT_BUFFERS
1077
+ #define MAX_TEXTFORMAT_BUFFERS 4 // Maximum number of static buffers for text formatting
1078
+ #endif
1079
+
1080
+ // We create an array of buffers so strings don't expire until MAX_TEXTFORMAT_BUFFERS invocations
1081
+ static char buffers[MAX_TEXTFORMAT_BUFFERS][MAX_TEXT_BUFFER_LENGTH] = { 0 };
1082
+ static int index = 0;
1083
+
1084
+ char *currentBuffer = buffers[index];
1085
+ memset(currentBuffer, 0, MAX_TEXT_BUFFER_LENGTH); // Clear buffer before using
1086
+
1087
+ va_list args;
1088
+ va_start(args, text);
1089
+ vsnprintf(currentBuffer, MAX_TEXT_BUFFER_LENGTH, text, args);
1090
+ va_end(args);
1091
+
1092
+ index += 1; // Move to next buffer for next function call
1093
+ if (index >= MAX_TEXTFORMAT_BUFFERS) index = 0;
1094
+
1095
+ return currentBuffer;
1096
+ }
1097
+
1098
+ // Get integer value from text
1099
+ // NOTE: This function replaces atoi() [stdlib.h]
1100
+ int TextToInteger(const char *text)
1101
+ {
1102
+ int value = 0;
1103
+ int sign = 1;
1104
+
1105
+ if ((text[0] == '+') || (text[0] == '-'))
1106
+ {
1107
+ if (text[0] == '-') sign = -1;
1108
+ text++;
1109
+ }
1110
+
1111
+ for (int i = 0; ((text[i] >= '0') && (text[i] <= '9')); ++i) value = value*10 + (int)(text[i] - '0');
1112
+
1113
+ return value*sign;
1114
+ }
1115
+
1116
+ #if defined(SUPPORT_TEXT_MANIPULATION)
1117
+ // Copy one string to another, returns bytes copied
1118
+ int TextCopy(char *dst, const char *src)
1119
+ {
1120
+ int bytes = 0;
1121
+
1122
+ if (dst != NULL)
1123
+ {
1124
+ while (*src != '\0')
1125
+ {
1126
+ *dst = *src;
1127
+ dst++;
1128
+ src++;
1129
+
1130
+ bytes++;
1131
+ }
1132
+
1133
+ *dst = '\0';
1134
+ }
1135
+
1136
+ return bytes;
1137
+ }
1138
+
1139
+ // Check if two text string are equal
1140
+ // REQUIRES: strcmp()
1141
+ bool TextIsEqual(const char *text1, const char *text2)
1142
+ {
1143
+ bool result = false;
1144
+
1145
+ if (strcmp(text1, text2) == 0) result = true;
1146
+
1147
+ return result;
1148
+ }
1149
+
1150
+ // Get a piece of a text string
1151
+ const char *TextSubtext(const char *text, int position, int length)
1152
+ {
1153
+ static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
1154
+
1155
+ int textLength = TextLength(text);
1156
+
1157
+ if (position >= textLength)
1158
+ {
1159
+ position = textLength - 1;
1160
+ length = 0;
1161
+ }
1162
+
1163
+ if (length >= textLength) length = textLength;
1164
+
1165
+ for (int c = 0 ; c < length ; c++)
1166
+ {
1167
+ *(buffer + c) = *(text + position);
1168
+ text++;
1169
+ }
1170
+
1171
+ *(buffer + length) = '\0';
1172
+
1173
+ return buffer;
1174
+ }
1175
+
1176
+ // Replace text string
1177
+ // REQUIRES: strstr(), strncpy(), strcpy()
1178
+ // WARNING: Returned buffer must be freed by the user (if return != NULL)
1179
+ char *TextReplace(char *text, const char *replace, const char *by)
1180
+ {
1181
+ // Sanity checks and initialization
1182
+ if (!text || !replace || !by) return NULL;
1183
+
1184
+ char *result;
1185
+
1186
+ char *insertPoint; // Next insert point
1187
+ char *temp; // Temp pointer
1188
+ int replaceLen; // Replace string length of (the string to remove)
1189
+ int byLen; // Replacement length (the string to replace replace by)
1190
+ int lastReplacePos; // Distance between replace and end of last replace
1191
+ int count; // Number of replacements
1192
+
1193
+ replaceLen = TextLength(replace);
1194
+ if (replaceLen == 0) return NULL; // Empty replace causes infinite loop during count
1195
+
1196
+ byLen = TextLength(by);
1197
+
1198
+ // Count the number of replacements needed
1199
+ insertPoint = text;
1200
+ for (count = 0; (temp = strstr(insertPoint, replace)); count++) insertPoint = temp + replaceLen;
1201
+
1202
+ // Allocate returning string and point temp to it
1203
+ temp = result = (char *)RL_MALLOC(TextLength(text) + (byLen - replaceLen)*count + 1);
1204
+
1205
+ if (!result) return NULL; // Memory could not be allocated
1206
+
1207
+ // First time through the loop, all the variable are set correctly from here on,
1208
+ // - 'temp' points to the end of the result string
1209
+ // - 'insertPoint' points to the next occurrence of replace in text
1210
+ // - 'text' points to the remainder of text after "end of replace"
1211
+ while (count--)
1212
+ {
1213
+ insertPoint = strstr(text, replace);
1214
+ lastReplacePos = (int)(insertPoint - text);
1215
+ temp = strncpy(temp, text, lastReplacePos) + lastReplacePos;
1216
+ temp = strcpy(temp, by) + byLen;
1217
+ text += lastReplacePos + replaceLen; // Move to next "end of replace"
1218
+ }
1219
+
1220
+ // Copy remaind text part after replacement to result (pointed by moving temp)
1221
+ strcpy(temp, text);
1222
+
1223
+ return result;
1224
+ }
1225
+
1226
+ // Insert text in a specific position, moves all text forward
1227
+ // WARNING: Allocated memory should be manually freed
1228
+ char *TextInsert(const char *text, const char *insert, int position)
1229
+ {
1230
+ int textLen = TextLength(text);
1231
+ int insertLen = TextLength(insert);
1232
+
1233
+ char *result = (char *)RL_MALLOC(textLen + insertLen + 1);
1234
+
1235
+ for (int i = 0; i < position; i++) result[i] = text[i];
1236
+ for (int i = position; i < insertLen + position; i++) result[i] = insert[i];
1237
+ for (int i = (insertLen + position); i < (textLen + insertLen); i++) result[i] = text[i];
1238
+
1239
+ result[textLen + insertLen] = '\0'; // Make sure text string is valid!
1240
+
1241
+ return result;
1242
+ }
1243
+
1244
+ // Join text strings with delimiter
1245
+ // REQUIRES: memset(), memcpy()
1246
+ const char *TextJoin(const char **textList, int count, const char *delimiter)
1247
+ {
1248
+ static char text[MAX_TEXT_BUFFER_LENGTH] = { 0 };
1249
+ memset(text, 0, MAX_TEXT_BUFFER_LENGTH);
1250
+ char *textPtr = text;
1251
+
1252
+ int totalLength = 0;
1253
+ int delimiterLen = TextLength(delimiter);
1254
+
1255
+ for (int i = 0; i < count; i++)
1256
+ {
1257
+ int textLength = TextLength(textList[i]);
1258
+
1259
+ // Make sure joined text could fit inside MAX_TEXT_BUFFER_LENGTH
1260
+ if ((totalLength + textLength) < MAX_TEXT_BUFFER_LENGTH)
1261
+ {
1262
+ memcpy(textPtr, textList[i], textLength);
1263
+ totalLength += textLength;
1264
+ textPtr += textLength;
1265
+
1266
+ if ((delimiterLen > 0) && (i < (count - 1)))
1267
+ {
1268
+ memcpy(textPtr, delimiter, delimiterLen);
1269
+ totalLength += delimiterLen;
1270
+ textPtr += delimiterLen;
1271
+ }
1272
+ }
1273
+ }
1274
+
1275
+ return text;
1276
+ }
1277
+
1278
+ // Split string into multiple strings
1279
+ // REQUIRES: memset()
1280
+ const char **TextSplit(const char *text, char delimiter, int *count)
1281
+ {
1282
+ // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter)
1283
+ // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated,
1284
+ // all used memory is static... it has some limitations:
1285
+ // 1. Maximum number of possible split strings is set by MAX_TEXTSPLIT_COUNT
1286
+ // 2. Maximum size of text to split is MAX_TEXT_BUFFER_LENGTH
1287
+
1288
+ static const char *result[MAX_TEXTSPLIT_COUNT] = { NULL };
1289
+ static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
1290
+ memset(buffer, 0, MAX_TEXT_BUFFER_LENGTH);
1291
+
1292
+ result[0] = buffer;
1293
+ int counter = 0;
1294
+
1295
+ if (text != NULL)
1296
+ {
1297
+ counter = 1;
1298
+
1299
+ // Count how many substrings we have on text and point to every one
1300
+ for (int i = 0; i < MAX_TEXT_BUFFER_LENGTH; i++)
1301
+ {
1302
+ buffer[i] = text[i];
1303
+ if (buffer[i] == '\0') break;
1304
+ else if (buffer[i] == delimiter)
1305
+ {
1306
+ buffer[i] = '\0'; // Set an end of string at this point
1307
+ result[counter] = buffer + i + 1;
1308
+ counter++;
1309
+
1310
+ if (counter == MAX_TEXTSPLIT_COUNT) break;
1311
+ }
1312
+ }
1313
+ }
1314
+
1315
+ *count = counter;
1316
+ return result;
1317
+ }
1318
+
1319
+ // Append text at specific position and move cursor!
1320
+ // REQUIRES: strcpy()
1321
+ void TextAppend(char *text, const char *append, int *position)
1322
+ {
1323
+ strcpy(text + *position, append);
1324
+ *position += TextLength(append);
1325
+ }
1326
+
1327
+ // Find first text occurrence within a string
1328
+ // REQUIRES: strstr()
1329
+ int TextFindIndex(const char *text, const char *find)
1330
+ {
1331
+ int position = -1;
1332
+
1333
+ char *ptr = strstr(text, find);
1334
+
1335
+ if (ptr != NULL) position = (int)(ptr - text);
1336
+
1337
+ return position;
1338
+ }
1339
+
1340
+ // Get upper case version of provided string
1341
+ // REQUIRES: toupper()
1342
+ const char *TextToUpper(const char *text)
1343
+ {
1344
+ static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
1345
+
1346
+ for (int i = 0; i < MAX_TEXT_BUFFER_LENGTH; i++)
1347
+ {
1348
+ if (text[i] != '\0')
1349
+ {
1350
+ buffer[i] = (char)toupper(text[i]);
1351
+ //if ((text[i] >= 'a') && (text[i] <= 'z')) buffer[i] = text[i] - 32;
1352
+
1353
+ // TODO: Support UTF-8 diacritics to upper-case
1354
+ //if ((text[i] >= 'à') && (text[i] <= 'ý')) buffer[i] = text[i] - 32;
1355
+ }
1356
+ else { buffer[i] = '\0'; break; }
1357
+ }
1358
+
1359
+ return buffer;
1360
+ }
1361
+
1362
+ // Get lower case version of provided string
1363
+ // REQUIRES: tolower()
1364
+ const char *TextToLower(const char *text)
1365
+ {
1366
+ static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
1367
+
1368
+ for (int i = 0; i < MAX_TEXT_BUFFER_LENGTH; i++)
1369
+ {
1370
+ if (text[i] != '\0')
1371
+ {
1372
+ buffer[i] = (char)tolower(text[i]);
1373
+ //if ((text[i] >= 'A') && (text[i] <= 'Z')) buffer[i] = text[i] + 32;
1374
+ }
1375
+ else { buffer[i] = '\0'; break; }
1376
+ }
1377
+
1378
+ return buffer;
1379
+ }
1380
+
1381
+ // Get Pascal case notation version of provided string
1382
+ // REQUIRES: toupper()
1383
+ const char *TextToPascal(const char *text)
1384
+ {
1385
+ static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
1386
+
1387
+ buffer[0] = (char)toupper(text[0]);
1388
+
1389
+ for (int i = 1, j = 1; i < MAX_TEXT_BUFFER_LENGTH; i++, j++)
1390
+ {
1391
+ if (text[j] != '\0')
1392
+ {
1393
+ if (text[j] != '_') buffer[i] = text[j];
1394
+ else
1395
+ {
1396
+ j++;
1397
+ buffer[i] = (char)toupper(text[j]);
1398
+ }
1399
+ }
1400
+ else { buffer[i] = '\0'; break; }
1401
+ }
1402
+
1403
+ return buffer;
1404
+ }
1405
+
1406
+ // Encode text codepoint into UTF-8 text
1407
+ // REQUIRES: memcpy()
1408
+ // WARNING: Allocated memory should be manually freed
1409
+ char *TextCodepointsToUTF8(int *codepoints, int length)
1410
+ {
1411
+ // We allocate enough memory fo fit all possible codepoints
1412
+ // NOTE: 5 bytes for every codepoint should be enough
1413
+ char *text = (char *)RL_CALLOC(length*5, 1);
1414
+ const char *utf8 = NULL;
1415
+ int size = 0;
1416
+
1417
+ for (int i = 0, bytes = 0; i < length; i++)
1418
+ {
1419
+ utf8 = CodepointToUTF8(codepoints[i], &bytes);
1420
+ memcpy(text + size, utf8, bytes);
1421
+ size += bytes;
1422
+ }
1423
+
1424
+ // Resize memory to text length + string NULL terminator
1425
+ void *ptr = RL_REALLOC(text, size + 1);
1426
+
1427
+ if (ptr != NULL) text = (char *)ptr;
1428
+
1429
+ return text;
1430
+ }
1431
+
1432
+ // Encode codepoint into utf8 text (char array length returned as parameter)
1433
+ // NOTE: It uses a static array to store UTF-8 bytes
1434
+ RLAPI const char *CodepointToUTF8(int codepoint, int *byteSize)
1435
+ {
1436
+ static char utf8[6] = { 0 };
1437
+ int size = 0; // Byte size of codepoint
1438
+
1439
+ if (codepoint <= 0x7f)
1440
+ {
1441
+ utf8[0] = (char)codepoint;
1442
+ size = 1;
1443
+ }
1444
+ else if (codepoint <= 0x7ff)
1445
+ {
1446
+ utf8[0] = (char)(((codepoint >> 6) & 0x1f) | 0xc0);
1447
+ utf8[1] = (char)((codepoint & 0x3f) | 0x80);
1448
+ size = 2;
1449
+ }
1450
+ else if (codepoint <= 0xffff)
1451
+ {
1452
+ utf8[0] = (char)(((codepoint >> 12) & 0x0f) | 0xe0);
1453
+ utf8[1] = (char)(((codepoint >> 6) & 0x3f) | 0x80);
1454
+ utf8[2] = (char)((codepoint & 0x3f) | 0x80);
1455
+ size = 3;
1456
+ }
1457
+ else if (codepoint <= 0x10ffff)
1458
+ {
1459
+ utf8[0] = (char)(((codepoint >> 18) & 0x07) | 0xf0);
1460
+ utf8[1] = (char)(((codepoint >> 12) & 0x3f) | 0x80);
1461
+ utf8[2] = (char)(((codepoint >> 6) & 0x3f) | 0x80);
1462
+ utf8[3] = (char)((codepoint & 0x3f) | 0x80);
1463
+ size = 4;
1464
+ }
1465
+
1466
+ *byteSize = size;
1467
+
1468
+ return utf8;
1469
+ }
1470
+
1471
+ // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter
1472
+ int *LoadCodepoints(const char *text, int *count)
1473
+ {
1474
+ int textLength = TextLength(text);
1475
+
1476
+ int bytesProcessed = 0;
1477
+ int codepointCount = 0;
1478
+
1479
+ // Allocate a big enough buffer to store as many codepoints as text bytes
1480
+ int *codepoints = RL_CALLOC(textLength, sizeof(int));
1481
+
1482
+ for (int i = 0; i < textLength; codepointCount++)
1483
+ {
1484
+ codepoints[codepointCount] = GetCodepoint(text + i, &bytesProcessed);
1485
+ i += bytesProcessed;
1486
+ }
1487
+
1488
+ // Re-allocate buffer to the actual number of codepoints loaded
1489
+ void *temp = RL_REALLOC(codepoints, codepointCount*sizeof(int));
1490
+ if (temp != NULL) codepoints = temp;
1491
+
1492
+ *count = codepointCount;
1493
+
1494
+ return codepoints;
1495
+ }
1496
+
1497
+ // Unload codepoints data from memory
1498
+ void UnloadCodepoints(int *codepoints)
1499
+ {
1500
+ RL_FREE(codepoints);
1501
+ }
1502
+
1503
+ // Get total number of characters(codepoints) in a UTF-8 encoded text, until '\0' is found
1504
+ // NOTE: If an invalid UTF-8 sequence is encountered a '?'(0x3f) codepoint is counted instead
1505
+ int GetCodepointCount(const char *text)
1506
+ {
1507
+ unsigned int length = 0;
1508
+ char *ptr = (char *)&text[0];
1509
+
1510
+ while (*ptr != '\0')
1511
+ {
1512
+ int next = 0;
1513
+ int letter = GetCodepoint(ptr, &next);
1514
+
1515
+ if (letter == 0x3f) ptr += 1;
1516
+ else ptr += next;
1517
+
1518
+ length++;
1519
+ }
1520
+
1521
+ return length;
1522
+ }
1523
+ #endif // SUPPORT_TEXT_MANIPULATION
1524
+
1525
+ // Get next codepoint in a UTF-8 encoded text, scanning until '\0' is found
1526
+ // When a invalid UTF-8 byte is encountered we exit as soon as possible and a '?'(0x3f) codepoint is returned
1527
+ // Total number of bytes processed are returned as a parameter
1528
+ // NOTE: The standard says U+FFFD should be returned in case of errors
1529
+ // but that character is not supported by the default font in raylib
1530
+ int GetCodepoint(const char *text, int *bytesProcessed)
1531
+ {
1532
+ /*
1533
+ UTF-8 specs from https://www.ietf.org/rfc/rfc3629.txt
1534
+
1535
+ Char. number range | UTF-8 octet sequence
1536
+ (hexadecimal) | (binary)
1537
+ --------------------+---------------------------------------------
1538
+ 0000 0000-0000 007F | 0xxxxxxx
1539
+ 0000 0080-0000 07FF | 110xxxxx 10xxxxxx
1540
+ 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
1541
+ 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1542
+ */
1543
+ // NOTE: on decode errors we return as soon as possible
1544
+
1545
+ int code = 0x3f; // Codepoint (defaults to '?')
1546
+ int octet = (unsigned char)(text[0]); // The first UTF8 octet
1547
+ *bytesProcessed = 1;
1548
+
1549
+ if (octet <= 0x7f)
1550
+ {
1551
+ // Only one octet (ASCII range x00-7F)
1552
+ code = text[0];
1553
+ }
1554
+ else if ((octet & 0xe0) == 0xc0)
1555
+ {
1556
+ // Two octets
1557
+
1558
+ // [0]xC2-DF [1]UTF8-tail(x80-BF)
1559
+ unsigned char octet1 = text[1];
1560
+
1561
+ if ((octet1 == '\0') || ((octet1 >> 6) != 2)) { *bytesProcessed = 2; return code; } // Unexpected sequence
1562
+
1563
+ if ((octet >= 0xc2) && (octet <= 0xdf))
1564
+ {
1565
+ code = ((octet & 0x1f) << 6) | (octet1 & 0x3f);
1566
+ *bytesProcessed = 2;
1567
+ }
1568
+ }
1569
+ else if ((octet & 0xf0) == 0xe0)
1570
+ {
1571
+ // Three octets
1572
+ unsigned char octet1 = text[1];
1573
+ unsigned char octet2 = '\0';
1574
+
1575
+ if ((octet1 == '\0') || ((octet1 >> 6) != 2)) { *bytesProcessed = 2; return code; } // Unexpected sequence
1576
+
1577
+ octet2 = text[2];
1578
+
1579
+ if ((octet2 == '\0') || ((octet2 >> 6) != 2)) { *bytesProcessed = 3; return code; } // Unexpected sequence
1580
+
1581
+ // [0]xE0 [1]xA0-BF [2]UTF8-tail(x80-BF)
1582
+ // [0]xE1-EC [1]UTF8-tail [2]UTF8-tail(x80-BF)
1583
+ // [0]xED [1]x80-9F [2]UTF8-tail(x80-BF)
1584
+ // [0]xEE-EF [1]UTF8-tail [2]UTF8-tail(x80-BF)
1585
+
1586
+ if (((octet == 0xe0) && !((octet1 >= 0xa0) && (octet1 <= 0xbf))) ||
1587
+ ((octet == 0xed) && !((octet1 >= 0x80) && (octet1 <= 0x9f)))) { *bytesProcessed = 2; return code; }
1588
+
1589
+ if ((octet >= 0xe0) && (0 <= 0xef))
1590
+ {
1591
+ code = ((octet & 0xf) << 12) | ((octet1 & 0x3f) << 6) | (octet2 & 0x3f);
1592
+ *bytesProcessed = 3;
1593
+ }
1594
+ }
1595
+ else if ((octet & 0xf8) == 0xf0)
1596
+ {
1597
+ // Four octets
1598
+ if (octet > 0xf4) return code;
1599
+
1600
+ unsigned char octet1 = text[1];
1601
+ unsigned char octet2 = '\0';
1602
+ unsigned char octet3 = '\0';
1603
+
1604
+ if ((octet1 == '\0') || ((octet1 >> 6) != 2)) { *bytesProcessed = 2; return code; } // Unexpected sequence
1605
+
1606
+ octet2 = text[2];
1607
+
1608
+ if ((octet2 == '\0') || ((octet2 >> 6) != 2)) { *bytesProcessed = 3; return code; } // Unexpected sequence
1609
+
1610
+ octet3 = text[3];
1611
+
1612
+ if ((octet3 == '\0') || ((octet3 >> 6) != 2)) { *bytesProcessed = 4; return code; } // Unexpected sequence
1613
+
1614
+ // [0]xF0 [1]x90-BF [2]UTF8-tail [3]UTF8-tail
1615
+ // [0]xF1-F3 [1]UTF8-tail [2]UTF8-tail [3]UTF8-tail
1616
+ // [0]xF4 [1]x80-8F [2]UTF8-tail [3]UTF8-tail
1617
+
1618
+ if (((octet == 0xf0) && !((octet1 >= 0x90) && (octet1 <= 0xbf))) ||
1619
+ ((octet == 0xf4) && !((octet1 >= 0x80) && (octet1 <= 0x8f)))) { *bytesProcessed = 2; return code; } // Unexpected sequence
1620
+
1621
+ if (octet >= 0xf0)
1622
+ {
1623
+ code = ((octet & 0x7) << 18) | ((octet1 & 0x3f) << 12) | ((octet2 & 0x3f) << 6) | (octet3 & 0x3f);
1624
+ *bytesProcessed = 4;
1625
+ }
1626
+ }
1627
+
1628
+ if (code > 0x10ffff) code = 0x3f; // Codepoints after U+10ffff are invalid
1629
+
1630
+ return code;
1631
+ }
1632
+
1633
+ //----------------------------------------------------------------------------------
1634
+ // Module specific Functions Definition
1635
+ //----------------------------------------------------------------------------------
1636
+ #if defined(SUPPORT_FILEFORMAT_FNT)
1637
+
1638
+ // Read a line from memory
1639
+ // REQUIRES: memcpy()
1640
+ // NOTE: Returns the number of bytes read
1641
+ static int GetLine(const char *origin, char *buffer, int maxLength)
1642
+ {
1643
+ int count = 0;
1644
+ for (; count < maxLength; count++) if (origin[count] == '\n') break;
1645
+ memcpy(buffer, origin, count);
1646
+ return count;
1647
+ }
1648
+
1649
+ // Load a BMFont file (AngelCode font file)
1650
+ // REQUIRES: strstr(), sscanf(), strrchr(), memcpy()
1651
+ static Font LoadBMFont(const char *fileName)
1652
+ {
1653
+ #define MAX_BUFFER_SIZE 256
1654
+
1655
+ Font font = { 0 };
1656
+
1657
+ char buffer[MAX_BUFFER_SIZE] = { 0 };
1658
+ char *searchPoint = NULL;
1659
+
1660
+ int fontSize = 0;
1661
+ int glyphCount = 0;
1662
+
1663
+ int imWidth = 0;
1664
+ int imHeight = 0;
1665
+ char imFileName[129];
1666
+
1667
+ int base = 0; // Useless data
1668
+
1669
+ char *fileText = LoadFileText(fileName);
1670
+
1671
+ if (fileText == NULL) return font;
1672
+
1673
+ char *fileTextPtr = fileText;
1674
+
1675
+ // NOTE: We skip first line, it contains no useful information
1676
+ int lineBytes = GetLine(fileTextPtr, buffer, MAX_BUFFER_SIZE);
1677
+ fileTextPtr += (lineBytes + 1);
1678
+
1679
+ // Read line data
1680
+ lineBytes = GetLine(fileTextPtr, buffer, MAX_BUFFER_SIZE);
1681
+ searchPoint = strstr(buffer, "lineHeight");
1682
+ sscanf(searchPoint, "lineHeight=%i base=%i scaleW=%i scaleH=%i", &fontSize, &base, &imWidth, &imHeight);
1683
+ fileTextPtr += (lineBytes + 1);
1684
+
1685
+ TRACELOGD("FONT: [%s] Loaded font info:", fileName);
1686
+ TRACELOGD(" > Base size: %i", fontSize);
1687
+ TRACELOGD(" > Texture scale: %ix%i", imWidth, imHeight);
1688
+
1689
+ lineBytes = GetLine(fileTextPtr, buffer, MAX_BUFFER_SIZE);
1690
+ searchPoint = strstr(buffer, "file");
1691
+ sscanf(searchPoint, "file=\"%128[^\"]\"", imFileName);
1692
+ fileTextPtr += (lineBytes + 1);
1693
+
1694
+ TRACELOGD(" > Texture filename: %s", imFileName);
1695
+
1696
+ lineBytes = GetLine(fileTextPtr, buffer, MAX_BUFFER_SIZE);
1697
+ searchPoint = strstr(buffer, "count");
1698
+ sscanf(searchPoint, "count=%i", &glyphCount);
1699
+ fileTextPtr += (lineBytes + 1);
1700
+
1701
+ TRACELOGD(" > Chars count: %i", glyphCount);
1702
+
1703
+ // Compose correct path using route of .fnt file (fileName) and imFileName
1704
+ char *imPath = NULL;
1705
+ char *lastSlash = NULL;
1706
+
1707
+ lastSlash = strrchr(fileName, '/');
1708
+ if (lastSlash == NULL) lastSlash = strrchr(fileName, '\\');
1709
+
1710
+ if (lastSlash != NULL)
1711
+ {
1712
+ // NOTE: We need some extra space to avoid memory corruption on next allocations!
1713
+ imPath = RL_CALLOC(TextLength(fileName) - TextLength(lastSlash) + TextLength(imFileName) + 4, 1);
1714
+ memcpy(imPath, fileName, TextLength(fileName) - TextLength(lastSlash) + 1);
1715
+ memcpy(imPath + TextLength(fileName) - TextLength(lastSlash) + 1, imFileName, TextLength(imFileName));
1716
+ }
1717
+ else imPath = imFileName;
1718
+
1719
+ TRACELOGD(" > Image loading path: %s", imPath);
1720
+
1721
+ Image imFont = LoadImage(imPath);
1722
+
1723
+ if (imFont.format == PIXELFORMAT_UNCOMPRESSED_GRAYSCALE)
1724
+ {
1725
+ // Convert image to GRAYSCALE + ALPHA, using the mask as the alpha channel
1726
+ Image imFontAlpha = {
1727
+ .data = calloc(imFont.width*imFont.height, 2),
1728
+ .width = imFont.width,
1729
+ .height = imFont.height,
1730
+ .format = PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA,
1731
+ .mipmaps = 1
1732
+ };
1733
+
1734
+ for (int p = 0, i = 0; p < (imFont.width*imFont.height*2); p += 2, i++)
1735
+ {
1736
+ ((unsigned char *)(imFontAlpha.data))[p] = 0xff;
1737
+ ((unsigned char *)(imFontAlpha.data))[p + 1] = ((unsigned char *)imFont.data)[i];
1738
+ }
1739
+
1740
+ UnloadImage(imFont);
1741
+ imFont = imFontAlpha;
1742
+ }
1743
+
1744
+ font.texture = LoadTextureFromImage(imFont);
1745
+
1746
+ if (lastSlash != NULL) RL_FREE(imPath);
1747
+
1748
+ // Fill font characters info data
1749
+ font.baseSize = fontSize;
1750
+ font.glyphCount = glyphCount;
1751
+ font.glyphPadding = 0;
1752
+ font.glyphs = (GlyphInfo *)RL_MALLOC(glyphCount*sizeof(GlyphInfo));
1753
+ font.recs = (Rectangle *)RL_MALLOC(glyphCount*sizeof(Rectangle));
1754
+
1755
+ int charId, charX, charY, charWidth, charHeight, charOffsetX, charOffsetY, charAdvanceX;
1756
+
1757
+ for (int i = 0; i < glyphCount; i++)
1758
+ {
1759
+ lineBytes = GetLine(fileTextPtr, buffer, MAX_BUFFER_SIZE);
1760
+ sscanf(buffer, "char id=%i x=%i y=%i width=%i height=%i xoffset=%i yoffset=%i xadvance=%i",
1761
+ &charId, &charX, &charY, &charWidth, &charHeight, &charOffsetX, &charOffsetY, &charAdvanceX);
1762
+ fileTextPtr += (lineBytes + 1);
1763
+
1764
+ // Get character rectangle in the font atlas texture
1765
+ font.recs[i] = (Rectangle){ (float)charX, (float)charY, (float)charWidth, (float)charHeight };
1766
+
1767
+ // Save data properly in sprite font
1768
+ font.glyphs[i].value = charId;
1769
+ font.glyphs[i].offsetX = charOffsetX;
1770
+ font.glyphs[i].offsetY = charOffsetY;
1771
+ font.glyphs[i].advanceX = charAdvanceX;
1772
+
1773
+ // Fill character image data from imFont data
1774
+ font.glyphs[i].image = ImageFromImage(imFont, font.recs[i]);
1775
+ }
1776
+
1777
+ UnloadImage(imFont);
1778
+ UnloadFileText(fileText);
1779
+
1780
+ if (font.texture.id == 0)
1781
+ {
1782
+ UnloadFont(font);
1783
+ font = GetFontDefault();
1784
+ TRACELOG(LOG_WARNING, "FONT: [%s] Failed to load texture, reverted to default font", fileName);
1785
+ }
1786
+ else TRACELOG(LOG_INFO, "FONT: [%s] Font loaded successfully (%i glyphs)", fileName, font.glyphCount);
1787
+
1788
+ return font;
1789
+ }
1790
+ #endif