From 6f318f53dd7a8fa9629be329231aeb5c321e2df3 Mon Sep 17 00:00:00 2001 From: indigoparadox Date: Tue, 28 May 2024 23:41:54 +0000 Subject: [PATCH] deploy: 11aed4e35af8429a7d3bb0eee899ceda12230106 --- .nojekyll | 0 annotated.html | 142 + bc_s.png | Bin 0 -> 676 bytes bc_sd.png | Bin 0 -> 635 bytes classes.html | 108 + clipboard.js | 61 + closed.png | Bin 0 -> 132 bytes cookie.js | 58 + dir_68267d1309a1af8e8297ef4c3efbcdba.html | 149 + doc.svg | 12 + docd.svg | 12 + doxstyle.css | 70 + doxygen.css | 2226 ++++++ doxygen.svg | 28 + doxygen_crawl.html | 471 ++ dynsections.js | 198 + files.html | 123 + folderclosed.svg | 11 + folderclosedd.svg | 11 + folderopen.svg | 17 + folderopend.svg | 12 + functions.html | 206 + functions_func.html | 100 + functions_vars.html | 204 + globals.html | 217 + globals_defs.html | 174 + globals_func.html | 135 + globals_type.html | 110 + graph_legend.html | 159 + graph_legend.md5 | 1 + graph_legend.png | Bin 0 -> 23252 bytes group__maug__cli.html | 206 + group__maug__console.html | 201 + group__maug__error.html | 279 + group__maug__error.map | 4 + group__maug__error.md5 | 1 + group__maug__error.png | Bin 0 -> 3740 bytes group__maug__error__retvals.html | 153 + group__maug__error__retvals.map | 4 + group__maug__error__retvals.md5 | 1 + group__maug__error__retvals.png | Bin 0 -> 3748 bytes group__maug__fmt.html | 214 + group__maug__fmt.map | 4 + group__maug__fmt.md5 | 1 + group__maug__fmt.png | Bin 0 -> 4802 bytes group__maug__fmt__bmp.html | 203 + group__maug__fmt__bmp.map | 4 + group__maug__fmt__bmp.md5 | 1 + group__maug__fmt__bmp.png | Bin 0 -> 4829 bytes group__maug__mem.html | 229 + group__maug__mfile.html | 589 ++ group__maug__mfile.map | 4 + group__maug__mfile.md5 | 1 + group__maug__mfile.png | Bin 0 -> 3375 bytes group__maug__mfile__types.html | 128 + group__maug__mfile__types.map | 4 + group__maug__mfile__types.md5 | 1 + group__maug__mfile__types.png | Bin 0 -> 3407 bytes group__maug__retroflt.html | 453 ++ group__maug__retroflt.map | 15 + group__maug__retroflt.md5 | 1 + group__maug__retroflt.png | Bin 0 -> 41481 bytes group__maug__retroflt__assets.html | 132 + group__maug__retroflt__assets.map | 4 + group__maug__retroflt__assets.md5 | 1 + group__maug__retroflt__assets.png | Bin 0 -> 3485 bytes group__maug__retroflt__bitmap.html | 309 + group__maug__retroflt__bitmap.map | 4 + group__maug__retroflt__bitmap.md5 | 1 + group__maug__retroflt__bitmap.png | Bin 0 -> 3964 bytes group__maug__retroflt__color.html | 227 + group__maug__retroflt__color.map | 5 + group__maug__retroflt__color.md5 | 1 + group__maug__retroflt__color.png | Bin 0 -> 6451 bytes group__maug__retroflt__compiling.html | 303 + group__maug__retroflt__compiling.map | 4 + group__maug__retroflt__compiling.md5 | 1 + group__maug__retroflt__compiling.png | Bin 0 -> 3816 bytes group__maug__retroflt__config.html | 309 + group__maug__retroflt__config.map | 6 + group__maug__retroflt__config.md5 | 1 + group__maug__retroflt__config.png | Bin 0 -> 10619 bytes group__maug__retroflt__config__btypes.html | 127 + group__maug__retroflt__config__btypes.map | 4 + group__maug__retroflt__config__btypes.md5 | 1 + group__maug__retroflt__config__btypes.png | Bin 0 -> 5898 bytes group__maug__retroflt__config__flags.html | 145 + group__maug__retroflt__config__flags.map | 4 + group__maug__retroflt__config__flags.md5 | 1 + group__maug__retroflt__config__flags.png | Bin 0 -> 4845 bytes group__maug__retroflt__drawing.html | 575 ++ group__maug__retroflt__drawing.map | 5 + group__maug__retroflt__drawing.md5 | 1 + group__maug__retroflt__drawing.png | Bin 0 -> 5869 bytes group__maug__retroflt__example.html | 218 + group__maug__retroflt__example.map | 4 + group__maug__retroflt__example.md5 | 1 + group__maug__retroflt__example.png | Bin 0 -> 3633 bytes group__maug__retroflt__flags.html | 204 + group__maug__retroflt__flags.map | 4 + group__maug__retroflt__flags.md5 | 1 + group__maug__retroflt__flags.png | Bin 0 -> 3425 bytes group__maug__retroflt__input.html | 276 + group__maug__retroflt__input.map | 5 + group__maug__retroflt__input.md5 | 1 + group__maug__retroflt__input.png | Bin 0 -> 6229 bytes group__maug__retroflt__keydefs.html | 264 + group__maug__retroflt__keydefs.map | 4 + group__maug__retroflt__keydefs.md5 | 1 + group__maug__retroflt__keydefs.png | Bin 0 -> 4700 bytes group__maug__retroflt__msg__api.html | 135 + group__maug__retroflt__msg__api.map | 4 + group__maug__retroflt__msg__api.md5 | 1 + group__maug__retroflt__msg__api.png | Bin 0 -> 4133 bytes group__maug__retroflt__retval.html | 139 + group__maug__retroflt__retval.map | 4 + group__maug__retroflt__retval.md5 | 1 + group__maug__retroflt__retval.png | Bin 0 -> 4364 bytes group__maug__retroflt__vdp.html | 184 + group__maug__retroflt__vdp.map | 4 + group__maug__retroflt__vdp.md5 | 1 + group__maug__retroflt__vdp.png | Bin 0 -> 3527 bytes group__maug__retrofp.html | 141 + group__maug__retroglu.html | 371 + group__maug__retroglu.map | 6 + group__maug__retroglu.md5 | 1 + group__maug__retroglu.png | Bin 0 -> 10421 bytes group__maug__retroglu__obj__fsm.html | 304 + group__maug__retroglu__obj__fsm.map | 5 + group__maug__retroglu__obj__fsm.md5 | 1 + group__maug__retroglu__obj__fsm.png | Bin 0 -> 7725 bytes group__maug__retroglu__obj__fsm__states.html | 217 + group__maug__retroglu__obj__fsm__states.map | 4 + group__maug__retroglu__obj__fsm__states.md5 | 1 + group__maug__retroglu__obj__fsm__states.png | Bin 0 -> 5826 bytes group__maug__retroglu__overlay.html | 255 + group__maug__retroglu__overlay.map | 4 + group__maug__retroglu__overlay.md5 | 1 + group__maug__retroglu__overlay.png | Bin 0 -> 4566 bytes group__maug__retroglu__sprite.html | 135 + group__maug__retroglu__sprite.map | 4 + group__maug__retroglu__sprite.md5 | 1 + group__maug__retroglu__sprite.png | Bin 0 -> 4123 bytes group__maug__retrogui.html | 300 + group__maug__retrogui.map | 4 + group__maug__retrogui.md5 | 1 + group__maug__retrogui.png | Bin 0 -> 3927 bytes group__maug__retrogui__ctl.html | 192 + group__maug__retrogui__ctl.map | 4 + group__maug__retrogui__ctl.md5 | 1 + group__maug__retrogui__ctl.png | Bin 0 -> 3965 bytes group__maug__retrosnd.html | 236 + group__maug__retrosnd.map | 4 + group__maug__retrosnd.md5 | 1 + group__maug__retrosnd.png | Bin 0 -> 4711 bytes group__maug__retrosnd__flags.html | 123 + group__maug__retrosnd__flags.map | 4 + group__maug__retrosnd__flags.md5 | 1 + group__maug__retrosnd__flags.png | Bin 0 -> 4681 bytes group__maug__uprintf.html | 385 + group__retrofont.html | 194 + group__retrohtr.html | 379 + group__retrotile.html | 215 + group__retrotile.map | 6 + group__retrotile.md5 | 1 + group__retrotile.png | Bin 0 -> 7943 bytes group__retrotile__defs.html | 162 + group__retrotile__defs.map | 5 + group__retrotile__defs.md5 | 1 + group__retrotile__defs.png | Bin 0 -> 7134 bytes group__retrotile__defs__types.html | 133 + group__retrotile__defs__types.map | 4 + group__retrotile__defs__types.md5 | 1 + group__retrotile__defs__types.png | Bin 0 -> 5448 bytes group__retrotile__gen.html | 334 + group__retrotile__gen.map | 4 + group__retrotile__gen.md5 | 1 + group__retrotile__gen.png | Bin 0 -> 3713 bytes group__retrotile__parser.html | 176 + group__retrotile__parser.map | 4 + group__retrotile__parser.md5 | 1 + group__retrotile__parser.png | Bin 0 -> 3114 bytes index.html | 178 + jquery.js | 34 + marge_8h_source.html | 372 + menu.js | 134 + menudata.js | 78 + merror_8h.html | 184 + merror_8h__dep__incl.map | 7 + merror_8h__dep__incl.md5 | 1 + merror_8h__dep__incl.png | Bin 0 -> 3887 bytes merror_8h_source.html | 177 + mfile_8h.html | 206 + mfile_8h__dep__incl.map | 7 + mfile_8h__dep__incl.md5 | 1 + mfile_8h__dep__incl.png | Bin 0 -> 3873 bytes mfile_8h__incl.map | 5 + mfile_8h__incl.md5 | 1 + mfile_8h__incl.png | Bin 0 -> 2561 bytes mfile_8h_source.html | 528 ++ mfmt_8h.html | 231 + mfmt_8h__incl.map | 7 + mfmt_8h__incl.md5 | 1 + mfmt_8h__incl.png | Bin 0 -> 3676 bytes mfmt_8h_source.html | 821 ++ mhtml_8h_source.html | 1031 +++ minus.svg | 8 + minusd.svg | 8 + mmem_8h.html | 151 + mmem_8h__incl.map | 5 + mmem_8h__incl.md5 | 1 + mmem_8h__incl.png | Bin 0 -> 2240 bytes mmem_8h_source.html | 165 + mplug_8h_source.html | 216 + nav_f.png | Bin 0 -> 153 bytes nav_fd.png | Bin 0 -> 169 bytes nav_g.png | Bin 0 -> 95 bytes nav_h.png | Bin 0 -> 98 bytes nav_hd.png | Bin 0 -> 114 bytes navtree.css | 149 + open.png | Bin 0 -> 123 bytes pages.html | 104 + plus.svg | 9 + plusd.svg | 9 + resize.js | 145 + retrocon_8h_source.html | 493 ++ retroflt_8h.html | 754 ++ retroflt_8h__incl.map | 21 + retroflt_8h__incl.md5 | 1 + retroflt_8h__incl.png | Bin 0 -> 19440 bytes retroflt_8h_source.html | 7081 +++++++++++++++++ retrofnt_8h.html | 145 + retrofnt_8h_source.html | 457 ++ retrofp_8h.html | 145 + retrofp_8h_source.html | 296 + retroglu_8h.html | 408 + retroglu_8h_source.html | 1642 ++++ retrogui_8h.html | 219 + retrogui_8h_source.html | 1345 ++++ retrogxc_8h_source.html | 638 ++ retrohtr_8h.html | 183 + retrohtr_8h_source.html | 1413 ++++ retrosft_8h_source.html | 543 ++ retrosnd_8h.html | 203 + retrosnd_8h_source.html | 925 +++ retrotil_8h_source.html | 1688 ++++ search/all_0.js | 7 + search/all_1.js | 8 + search/all_10.js | 20 + search/all_11.js | 10 + search/all_12.js | 4 + search/all_13.js | 12 + search/all_14.js | 4 + search/all_2.js | 16 + search/all_3.js | 5 + search/all_4.js | 5 + search/all_5.js | 12 + search/all_6.js | 5 + search/all_7.js | 8 + search/all_8.js | 7 + search/all_9.js | 4 + search/all_a.js | 5 + search/all_b.js | 51 + search/all_c.js | 9 + search/all_d.js | 6 + search/all_e.js | 12 + search/all_f.js | 180 + search/classes_0.js | 12 + search/classes_1.js | 33 + search/close.svg | 18 + search/files_0.js | 7 + search/files_1.js | 10 + search/files_2.js | 4 + search/functions_0.js | 8 + search/functions_1.js | 37 + search/groups_0.js | 6 + search/groups_1.js | 6 + search/groups_10.js | 5 + search/groups_11.js | 5 + search/groups_2.js | 12 + search/groups_3.js | 5 + search/groups_4.js | 5 + search/groups_5.js | 9 + search/groups_6.js | 5 + search/groups_7.js | 5 + search/groups_8.js | 5 + search/groups_9.js | 4 + search/groups_a.js | 4 + search/groups_b.js | 10 + search/groups_c.js | 6 + search/groups_d.js | 8 + search/groups_e.js | 39 + search/groups_f.js | 7 + search/mag.svg | 24 + search/mag_d.svg | 24 + search/mag_sel.svg | 31 + search/mag_seld.svg | 31 + search/pages_0.js | 4 + search/pages_1.js | 4 + search/pages_2.js | 4 + search/pages_3.js | 6 + search/pages_4.js | 4 + search/pages_5.js | 5 + search/pages_6.js | 4 + search/search.css | 291 + search/search.js | 694 ++ search/searchdata.js | 36 + search/typedefs_0.js | 8 + search/typedefs_1.js | 10 + search/variables_0.js | 4 + search/variables_1.js | 5 + search/variables_2.js | 6 + search/variables_3.js | 6 + search/variables_4.js | 6 + search/variables_5.js | 5 + search/variables_6.js | 8 + search/variables_7.js | 7 + search/variables_8.js | 6 + search/variables_9.js | 4 + search/variables_a.js | 16 + search/variables_b.js | 7 + search/variables_c.js | 10 + search/variables_d.js | 4 + splitbar.png | Bin 0 -> 314 bytes splitbard.png | Bin 0 -> 282 bytes structMFILE__CADDY.html | 140 + structMFILE__CADDY__coll__graph.map | 5 + structMFILE__CADDY__coll__graph.md5 | 1 + structMFILE__CADDY__coll__graph.png | Bin 0 -> 3641 bytes structMFMT__STRUCT.html | 119 + structMFMT__STRUCT__BMPFILE.html | 136 + structMFMT__STRUCT__BMPFILE__coll__graph.map | 5 + structMFMT__STRUCT__BMPFILE__coll__graph.md5 | 1 + structMFMT__STRUCT__BMPFILE__coll__graph.png | Bin 0 -> 5467 bytes structMFMT__STRUCT__BMPINFO.html | 173 + structMHTML__PARSER.html | 163 + structMHTML__PARSER__coll__graph.map | 7 + structMHTML__PARSER__coll__graph.md5 | 1 + structMHTML__PARSER__coll__graph.png | Bin 0 -> 7322 bytes structMHTML__TAG__BASE.html | 138 + structRETROCON.html | 165 + structRETROCON__coll__graph.map | 4 + structRETROCON__coll__graph.md5 | 1 + structRETROCON__coll__graph.png | Bin 0 -> 2708 bytes structRETROFLAT__ARGS.html | 157 + structRETROFLAT__BITMAP.html | 136 + structRETROFLAT__CACHE__ASSET.html | 117 + structRETROFLAT__INPUT.html | 126 + structRETROFLAT__STATE.html | 224 + structRETROFLAT__STATE__coll__graph.map | 5 + structRETROFLAT__STATE__coll__graph.md5 | 1 + structRETROFLAT__STATE__coll__graph.png | Bin 0 -> 5901 bytes structRETROFONT.html | 126 + structRETROGLU__FACE.html | 141 + structRETROGLU__MATERIAL.html | 126 + structRETROGLU__OBJ.html | 158 + structRETROGLU__OBJ__coll__graph.map | 11 + structRETROGLU__OBJ__coll__graph.md5 | 1 + structRETROGLU__OBJ__coll__graph.png | Bin 0 -> 18318 bytes structRETROGLU__PARSER.html | 167 + structRETROGLU__PARSER__coll__graph.map | 14 + structRETROGLU__PARSER__coll__graph.md5 | 1 + structRETROGLU__PARSER__coll__graph.png | Bin 0 -> 23237 bytes structRETROGLU__PROJ__ARGS.html | 120 + structRETROGLU__SPRITE.html | 148 + structRETROGLU__SPRITE__PARMS.html | 136 + structRETROGLU__SPRITE__coll__graph.map | 5 + structRETROGLU__SPRITE__coll__graph.md5 | 1 + structRETROGLU__SPRITE__coll__graph.png | Bin 0 -> 4938 bytes structRETROGLU__TILE.html | 130 + structRETROGLU__TILE__coll__graph.map | 5 + structRETROGLU__TILE__coll__graph.md5 | 1 + structRETROGLU__TILE__coll__graph.png | Bin 0 -> 4601 bytes structRETROGLU__VERTEX.html | 117 + structRETROGLU__VTEXTURE.html | 114 + structRETROGUI.html | 155 + structRETROGUI__CTL__BASE.html | 139 + structRETROGUI__coll__graph.map | 9 + structRETROGUI__coll__graph.md5 | 1 + structRETROGUI__coll__graph.png | Bin 0 -> 12120 bytes structRETROGXC__FONT__PARMS.html | 117 + structRETROHTR__RENDER__NODE.html | 175 + structRETROHTR__RENDER__NODE__coll__graph.map | 5 + structRETROHTR__RENDER__NODE__coll__graph.md5 | 1 + structRETROHTR__RENDER__NODE__coll__graph.png | Bin 0 -> 5015 bytes structRETROHTR__RENDER__TREE.html | 148 + structRETROHTR__RENDER__TREE__coll__graph.map | 14 + structRETROHTR__RENDER__TREE__coll__graph.md5 | 1 + structRETROHTR__RENDER__TREE__coll__graph.png | Bin 0 -> 18434 bytes structRETROSND__STATE.html | 119 + structRETROTILE.html | 132 + structRETROTILE__DATA__BORDER.html | 121 + structRETROTILE__DATA__DS.html | 139 + structRETROTILE__LAYER.html | 111 + structRETROTILE__PARSER.html | 158 + structRETROTILE__PARSER__coll__graph.map | 5 + structRETROTILE__PARSER__coll__graph.md5 | 1 + structRETROTILE__PARSER__coll__graph.png | Bin 0 -> 3377 bytes structRETROTILE__TILE__DEF.html | 114 + sync_off.png | Bin 0 -> 853 bytes sync_on.png | Bin 0 -> 845 bytes tab_a.png | Bin 0 -> 142 bytes tab_ad.png | Bin 0 -> 135 bytes tab_b.png | Bin 0 -> 169 bytes tab_bd.png | Bin 0 -> 173 bytes tab_h.png | Bin 0 -> 177 bytes tab_hd.png | Bin 0 -> 180 bytes tab_s.png | Bin 0 -> 184 bytes tab_sd.png | Bin 0 -> 188 bytes tabs.css | 1 + todo.html | 116 + topics.html | 147 + unionMAUG__FMT__SPEC.html | 126 + unionMFILE__HANDLE.html | 114 + unionMHTML__TAG.html | 121 + unionMHTML__TAG__coll__graph.map | 5 + unionMHTML__TAG__coll__graph.md5 | 1 + unionMHTML__TAG__coll__graph.png | Bin 0 -> 4481 bytes unionRETROGUI__CTL.html | 121 + unionRETROGUI__CTL__coll__graph.map | 5 + unionRETROGUI__CTL__coll__graph.md5 | 1 + unionRETROGUI__CTL__coll__graph.png | Bin 0 -> 5389 bytes uprintf_8h.html | 252 + uprintf_8h__dep__incl.map | 5 + uprintf_8h__dep__incl.md5 | 1 + uprintf_8h__dep__incl.png | Bin 0 -> 2533 bytes uprintf_8h__incl.map | 11 + uprintf_8h__incl.md5 | 1 + uprintf_8h__incl.png | Bin 0 -> 8582 bytes uprintf_8h_source.html | 758 ++ 430 files changed, 47982 insertions(+) create mode 100644 .nojekyll create mode 100644 annotated.html create mode 100644 bc_s.png create mode 100644 bc_sd.png create mode 100644 classes.html create mode 100644 clipboard.js create mode 100644 closed.png create mode 100644 cookie.js create mode 100644 dir_68267d1309a1af8e8297ef4c3efbcdba.html create mode 100644 doc.svg create mode 100644 docd.svg create mode 100644 doxstyle.css create mode 100644 doxygen.css create mode 100644 doxygen.svg create mode 100644 doxygen_crawl.html create mode 100644 dynsections.js create mode 100644 files.html create mode 100644 folderclosed.svg create mode 100644 folderclosedd.svg create mode 100644 folderopen.svg create mode 100644 folderopend.svg create mode 100644 functions.html create mode 100644 functions_func.html create mode 100644 functions_vars.html create mode 100644 globals.html create mode 100644 globals_defs.html create mode 100644 globals_func.html create mode 100644 globals_type.html create mode 100644 graph_legend.html create mode 100644 graph_legend.md5 create mode 100644 graph_legend.png create mode 100644 group__maug__cli.html create mode 100644 group__maug__console.html create mode 100644 group__maug__error.html create mode 100644 group__maug__error.map create mode 100644 group__maug__error.md5 create mode 100644 group__maug__error.png create mode 100644 group__maug__error__retvals.html create mode 100644 group__maug__error__retvals.map create mode 100644 group__maug__error__retvals.md5 create mode 100644 group__maug__error__retvals.png create mode 100644 group__maug__fmt.html create mode 100644 group__maug__fmt.map create mode 100644 group__maug__fmt.md5 create mode 100644 group__maug__fmt.png create mode 100644 group__maug__fmt__bmp.html create mode 100644 group__maug__fmt__bmp.map create mode 100644 group__maug__fmt__bmp.md5 create mode 100644 group__maug__fmt__bmp.png create mode 100644 group__maug__mem.html create mode 100644 group__maug__mfile.html create mode 100644 group__maug__mfile.map create mode 100644 group__maug__mfile.md5 create mode 100644 group__maug__mfile.png create mode 100644 group__maug__mfile__types.html create mode 100644 group__maug__mfile__types.map create mode 100644 group__maug__mfile__types.md5 create mode 100644 group__maug__mfile__types.png create mode 100644 group__maug__retroflt.html create mode 100644 group__maug__retroflt.map create mode 100644 group__maug__retroflt.md5 create mode 100644 group__maug__retroflt.png create mode 100644 group__maug__retroflt__assets.html create mode 100644 group__maug__retroflt__assets.map create mode 100644 group__maug__retroflt__assets.md5 create mode 100644 group__maug__retroflt__assets.png create mode 100644 group__maug__retroflt__bitmap.html create mode 100644 group__maug__retroflt__bitmap.map create mode 100644 group__maug__retroflt__bitmap.md5 create mode 100644 group__maug__retroflt__bitmap.png create mode 100644 group__maug__retroflt__color.html create mode 100644 group__maug__retroflt__color.map create mode 100644 group__maug__retroflt__color.md5 create mode 100644 group__maug__retroflt__color.png create mode 100644 group__maug__retroflt__compiling.html create mode 100644 group__maug__retroflt__compiling.map create mode 100644 group__maug__retroflt__compiling.md5 create mode 100644 group__maug__retroflt__compiling.png create mode 100644 group__maug__retroflt__config.html create mode 100644 group__maug__retroflt__config.map create mode 100644 group__maug__retroflt__config.md5 create mode 100644 group__maug__retroflt__config.png create mode 100644 group__maug__retroflt__config__btypes.html create mode 100644 group__maug__retroflt__config__btypes.map create mode 100644 group__maug__retroflt__config__btypes.md5 create mode 100644 group__maug__retroflt__config__btypes.png create mode 100644 group__maug__retroflt__config__flags.html create mode 100644 group__maug__retroflt__config__flags.map create mode 100644 group__maug__retroflt__config__flags.md5 create mode 100644 group__maug__retroflt__config__flags.png create mode 100644 group__maug__retroflt__drawing.html create mode 100644 group__maug__retroflt__drawing.map create mode 100644 group__maug__retroflt__drawing.md5 create mode 100644 group__maug__retroflt__drawing.png create mode 100644 group__maug__retroflt__example.html create mode 100644 group__maug__retroflt__example.map create mode 100644 group__maug__retroflt__example.md5 create mode 100644 group__maug__retroflt__example.png create mode 100644 group__maug__retroflt__flags.html create mode 100644 group__maug__retroflt__flags.map create mode 100644 group__maug__retroflt__flags.md5 create mode 100644 group__maug__retroflt__flags.png create mode 100644 group__maug__retroflt__input.html create mode 100644 group__maug__retroflt__input.map create mode 100644 group__maug__retroflt__input.md5 create mode 100644 group__maug__retroflt__input.png create mode 100644 group__maug__retroflt__keydefs.html create mode 100644 group__maug__retroflt__keydefs.map create mode 100644 group__maug__retroflt__keydefs.md5 create mode 100644 group__maug__retroflt__keydefs.png create mode 100644 group__maug__retroflt__msg__api.html create mode 100644 group__maug__retroflt__msg__api.map create mode 100644 group__maug__retroflt__msg__api.md5 create mode 100644 group__maug__retroflt__msg__api.png create mode 100644 group__maug__retroflt__retval.html create mode 100644 group__maug__retroflt__retval.map create mode 100644 group__maug__retroflt__retval.md5 create mode 100644 group__maug__retroflt__retval.png create mode 100644 group__maug__retroflt__vdp.html create mode 100644 group__maug__retroflt__vdp.map create mode 100644 group__maug__retroflt__vdp.md5 create mode 100644 group__maug__retroflt__vdp.png create mode 100644 group__maug__retrofp.html create mode 100644 group__maug__retroglu.html create mode 100644 group__maug__retroglu.map create mode 100644 group__maug__retroglu.md5 create mode 100644 group__maug__retroglu.png create mode 100644 group__maug__retroglu__obj__fsm.html create mode 100644 group__maug__retroglu__obj__fsm.map create mode 100644 group__maug__retroglu__obj__fsm.md5 create mode 100644 group__maug__retroglu__obj__fsm.png create mode 100644 group__maug__retroglu__obj__fsm__states.html create mode 100644 group__maug__retroglu__obj__fsm__states.map create mode 100644 group__maug__retroglu__obj__fsm__states.md5 create mode 100644 group__maug__retroglu__obj__fsm__states.png create mode 100644 group__maug__retroglu__overlay.html create mode 100644 group__maug__retroglu__overlay.map create mode 100644 group__maug__retroglu__overlay.md5 create mode 100644 group__maug__retroglu__overlay.png create mode 100644 group__maug__retroglu__sprite.html create mode 100644 group__maug__retroglu__sprite.map create mode 100644 group__maug__retroglu__sprite.md5 create mode 100644 group__maug__retroglu__sprite.png create mode 100644 group__maug__retrogui.html create mode 100644 group__maug__retrogui.map create mode 100644 group__maug__retrogui.md5 create mode 100644 group__maug__retrogui.png create mode 100644 group__maug__retrogui__ctl.html create mode 100644 group__maug__retrogui__ctl.map create mode 100644 group__maug__retrogui__ctl.md5 create mode 100644 group__maug__retrogui__ctl.png create mode 100644 group__maug__retrosnd.html create mode 100644 group__maug__retrosnd.map create mode 100644 group__maug__retrosnd.md5 create mode 100644 group__maug__retrosnd.png create mode 100644 group__maug__retrosnd__flags.html create mode 100644 group__maug__retrosnd__flags.map create mode 100644 group__maug__retrosnd__flags.md5 create mode 100644 group__maug__retrosnd__flags.png create mode 100644 group__maug__uprintf.html create mode 100644 group__retrofont.html create mode 100644 group__retrohtr.html create mode 100644 group__retrotile.html create mode 100644 group__retrotile.map create mode 100644 group__retrotile.md5 create mode 100644 group__retrotile.png create mode 100644 group__retrotile__defs.html create mode 100644 group__retrotile__defs.map create mode 100644 group__retrotile__defs.md5 create mode 100644 group__retrotile__defs.png create mode 100644 group__retrotile__defs__types.html create mode 100644 group__retrotile__defs__types.map create mode 100644 group__retrotile__defs__types.md5 create mode 100644 group__retrotile__defs__types.png create mode 100644 group__retrotile__gen.html create mode 100644 group__retrotile__gen.map create mode 100644 group__retrotile__gen.md5 create mode 100644 group__retrotile__gen.png create mode 100644 group__retrotile__parser.html create mode 100644 group__retrotile__parser.map create mode 100644 group__retrotile__parser.md5 create mode 100644 group__retrotile__parser.png create mode 100644 index.html create mode 100644 jquery.js create mode 100644 marge_8h_source.html create mode 100644 menu.js create mode 100644 menudata.js create mode 100644 merror_8h.html create mode 100644 merror_8h__dep__incl.map create mode 100644 merror_8h__dep__incl.md5 create mode 100644 merror_8h__dep__incl.png create mode 100644 merror_8h_source.html create mode 100644 mfile_8h.html create mode 100644 mfile_8h__dep__incl.map create mode 100644 mfile_8h__dep__incl.md5 create mode 100644 mfile_8h__dep__incl.png create mode 100644 mfile_8h__incl.map create mode 100644 mfile_8h__incl.md5 create mode 100644 mfile_8h__incl.png create mode 100644 mfile_8h_source.html create mode 100644 mfmt_8h.html create mode 100644 mfmt_8h__incl.map create mode 100644 mfmt_8h__incl.md5 create mode 100644 mfmt_8h__incl.png create mode 100644 mfmt_8h_source.html create mode 100644 mhtml_8h_source.html create mode 100644 minus.svg create mode 100644 minusd.svg create mode 100644 mmem_8h.html create mode 100644 mmem_8h__incl.map create mode 100644 mmem_8h__incl.md5 create mode 100644 mmem_8h__incl.png create mode 100644 mmem_8h_source.html create mode 100644 mplug_8h_source.html create mode 100644 nav_f.png create mode 100644 nav_fd.png create mode 100644 nav_g.png create mode 100644 nav_h.png create mode 100644 nav_hd.png create mode 100644 navtree.css create mode 100644 open.png create mode 100644 pages.html create mode 100644 plus.svg create mode 100644 plusd.svg create mode 100644 resize.js create mode 100644 retrocon_8h_source.html create mode 100644 retroflt_8h.html create mode 100644 retroflt_8h__incl.map create mode 100644 retroflt_8h__incl.md5 create mode 100644 retroflt_8h__incl.png create mode 100644 retroflt_8h_source.html create mode 100644 retrofnt_8h.html create mode 100644 retrofnt_8h_source.html create mode 100644 retrofp_8h.html create mode 100644 retrofp_8h_source.html create mode 100644 retroglu_8h.html create mode 100644 retroglu_8h_source.html create mode 100644 retrogui_8h.html create mode 100644 retrogui_8h_source.html create mode 100644 retrogxc_8h_source.html create mode 100644 retrohtr_8h.html create mode 100644 retrohtr_8h_source.html create mode 100644 retrosft_8h_source.html create mode 100644 retrosnd_8h.html create mode 100644 retrosnd_8h_source.html create mode 100644 retrotil_8h_source.html create mode 100644 search/all_0.js create mode 100644 search/all_1.js create mode 100644 search/all_10.js create mode 100644 search/all_11.js create mode 100644 search/all_12.js create mode 100644 search/all_13.js create mode 100644 search/all_14.js create mode 100644 search/all_2.js create mode 100644 search/all_3.js create mode 100644 search/all_4.js create mode 100644 search/all_5.js create mode 100644 search/all_6.js create mode 100644 search/all_7.js create mode 100644 search/all_8.js create mode 100644 search/all_9.js create mode 100644 search/all_a.js create mode 100644 search/all_b.js create mode 100644 search/all_c.js create mode 100644 search/all_d.js create mode 100644 search/all_e.js create mode 100644 search/all_f.js create mode 100644 search/classes_0.js create mode 100644 search/classes_1.js create mode 100644 search/close.svg create mode 100644 search/files_0.js create mode 100644 search/files_1.js create mode 100644 search/files_2.js create mode 100644 search/functions_0.js create mode 100644 search/functions_1.js create mode 100644 search/groups_0.js create mode 100644 search/groups_1.js create mode 100644 search/groups_10.js create mode 100644 search/groups_11.js create mode 100644 search/groups_2.js create mode 100644 search/groups_3.js create mode 100644 search/groups_4.js create mode 100644 search/groups_5.js create mode 100644 search/groups_6.js create mode 100644 search/groups_7.js create mode 100644 search/groups_8.js create mode 100644 search/groups_9.js create mode 100644 search/groups_a.js create mode 100644 search/groups_b.js create mode 100644 search/groups_c.js create mode 100644 search/groups_d.js create mode 100644 search/groups_e.js create mode 100644 search/groups_f.js create mode 100644 search/mag.svg create mode 100644 search/mag_d.svg create mode 100644 search/mag_sel.svg create mode 100644 search/mag_seld.svg create mode 100644 search/pages_0.js create mode 100644 search/pages_1.js create mode 100644 search/pages_2.js create mode 100644 search/pages_3.js create mode 100644 search/pages_4.js create mode 100644 search/pages_5.js create mode 100644 search/pages_6.js create mode 100644 search/search.css create mode 100644 search/search.js create mode 100644 search/searchdata.js create mode 100644 search/typedefs_0.js create mode 100644 search/typedefs_1.js create mode 100644 search/variables_0.js create mode 100644 search/variables_1.js create mode 100644 search/variables_2.js create mode 100644 search/variables_3.js create mode 100644 search/variables_4.js create mode 100644 search/variables_5.js create mode 100644 search/variables_6.js create mode 100644 search/variables_7.js create mode 100644 search/variables_8.js create mode 100644 search/variables_9.js create mode 100644 search/variables_a.js create mode 100644 search/variables_b.js create mode 100644 search/variables_c.js create mode 100644 search/variables_d.js create mode 100644 splitbar.png create mode 100644 splitbard.png create mode 100644 structMFILE__CADDY.html create mode 100644 structMFILE__CADDY__coll__graph.map create mode 100644 structMFILE__CADDY__coll__graph.md5 create mode 100644 structMFILE__CADDY__coll__graph.png create mode 100644 structMFMT__STRUCT.html create mode 100644 structMFMT__STRUCT__BMPFILE.html create mode 100644 structMFMT__STRUCT__BMPFILE__coll__graph.map create mode 100644 structMFMT__STRUCT__BMPFILE__coll__graph.md5 create mode 100644 structMFMT__STRUCT__BMPFILE__coll__graph.png create mode 100644 structMFMT__STRUCT__BMPINFO.html create mode 100644 structMHTML__PARSER.html create mode 100644 structMHTML__PARSER__coll__graph.map create mode 100644 structMHTML__PARSER__coll__graph.md5 create mode 100644 structMHTML__PARSER__coll__graph.png create mode 100644 structMHTML__TAG__BASE.html create mode 100644 structRETROCON.html create mode 100644 structRETROCON__coll__graph.map create mode 100644 structRETROCON__coll__graph.md5 create mode 100644 structRETROCON__coll__graph.png create mode 100644 structRETROFLAT__ARGS.html create mode 100644 structRETROFLAT__BITMAP.html create mode 100644 structRETROFLAT__CACHE__ASSET.html create mode 100644 structRETROFLAT__INPUT.html create mode 100644 structRETROFLAT__STATE.html create mode 100644 structRETROFLAT__STATE__coll__graph.map create mode 100644 structRETROFLAT__STATE__coll__graph.md5 create mode 100644 structRETROFLAT__STATE__coll__graph.png create mode 100644 structRETROFONT.html create mode 100644 structRETROGLU__FACE.html create mode 100644 structRETROGLU__MATERIAL.html create mode 100644 structRETROGLU__OBJ.html create mode 100644 structRETROGLU__OBJ__coll__graph.map create mode 100644 structRETROGLU__OBJ__coll__graph.md5 create mode 100644 structRETROGLU__OBJ__coll__graph.png create mode 100644 structRETROGLU__PARSER.html create mode 100644 structRETROGLU__PARSER__coll__graph.map create mode 100644 structRETROGLU__PARSER__coll__graph.md5 create mode 100644 structRETROGLU__PARSER__coll__graph.png create mode 100644 structRETROGLU__PROJ__ARGS.html create mode 100644 structRETROGLU__SPRITE.html create mode 100644 structRETROGLU__SPRITE__PARMS.html create mode 100644 structRETROGLU__SPRITE__coll__graph.map create mode 100644 structRETROGLU__SPRITE__coll__graph.md5 create mode 100644 structRETROGLU__SPRITE__coll__graph.png create mode 100644 structRETROGLU__TILE.html create mode 100644 structRETROGLU__TILE__coll__graph.map create mode 100644 structRETROGLU__TILE__coll__graph.md5 create mode 100644 structRETROGLU__TILE__coll__graph.png create mode 100644 structRETROGLU__VERTEX.html create mode 100644 structRETROGLU__VTEXTURE.html create mode 100644 structRETROGUI.html create mode 100644 structRETROGUI__CTL__BASE.html create mode 100644 structRETROGUI__coll__graph.map create mode 100644 structRETROGUI__coll__graph.md5 create mode 100644 structRETROGUI__coll__graph.png create mode 100644 structRETROGXC__FONT__PARMS.html create mode 100644 structRETROHTR__RENDER__NODE.html create mode 100644 structRETROHTR__RENDER__NODE__coll__graph.map create mode 100644 structRETROHTR__RENDER__NODE__coll__graph.md5 create mode 100644 structRETROHTR__RENDER__NODE__coll__graph.png create mode 100644 structRETROHTR__RENDER__TREE.html create mode 100644 structRETROHTR__RENDER__TREE__coll__graph.map create mode 100644 structRETROHTR__RENDER__TREE__coll__graph.md5 create mode 100644 structRETROHTR__RENDER__TREE__coll__graph.png create mode 100644 structRETROSND__STATE.html create mode 100644 structRETROTILE.html create mode 100644 structRETROTILE__DATA__BORDER.html create mode 100644 structRETROTILE__DATA__DS.html create mode 100644 structRETROTILE__LAYER.html create mode 100644 structRETROTILE__PARSER.html create mode 100644 structRETROTILE__PARSER__coll__graph.map create mode 100644 structRETROTILE__PARSER__coll__graph.md5 create mode 100644 structRETROTILE__PARSER__coll__graph.png create mode 100644 structRETROTILE__TILE__DEF.html create mode 100644 sync_off.png create mode 100644 sync_on.png create mode 100644 tab_a.png create mode 100644 tab_ad.png create mode 100644 tab_b.png create mode 100644 tab_bd.png create mode 100644 tab_h.png create mode 100644 tab_hd.png create mode 100644 tab_s.png create mode 100644 tab_sd.png create mode 100644 tabs.css create mode 100644 todo.html create mode 100644 topics.html create mode 100644 unionMAUG__FMT__SPEC.html create mode 100644 unionMFILE__HANDLE.html create mode 100644 unionMHTML__TAG.html create mode 100644 unionMHTML__TAG__coll__graph.map create mode 100644 unionMHTML__TAG__coll__graph.md5 create mode 100644 unionMHTML__TAG__coll__graph.png create mode 100644 unionRETROGUI__CTL.html create mode 100644 unionRETROGUI__CTL__coll__graph.map create mode 100644 unionRETROGUI__CTL__coll__graph.md5 create mode 100644 unionRETROGUI__CTL__coll__graph.png create mode 100644 uprintf_8h.html create mode 100644 uprintf_8h__dep__incl.map create mode 100644 uprintf_8h__dep__incl.md5 create mode 100644 uprintf_8h__dep__incl.png create mode 100644 uprintf_8h__incl.map create mode 100644 uprintf_8h__incl.md5 create mode 100644 uprintf_8h__incl.png create mode 100644 uprintf_8h_source.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/annotated.html b/annotated.html new file mode 100644 index 00000000..66a276ba --- /dev/null +++ b/annotated.html @@ -0,0 +1,142 @@ + + + + + + + +maug: Data Structures + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 CMAUG_FMT_SPEC
 CMFILE_CADDY
 CMFILE_HANDLE
 CMFMT_STRUCTGeneric image description struct
 CMFMT_STRUCT_BMPFILE
 CMFMT_STRUCT_BMPINFOBITMAPINFO struct that comes before Windows bitmap data
 CMHTML_PARSER
 CMHTML_TAG
 CMHTML_TAG_BASE
 CRETROCON
 CRETROFLAT_ARGSStruct containing configuration values for a RetroFlat program
 CRETROFLAT_BITMAPPlatform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine if a valid bitmap is loaded
 CRETROFLAT_CACHE_ASSET
 CRETROFLAT_INPUTStruct passed to retroflat_poll_input() to hold return data
 CRETROFLAT_STATEGlobal singleton containing state for the current platform
 CRETROFONT
 CRETROGLU_FACE
 CRETROGLU_MATERIAL
 CRETROGLU_OBJ
 CRETROGLU_PARSERAs retroglu_parse_obj_c() parses OBJ data, it populates this struct with object information
 CRETROGLU_PROJ_ARGS
 CRETROGLU_SPRITE
 CRETROGLU_SPRITE_PARMSIf draw lists are disabled, this struct holds a list of params for retroglu_set_sprite_clip() so that the sprite can be drawn without a list
 CRETROGLU_TILE
 CRETROGLU_VERTEX
 CRETROGLU_VTEXTURE
 CRETROGUI
 CRETROGUI_CTL
 CRETROGUI_CTL_BASEFields common to ALL RETROGUI_CTL types
 CRETROGXC_FONT_PARMS
 CRETROHTR_RENDER_NODE
 CRETROHTR_RENDER_TREE
 CRETROSND_STATEInternal retrosound state struct. Most fields are platform-specific
 CRETROTILE
 CRETROTILE_DATA_BORDER
 CRETROTILE_DATA_DSInternal data structure used by retrotile_gen_diamond_square_iter()
 CRETROTILE_LAYER
 CRETROTILE_PARSER
 CRETROTILE_TILE_DEF
+
+
+ + +
+ + diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..224b29aa9847d5a4b3902efd602b7ddf7d33e6c2 GIT binary patch literal 676 zcmV;V0$crwP)y__>=_9%My z{n931IS})GlGUF8K#6VIbs%684A^L3@%PlP2>_sk`UWPq@f;rU*V%rPy_ekbhXT&s z(GN{DxFv}*vZp`F>S!r||M`I*nOwwKX+BC~3P5N3-)Y{65c;ywYiAh-1*hZcToLHK ztpl1xomJ+Yb}K(cfbJr2=GNOnT!UFA7Vy~fBz8?J>XHsbZoDad^8PxfSa0GDgENZS zuLCEqzb*xWX2CG*b&5IiO#NzrW*;`VC9455M`o1NBh+(k8~`XCEEoC1Ybwf;vr4K3 zg|EB<07?SOqHp9DhLpS&bzgo70I+ghB_#)K7H%AMU3v}xuyQq9&Bm~++VYhF09a+U zl7>n7Jjm$K#b*FONz~fj;I->Bf;ule1prFN9FovcDGBkpg>)O*-}eLnC{6oZHZ$o% zXKW$;0_{8hxHQ>l;_*HATI(`7t#^{$(zLe}h*mqwOc*nRY9=?Sx4OOeVIfI|0V(V2 zBrW#G7Ss9wvzr@>H*`r>zE z+e8bOBgqIgldUJlG(YUDviMB`9+DH8n-s9SXRLyJHO1!=wY^79WYZMTa(wiZ!zP66 zA~!21vmF3H2{ngD;+`6j#~6j;$*f*G_2ZD1E;9(yaw7d-QnSCpK(cR1zU3qU0000< KMNUMnLSTYoA~SLT literal 0 HcmV?d00001 diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..31ca888dc71049713b35c351933a8d0f36180bf1 GIT binary patch literal 635 zcmV->0)+jEP)Jwi0r1~gdSq#w{Bu1q z`craw(p2!hu$4C_$Oc3X(sI6e=9QSTwPt{G) z=htT&^~&c~L2~e{r5_5SYe7#Is-$ln>~Kd%$F#tC65?{LvQ}8O`A~RBB0N~`2M+waajO;5>3B&-viHGJeEK2TQOiPRa zfDKyqwMc4wfaEh4jt>H`nW_Zidwk@Bowp`}(VUaj-pSI(-1L>FJVsX}Yl9~JsqgsZ zUD9(rMwf23Gez6KPa|wwInZodP-2}9@fK0Ga_9{8SOjU&4l`pH4@qlQp83>>HT$xW zER^U>)MyV%t(Lu=`d=Y?{k1@}&r7ZGkFQ%z%N+sE9BtYjovzxyxCPxN6&@wLK{soQ zSmkj$aLI}miuE^p@~4}mg9OjDfGEkgY4~^XzLRUBB*O{+&vq<3v(E%+k_i%=`~j%{ Vj14gnt9}3g002ovPDHLkV1n!oC4m3{ literal 0 HcmV?d00001 diff --git a/classes.html b/classes.html new file mode 100644 index 00000000..f5aabb3f --- /dev/null +++ b/classes.html @@ -0,0 +1,108 @@ + + + + + + + +maug: Data Structure Index + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+ + + diff --git a/clipboard.js b/clipboard.js new file mode 100644 index 00000000..42c1fb0e --- /dev/null +++ b/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/closed.png b/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..98cc2c909da37a6df914fbf67780eebd99c597f5 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@8{^CZMh(5KoB^r_<4^zF@3)Cp&&t3hdujKf f*?bjBoY!V+E))@{xMcbjXe@)LtDnm{r-UW|*e5JT literal 0 HcmV?d00001 diff --git a/cookie.js b/cookie.js new file mode 100644 index 00000000..53ad21d9 --- /dev/null +++ b/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 00000000..ecc428ae --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,149 @@ + + + + + + + +maug: src Directory Reference + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+
src Directory Reference
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Files

 marge.h
 
 merror.h
 
 mfile.h
 
 mfmt.h
 
 mhtml.h
 
 mmem.h
 
 mplug.h
 
 retrocon.h
 
 retroflt.h
 Abstraction layer header for retro systems.
 
 retrofnt.h
 
 retrofp.h
 Contains functions and macros for working with fixed-point numbers.
 
 retroglu.h
 Library of tools for working with RetroFlat and OpenGL.
 
 retrogui.h
 
 retrogxc.h
 
 retrohtr.h
 
 retrosft.h
 
 retrosnd.h
 Abstraction layer header for sound on retro systems.
 
 retrotil.h
 
 uprintf.h
 
+
+ + +
+ + diff --git a/doc.svg b/doc.svg new file mode 100644 index 00000000..0b928a53 --- /dev/null +++ b/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/docd.svg b/docd.svg new file mode 100644 index 00000000..ac18b275 --- /dev/null +++ b/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxstyle.css b/doxstyle.css new file mode 100644 index 00000000..48d9c780 --- /dev/null +++ b/doxstyle.css @@ -0,0 +1,70 @@ + +body { + background: black; + color: white; +} + +blockquote { + background: #111111 !important; + color: white !important; +} + +pre { + background: #111111 !important; + color: white !important; +} + +.header { + background: black !important; +} + +a, a:visited { + color: cyan !important; +} + +h2 { + color: magenta !important; +} + +.sm-dox, .sm-dox ul, .sm-dox ul a, .navpath ul { + background: black !important; + border: white 1px solid; +} + +tr.even { + background: transparent !important; +} + +tr { +} + +.doxtable th { + background: cyan !important; + color: black !important; +} + +.memberdecls td { + background: transparent !important; +} + +.mdescRight, .memproto, .memdoc, .memtitle { + background: black !important; +} + +.memname { + color: white !important; +} + +.paramname { + color: magenta !important; +} + +.mdescRight { + color: white !important; +} + +.doxtable td { + background: transparent !important; + border: 1px solid cyan !important; +} + diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 00000000..e2ac1b7d --- /dev/null +++ b/doxygen.css @@ -0,0 +1,2226 @@ +/* The standard CSS for doxygen 1.11.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #3D578C; +--page-visited-link-color: #4665A2; + +/* index */ +--index-odd-item-bg-color: #F8F9FC; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F9FAFC; +--header-separator-color: #C4CFE5; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #879ECB; +--group-header-color: #354C7B; +--inherit-header-color: gray; + +--footer-foreground-color: #2A3D61; +--footer-logo-width: 104px; +--citation-label-color: #334975; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #5373B4; +--directory-separator-color: #9CAFD4; +--separator-color: #4A6AAA; + +--blockquote-background-color: #F7F8FB; +--blockquote-border-color: #9CAFD4; + +--scrollbar-thumb-color: #9CAFD4; +--scrollbar-background-color: #F9FAFC; + +--icon-background-color: #728DC1; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F9FAFC; +--memdecl-separator-color: #DEE4F0; +--memdecl-foreground-color: #555; +--memdecl-template-color: #4665A2; + +/* detailed member list */ +--memdef-border-color: #A8B8D9; +--memdef-title-background-color: #E2E8F2; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #DFE5F1; +--memdef-proto-text-color: #253555; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #4665A2; + +/* tables */ +--table-cell-border-color: #2D4068; +--table-header-background-color: #374F7F; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #728DC1; +--label-left-top-border-color: #5373B4; +--label-right-bottom-border-color: #C4CFE5; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F9FAFC; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #C2CDE4; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #283A5D; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #364D7C; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #9CAFD4; +--nav-arrow-selected-color: #9CAFD4; + +/* table of contents */ +--toc-background-color: #F4F6FA; +--toc-border-color: #D8DFEE; +--toc-header-color: #4665A2; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F9FAFC; +--search-filter-foreground-color: black; +--search-filter-border-color: #90A5CE; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #3D578C; +--search-results-foreground-color: #425E97; +--search-results-background-color: #EEF1F7; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #4665A2; +--code-external-link-color: #4665A2; +--fragment-foreground-color: black; +--fragment-background-color: #FBFCFD; +--fragment-border-color: #C4CFE5; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #4665A2; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #4665A2; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #4665A2; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #90A5CE; +--page-visited-link-color: #A3B4D7; + +/* index */ +--index-odd-item-bg-color: #0B101A; +--index-even-item-bg-color: black; +--index-header-color: #C4CFE5; +--index-separator-color: #334975; + +/* header */ +--header-background-color: #070B11; +--header-separator-color: #141C2E; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #283A5D; +--group-header-color: #90A5CE; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #5B7AB7; +--footer-logo-width: 60px; +--citation-label-color: #90A5CE; +--glow-color: cyan; + +--title-background-color: #090D16; +--title-separator-color: #354C79; +--directory-separator-color: #283A5D; +--separator-color: #283A5D; + +--blockquote-background-color: #101826; +--blockquote-border-color: #283A5D; + +--scrollbar-thumb-color: #283A5D; +--scrollbar-background-color: #070B11; + +--icon-background-color: #334975; +--icon-foreground-color: #C4CFE5; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #0B101A; +--memdecl-separator-color: #2C3F65; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #7C95C6; + +/* detailed member list */ +--memdef-border-color: #233250; +--memdef-title-background-color: #1B2840; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #19243A; +--memdef-proto-text-color: #9DB0D4; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #7C95C6; + +/* tables */ +--table-cell-border-color: #283A5D; +--table-header-background-color: #283A5D; +--table-header-foreground-color: #C4CFE5; + +/* labels */ +--label-background-color: #354C7B; +--label-left-top-border-color: #4665A2; +--label-right-bottom-border-color: #283A5D; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #101826; +--nav-foreground-color: #364D7C; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #2A3D61; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #B6C4DF; +--nav-text-hover-color: #DCE2EF; +--nav-text-active-color: #DCE2EF; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #B6C4DF; +--nav-menu-background-color: #05070C; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #334975; +--nav-arrow-selected-color: #90A5CE; + +/* table of contents */ +--toc-background-color: #151E30; +--toc-border-color: #202E4A; +--toc-header-color: #A3B4D7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #101826; +--search-filter-foreground-color: #90A5CE; +--search-filter-border-color: #7C95C6; +--search-filter-highlight-text-color: #BCC9E2; +--search-filter-highlight-bg-color: #283A5D; +--search-results-background-color: #101826; +--search-results-foreground-color: #90A5CE; +--search-results-border-color: #7C95C6; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #2F436C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #090D16; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : var(--nav-background-color); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul.check { + list-style:none; + text-indent: -16px; + padding-left: 38px; +} +li.unchecked:before { + content: "\2610\A0"; +} +li.checked:before { + content: "\2611\A0"; +} + +ol { + text-indent: 0px; +} + +ul { + text-indent: 0px; + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: auto; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* + +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention, dl.important { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.important, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention, dl.important { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt, dl.important dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.note dd, dl.warning dd, dl.pre dd, dl.post dd, +dl.remark dd, dl.attention dd, dl.important dd, dl.invariant dd, +dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + diff --git a/doxygen.svg b/doxygen.svg new file mode 100644 index 00000000..79a76354 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doxygen_crawl.html b/doxygen_crawl.html new file mode 100644 index 00000000..b36fd4a3 --- /dev/null +++ b/doxygen_crawl.html @@ -0,0 +1,471 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 00000000..b05f4c8d --- /dev/null +++ b/dynsections.js @@ -0,0 +1,198 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function toggleVisibility(linkObj) { + return dynsection.toggleVisibility(linkObj); +} + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/files.html b/files.html new file mode 100644 index 00000000..81809515 --- /dev/null +++ b/files.html @@ -0,0 +1,123 @@ + + + + + + + +maug: File List + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 12]
+ + + + + + + + + + + + + + + + + + + + +
  src
 marge.h
 merror.h
 mfile.h
 mfmt.h
 mhtml.h
 mmem.h
 mplug.h
 retrocon.h
 retroflt.hAbstraction layer header for retro systems
 retrofnt.h
 retrofp.hContains functions and macros for working with fixed-point numbers
 retroglu.hLibrary of tools for working with RetroFlat and OpenGL
 retrogui.h
 retrogxc.h
 retrohtr.h
 retrosft.h
 retrosnd.hAbstraction layer header for sound on retro systems
 retrotil.h
 uprintf.h
+
+
+ + +
+ + diff --git a/folderclosed.svg b/folderclosed.svg new file mode 100644 index 00000000..b04bed2e --- /dev/null +++ b/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderclosedd.svg b/folderclosedd.svg new file mode 100644 index 00000000..52f0166a --- /dev/null +++ b/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderopen.svg b/folderopen.svg new file mode 100644 index 00000000..f6896dd2 --- /dev/null +++ b/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/folderopend.svg b/folderopend.svg new file mode 100644 index 00000000..2d1f06e7 --- /dev/null +++ b/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/functions.html b/functions.html new file mode 100644 index 00000000..62b1c872 --- /dev/null +++ b/functions.html @@ -0,0 +1,206 @@ + + + + + + + +maug: Data Fields + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- v -

+ + +

- w -

+
+ + +
+ + diff --git a/functions_func.html b/functions_func.html new file mode 100644 index 00000000..56ec6520 --- /dev/null +++ b/functions_func.html @@ -0,0 +1,100 @@ + + + + + + + +maug: Data Fields - Functions + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the struct/union documentation for each field:
+
+ + +
+ + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 00000000..08d9ca93 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,204 @@ + + + + + + + +maug: Data Fields - Variables + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the struct/union documentation for each field:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- v -

+ + +

- w -

+
+ + +
+ + diff --git a/globals.html b/globals.html new file mode 100644 index 00000000..fb2eb8f3 --- /dev/null +++ b/globals.html @@ -0,0 +1,217 @@ + + + + + + + +maug: Globals + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- m -

+ + +

- n -

+ + +

- r -

+
+ + +
+ + diff --git a/globals_defs.html b/globals_defs.html new file mode 100644 index 00000000..81f96d95 --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,174 @@ + + + + + + + +maug: Globals + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+ +

- m -

    +
  • maug_hctoi : uprintf.h
  • +
  • maug_mrealloc : mmem.h
  • +
  • maug_mzero : mmem.h
  • +
  • MFILE_CADDY_TYPE_FILE_READ : mfile.h
  • +
  • MFILE_CADDY_TYPE_MEM_BUFFER : mfile.h
  • +
  • MFMT_BMP_COMPRESSION_NONE : mfmt.h
  • +
  • MFMT_BMP_COMPRESSION_RLE4 : mfmt.h
  • +
  • MFMT_BMP_COMPRESSION_RLE8 : mfmt.h
  • +
+ + +

- n -

+ + +

- r -

+
+ + +
+ + diff --git a/globals_func.html b/globals_func.html new file mode 100644 index 00000000..514d3953 --- /dev/null +++ b/globals_func.html @@ -0,0 +1,135 @@ + + + + + + + +maug: Globals + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the documentation:
+ +

- m -

+ + +

- r -

+
+ + +
+ + diff --git a/globals_type.html b/globals_type.html new file mode 100644 index 00000000..6abcdf2f --- /dev/null +++ b/globals_type.html @@ -0,0 +1,110 @@ + + + + + + + +maug: Globals + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented typedefs with links to the documentation:
+
+ + +
+ + diff --git a/graph_legend.html b/graph_legend.html new file mode 100644 index 00000000..0aa4b5d2 --- /dev/null +++ b/graph_legend.html @@ -0,0 +1,159 @@ + + + + + + + +maug: Graph Legend + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Graph Legend
+
+
+

This page explains how to interpret the graphs that are generated by doxygen.

+

Consider the following example:

/*! Invisible class because of truncation */
+
class Invisible { };
+
+
/*! Truncated class, inheritance relation is hidden */
+
class Truncated : public Invisible { };
+
+
/* Class not documented with doxygen comments */
+
class Undocumented { };
+
+
/*! Class that is inherited using public inheritance */
+
class PublicBase : public Truncated { };
+
+
/*! A template class */
+
template<class T> class Templ { };
+
+
/*! Class that is inherited using protected inheritance */
+
class ProtectedBase { };
+
+
/*! Class that is inherited using private inheritance */
+
class PrivateBase { };
+
+
/*! Class that is used by the Inherited class */
+
class Used { };
+
+
/*! Super class that inherits a number of other classes */
+
class Inherited : public PublicBase,
+
protected ProtectedBase,
+
private PrivateBase,
+
public Undocumented,
+
public Templ<int>
+
{
+
private:
+
Used *m_usedClass;
+
};
+

This will result in the following graph:

+

The boxes in the above graph have the following meaning:

+
    +
  • +A filled gray box represents the struct or class for which the graph is generated.
  • +
  • +A box with a black border denotes a documented struct or class.
  • +
  • +A box with a gray border denotes an undocumented struct or class.
  • +
  • +A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • +
+

The arrows have the following meaning:

+
    +
  • +A blue arrow is used to visualize a public inheritance relation between two classes.
  • +
  • +A dark green arrow is used for protected inheritance.
  • +
  • +A dark red arrow is used for private inheritance.
  • +
  • +A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • +
  • +A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • +
+
+ + +
+ + diff --git a/graph_legend.md5 b/graph_legend.md5 new file mode 100644 index 00000000..da515da9 --- /dev/null +++ b/graph_legend.md5 @@ -0,0 +1 @@ +f74606a252eb303675caf37987d0b7af \ No newline at end of file diff --git a/graph_legend.png b/graph_legend.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd8831bcec9382c5a41018995a9aef590ebb269 GIT binary patch literal 23252 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 M8Cn=%^xPi&58jX1#Q*>R literal 0 HcmV?d00001 diff --git a/group__maug__cli.html b/group__maug__cli.html new file mode 100644 index 00000000..2a7753ad --- /dev/null +++ b/group__maug__cli.html @@ -0,0 +1,206 @@ + + + + + + + +maug: Command Line API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Command Line API
+
+
+ +

Tools for parsing command line arguments. +More...

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

+Macros

+#define MAUG_CLI_SIGIL_SZ   1
 
+#define MAUG_CLI_SIGIL   "-"
 Default flag to prepend to CLI arguments. Is "/" on Windows/DOS and "-" on other platforms. Can be overridden with a -D flag or define.
 
+#define MAUG_CLI_ARG_LIST_SZ_MAX   20
 
+#define MAUG_CLI_ARG_HELP_SZ_MAX   127
 
+#define MAUG_CLI_ARG_SZ_MAX   20
 
+#define MAUG_CLI(f)    f( MAUG_CLI_SIGIL "h", 3, "Display help and exit.", maug_cli_h, NULL )
 Default CLI arguments for all RetroFlat programs.
 
+ + + +

+Typedefs

+typedef MERROR_RETVAL(* maug_cli_cb) (const char *arg, void *data)
 
+ + + + + + +

+Functions

+int maug_parse_args (int argc, char *argv[])
 
MERROR_RETVAL maug_add_arg (const char *arg, int arg_sz, const char *help, int help_sz, maug_cli_cb arg_cb, maug_cli_cb def_cb, void *data)
 Add a command-line argument to the built-in parser.
 
+

Detailed Description

+

Tools for parsing command line arguments.

+

Function Documentation

+ +

◆ maug_add_arg()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MERROR_RETVAL maug_add_arg (const char * arg,
int arg_sz,
const char * help,
int help_sz,
maug_cli_cb arg_cb,
maug_cli_cb def_cb,
void * data )
+
+ +

Add a command-line argument to the built-in parser.

+
Parameters
+ + + + + + +
argString containing the argument to look for.
arg_szLength of arg in chars or 0 to autodetect.
helpHelp text for the arg when -h is invoked.
help_szLength of help in chars or 0 to autodetect.
arg_cbmaug_cli_cb to invoke when arg is found.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__console.html b/group__maug__console.html new file mode 100644 index 00000000..ad593df0 --- /dev/null +++ b/group__maug__console.html @@ -0,0 +1,201 @@ + + + + + + + +maug: In-Situ Console API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
In-Situ Console API
+
+
+ + + + +

+Data Structures

struct  RETROCON
 
+ + + + + + + + + + + + + + + +

+Macros

+#define RETROCON_SBUFFER_SZ_MAX   4096
 
+#define RETROCON_SBUFFER_LINES_MAX   30
 
+#define RETROCON_LBUFFER_SZ_MAX   256
 
+#define RETROCON_ACTIVE_KEY   RETROFLAT_KEY_GRAVE
 
+#define RETROCON_CB_NAME_SZ_MAX   32
 
+#define RETROCON_CB_SZ_MAX   128
 
+#define RETROCON_WIN_H   110
 
+ + + +

+Typedefs

+typedef MERROR_RETVAL(* retrocon_cb) (struct RETROCON *con, const char *line, size_t line_sz, void *data)
 
+ + + + + + + + + + + + + + + + +

+Functions

+MERROR_RETVAL retrocon_init (struct RETROCON *con)
 
+MERROR_RETVAL retrocon_add_command (struct RETROCON *con, const char *cmd, retrocon_cb cb, void *cb_data)
 
+MERROR_RETVAL retrocon_display (struct RETROCON *con, struct RETROFLAT_BITMAP *display)
 
+void retrocon_print_line (struct RETROCON *con, const char *line)
 
+MERROR_RETVAL retrocon_exec_line (struct RETROCON *con, const char *line, size_t line_sz)
 
+int retrocon_debounce (struct RETROCON *con, int c)
 
MERROR_RETVAL retrocon_input (struct RETROCON *con, RETROFLAT_IN_KEY *p_c, struct RETROFLAT_INPUT *input_evt)
 Process input from retroflat_poll_input() and apply it to the console, if open.
 
+

Detailed Description

+

Function Documentation

+ +

◆ retrocon_input()

+ +
+
+ + + + + + + + + + + + + + + + +
MERROR_RETVAL retrocon_input (struct RETROCON * con,
RETROFLAT_IN_KEY * p_c,
struct RETROFLAT_INPUT * input_evt )
+
+ +

Process input from retroflat_poll_input() and apply it to the console, if open.

+
Parameters
+ + +
p_cPointer to the input value returned from retroflat_poll_input().
+
+
+
Note
This function will set input to 0 (nothing) if it was handled by an open console!
+ +
+
+
+ + +
+ + diff --git a/group__maug__error.html b/group__maug__error.html new file mode 100644 index 00000000..652e16a8 --- /dev/null +++ b/group__maug__error.html @@ -0,0 +1,279 @@ + + + + + + + +maug: Error Handling API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Error Handling API
+
+
+
+Collaboration diagram for Error Handling API:
+
+
+ + + + +
+ + + + +

+Topics

 Return Values
 
+ + + +

+Files

file  merror.h
 
+ + + + + + + + + + + + + + + + + + + +

+Macros

#define maug_cleanup_if_null_msg(type, ptr, err, msg)
 
+#define maug_cleanup_if_null(type, ptr, err)    maug_cleanup_if_null_msg( type, ptr, err, "failed to allocate " #ptr "!" )
 
+#define maug_cleanup_if_null_alloc(type, ptr)    maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to allocate " #ptr "!" )
 
+#define maug_cleanup_if_null_file(ptr)    maug_cleanup_if_null_msg( FILE*, ptr, MERROR_FILE, "failed to open FILE!" )
 
#define maug_cleanup_if_not_ok()
 
#define maug_cleanup_if_lt(a, b, fmt, err)
 
+#define maug_cleanup_if_lt_overflow(a, b)    maug_cleanup_if_lt( a, b, SIZE_T_FMT, MERROR_OVERFLOW )
 
#define maug_cleanup_if_ge(a, b, fmt, err)
 
+#define maug_cleanup_if_ge_overflow(a, b)    maug_cleanup_if_ge( a, (size_t)(b), SIZE_T_FMT, MERROR_OVERFLOW )
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ maug_cleanup_if_ge

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#define maug_cleanup_if_ge( a,
b,
fmt,
err )
+
+Value:
if( (a) >= (b) ) { \
+
error_printf( fmt " is greater or equal to " fmt "!", a, b ); \
+
retval = err; \
+
goto cleanup; \
+
}
+
+
+
+ +

◆ maug_cleanup_if_lt

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#define maug_cleanup_if_lt( a,
b,
fmt,
err )
+
+Value:
if( (a) < (b) ) { \
+
error_printf( fmt " is less than " fmt "!", a, b ); \
+
retval = err; \
+
goto cleanup; \
+
}
+
+
+
+ +

◆ maug_cleanup_if_not_ok

+ +
+
+ + + + + + + +
#define maug_cleanup_if_not_ok()
+
+Value:
if( MERROR_OK != retval ) { \
+
goto cleanup; \
+
}
+
+
+
+ +

◆ maug_cleanup_if_null_msg

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#define maug_cleanup_if_null_msg( type,
ptr,
err,
msg )
+
+Value:
if( (type)NULL == ptr ) { \
+
error_printf( msg ); \
+
retval = err; \
+
goto cleanup; \
+
}
+
+
+
+
+ + +
+ + diff --git a/group__maug__error.map b/group__maug__error.map new file mode 100644 index 00000000..c5f78773 --- /dev/null +++ b/group__maug__error.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__error.md5 b/group__maug__error.md5 new file mode 100644 index 00000000..8b065fa3 --- /dev/null +++ b/group__maug__error.md5 @@ -0,0 +1 @@ +49cca93c06e1464f5c803fa2573c30ac \ No newline at end of file diff --git a/group__maug__error.png b/group__maug__error.png new file mode 100644 index 0000000000000000000000000000000000000000..5f325d3519e292b7f0dd2e3893312f60dec65b9a GIT binary patch literal 3740 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 LkCe;qS-t)b2JK{P literal 0 HcmV?d00001 diff --git a/group__maug__error__retvals.html b/group__maug__error__retvals.html new file mode 100644 index 00000000..509cfda3 --- /dev/null +++ b/group__maug__error__retvals.html @@ -0,0 +1,153 @@ + + + + + + + +maug: Return Values + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Return Values
+
+
+
+Collaboration diagram for Return Values:
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define MERROR_OK   0x0000
 
+#define MERROR_ALLOC   0x0001
 
+#define MERROR_OVERFLOW   0x0002
 
+#define MERROR_FILE   0x0004
 
+#define MERROR_USR   0x0008
 
+#define MERROR_PARSE   0x0010
 
+#define MERROR_GUI   0x0020
 
+#define MERROR_SND   0x0020
 
+#define MERROR_WAIT   0x0040
 
+#define MERROR_TIMEOUT   0x0080
 
+ + + + +

+Typedefs

+typedef int MERROR_RETVAL
 Return type indicating function returns a value from this list.
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__maug__error__retvals.map b/group__maug__error__retvals.map new file mode 100644 index 00000000..e9c50fba --- /dev/null +++ b/group__maug__error__retvals.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__error__retvals.md5 b/group__maug__error__retvals.md5 new file mode 100644 index 00000000..d2d947e9 --- /dev/null +++ b/group__maug__error__retvals.md5 @@ -0,0 +1 @@ +af9e58a2fbc9bffc06373315124f46d4 \ No newline at end of file diff --git a/group__maug__error__retvals.png b/group__maug__error__retvals.png new file mode 100644 index 0000000000000000000000000000000000000000..c9c885e6de0613db2660c08598909d62dc3d7147 GIT binary patch literal 3748 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 + + + + + + +maug: Maug File Format API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Maug File Format API
+
+
+
+Collaboration diagram for Maug File Format API:
+
+
+ + + + +
+ + + + + +

+Topics

 Maug File Format: Bitmap
 Constants and functions describing the Windows bitmap format.
 
+ + + +

+Files

file  mfmt.h
 
+ + + + +

+Data Structures

struct  MFMT_STRUCT
 Generic image description struct. More...
 
+ + + + + + + + + + + +

+Macros

+#define MFMT_DECOMP_FLAG_4BIT   0x01
 
+#define MFMT_DECOMP_FLAG_8BIT   0x02
 
+#define MFMT_PX_FLAG_INVERT_Y   0x01
 
+#define MFMT_TRACE_BMP_LVL   0
 
+#define MFMT_TRACE_RLE_LVL   0
 
+ + + + + + + + + + + + + +

+Typedefs

typedef MERROR_RETVAL(* mfmt_decode) (mfile_t *p_file_in, off_t file_offset, off_t file_sz, size_t line_w, MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags)
 Callback to decode compressed data.
 
+typedef MERROR_RETVAL(* mfmt_read_header_cb) (struct MFMT_STRUCT *header, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t *p_flags)
 Callback to read image header and get properties.
 
+typedef MERROR_RETVAL(* mfmt_read_palette_cb) (struct MFMT_STRUCT *header, uint32_t *palette, size_t palette_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
 Callback to read image palette into 24-bit RGB values.
 
+typedef MERROR_RETVAL(* mfmt_read_px_cb) (struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
 Callback to read image pixels into 8-bit values.
 
+ + + + + + + + + + +

+Functions

+MERROR_RETVAL mfmt_decode_rle (mfile_t *p_file_in, off_t file_offset, off_t file_sz, size_t line_w, MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags)
 
+MERROR_RETVAL mfmt_read_bmp_header (struct MFMT_STRUCT *header, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t *p_flags)
 
+MERROR_RETVAL mfmt_read_bmp_palette (struct MFMT_STRUCT *header, uint32_t *palette, size_t palette_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
 
+MERROR_RETVAL mfmt_read_bmp_px (struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
 Read mfmt_bitmap pixels into an 8-bit memory bitmap.
 
+

Detailed Description

+

Typedef Documentation

+ +

◆ mfmt_decode

+ +
+
+ + + + +
typedef MERROR_RETVAL(* mfmt_decode) (mfile_t *p_file_in, off_t file_offset, off_t file_sz, size_t line_w, MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags)
+
+ +

Callback to decode compressed data.

+
Parameters
+ + + + + + + +
p_file_inPointer to file to read compressed data from.
file_offsetNumber of bytes into p_file where data starts.
file_szNumber of bytes of compressed data in p_file.
buffer_outUnlocked handle to write uncompressed data to.
buffer_out_szMaximum number of bytes buffer_out can hold.
flagsAdditional flags for compression options.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__fmt.map b/group__maug__fmt.map new file mode 100644 index 00000000..8662e5e8 --- /dev/null +++ b/group__maug__fmt.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__fmt.md5 b/group__maug__fmt.md5 new file mode 100644 index 00000000..e314f19d --- /dev/null +++ b/group__maug__fmt.md5 @@ -0,0 +1 @@ +8130e5e8fec4153494db232cd1adbafc \ No newline at end of file diff --git a/group__maug__fmt.png b/group__maug__fmt.png new file mode 100644 index 0000000000000000000000000000000000000000..471e8d75f6a8ed6eed9587a6886fe66b3597b1f8 GIT binary patch literal 4802 zcmZvg2T)T{w}pd9Z&IX500BXYbVWKS9Rvvoiu4kC6#_v5ND-A{iAw08bVBbX0xC5~ z@4ZV$dWUzId2i-B;_{t}%R)mSbiSG@%7%W4>q##SpV%F@DE{@RhZ4N1%5GKWX;f+C z;8z>`9CyF(w&fe+O#RxblFWFQ=sZVC2{WVk1tBpnQw$YvHs0~sT$CN*I%i;n>SuOWw=uuY?znVt0E^MzvMMce3ejV|3 z;{gZTijQoh=zg6R<|8_EDN@}f+LFIEzRXPdn$5B^-;Plk7mC4P2$*=PYWW2OSY61@ z;NW69iT6E=>`1RN+S=NBA3@PHA&i$pqP)hHO>y-~qgfc~3K*jY)6I|?@bkFpn^a*i zUSC@9_l6%92t$eg>+=ol-C=dvQ+)jrCqmMWF1D!eGRP8Yn@@Sog@#J9B{%083RT7ft zt}o_WX`P&%+q$|cNmnY_(LE07)zxu?B-GvA-3{Z_F9@>p@@!f^+$8iNy&y@qCSMF} zpwf}w8+2C|UIwwwc)a(*?cEriqCpA__*#7vIE( z78Vw4Y;2HLJpSSLp5gv;%Od9?;az|ENX9!guC>q0Z$zsJo7c5wr3AJsUL5Jgu*;KU zPO`EPn+z^={RAPQp+Fzv6f0Ax11Nd;EFZ-ZG%P&a6YTmtI{-6}P+F%U2DRnp;rZ?K z_~QIzGY5;c-59T)pPx@1aPmYT?m71zVZ3Fa5i}fMLyjS$bbU^JcENNGBy4Vj($xLB zB=K+Q`AY1&*h^C<2M3$e9!6k9t$ym|E=<1MymjkV2EOJ`f)q{mS>tp^oWzoM4Li|P z=V+E*O6TF$Ty?;a_~hgy{CqijLY5$5q2I>ZTF6N1IujE;6zXbZWM=lr$cQmP%AHqG zFfx)!^fv>*Lkv_;^-v2?^<- zb2(Yxjrrei=>raDBG!hBL$zat(_lHR9UVN}+@ZO-0&N9%>lfzdF9&mecET?tv<5R! zRwig{Z2aBQGB-WlP=9f@>GuBD)D%a)QKW9xDw+d(?P?u_0rI6G0dqy>R4VlX8>fJh z0rS&8IH+ZJ*)yFc{FsmlZlXI-n$UMWy?cuvw){QVi9N zd!o*RLPiCqnr?2wf=1Y-@=hQZpebv8H%Zo!8Xv*7wl=xFeuIFsy&+r$Rrlm%XYJ+> z{MtzAvl3e}BoYZT18u@2Vs3l1y$}F;gNKLbA80o;2BYESB~C)ao}Qcg4rnT#FWE0d zPvJ=A7<;!KwcWkZ@VEzf7!M9zkku6 zKK(2VI&;3~IvUn!xrDBFZ-UGFWWd^tEl{eiu6LA`m6@Z}IuoUTy}K@WxQ!Pf=ys5F z87_LoZ;*M7iK(Uf#b3Wo+=1WUB;RhQazjHy%m}ui0N$UiUshRJ8hGaa;Nio!(a{S) zQi%$v_!jn;SnWH219O)Gs3>-`oJ?8ux|%0trIUv_C>2H{;u;=oc~>u{I9*eFefLcH*elFSc-bg{w6Ch z$7uxw$V~<8P;J)jP=k8Q9ZrX`$@_nH9jhottdEWzuYXi$Pb(|?oMVtB4)4GSpXon+ zs$pu%23V@1stR^m&km;C_e@vz{9~Z9YD!9w{r$6AmH7C0xnTR?@CI8YlHm#LMuGYU zF?KCBIM8EnWxzbBxv42UEbQw3#sq$+OOZwilpRz!;QZ(>tTsKJhk=|3;NU^Nk%aGt zDIkEBi;EB_a#?w~rmLW!V1{nyOQPQwp+PzB`NXo?M;zP$gL)(oSYo1 z#g4f7#YJ(~QOWJ?Z4GU0ZZ58nh6W|D1N1r46NVv#sp$t&z$-IF^Qe*vL{%Ji=wSGs|O_45WyYrNmiwOpK-W2ygFSDi0l zFuKCJZSsc^)C=pCQ<+#SuuRIlnwKGeLTXHfFTu=k{W>iJgNmKqt(cgYtHi`wu5RO1 z%350F2AMhpmK_)|HdzD~AGvBoPEPKDKrBktA5mHQ3mndITsV}U4Hw(|@tOpsG8(&* zDC6_4qT*g}Z|?{Ef{MC2fJaBMO$+9ptI7NI6gecFl#~>I6FoisLjwc)i{qhsW?6)g zae?VfIFmUiCnu!bB-*^tezFefheW15zWub)4a(2Y4=iP7brrudkSE4WS-Cd`5rjv9WQ^1n5J73|kWulMijSIChndDBv`p>a5J6 z{HdYK@uhyU+1JNKGwg}O2M2#-?4r?VNx$;vXBpby%0E ztZYI_iMX|mP5x*;5XI&sE_=Yqkus~GK-WKhUB}SyvufuF;+1Z`Q7P&Kp{1=&MnglQ zGqj)iD4~XOWpFLeP(b10^hLi@`L6f3q19)VZb`c+EnVHOAv_Jvg}7#bnWKTiKvg)L z7l4d5Qk{aORf*nYm97{YHDYY-Itdy#av-lAZ2O?Op@&0=@=@3|s zq_$L3Q`1%>35UiQnosZEiB3!3YaCAA&CRX1LWdVkY;m$une3qV=uy+uRLZ4Sf%t?t zK|WtbO}`>Zzu@NP-rC(&$$(8rE6WQBQAVphG&6&OOESvi==pR%BqZQ}hEo7hw6wLo z1r}oZvyVSnxp5UhI;}@Qu#oakQ4j!JK1Uii+ zBHn*1$1Yj;kVakw$jxy7eb8yBL6&YD(OzmQr`mh=2|kp3I?FI(M}!$eBt*n@wCNIC zdj)jEWsU?G)YjLh)zs94?=37W0BpZKn0)y@)*_HaQBjc{wX0uxuQHHHrr8dF5wxV3 z^H40q$GfJcrvJ9KtX2o};S10{lb7$ZviR=YxdXSm{E)D5TQA%FoP3yHI6N{!%gCsP zL{>jqQ|{WG^jGkaf#&DupCv2X_BE-C$3<<;wUh>31VSQ_g?I1X1uzqJ8@~^#ep^_$ z*;3R}lGW4Odp?3AaQbAko-6c~N;Bx10myNxB zi~PZOXl<=5N8q7Vp`M4WEziYKR}jwx7<*c3YJ)Yom3wv4lnekRV@h6b?zfzrx9S|I z&pqGOwS%^{wz3Tc3e0K;Ma<5WsOo5(Aj6(T#L=+Mm$qqg9KG_E&@?8ag_X zc_;g0?py!NsYzX*`FZBK^&Z%tU-bgc7#XkW^v2P-Vi0)g~}p^ zb#_1;>TxOuxBB_(7a0YG%|PxGm(j8uV}!M}wS&96J;;#3IfNC+9eAc*%A^Qt;)qK0 z#<07S6Buoddc_lg>*3+yMi$bOv1EkuJtrHrn_hFTmp@qmE}oyC!+;MAmt|3B($`$( zHofU|P4sY;CwHE4VP<}QbZe`|l`B^Oo=HS-yL4djfHlX(1FHc{OlSKF%b723Vdn;p z4$994g|bM%b?W;FFN3ZaFsI(WJ}^mXX=$%C(Y$-dN!wZ(pTHqSh;@?y6w1-biAzBt z8I<(9QQir56A}1w;fwLVg9AP(DW=dy%l(Z_Aj~vFfeZ#c5?Wf?`!X^xQ`3(AoX{T* zI~{-Ohl2Sri+NpyuOVkC*xHw+x7p_(S->oAOA6ws?bd7) zD44#5g`S^Zm1-AGR!&Z?wY}ZC=bI|lqCUB~S?$}mZ-;#;=lz#+e@9L(5k#%);SU<0 zyW^Tl>@sICF$uHzrwbxMA9+1MhI#YH$+yTt&*Dkz|iRtqgG6mfNRt*WiPOv&#R&)zyCFWI&`((>zJTgD6Wb?-hG9JpI!8<2-}|57)u|gKb@H@HT=(%McK9gV z(Z?u|3c=i`EAM{$#svUlWn~r2Z@<2<&{Smg3$$o27jp*et!~yFut60SmFcy$D3g4( ze51M5)kr`b01^NUjj8g@A15(lHqAwjeY~AXvg$@gU&9%hn3y8PlBq#BsRBd;3sw-N zLB!zBAS<+}*M0VkrJ$g|$iQo2q<$bKHa2!7I)CR}#+^ekFcCDA9&4Y#?c0{SOFe%6 z{)p8|_xdx&moHzcMYF0pI`RiMp}ia(b4EVfRh#N+XuKIwTFO5s=vW)oDg-Y{(J?W> z0x9S~g5sx-J3ZCCwxO;e5!{1-V{l`(Js)(V--|qLR zf$H63sS4do-ZFJKTw7-+@6DS8(Q3cu+tA3p0pmEupmR$+{Vp914GlR3#Yv)DF=M}L zav%$-S`1qoA&p$a4fncN@88qJidewGYJe-1;ykOUvXT$1vw+sbt$&lQtggmMzgSc% zIKEEFsg+SOmGiaW@Yz+LVDO`;eP`mv4f3nLVt_I7@m_pYJIihD8$USBaf1K%VB`Nk z_prK~<(5}nc%`u`?pFlO^E#9vXBB-m7Q0q5&XtW{*meqS{LqJ#E>Y@cn)gEPSvoHX xs(lwz_jbGLEACZ&>UWU;U!L(?^KQBzWTP_*LyjVN!9yvCrmC(=!2`>X{{gr?iJ<@h literal 0 HcmV?d00001 diff --git a/group__maug__fmt__bmp.html b/group__maug__fmt__bmp.html new file mode 100644 index 00000000..cdaa538a --- /dev/null +++ b/group__maug__fmt__bmp.html @@ -0,0 +1,203 @@ + + + + + + + +maug: Maug File Format: Bitmap + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Maug File Format: Bitmap
+
+
+ +

Constants and functions describing the Windows bitmap format. +More...

+
+Collaboration diagram for Maug File Format: Bitmap:
+
+
+ + + + +
+ + + + + + + +

+Data Structures

struct  MFMT_STRUCT_BMPINFO
 BITMAPINFO struct that comes before Windows bitmap data. More...
 
struct  MFMT_STRUCT_BMPFILE
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define MFMT_BMPINFO_OFS_WIDTH   4
 
+#define MFMT_BMPINFO_OFS_HEIGHT   8
 
+#define MFMT_BMPINFO_OFS_COLOR_PLANES   12
 
+#define MFMT_BMPINFO_OFS_BPP   14
 
+#define MFMT_BMPINFO_OFS_COMPRESSION   16
 
+#define MFMT_BMPINFO_OFS_SZ   20
 
+#define MFMT_BMPINFO_OFS_HRES   24
 
+#define MFMT_BMPINFO_OFS_VRES   28
 
+#define MFMT_BMPINFO_OFS_PAL_SZ   32
 
+#define MFMT_BMPINFO_OFS_IMP_COLORS   36
 
+#define MFMT_BMP_COMPRESSION_NONE   (0)
 MFMT_STRUCT_BMPINFO::compression value indicating none.
 
+#define MFMT_BMP_COMPRESSION_RLE8   (1)
 MFMT_STRUCT_BMPINFO::compression value indicating 8-bit RLE.
 
+#define MFMT_BMP_COMPRESSION_RLE4   (2)
 MFMT_STRUCT_BMPINFO::compression value indicating 4-bit RLE.
 
#define mfmt_bmp_check_header()
 
+

Detailed Description

+

Constants and functions describing the Windows bitmap format.

+

Macro Definition Documentation

+ +

◆ mfmt_bmp_check_header

+ +
+
+ + + + + + + +
#define mfmt_bmp_check_header()
+
+Value:
if( 40 == header->sz ) { \
+
header_bmp_info = (struct MFMT_STRUCT_BMPINFO*)header; \
+
} else if( 0x4d42 == *((uint16_t*)header) ) { \
+
debug_printf( MFMT_TRACE_BMP_LVL, "bmp file header detected" ); \
+
header_bmp_file = (struct MFMT_STRUCT_BMPFILE*)header; \
+
header_bmp_info = &(header_bmp_file->info); \
+
} else { \
+
error_printf( "unable to select read header!" ); \
+
retval = MERROR_FILE; \
+
goto cleanup; \
+
}
+
Definition mfmt.h:105
+
BITMAPINFO struct that comes before Windows bitmap data.
Definition mfmt.h:80
+
+
+
+
+ + +
+ + diff --git a/group__maug__fmt__bmp.map b/group__maug__fmt__bmp.map new file mode 100644 index 00000000..cefc8641 --- /dev/null +++ b/group__maug__fmt__bmp.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__fmt__bmp.md5 b/group__maug__fmt__bmp.md5 new file mode 100644 index 00000000..1dfe0560 --- /dev/null +++ b/group__maug__fmt__bmp.md5 @@ -0,0 +1 @@ +b3e185bc4a743f240f9fcf9f1db48718 \ No newline at end of file diff --git a/group__maug__fmt__bmp.png b/group__maug__fmt__bmp.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5fe82f1d5cd991ed562cf0d769810af9a7b0cf GIT binary patch literal 4829 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 R1 + + + + + + +maug: Memory Management API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Memory Management API
+
+
+ + + + +

+Files

file  mmem.h
 
+ + + + + + + + + + + + + + + + + + +

+Macros

+#define maug_malloc(nmemb, sz)   malloc( sz * nmemb )
 
#define maug_mrealloc(handle, nmemb, sz)   realloc( handle, (sz) * (nmemb) )
 
#define maug_mzero(ptr, sz)   memset( ptr, '\0', sz )
 Zero the block of memory pointed to by ptr.
 
+#define maug_mcpy(ptr_dest, ptr_src, sz)   memcpy( ptr_dest, ptr_src, sz )
 
+#define maug_mfree(handle)   free( handle ); handle = NULL;
 
+#define maug_mlock(handle, ptr)   ptr = handle; handle = NULL;
 
+#define maug_munlock(handle, ptr)   handle = ptr; ptr = NULL;
 
#define maug_mrealloc_test(new_handle, handle, nmemb, sz)
 
+ + + +

+Typedefs

+typedef void * MAUG_MHANDLE
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ maug_mrealloc

+ +
+
+ + + + + + + + + + + + + + + + +
#define maug_mrealloc( handle,
nmemb,
sz )   realloc( handle, (sz) * (nmemb) )
+
+

\warn This does not test that reallocation was successful! Use maug_mrealloc_test() for that.

+ +
+
+ +

◆ maug_mrealloc_test

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#define maug_mrealloc_test( new_handle,
handle,
nmemb,
sz )
+
+Value:
maug_cleanup_if_lt_overflow( (sz) * (nmemb), sz ); \
+
new_handle = maug_mrealloc( handle, nmemb, sz ); \
+
maug_cleanup_if_null_alloc( MAUG_MHANDLE, new_handle ); \
+
handle = new_handle;
+
#define maug_mrealloc(handle, nmemb, sz)
Definition mmem.h:53
+
+
+
+ +

◆ maug_mzero

+ +
+
+ + + + + + + + + + + +
#define maug_mzero( ptr,
sz )   memset( ptr, '\0', sz )
+
+ +

Zero the block of memory pointed to by ptr.

+

\warn This should be used on pointers, not handles!

+ +
+
+
+ + +
+ + diff --git a/group__maug__mfile.html b/group__maug__mfile.html new file mode 100644 index 00000000..9a5f7081 --- /dev/null +++ b/group__maug__mfile.html @@ -0,0 +1,589 @@ + + + + + + + +maug: RetroFile API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFile API
+
+
+ +

Abstraction layer for dealing with files on retro systems. +More...

+
+Collaboration diagram for RetroFile API:
+
+
+ + + + +
+ + + + + +

+Topics

 RetroFile Types
 Types of files/data stores that mfile can abstract from.
 
+ + + +

+Files

file  mfile.h
 
+ + + + + +

+Data Structures

union  MFILE_HANDLE
 
struct  MFILE_CADDY
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define mfile_check_lock(p_file)   (NULL != (p_file)->mem_buffer)
 
#define mfile_default_case(p_file)
 
#define mfile_seek(p_file, idx)
 
#define mfile_has_bytes(p_file)
 
#define mfile_cread(p_file, p_c)
 
#define mfile_cread_at(p_file, p_c, idx)
 
#define mfile_u16read_at(p_file, p_u16, idx)
 
#define mfile_u16read_lsbf_at(p_file, p_u16, idx)
 
#define mfile_u32read_at(p_file, p_u32, idx)
 
#define mfile_u32read_lsbf(p_file, p_u32)
 
#define mfile_u32read_lsbf_at(p_file, p_u32, idx)
 
+#define mfile_get_sz(p_file)   ((p_file)->sz)
 
#define mfile_reset(p_file)
 
+ + + +

+Typedefs

+typedef struct MFILE_CADDY mfile_t
 
+ + + + + + + + + + + + + + +

+Functions

+MERROR_RETVAL mfile_read_block (mfile_t *p_f, uint8_t *buf, off_t buf_sz)
 
+MERROR_RETVAL mfile_read_line (mfile_t *, char *buffer, off_t buffer_sz)
 
+MERROR_RETVAL mfile_lock_buffer (MAUG_MHANDLE, mfile_t *p_file)
 Lock a buffer and assign it to an mfile_t to read/write.
 
MERROR_RETVAL mfile_open_read (const char *filename, mfile_t *p_file)
 Open a file and read it into memory or memory-map it.
 
+void mfile_close (mfile_t *p_file)
 Close a file opened with mfile_open_read().
 
+

Detailed Description

+

Abstraction layer for dealing with files on retro systems.

+

Macro Definition Documentation

+ +

◆ mfile_cread

+ +
+
+ + + + + + + + + + + +
#define mfile_cread( p_file,
p_c )
+
+Value:
switch( (p_file)->type ) { \
+ +
(p_file)->last_read = fread( p_c, 1, 1, (p_file)->h.file ); \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
#define MFILE_CADDY_TYPE_FILE_READ
A standard UNIX file opened for reading.
Definition mfile.h:31
+
+
+
+ +

◆ mfile_cread_at

+ +
+
+ + + + + + + + + + + + + + + + +
#define mfile_cread_at( p_file,
p_c,
idx )
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, idx, SEEK_SET ); \
+
(p_file)->last_read = fread( p_c, 1, 1, (p_file)->h.file ); \
+
break; \
+ +
*p_c = (p_file)->mem_buffer[idx]; \
+
(p_file)->mem_cursor += 1; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
#define MFILE_CADDY_TYPE_MEM_BUFFER
An array of bytes in memory abstracted through this library.
Definition mfile.h:36
+
+
+
+ +

◆ mfile_default_case

+ +
+
+ + + + + + + +
#define mfile_default_case( p_file)
+
+Value:
default: \
+
error_printf( "unknown file type: %d", (p_file)->type ); \
+
break;
+
+
+
+ +

◆ mfile_has_bytes

+ +
+
+ + + + + + + +
#define mfile_has_bytes( p_file)
+
+Value:
((MFILE_CADDY_TYPE_FILE_READ == ((p_file)->type) ? \
+
(off_t)ftell( (p_file)->h.file ) : \
+
(p_file)->mem_cursor) < (p_file)->sz)
+
+
+
+ +

◆ mfile_reset

+ +
+
+ + + + + + + +
#define mfile_reset( p_file)
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, 0, SEEK_SET ); \
+
break; \
+ +
(p_file)->mem_cursor = 0; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+ +

◆ mfile_seek

+ +
+
+ + + + + + + + + + + +
#define mfile_seek( p_file,
idx )
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, idx, SEEK_SET ); \
+
break; \
+ +
(p_file)->mem_cursor = idx; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+ +

◆ mfile_u16read_at

+ +
+
+ + + + + + + + + + + + + + + + +
#define mfile_u16read_at( p_file,
p_u16,
idx )
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, idx, SEEK_SET ); \
+
(p_file)->last_read = \
+
fread( (((uint8_t*)p_u16) + 1), 1, 1, (p_file)->h.file ); \
+
(p_file)->last_read += \
+
fread( ((uint8_t*)p_u16), 1, 1, (p_file)->h.file ); \
+
break; \
+ +
((uint8_t*)(p_u16))[0] = (p_file)->mem_buffer[idx]; \
+
((uint8_t*)(p_u16))[1] = (p_file)->mem_buffer[idx + 1]; \
+
(p_file)->mem_cursor += 2; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+ +

◆ mfile_u16read_lsbf_at

+ +
+
+ + + + + + + + + + + + + + + + +
#define mfile_u16read_lsbf_at( p_file,
p_u16,
idx )
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, idx, SEEK_SET ); \
+
(p_file)->last_read = fread( p_u16, 1, 2, (p_file)->h.file ); \
+
break; \
+ +
((uint8_t*)(p_u16))[0] = (p_file)->mem_buffer[idx + 1]; \
+
((uint8_t*)(p_u16))[1] = (p_file)->mem_buffer[idx]; \
+
(p_file)->mem_cursor += 2; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+ +

◆ mfile_u32read_at

+ +
+
+ + + + + + + + + + + + + + + + +
#define mfile_u32read_at( p_file,
p_u32,
idx )
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, idx, SEEK_SET ); \
+
(p_file)->last_read = \
+
fread( (((uint8_t*)p_u32) + 3), 1, 1, (p_file)->h.file ); \
+
(p_file)->last_read += \
+
fread( (((uint8_t*)p_u32) + 2), 1, 1, (p_file)->h.file ); \
+
(p_file)->last_read += \
+
fread( (((uint8_t*)p_u32) + 1), 1, 1, (p_file)->h.file ); \
+
(p_file)->last_read += \
+
fread( ((uint8_t*)p_u32), 1, 1, (p_file)->h.file ); \
+
break; \
+ +
((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[idx]; \
+
((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[idx + 1]; \
+
((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[idx + 2]; \
+
((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[idx + 3]; \
+
(p_file)->mem_cursor += 4; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+ +

◆ mfile_u32read_lsbf

+ +
+
+ + + + + + + + + + + +
#define mfile_u32read_lsbf( p_file,
p_u32 )
+
+Value:
switch( (p_file)->type ) { \
+ +
(p_file)->last_read = fread( p_u32, 1, 4, (p_file)->h.file ); \
+
break; \
+ +
((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[(p_file)->mem_cursor]; \
+
((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[(p_file)->mem_cursor + 1]; \
+
((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[(p_file)->mem_cursor + 2]; \
+
((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[(p_file)->mem_cursor + 3]; \
+
(p_file)->mem_cursor += 4; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+ +

◆ mfile_u32read_lsbf_at

+ +
+
+ + + + + + + + + + + + + + + + +
#define mfile_u32read_lsbf_at( p_file,
p_u32,
idx )
+
+Value:
switch( (p_file)->type ) { \
+ +
fseek( (p_file)->h.file, idx, SEEK_SET ); \
+
(p_file)->last_read = fread( p_u32, 1, 4, (p_file)->h.file ); \
+
break; \
+ +
((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[idx]; \
+
((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[idx + 1]; \
+
((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[idx + 2]; \
+
((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[idx + 3]; \
+
(p_file)->mem_cursor += 4; \
+
break; \
+
mfile_default_case( p_file ); \
+
}
+
+
+
+

Function Documentation

+ +

◆ mfile_open_read()

+ +
+
+ + + + + + + + + + + +
MERROR_RETVAL mfile_open_read (const char * filename,
mfile_t * p_file )
+
+ +

Open a file and read it into memory or memory-map it.

+
Parameters
+ + +
filenameNULL-terminated path to file to open.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__mfile.map b/group__maug__mfile.map new file mode 100644 index 00000000..91823948 --- /dev/null +++ b/group__maug__mfile.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__mfile.md5 b/group__maug__mfile.md5 new file mode 100644 index 00000000..0450a310 --- /dev/null +++ b/group__maug__mfile.md5 @@ -0,0 +1 @@ +29213ae59d7d759fcc8f6fffeecad1cb \ No newline at end of file diff --git a/group__maug__mfile.png b/group__maug__mfile.png new file mode 100644 index 0000000000000000000000000000000000000000..068d1543dd6e3b0bc7300a383c608c4477fbb529 GIT binary patch literal 3375 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 + + + + + + +maug: RetroFile Types + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFile Types
+
+
+ +

Types of files/data stores that mfile can abstract from. +More...

+
+Collaboration diagram for RetroFile Types:
+
+
+ + + + +
+ + + + + + + + +

+Macros

+#define MFILE_CADDY_TYPE_FILE_READ   0x01
 A standard UNIX file opened for reading.
 
+#define MFILE_CADDY_TYPE_MEM_BUFFER   0x80
 An array of bytes in memory abstracted through this library.
 
+

Detailed Description

+

Types of files/data stores that mfile can abstract from.

+

This library is designed with the intention of including various archive and "weird hardware storage" formats.

+
+ + +
+ + diff --git a/group__maug__mfile__types.map b/group__maug__mfile__types.map new file mode 100644 index 00000000..3cf4a1a2 --- /dev/null +++ b/group__maug__mfile__types.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__mfile__types.md5 b/group__maug__mfile__types.md5 new file mode 100644 index 00000000..98ab8003 --- /dev/null +++ b/group__maug__mfile__types.md5 @@ -0,0 +1 @@ +366413e56bcf4c133c92d3785fee5d8f \ No newline at end of file diff --git a/group__maug__mfile__types.png b/group__maug__mfile__types.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3955c9b6320d9902113d7c571deec85250e523 GIT binary patch literal 3407 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 + + + + + + +maug: RetroFlat API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat API
+
+
+ +

Abstraction layer header for retro systems. +More...

+
+Collaboration diagram for RetroFlat API:
+
+
+ + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Topics

 RetroFlat Example
 An extremely simple single-file annotated example program written with the RetroFlat API.
 
 RetroFlat Compilation
 Makefile examples and compiler considerations for using RetroFlat.
 
 RetroFlat Colors
 Color definitions RetroFlat is aware of, for use with the RetroFlat Drawing API.
 
 RetroFlat API Return Values
 Standardized return values from RetroFlat API functions.
 
 RetroFlat Drawing API
 Functions for drawing primitives on-screen.
 
 Global Flags
 Flags that may be present on RETROFLAT_STATE::retroflat_flags.
 
 RetroFlat Config API
 Tools for loading and saving config data between sessions.
 
 RetroFlat Message API
 These flags can be passed to retroflat_message() to indicate the type of message being conveyed.
 
 RetroFlat VDP API
 Video Display Processor tools for modifying display output.
 
 RetroFlat Bitmap API
 Tools for loading bitmaps from disk and drawing them on-screen.
 
 RetroFlat Assets API
 Functions and macros for handling graphical asset files.
 
 RetroFlat Input API
 Functions and constants for polling and interpreting user input.
 
+ + + + +

+Files

file  retroflt.h
 Abstraction layer header for retro systems.
 
+ + + + + + + +

+Data Structures

struct  RETROFLAT_ARGS
 Struct containing configuration values for a RetroFlat program. More...
 
struct  RETROFLAT_STATE
 Global singleton containing state for the current platform. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROFLAT_BITMAP_TRACE_LVL   0
 
+#define RETROFLAT_KB_TRACE_LVL   0
 
#define retroflat_read_lsbf_32(bytes, offset)
 
+#define retroflat_read_lsbf_16(bytes, offset)    ((bytes[offset]) | (bytes[offset + 1] << 8))
 
+#define RETROFLAT_DEFAULT_SCREEN_W   320
 
+#define RETROFLAT_DEFAULT_SCREEN_H   200
 
+#define RETROFLAT_GL_Z   -0.001
 
#define retroflat_on_resize(w, h)
 
+#define retroflat_screen_w()
 Get the current screen width in pixels.
 
+#define retroflat_screen_h()
 Get the current screen height in pixels.
 
+#define retroflat_screen_buffer()   (&(g_retroflat_state->buffer))
 Get the direct screen buffer or the VDP buffer if a VDP is loaded.
 
#define retroflat_quit(retval_in)
 This should be called in order to quit a program using RetroFlat.
 
+#define RETROFLAT_COLOR_TABLE_CONSTS(idx, name_l, name_u, r, g, b, cgac, cgad)    extern MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u;
 
+ + + + + + +

+Typedefs

+typedef MERROR_RETVAL(* retroflat_proc_resize_t) (uint16_t new_w, uint16_t new_h, void *data)
 
+typedef void(* retroflat_loop_iter) (void *data)
 Prototype for the main loop function passed to retroflat_loop().
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

+MERROR_RETVAL retroflat_loop (retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void *data)
 This should be called once in the main body of the program in order to enter the main loop. The main loop will continuously call loop_iter with data as an argument until retroflat_quit() is called.
 
void retroflat_message (uint8_t flags, const char *title, const char *format,...)
 Display a message in a dialog box and/or on stderr.
 
MERROR_RETVAL retroflat_init (int argc, char *argv[], struct RETROFLAT_ARGS *args)
 Initialize RetroFlat and its underlying layers. This should be called once at the beginning of the program and should quit if the return value indicates any failures.
 
void retroflat_shutdown (int retval)
 Deinitialize RetroFlat and its underlying layers. This should be called once at the end of the program, after retroflat_loop().
 
+void retroflat_set_title (const char *format,...)
 
+retroflat_ms_t retroflat_get_ms ()
 
+uint32_t retroflat_get_rand ()
 
+char retroflat_vk_to_ascii (RETROFLAT_IN_KEY k, uint8_t flags)
 
+void retroflat_set_proc_resize (retroflat_proc_resize_t on_resize_in, void *data_in)
 
+void retroflat_resize_v ()
 
+ + + + + +

+Variables

+MAUG_CONST char *SEG_MCONST gc_retroflat_color_names []
 
+struct RETROFLAT_STATEg_retroflat_state
 
+

Detailed Description

+

Abstraction layer header for retro systems.

+

Macro Definition Documentation

+ +

◆ retroflat_on_resize

+ +
+
+ + + + + + + + + + + +
#define retroflat_on_resize( w,
h )
+
+Value:
g_retroflat_state->screen_w = w; \
+
g_retroflat_state->screen_h = h;
+
int screen_w
The screen width as seen by the system, after scaling.
Definition retroflt.h:2268
+
int screen_h
The screen height as seen by the system, after scaling.
Definition retroflt.h:2270
+
+
+
+ +

◆ retroflat_quit

+ +
+
+ + + + + + + +
#define retroflat_quit( retval_in)
+
+ +

This should be called in order to quit a program using RetroFlat.

+
Parameters
+ + +
retvalThe return value to pass back to the operating system.
+
+
+ +
+
+ +

◆ retroflat_read_lsbf_32

+ +
+
+ + + + + + + + + + + +
#define retroflat_read_lsbf_32( bytes,
offset )
+
+Value:
((bytes[offset]) | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) \
+
| (bytes[offset + 3] << 24))
+
+
+
+

Function Documentation

+ +

◆ retroflat_init()

+ +
+
+ + + + + + + + + + + + + + + + +
MERROR_RETVAL retroflat_init (int argc,
char * argv[],
struct RETROFLAT_ARGS * args )
+
+ +

Initialize RetroFlat and its underlying layers. This should be called once at the beginning of the program and should quit if the return value indicates any failures.

+
Returns
RETROFLAT_OK if there were no problems or other RetroFlat API Return Values if there were.
+ +
+
+ +

◆ retroflat_message()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
void retroflat_message (uint8_t flags,
const char * title,
const char * format,
... )
+
+ +

Display a message in a dialog box and/or on stderr.

+
Parameters
+ + + +
titleA string with the title to use for a dialog box.
formatA format string to be passed to vsnprintf().
+
+
+
Todo
This should display a dialog box on every platform if possible.
+ +
+
+ +

◆ retroflat_shutdown()

+ +
+
+ + + + + + + +
void retroflat_shutdown (int retval)
+
+ +

Deinitialize RetroFlat and its underlying layers. This should be called once at the end of the program, after retroflat_loop().

+
Parameters
+ + +
retvalReturn value from retroflat_init(), so we know what layers are in what state.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt.map b/group__maug__retroflt.map new file mode 100644 index 00000000..d47e7edf --- /dev/null +++ b/group__maug__retroflt.map @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/group__maug__retroflt.md5 b/group__maug__retroflt.md5 new file mode 100644 index 00000000..7d1d92d1 --- /dev/null +++ b/group__maug__retroflt.md5 @@ -0,0 +1 @@ +e76d0767d0ce3a8ad1686b6479e22a50 \ No newline at end of file diff --git a/group__maug__retroflt.png b/group__maug__retroflt.png new file mode 100644 index 0000000000000000000000000000000000000000..cecea1daadb1f42a23659831c7ba84159359678f GIT binary patch literal 41481 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 E0KPV*5dZ)H literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__assets.html b/group__maug__retroflt__assets.html new file mode 100644 index 00000000..d78c0bab --- /dev/null +++ b/group__maug__retroflt__assets.html @@ -0,0 +1,132 @@ + + + + + + + +maug: RetroFlat Assets API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + diff --git a/group__maug__retroflt__assets.map b/group__maug__retroflt__assets.map new file mode 100644 index 00000000..3900f2bd --- /dev/null +++ b/group__maug__retroflt__assets.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__assets.md5 b/group__maug__retroflt__assets.md5 new file mode 100644 index 00000000..d51d1899 --- /dev/null +++ b/group__maug__retroflt__assets.md5 @@ -0,0 +1 @@ +7f6e9a82633a6ef7d46f7752bcd291a8 \ No newline at end of file diff --git a/group__maug__retroflt__assets.png b/group__maug__retroflt__assets.png new file mode 100644 index 0000000000000000000000000000000000000000..544e0d51dc05910800bf4ced9acc00db0ff48815 GIT binary patch literal 3485 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 R3hcKanyNY~6?Yzl{RiC#z&`*0 literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__bitmap.html b/group__maug__retroflt__bitmap.html new file mode 100644 index 00000000..9dcc4050 --- /dev/null +++ b/group__maug__retroflt__bitmap.html @@ -0,0 +1,309 @@ + + + + + + + +maug: RetroFlat Bitmap API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Bitmap API
+
+
+ +

Tools for loading bitmaps from disk and drawing them on-screen. +More...

+
+Collaboration diagram for RetroFlat Bitmap API:
+
+
+ + + + +
+ + + + + +

+Data Structures

struct  RETROFLAT_BITMAP
 Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine if a valid bitmap is loaded. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROFLAT_FLAGS_SCREEN_LOCK   0x02
 
+#define RETROFLAT_BITMAP_EXT   "bmp"
 The filename suffix to be appended with a "." to filenames passed to retroflat_load_bitmap(). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_OPENGL_BPP   32
 
+#define RETROFLAT_TXP_R   0x00
 Compiler-define-overridable constant indicating the Red value of the transparency color on platforms that support it (mainly Win16/SDL). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_TXP_G   0x00
 Compiler-define-overridable constant indicating the Green value of the transparency color on platforms that support it (mainly Win16/SDL). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_TXP_B   0x00
 Compiler-define-overridable constant indicating the Blue value of the transparency color on platforms that support it (mainly Win16/SDL). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_TXP_PAL_IDX   0
 
+#define retroflat_bitmap_ok(bitmap)   (NULL != (bitmap)->b)
 Check to see if a bitmap is loaded.
 
+ + + + + + + + + + + + +

+Functions

MERROR_RETVAL retroflat_load_bitmap (const char *filename, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
 Load a bitmap into the given RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to the limitations enumerated in RetroFlat Bitmap API.
 
+MERROR_RETVAL retroflat_create_bitmap (size_t w, size_t h, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
 
void retroflat_destroy_bitmap (struct RETROFLAT_BITMAP *bitmap)
 Unload a bitmap from a RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on the stack).
 
void retroflat_blit_bitmap (struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
 Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
 
+

Detailed Description

+

Tools for loading bitmaps from disk and drawing them on-screen.

+

Bitmaps handled by retroflat are subject to certain constraints, due to the limitations of the underyling layers:

+
    +
  • They must have a 16-color palette.
  • +
  • The colors must be in the order specified in RetroFlat Colors.
  • +
  • The first color (black) is the transparency color.
  • +
+

RETROFLAT_BITMAP structs loaded with retroflat_load_bitmap() should later be freed using retroflat_destroy_bitmap().

+

Locking from the RetroFlat Drawing API also applies here. Please see that page for more information on retroflat_draw_lock() and retroflat_draw_release().

+
Warning
The screen MUST be locked by calling retroflat_draw_lock() with NULL before it is drawn to, and released with retroflat_draw_release() when drawing is finished before the retroflat_loop_iter() ends!
+

Function Documentation

+ +

◆ retroflat_blit_bitmap()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroflat_blit_bitmap (struct RETROFLAT_BITMAP * target,
struct RETROFLAT_BITMAP * src,
int s_x,
int s_y,
int d_x,
int d_y,
int16_t w,
int16_t h )
+
+ +

Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.

+
Parameters
+ + + + + + + + + +
targetPointer to the RETROFLAT_BITMAP to blit src onto.
srcPointer to the RETROFLAT_BITMAP to blit onto target.
s_xLeft X coordinate to blit starting from on the source bitmap.
s_yTop Y coordinate to blit starting from on the source bitmap.
d_xLeft X coordinate to blit to on the target bitmap.
d_yTop Y coordinate to blit to on the target bitmap.
wPixel width of the region to blit.
hPixel height of the region to blit.
+
+
+
Todo
Currently s_x, s_y, w, and h are not functional on all platforms!
+ +
+
+ +

◆ retroflat_destroy_bitmap()

+ +
+
+ + + + + + + +
void retroflat_destroy_bitmap (struct RETROFLAT_BITMAP * bitmap)
+
+ +

Unload a bitmap from a RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on the stack).

+
Parameters
+ + +
bitmapPointer to the RETROFLAT_BITMAP to unload.
+
+
+ +
+
+ +

◆ retroflat_load_bitmap()

+ +
+
+ + + + + + + + + + + + + + + + +
MERROR_RETVAL retroflat_load_bitmap (const char * filename,
struct RETROFLAT_BITMAP * bmp_out,
uint8_t flags )
+
+ +

Load a bitmap into the given RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to the limitations enumerated in RetroFlat Bitmap API.

+
Parameters
+ + + +
filenameFilename of the bitmap under RETROFLAT_ARGS::assets_path with no separator, ".", or RETROFLAT_BITMAP_EXT.
bmp_outPointer to a RETROFLAT_BITMAP to load the bitmap into.
+
+
+
Returns
RETROFLAT_OK if the bitmap was loaded or RETROFLAT_ERROR_TIMER if there was a problem (e.g. the bitmap was not found).
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__bitmap.map b/group__maug__retroflt__bitmap.map new file mode 100644 index 00000000..5d4fc694 --- /dev/null +++ b/group__maug__retroflt__bitmap.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__bitmap.md5 b/group__maug__retroflt__bitmap.md5 new file mode 100644 index 00000000..1176ba3a --- /dev/null +++ b/group__maug__retroflt__bitmap.md5 @@ -0,0 +1 @@ +081c8dcbadcf7bfb4c7565a2550d789d \ No newline at end of file diff --git a/group__maug__retroflt__bitmap.png b/group__maug__retroflt__bitmap.png new file mode 100644 index 0000000000000000000000000000000000000000..3f35962819040a11649ec35c5ce61d4636f5ca8b GIT binary patch literal 3964 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 Soi{j6LsS$s6w2ky-~R_sI+ + + + + + + +maug: RetroFlat Colors + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +

Color definitions RetroFlat is aware of, for use with the RetroFlat Drawing API. +More...

+
+Collaboration diagram for RetroFlat Colors:
+
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define RETROFLAT_COLOR_TABLE(f)
 This macro defines all colors supported by RetroFlat for primative operations, particularly using retroflat_px().
 
+#define RETROFLAT_COLOR_NULL   (-1)
 
+#define RETROFLAT_COLORS_SZ   16
 
+#define RETROFLAT_COLOR_BLACK   0
 
+#define RETROFLAT_COLOR_DARKBLUE   1
 
+#define RETROFLAT_COLOR_DARKGREEN   2
 
+#define RETROFLAT_COLOR_TEAL   3
 
+#define RETROFLAT_COLOR_DARKRED   4
 
+#define RETROFLAT_COLOR_VIOLET   5
 
+#define RETROFLAT_COLOR_BROWN   6
 
+#define RETROFLAT_COLOR_GRAY   7
 
+#define RETROFLAT_COLOR_DARKGRAY   8
 
+#define RETROFLAT_COLOR_BLUE   9
 
+#define RETROFLAT_COLOR_GREEN   10
 
+#define RETROFLAT_COLOR_CYAN   11
 
+#define RETROFLAT_COLOR_RED   12
 
+#define RETROFLAT_COLOR_MAGENTA   13
 
+#define RETROFLAT_COLOR_YELLOW   14
 
+#define RETROFLAT_COLOR_WHITE   15
 
+ + + + + + +

+Typedefs

+typedef int8_t RETROFLAT_COLOR
 Defines an index in the platform-specific color-table.
 
+typedef int RETROFLAT_COLOR_DEF
 
+

Detailed Description

+

Color definitions RetroFlat is aware of, for use with the RetroFlat Drawing API.

+

The precise type and values of these constants vary by platform.

+

Macro Definition Documentation

+ +

◆ RETROFLAT_COLOR_TABLE

+ +
+
+ + + + + + + +
#define RETROFLAT_COLOR_TABLE( f)
+
+Value:
f( 0, black, BLACK, 0, 0, 0, BLACK, BLACK ) \
+
f( 1, darkblue, DARKBLUE, 0, 0, 170, CYAN, BLACK ) \
+
f( 2, darkgreen, DARKGREEN, 0, 170, 0, CYAN, BLACK ) \
+
f( 3, teal, TEAL, 0, 170, 170, CYAN, CYAN ) \
+
f( 4, darkred, DARKRED, 170, 0, 0, MAGENTA, BLACK ) \
+
f( 5, violet, VIOLET, 170, 0, 170, MAGENTA, BLACK ) \
+
f( 6, brown, BROWN, 170, 85, 0, CYAN, MAGENTA ) \
+
f( 7, gray, GRAY, 170, 170, 170, WHITE, BLACK ) \
+
f( 8, darkgray, DARKGRAY, 85, 85, 85, WHITE, BLACK ) \
+
f( 9, blue, BLUE, 85, 85, 255, CYAN, WHITE ) \
+
f( 10, green, GREEN, 85, 255, 85, CYAN, CYAN ) \
+
f( 11, cyan, CYAN, 85, 255, 255, CYAN, CYAN ) \
+
f( 12, red, RED, 255, 85, 85, MAGENTA, WHITE ) \
+
f( 13, magenta, MAGENTA, 255, 85, 255, MAGENTA, MAGENTA ) \
+
f( 14, yellow, YELLOW, 255, 255, 85, CYAN, MAGENTA ) \
+
f( 15, white, WHITE, 255, 255, 255, WHITE, WHITE )
+
+

This macro defines all colors supported by RetroFlat for primative operations, particularly using retroflat_px().

+

The fields are: index, name (lowercase), name (uppercase), red, green, blue, cga on-color, cga off-color

+

On-color and off-color are used for dithering... odd pixels get one and even pixels get the other.

+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__color.map b/group__maug__retroflt__color.map new file mode 100644 index 00000000..95590f23 --- /dev/null +++ b/group__maug__retroflt__color.map @@ -0,0 +1,5 @@ + + + + + diff --git a/group__maug__retroflt__color.md5 b/group__maug__retroflt__color.md5 new file mode 100644 index 00000000..14169e49 --- /dev/null +++ b/group__maug__retroflt__color.md5 @@ -0,0 +1 @@ +9313ca6bba6ae8ec2087e31069dc0a18 \ No newline at end of file diff --git a/group__maug__retroflt__color.png b/group__maug__retroflt__color.png new file mode 100644 index 0000000000000000000000000000000000000000..b9805ab59425b1dbb976d630402b0d6812207a01 GIT binary patch literal 6451 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 `*Vhe&?+; zA$F$WvzixO#1AZM$nHF~uaq-{4 z+z9qUUY_ndkg>`sfe0^M(z$D3APPjDAP|{0nE+on`Bzr;Ufh8Sq;eQTSK$0UPiUnMB(IY+`_`~ySr{AB=uKuvLMX0wY7~AN(b#f1TaC$|5QA9 z_!*!?0D86DB@zJe`=;vbM8w26`S^%HeE|gH6BPUdMwF74zESPE^aS*xG(d9j93b87 zWACL5NPBHE1K*IArs3vR%l%wjPcjEx4p6qvvgb}-ULFWbZTn(bLPA4bSB7(+h^)wT ze*XLjL~H68jFi{r%=4qoS-8LNFx^)7Z6lu-X_-dC%6+D49>3Bx}ORs5*-th zDryrsxP*62z5w+s9UWCHEjhTkx!0%a!j0-|7Zw)az+*Ht4t@Q)nCUg=@RmI@Bf}6F zPlGBm=bb%WCV3z6!NEbC3n!ucbkaT}u_=$Vw2{vq5Ni{FH0^!DT8T%T?t9o-4u`T1 zj*KL%tk{EG_d3%8+3u&|VG0e6p-M6&g%63y3WD6u!9f{;xQRxi*XKLgfFDxNlABtg zGNcG8jOcu4_Yu%I5i#-FKjB-seN++%IE9b=bsDj9kk%$Xfo6(eC+w;#?tfHlg>Zp` i=>Pw`7L4|;ZiESy7fmZT27>>BK$IV=KdMAn1phxC&q&Y! literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__compiling.html b/group__maug__retroflt__compiling.html new file mode 100644 index 00000000..327f1543 --- /dev/null +++ b/group__maug__retroflt__compiling.html @@ -0,0 +1,303 @@ + + + + + + + +maug: RetroFlat Compilation + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Compilation
+
+
+ +

Makefile examples and compiler considerations for using RetroFlat. +More...

+
+Collaboration diagram for RetroFlat Compilation:
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

#define RETROFLAT_FPS   30
 Target Frames Per Second.
 
+#define retroflat_fps_next()   (1000 / RETROFLAT_FPS)
 
+#define RETROFLAT_WINDOW_CLASS   "RetroFlatWindowClass"
 Unique window class to use on some platforms (e.g. Win32). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_WIN_FRAME_TIMER_ID   6001
 Unique ID for the timer that execute frame draws in Win16/Win32. Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_WIN_LOOP_TIMER_ID   6002
 Unique ID for the timer that execute loop ticks in Win16/Win32. Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_MSG_MAX   4096
 Maximum number of characters possible in a message using retroflat_message(). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_PATH_MAX   256
 Maximum size allocated for asset paths.
 
+#define RETROFLAT_TITLE_MAX   255
 
#define RETROFLAT_VDP_ARGS_SZ_MAX   255
 
+#define RETROFLAT_PATH_SEP   '/'
 The valid path separator on the target platform.
 
+#define RETROFLAT_ASSETS_PATH_MAX   (RETROFLAT_PATH_MAX >> 1)
 Maximum size of the assets path, to allow room for appending.
 
+#define NDS_OAM_ACTIVE   &oamMain
 Active sprite engine screen on Nintendo DS.
 
+#define NDS_SPRITES_ACTIVE   24
 Maximum number of sprites active on-screen on Nintendo DS.
 
+#define RETROFLAT_CONFIG_LN_SZ_MAX   255
 
+#define RETROFLAT_CONFIG_EXT   ".ini"
 
+#define RETROFLAT_BMP_COLORS_SZ_MAX   256
 
+

Detailed Description

+

Makefile examples and compiler considerations for using RetroFlat.

+ + +

RetroFlat Compiler Definitions

Certain options can be configured when a RetroFlat program is compiled by passing definitions with the compiler using the -D flag, or by #define-ing them before retroflt.h is included in the source files.

OS Selection Definitions

+These are mutually exclusive. It's best to specify them, in case RetroFlat can't figure it out from the compiler options. + + + + + + + + + + +
Define Description
RETROFLAT_OS_WIN Specify that the program will run on Windows.
RETROFLAT_OS_DOS Specify that the program will run on DOS DPMI.
RETROFLAT_OS_DOS_REAL Specify that the program will run DOS real mode.
RETROFLAT_OS_UNIX Specify that the program will run on UNIX/Linux.
+

API/Library Selection Definitions

+These are mutually exclusive. RetroGLU API is only supported on some (32-bit and up) platforms. + + + + + + + + + + + + + + + + + + +
Define Description Supports OpenGL
RETROFLAT_API_ALLEGRO Allegro No
RETROFLAT_API_SDL1 SDL 1.2 Yes
RETROFLAT_API_SDL2 SDL 2 No
RETROFLAT_API_WIN16 Windows 3.1x API No
RETROFLAT_API_WIN32 Win32/NT API Yes
RETROFLAT_API_NDS Nintendo DS Yes (Limited)
RETROFLAT_API_PC_BIOS MS-DOS w/ PC BIOS No
RETROFLAT_API_GLUT GLUT (OpenGL-Only) Yes
+

Option Definitions

+These are NOT mutually exclusive. + + + + + + + + + + + + + + + + +
Define Description
RETROFLAT_MOUSE Force-enable mouse on broken APIs (DANGEROUS!)
RETROFLAT_TXP_R Specify R component of bitmap transparent color.
RETROFLAT_TXP_G Specify G component of bitmap transparent color.
RETROFLAT_TXP_B Specify B component of bitmap transparent color.
RETROFLAT_BITMAP_EXT Specify file extension for bitmap assets.
RETROFLAT_NO_RESIZABLE Disallow resizing the RetroFlat window.
RETROFLAT_NO_BLANK_INIT Do not blank screen on retroflat_ini().
+
+ +

RetroFlat Project Makefiles

Win16 (OpenWatcom)

+Compiling projects for Win16 requires the OpenWatcom compiler from https://github.com/open-watcom/open-watcom-v2. Other compilers may work, but this is the only one that has been tested. No other specific libraries are required. The Windows API is used directly.The Watcom Makefile includes assume the following variable definitions from the environment:
    +
  • $WATCOM should be set to the path where the OpenWatcom compiler has been extracted, containing the binw, binl, h, and lib386 directories (among others).
  • +
  • $PATH should contain $WATCOM/bin, so that the wcc386 and accompanying tools below can be executed.
  • +
+For an example of the main.c file, please see RetroFlat Example.

Makefile

+An example to use the unified Makefile include follows. Please name it "Makefile" in the root directory of the project and replace "exampl" with a 6-character binary name for best results!

  # A list of C files included in the project. These must be provided
+  # by you. In this example, our program only has one file.
+  C_FILES := main.c
+
+  # Project-specific defines to pass to EVERY target.
+  GLOBAL_DEFINES := 
+
+  # Include the template Makefile that will create targets for
+  # platforms as specified below.
+  include maug/Makefile.inc
+
+  # Build these targets by default.
+  all: exampl.sdl examplb.exe examplnt.exe
+
+  # Create an icon from exampl.bmp for SDL to use for its window.
+  $(eval $(call TGTSDLICO,mdemo))
+
+  $(eval $(call TGTUNIXSDL,mdemo))
+
+  # Build a DOS real-mode target.
+  $(eval $(call TGTDOSBIOS,exampl))
+
+  # Create an icon and resource file from exampl.bmp for Windows
+  # targets to use.
+  $(eval $(call TGTWINICO,exampl))
+
+  # Build a Windows NT 32-bit target.
+  $(eval $(call TGTWINNT,exampl))
+
+  # Remove built files from previously defined targets.
+  clean:
+     rm -rf $(CLEAN_TARGETS)
+

Macro Definition Documentation

+ +

◆ RETROFLAT_FPS

+ +
+
+ + + + +
#define RETROFLAT_FPS   30
+
+ +

Target Frames Per Second.

+
Todo
FPS currently has no effect in Allegro.
+ +
+
+ +

◆ RETROFLAT_VDP_ARGS_SZ_MAX

+ +
+
+ + + + +
#define RETROFLAT_VDP_ARGS_SZ_MAX   255
+
+

\warn Changing this may break binary compatibility!

+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__compiling.map b/group__maug__retroflt__compiling.map new file mode 100644 index 00000000..5f16192c --- /dev/null +++ b/group__maug__retroflt__compiling.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__compiling.md5 b/group__maug__retroflt__compiling.md5 new file mode 100644 index 00000000..1ae7fad7 --- /dev/null +++ b/group__maug__retroflt__compiling.md5 @@ -0,0 +1 @@ +a02e13c29d727eead6f92acb184fa509 \ No newline at end of file diff --git a/group__maug__retroflt__compiling.png b/group__maug__retroflt__compiling.png new file mode 100644 index 0000000000000000000000000000000000000000..480cbfa91766d2c1366d7b4f0c3c664af20bd175 GIT binary patch literal 3816 zcmYLMcRW>p_`iHJON0oa%#yt#BkI~SB-z{L8YOh?tebI->}y;rs7AO=NmzWsZ)PzIVxz0ou7e9cHmQ+Mw z1aC#Ux{i~5lbRRE&aJyzL(&<`Uik6j_oa-esH=*KikcZx1a=`7g?v3i3mJP{Muw)Q z=Cu$q>HwVk1c9T@ZLXlHiB(5Ohl7LT0>94X=;+vo79(?W+h!Z-_qDt3bDEJ; z#2Q#TIFRi(ns<2blSpn%>lbKRZB2hhE*>8vWMyT$dU~weBX61&$oc;jPvFt|{ekei z$XPB$$f8y%c1t`lB_$yxMaA7+bYrZn5R0YY#0`f3nNVX#xWSM@vmQ%dOfdi02vnYpLvSzgKL(D-;4TFjxSqy#FMvNs7YyFpJsoI@(d9F5G#xIG(q z>7Q_M=Ywi^RMg_E+|2It8siyk$I_Cm{f{&yFE2^jh|q_#i2sCygf5O3shOFX$**6R zM8tG=clTlB(*OK%1^^-_C%62&zplzfd$={D;o(s|5jT+L!?cReTnW3%=>B)#5hLpz z{PpW&JRVOvHK_0N17X(ehyL`556}mol#`zyMM1|y!@{DWt$qFO-MjQRZxRTd>*S9Ii;S?1WHL7)H`j7OQWlJ!L zt*xzxV@il~?v7Kh{E;Xzhbil(Kf|L`!<7h05U z7|Ot4v~6va9UIs9; zu$+LRRa8~k5Pr1-x>vc)$;+QC(Ji@4%gf8xH#F!O8Y(L(k)Y9N6st@!&?QqdGwE0J z5Qs)He@=CEBFNj$ghLjQumh zm9Q`<6S>LP#j)+|uj>~NEv>A$pa1n#SS=kM9i_c-Ls3u8<4bZs z{PWVV)HqBJ3oSKF_Y?YO5b2W9fY!RYy5DMDrmp!v&%?)|(T>9APv2jci1LX>q@H)eAf z`0(z|!czmjn~*mveO7=}?_8tTQ!D};e^E{5nkU0B(r*f^>Rruh8%^FkNP`;ubj zz=1=NNa692phW-Pgw@C6$Uql77^?56rG=;i6C{>nB)_0T&k+5K!7hQ1IiR^)fpL2bLIt z2yZnm+OzZX?w+39%F6hH0v;zg{7Y%dg~}yJlb@fTCT?VGEFm*9x~}eR9rM9mI;=rt zNJz*+SSpl5L=45L5+i=Lxw#o_D!AGbLMB<7!oBHqd*#_ZdPzc;i+!WH_wr4;htjgL zx0BS{ffWE(1gWWTnUYKpSI@6(Yow{Rz zVMC^#|5G?DN9LcJH2FxlH60``OpjRvYAGutBM3gVR6ax!JC6ece+8jaNjDZq!u>xt zH0ER~-%gRt7=f9SgzJr2HxjX_i{+FQMUNJHA7dX>}pZOa67R}Q<%m=qt^YJj4qvN`G z8D_LM-fJ_uF1|@p&2unYvB-e$_wV1S5^x4aLDO$7EkW+`H zK8CaVJ&Z-_`1#4M_Gji56m;;hN-hQBz4fCYZ!NjwuEOx`ZQ_}{n}Hw|fx7iA{Gp#499VLf~RzZt~49G;I zBdV(26b^~_7z>%eYZJ{g$(A-YdfTHIPktAd8P&P6E_TLt4h+Qp`ehB4Q6;pl&PYK4 zk`?gxzEjQQ{I3lPDk{670<9}#WMb}1s_GgVYO1Ph9@Dc-K(zZ(MM7RLcHjpG6#&6) zI%AgGs2?wZfOwcubCUM9wloY3_J<#b$rNL6OFz-m)1x-&vL7aL3=C|EPu@kt4l-HkIR8&+TJGaa+VE<~V>xQi;`X&2^Zd-nnTGal&M`dLt z%*m;>v-7?8-pb2-ZqO_Mz*l+i+0#>!P=*DA0&8bJY6mSr!!XUQTU|g9?j@s;0Om^<Xq;w*Vf$ESOdQHnVHP^cv>ViyX!8kN|s@c?#@pQAy1Q9w#7zqW-1_c z*KSMEB&mlf=jBvZ(t>7$^x7@U+#E5`kHBECZ!14Mi_ce9My$c4keA{nd8wgqJ@|_ihE)i{6F;vb#nj! literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__config.html b/group__maug__retroflt__config.html new file mode 100644 index 00000000..c63ee9ce --- /dev/null +++ b/group__maug__retroflt__config.html @@ -0,0 +1,309 @@ + + + + + + + +maug: RetroFlat Config API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Config API
+
+
+ +

Tools for loading and saving config data between sessions. +More...

+
+Collaboration diagram for RetroFlat Config API:
+
+
+ + + + + + +
+ + + + + + + +

+Topics

 RetroFlat Config Buffer Types
 
 RetroFlat Config Flags
 Flags for the flags parameter of retroflat_config_open().
 
+ + + + +

+Typedefs

typedef FILE * RETROFLAT_CONFIG
 A configuration object to use with the RetroFlat Config API.
 
+ + + + + + + + + + + + +

+Functions

MERROR_RETVAL retroflat_config_open (RETROFLAT_CONFIG *config, uint8_t flags)
 Open a configuration file/registry/SRAM/etc handle.
 
+void retroflat_config_close (RETROFLAT_CONFIG *config)
 
size_t retroflat_config_write (RETROFLAT_CONFIG *config, const char *sect_name, const char *key_name, uint8_t buffer_type, void *buffer, size_t buffer_sz_max)
 Write the contents of a buffer to a config object.
 
size_t retroflat_config_read (RETROFLAT_CONFIG *config, const char *sect_name, const char *key_name, uint8_t buffer_type, void *buffer_out, size_t buffer_out_sz_max, const void *default_out, size_t default_out_sz)
 Write the contents of a buffer to a config object.
 
+

Detailed Description

+

Tools for loading and saving config data between sessions.

+

Typedef Documentation

+ +

◆ RETROFLAT_CONFIG

+ +
+
+ + + + +
typedef FILE* RETROFLAT_CONFIG
+
+ +

A configuration object to use with the RetroFlat Config API.

+

This is a file by default, but may be different things (e.g. a registry key or battery-backed SRAM block) on different platforms.

+ +
+
+

Function Documentation

+ +

◆ retroflat_config_open()

+ +
+
+ + + + + + + + + + + +
MERROR_RETVAL retroflat_config_open (RETROFLAT_CONFIG * config,
uint8_t flags )
+
+ +

Open a configuration file/registry/SRAM/etc handle.

+
Parameters
+ + +
flagsRetroFlat Config Flags to open config with.
+
+
+ +
+
+ +

◆ retroflat_config_read()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
size_t retroflat_config_read (RETROFLAT_CONFIG * config,
const char * sect_name,
const char * key_name,
uint8_t buffer_type,
void * buffer_out,
size_t buffer_out_sz_max,
const void * default_out,
size_t default_out_sz )
+
+ +

Write the contents of a buffer to a config object.

+
Warning
The config object must have been opened with the RETROFLAT_CONFIG_FLAG_W flag disabled!
+
Parameters
+ + + +
buffer_typeRetroFlat Config Buffer Types of the buffer provided.
buffer_out_sz_maxSize of the buffer provided in bytes.
+
+
+ +
+
+ +

◆ retroflat_config_write()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
size_t retroflat_config_write (RETROFLAT_CONFIG * config,
const char * sect_name,
const char * key_name,
uint8_t buffer_type,
void * buffer,
size_t buffer_sz_max )
+
+ +

Write the contents of a buffer to a config object.

+
Warning
The config object must have been opened with the RETROFLAT_CONFIG_FLAG_W flag enabled!
+
Parameters
+ + + +
buffer_typeRetroFlat Config Buffer Types of the buffer provided.
buffer_sz_maxSize of the buffer provided in bytes.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__config.map b/group__maug__retroflt__config.map new file mode 100644 index 00000000..9006b74c --- /dev/null +++ b/group__maug__retroflt__config.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/group__maug__retroflt__config.md5 b/group__maug__retroflt__config.md5 new file mode 100644 index 00000000..046176f7 --- /dev/null +++ b/group__maug__retroflt__config.md5 @@ -0,0 +1 @@ +75860e0c5c6ea1128a45a9ce3918d37e \ No newline at end of file diff --git a/group__maug__retroflt__config.png b/group__maug__retroflt__config.png new file mode 100644 index 0000000000000000000000000000000000000000..4ea4480820e37d1a56473405aafe45730e812def GIT binary patch literal 10619 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 + + + + + + +maug: RetroFlat Config Buffer Types + + + + + + + + + + + + + + +

+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Config Buffer Types
+
+
+
+Collaboration diagram for RetroFlat Config Buffer Types:
+
+
+ + + + +
+ + + + + + + + + + +

+Macros

+#define RETROFLAT_BUFFER_INT   0x00
 
+#define RETROFLAT_BUFFER_STRING   0x01
 
+#define RETROFLAT_BUFFER_FLOAT   0x02
 
+#define RETROFLAT_BUFFER_BOOL   0x04
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__maug__retroflt__config__btypes.map b/group__maug__retroflt__config__btypes.map new file mode 100644 index 00000000..a5962a6d --- /dev/null +++ b/group__maug__retroflt__config__btypes.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__config__btypes.md5 b/group__maug__retroflt__config__btypes.md5 new file mode 100644 index 00000000..b018c6b0 --- /dev/null +++ b/group__maug__retroflt__config__btypes.md5 @@ -0,0 +1 @@ +00b07ef46d1f66368b9328df26af16e5 \ No newline at end of file diff --git a/group__maug__retroflt__config__btypes.png b/group__maug__retroflt__config__btypes.png new file mode 100644 index 0000000000000000000000000000000000000000..7da24f96f52de5a8ae218a54107cf47a0e22d073 GIT binary patch literal 5898 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 literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__config__flags.html b/group__maug__retroflt__config__flags.html new file mode 100644 index 00000000..291099b8 --- /dev/null +++ b/group__maug__retroflt__config__flags.html @@ -0,0 +1,145 @@ + + + + + + + +maug: RetroFlat Config Flags + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Config Flags
+
+
+ +

Flags for the flags parameter of retroflat_config_open(). +More...

+
+Collaboration diagram for RetroFlat Config Flags:
+
+
+ + + + +
+ + + + + + + + +

+Macros

#define RETROFLAT_CONFIG_FLAG_W   0x01
 Flag indicating config object should be opened for WRITING only.
 
+#define RETROFLAT_CONFIG_FLAG_BIN   0x02
 Flag indicating config object holds BINARY data.
 
+

Detailed Description

+

Flags for the flags parameter of retroflat_config_open().

+

Macro Definition Documentation

+ +

◆ RETROFLAT_CONFIG_FLAG_W

+ +
+
+ + + + +
#define RETROFLAT_CONFIG_FLAG_W   0x01
+
+ +

Flag indicating config object should be opened for WRITING only.

+

If this is not specified, the buffer will only be opened for READING.

+

These modes are mutually exclusive! A config object must be closed and reopened to switch between READING and WRITING!

+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__config__flags.map b/group__maug__retroflt__config__flags.map new file mode 100644 index 00000000..a4180dcb --- /dev/null +++ b/group__maug__retroflt__config__flags.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__config__flags.md5 b/group__maug__retroflt__config__flags.md5 new file mode 100644 index 00000000..881728b8 --- /dev/null +++ b/group__maug__retroflt__config__flags.md5 @@ -0,0 +1 @@ +b7dec93bc64770fd4b0d32d632595e4a \ No newline at end of file diff --git a/group__maug__retroflt__config__flags.png b/group__maug__retroflt__config__flags.png new file mode 100644 index 0000000000000000000000000000000000000000..10df68f75555c093a52aa55293f95a4012eeb651 GIT binary patch literal 4845 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 WP<>a)Z*c#LL|4;DqvoD% + + + + + + +maug: RetroFlat Drawing API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Drawing API
+
+
+ +

Functions for drawing primitives on-screen. +More...

+
+Collaboration diagram for RetroFlat Drawing API:
+
+
+ + + + + +
+ + + + + +

+Topics

 RetroFlat Colors
 Color definitions RetroFlat is aware of, for use with the RetroFlat Drawing API.
 
+ + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROFLAT_FLAGS_FILL   0x01
 Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
 
+#define RETROFLAT_FLAGS_OPAQUE   0x01
 Flag for retroflat_create_bitmap() to create a bitmap without transparency.
 
#define RETROFLAT_FLAGS_ALL_CAPS   0x02
 Flag for retroflat_string() and retroflat_string_sz() to print text in all capital letters. Non-letters are unmodified.
 
+#define RETROFLAT_FLAGS_LITERAL_PATH   0x02
 Flag for retroflat_load_bitmap() to not use assets path.
 
#define RETROFLAT_FLAGS_OUTLINE   0x04
 Flag for retroflat_string() and retroflat_string_sz() to print text as outline-only.
 
#define RETROFLAT_FLAGS_SCREEN_BUFFER   0x80
 Flag for retroflat_create_bitmap() to create a WinG-backed bitmap.
 
+#define RETROFLAT_LINE_THICKNESS   1
 Line drawing thickness (only works on some platforms). Is a RetroFlat Compiler Definitions.
 
+#define RETROFLAT_PI   3.14159
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

MERROR_RETVAL retroflat_draw_lock (struct RETROFLAT_BITMAP *bmp)
 Lock a bitmap for drawing. This will be done automatically if necessary and not called explicitly, but performance should improve if done before a batch of drawing operations.
 
+MERROR_RETVAL retroflat_draw_release (struct RETROFLAT_BITMAP *bmp)
 
+void retroflat_px (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, uint8_t flags)
 
void retroflat_rect (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
 Draw a rectangle onto the target RETROFLAT_BITMAP.
 
void retroflat_ellipse (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
 Draw an ellipse onto the target RETROFLAT_BITMAP.
 
void retroflat_line (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags)
 Draw a straight line onto the target RETROFLAT_BITMAP.
 
+void retroflat_cursor (struct RETROFLAT_BITMAP *target, uint8_t flags)
 
void retroflat_string_sz (struct RETROFLAT_BITMAP *target, const char *str, size_t str_sz, const char *font_str, size_t *w_out, size_t *h_out, uint8_t flags)
 Get the size in pixels of a text string when drawn with a given font by retroflat_string().
 
void retroflat_string (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, const char *str, int str_sz, const char *font_str, int16_t x_orig, int16_t y_orig, uint8_t flags)
 Draw a text string at the specified location in the specified font and color on the target RETROFLAT_BITMAP.
 
+void retroflat_get_palette (uint8_t idx, uint32_t *rgb)
 
+MERROR_RETVAL retroflat_set_palette (uint8_t idx, uint32_t rgb)
 
+

Detailed Description

+

Functions for drawing primitives on-screen.

+
Warning
Drawing functions should not be used outside of the context of the main loop, as the platform may not have fully initialized the drawing window until the main loop is called for the first time!
+

Macro Definition Documentation

+ +

◆ RETROFLAT_FLAGS_ALL_CAPS

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_ALL_CAPS   0x02
+
+ +

Flag for retroflat_string() and retroflat_string_sz() to print text in all capital letters. Non-letters are unmodified.

+
Todo
This has not yet been implemented and is present for backward compatibility.
+ +
+
+ +

◆ RETROFLAT_FLAGS_OUTLINE

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_OUTLINE   0x04
+
+ +

Flag for retroflat_string() and retroflat_string_sz() to print text as outline-only.

+
Todo
This has not yet been implemented and is present for backward compatibility.
+ +
+
+ +

◆ RETROFLAT_FLAGS_SCREEN_BUFFER

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_SCREEN_BUFFER   0x80
+
+ +

Flag for retroflat_create_bitmap() to create a WinG-backed bitmap.

+

Also may be present in RETROFLAT_BITMAP::flags to indicate that a bitmap is screen-backed.

+ +
+
+

Function Documentation

+ +

◆ retroflat_draw_lock()

+ +
+
+ + + + + + + +
MERROR_RETVAL retroflat_draw_lock (struct RETROFLAT_BITMAP * bmp)
+
+ +

Lock a bitmap for drawing. This will be done automatically if necessary and not called explicitly, but performance should improve if done before a batch of drawing operations.

+
Parameters
+ + +
bmpPointer to a RETROFLAT_BITMAP struct to lock. If this is NULL, try to lock the screen.
+
+
+
Returns
RETROFLAT_OK if lock was successful or RetroFlat API Return Values otherwise.
+ +
+
+ +

◆ retroflat_ellipse()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroflat_ellipse (struct RETROFLAT_BITMAP * target,
const RETROFLAT_COLOR color,
int16_t x,
int16_t y,
int16_t w,
int16_t h,
uint8_t flags )
+
+ +

Draw an ellipse onto the target RETROFLAT_BITMAP.

+
Parameters
+ + + + + + +
targetPointer to the RETROFLAT_BITMAP to draw onto, or NULL to draw to the screen buffer.
colorRetroFlat Colors in which to draw.
xLeft X coordinate in pixels at which to draw on the target bitmap.
yTop Y coordinate in pixels at which to draw on the target bitmap.
flagsFlags to control drawing. The following flags apply: RETROFLAT_FLAGS_FILL
+
+
+ +
+
+ +

◆ retroflat_line()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroflat_line (struct RETROFLAT_BITMAP * target,
const RETROFLAT_COLOR color,
int16_t x1,
int16_t y1,
int16_t x2,
int16_t y2,
uint8_t flags )
+
+ +

Draw a straight line onto the target RETROFLAT_BITMAP.

+
Parameters
+ + + + + + + + +
targetPointer to the RETROFLAT_BITMAP to draw onto, or NULL to draw to the screen buffer.
x1Left X coordinate of the line to draw on the target bitmap.
y1Top Y coordinate of the line to draw on the target bitmap.
x2Right X coordinate of the line to draw on the target bitmap.
y2Bottom Y coordinate of the line to draw on the target bitmap.
colorRetroFlat Colors in which to draw.
flagsFlags to control drawing. No flags currently apply.
+
+
+ +
+
+ +

◆ retroflat_rect()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroflat_rect (struct RETROFLAT_BITMAP * target,
const RETROFLAT_COLOR color,
int16_t x,
int16_t y,
int16_t w,
int16_t h,
uint8_t flags )
+
+ +

Draw a rectangle onto the target RETROFLAT_BITMAP.

+
Parameters
+ + + + + + +
targetPointer to the RETROFLAT_BITMAP to draw onto, or NULL to draw to the screen buffer.
colorRetroFlat Colors in which to draw.
xLeft X coordinate in pixels at which to draw on the target bitmap.
yTop Y coordinate in pixels at which to draw on the target bitmap.
flagsFlags to control drawing. The following flags apply: RETROFLAT_FLAGS_FILL
+
+
+ +
+
+ +

◆ retroflat_string()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroflat_string (struct RETROFLAT_BITMAP * target,
const RETROFLAT_COLOR color,
const char * str,
int str_sz,
const char * font_str,
int16_t x_orig,
int16_t y_orig,
uint8_t flags )
+
+ +

Draw a text string at the specified location in the specified font and color on the target RETROFLAT_BITMAP.

+
Warning
Font specifications for font_str may vary by platform, so be sure to test with #ifdefs for each!
+
Parameters
+ + + + + + + + + +
targetPointer to the RETROFLAT_BITMAP to draw onto, or NULL to draw to the screen buffer.
colorRetroFlat Colors in which to draw.
strThe text string to draw to the target bitmap.
str_szLength of the string to draw in characters.
font_strName of the font in which to draw the string.
x_origLeft X coordinate in pixels at which to draw on the target bitmap.
y_origTop Y coordinate in pixels at which to draw on the target bitmap.
flagsFlags to control drawing. No flags currently apply.
+
+
+ +
+
+ +

◆ retroflat_string_sz()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroflat_string_sz (struct RETROFLAT_BITMAP * target,
const char * str,
size_t str_sz,
const char * font_str,
size_t * w_out,
size_t * h_out,
uint8_t flags )
+
+ +

Get the size in pixels of a text string when drawn with a given font by retroflat_string().

+
Warning
Font specifications for font_str may vary by platform, so be sure to test with #ifdefs for each!
+
Parameters
+ + + + + + + +
targetPointer to the RETROFLAT_BITMAP on which drawing is planned.
strThe text string to get the size of.
str_szLength of the string to get the size of in characters.
font_strName of the font in which to size the string.
w_outPointer to an int in which to store the string width in pixels.
h_outPointer to an int in which to store the string height in pixels.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__drawing.map b/group__maug__retroflt__drawing.map new file mode 100644 index 00000000..0ba42003 --- /dev/null +++ b/group__maug__retroflt__drawing.map @@ -0,0 +1,5 @@ + + + + + diff --git a/group__maug__retroflt__drawing.md5 b/group__maug__retroflt__drawing.md5 new file mode 100644 index 00000000..7ed0c611 --- /dev/null +++ b/group__maug__retroflt__drawing.md5 @@ -0,0 +1 @@ +a0ef89a1f1e9c331dc414cf82c193c65 \ No newline at end of file diff --git a/group__maug__retroflt__drawing.png b/group__maug__retroflt__drawing.png new file mode 100644 index 0000000000000000000000000000000000000000..9957389eb31e909e19fd7749753ccc99fc2ed4dd GIT binary patch literal 5869 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 HCold7&z+7J literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__example.html b/group__maug__retroflt__example.html new file mode 100644 index 00000000..ee0b9c09 --- /dev/null +++ b/group__maug__retroflt__example.html @@ -0,0 +1,218 @@ + + + + + + + +maug: RetroFlat Example + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
RetroFlat Example
+
+
+ +

An extremely simple single-file annotated example program written with the RetroFlat API. +

+
+Collaboration diagram for RetroFlat Example:
+
+
+ + + + +
+

An extremely simple single-file annotated example program written with the RetroFlat API.

+ + +

maug_retroflt_example_page

This is a brief example program written for the RetroFlat API.This can be compiled using the Makefiles from RetroFlat Compilation.
  / * RETROFLT_C must be defined before including retroflt.h ONLY
+    * in one project file! It must be defined once, and only once,
+    * project-wide! The C file where it is defined is where all the
+    * RetroFlat functions will be placed.
+    * /
+  #define RETROFLT_C
+  #include <retroflt.h>
+
+  / * An example struct containing data fields to be retained between
+    * loop iterations below.
+    * /
+  struct EXAMPLE_DATA {
+     int example;
+  };
+
+  / * This is the loop iteration which will be repeatedly called
+    * by retroflat_loop() below, until retroflat_quit() is called.
+    * /
+  void example_loop( struct EXAMPLE_DATA* data ) {
+     struct RETROFLAT_INPUT input_evt;
+     RETROFLAT_IN_KEY input = 0;
+
+     / * Start loop. * /
+     input = retroflat_poll_input( &input_evt );
+
+     switch( input ) {
+     case RETROFLAT_MOUSE_B_LEFT:
+        / * Left mouse button was clicked, do something! * /
+        break;
+
+     case RETROFLAT_KEY_Q:
+        / * Q key was pressed, so quit! * /
+        retroflat_quit( 0 );
+        break;
+     }
+
+     / *  === Drawing === * /
+
+     / * Lock the screen (NULL) for drawing. * /
+     retroflat_draw_lock( NULL );
+
+     / * Clear the screen by drawing a big gray rectangle to NULL. * /
+     retroflat_rect(
+        NULL, RETROFLAT_COLOR_GRAY, 0, 0,
+        retroflat_screen_w(), retroflat_screen_h(),
+        RETROFLAT_FLAGS_FILL );
+
+     / * Release the screen (NULL) from drawing. * /
+     retroflat_draw_release( NULL );
+  }
+
+  int main( int argc, char* argv[] ) {
+     int retval = 0;
+     struct EXAMPLE_DATA data;
+     struct RETROFLAT_ARGS args;
+
+     / * Startup logging before all else so we catch everything. * /
+     logging_init();
+
+     / * Setup the args to retroflat_init() below to create a window 
+       * titled "Example Program", and load bitmaps from the "assets"
+       * subdirectory next to the executable.
+       * /
+     args.title = "Example Program";
+     args.assets_path = "assets";
+
+     / * Zero out the data holder. * /
+     memset( &data, '\0', sizeof( struct EXAMPLE_DATA ) );
+
+     / * === Setup === * /
+     / * Call the init with the args struct created above. * /
+     retval = retroflat_init( argc, argv, &args );
+
+     / * Make sure setup completed successfully! * /
+     if( RETROFLAT_OK != retval ) {
+        goto cleanup;
+     }
+
+     / * === Main Loop === * /
+     / * Call example_loop( data ) repeatedly, until it calls
+       * retroflat_quit(). Passing it as the first arg means it will
+       * be capped by the framerate.
+       * /
+     retroflat_loop( (retroflat_loop_iter)example_loop, NULL, &data );
+
+  cleanup:
+
+  / * Don't run cleanup stuff under WASM. * /
+  #ifndef RETROFLAT_OS_WASM
+
+     / * This must be called at the end of the program! * /
+     retroflat_shutdown( retval );
+
+     / * Shutdown logging after all else so we catch everything. * /
+     logging_shutdown();
+
+  #endif / * RETROFLAT_OS_WASM * /
+
+     return retval;
+  }
+  / * This should ALWAYS be included after main(), no matter what
+    * platform your program is intended for.
+    * /
+  END_OF_MAIN()
+
+ + +
+ + diff --git a/group__maug__retroflt__example.map b/group__maug__retroflt__example.map new file mode 100644 index 00000000..86310c13 --- /dev/null +++ b/group__maug__retroflt__example.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__example.md5 b/group__maug__retroflt__example.md5 new file mode 100644 index 00000000..0e5fd670 --- /dev/null +++ b/group__maug__retroflt__example.md5 @@ -0,0 +1 @@ +ffce6aa9c3bbc7d387de54a73c449463 \ No newline at end of file diff --git a/group__maug__retroflt__example.png b/group__maug__retroflt__example.png new file mode 100644 index 0000000000000000000000000000000000000000..15dcaec7bf4e0b32e598f84d0281c04c7d4d8c9e GIT binary patch literal 3633 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 J8g0jz{{dOW{VxCj literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__flags.html b/group__maug__retroflt__flags.html new file mode 100644 index 00000000..025bd1c5 --- /dev/null +++ b/group__maug__retroflt__flags.html @@ -0,0 +1,204 @@ + + + + + + + +maug: Global Flags + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Global Flags
+
+
+ +

Flags that may be present on RETROFLAT_STATE::retroflat_flags. +More...

+
+Collaboration diagram for Global Flags:
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + +

+Macros

#define RETROFLAT_FLAGS_RUNNING   0x01
 Flag indicating that retroflat_loop() should continue executing.
 
#define RETROFLAT_FLAGS_UNLOCK_FPS   0x02
 Flag indicating FPS should not be capped.
 
#define RETROFLAT_FLAGS_KEY_REPEAT   0x04
 Flag indicating keyboard repeat is enabled.
 
#define RETROFLAT_FLAGS_SCREENSAVER   0x08
 Flag indicating the current application is running as a screensaver.
 
+#define RETROFLAT_FLAGS_SCALE2X   0x10
 Only supported on some platforms: Attempt to scale screen by 2X.
 
+

Detailed Description

+

Flags that may be present on RETROFLAT_STATE::retroflat_flags.

+

Macro Definition Documentation

+ +

◆ RETROFLAT_FLAGS_KEY_REPEAT

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_KEY_REPEAT   0x04
+
+ +

Flag indicating keyboard repeat is enabled.

+
Warning
This flag should only be set inside retroflat!
+ +
+
+ +

◆ RETROFLAT_FLAGS_RUNNING

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_RUNNING   0x01
+
+ +

Flag indicating that retroflat_loop() should continue executing.

+
Warning
This flag is not used on all platforms! It should only be removed using retroflat_quit().
+ +
+
+ +

◆ RETROFLAT_FLAGS_SCREENSAVER

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_SCREENSAVER   0x08
+
+ +

Flag indicating the current application is running as a screensaver.

+
Warning
This flag should only be set inside retroflat!
+ +
+
+ +

◆ RETROFLAT_FLAGS_UNLOCK_FPS

+ +
+
+ + + + +
#define RETROFLAT_FLAGS_UNLOCK_FPS   0x02
+
+ +

Flag indicating FPS should not be capped.

+
Warning
This flag should only be set inside retroflat!
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__flags.map b/group__maug__retroflt__flags.map new file mode 100644 index 00000000..f1ccb252 --- /dev/null +++ b/group__maug__retroflt__flags.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__flags.md5 b/group__maug__retroflt__flags.md5 new file mode 100644 index 00000000..0d42a942 --- /dev/null +++ b/group__maug__retroflt__flags.md5 @@ -0,0 +1 @@ +15a6e84850bd1c6d7f572d3b3bee4ce8 \ No newline at end of file diff --git a/group__maug__retroflt__flags.png b/group__maug__retroflt__flags.png new file mode 100644 index 0000000000000000000000000000000000000000..eacd4bd553f1bb66705819f6dde5e48f1aa4bef0 GIT binary patch literal 3425 zcmZu!XHXNt9w#8ZiKsxNC?HDj(nN}M#n2R_gGlc&^dLp5B28LAKzi>W)d127O@V;) z4uT*?AP~x1KfQS~Z*OkzZf5Uh_y22qQ94i5X{n%8L_|cini?v4;7R}|Hw78!VbI5> z;6i5oNL_{K;@^?oR+tDzUe{DnGVsaxmEo^r@RFlfL7=fF=n^$IXP}aF^=Vxl`M(+@TEu<&SEVX?4kmW>YfY3U@%v~@QZVtP1N6zwf5JK1#=W4 zM-m)Hw_Z&v8f-{#)q2NeW!B#z+ieJ*);N#=dDK=2sy25DB zz`!61$(dGF38(yj{l#=DgsT0=xU$M)*k^q=q}Bd%_v{y>iL{iIRPXoiiSZv*hM)misEFYTb*kn~~ZF&0p`vr`uvenrR4-YYE;t_dy+yVkW zTyaj7ZQ-Uuc5}^$(40c@0wNd*KZL3M8Xj51&-OSFzeFA#9X)C<(YNMFOiY|A?U56Q zcESqfiGeLAT)5W7+dtTW5<}b91@)4J&r)h4e-4+A4VO zvQkn~;t2#2_mv*n2gj?7%F4=(0movluCDUtSqTZsHa6T42!y1fg@l8HLjp>>5J+&T zT>h)}b$70XmyeHAT>N|A&PT-NfnSAr+dygM7p>>dS>(KTFD-t{eOXQxh;4w#K_oK48Hz2^i|s9$vb8RmO2;zBsk+1YIbDwG!3jAC4`PIZP5_Rt(rc`inZ<y1kJ%_9Vudm4Vm3DnaAAi(yf@n_5+jBYq*BAUUHM{RB14%B4kH3GdbvIR= zarqd+xI9_hZdk|M{C$1BWJgB_9*?Iu1|O@n8_~0{h>eY<$E^=N|B#&gXIvjPHaegwvUb?&A)Y8)OSqfw7>+iQ3LP=t> z6tYSUD-+VwA6Z%5va+(;d?gFGPeDm}i-#v1Oz_WQD81*}z_leZ=O1-ZE;9|3h?%J= z_nj$G5_!I)=;>NJ0Gqn0DeE0rrp@kb)A+;$i^FDgS($+Kix(`S)|X-x&ZVC}e=d(| z%g+x(5)PL(Hl!?brS9E(Pn1cN6Rb{zI~2gV3X84ED9YbtI8&*_9yOP#&;EV6(rwIIhFUNEf{7xnM+;7j-nw|zVo#nqPpUhOgY{v%z7hrUh{I$sQDEyU($f(&4LwnKt)GK$2bk{ zP%&wrt#7w2EQzZw#}Uh(+)KQoZNhi~D-^ahES(9Am8CCO+t`4g;ysoEevTI_quH_> z8j?FZmG$)X!!}@r-{TV#xl-i?1l~n(1Tx#36rx`aUQZS>)6&to3{+xdVnU7JO&ah= z%?%9=6^+a@HYg}%hZ(2|mp<`ooBnRTQ~x#^jh41SdJE~>1wTN_AvoGKDrtY4^S zY#jZhkkPpR?BysX^TP)fcXtsY^u@UxIXyeKsAzmb!WAlNY6n->dp=I*r??SmSy?ZZ z!O6*F%|srEj;X0Y*Du9SI{$7mys>tB@7}(p23YX$@je3I?2P6?S!ZBYf!rK>`B<)##O8Q&3Rgi?g#ApDL0G5L*X}oG%2RvHICW zCFBBm92(pS<}Gb2zJPR{iUmNaFoiP-qK%O(sguwMz2dI^eoYbCI?3aaOnLr{SPlhq z{Lb=nNK(=@AWL8Yz&jrSn}NoJgJ!<9qn$N}!IaJ5fyBXjpzn@-{QN+5-U45Elq|4x zcC?@_lp-E@>T{KK z$w^5`zo&gW;O`V*a+}PB#KP0t4p-={b zuQUC@ojbjoY1K6~%flb#$Q)u~VmddaE#oRD9DxO2G4|8d)qN8dCh9nTcOH2(r$i6} zm2jSGt{=pUrIkGzViPcJjEjt<0Qvw?xBTn#!g`F<{3h=2(j3in4%EcNgq4j=x7grK zL)bPx4+| z)`gG^e9+pmco}c=D z+DQ|)`;Egf4rIt8w3w&lJeDtkKm*zn5EKME0ITsL-SNpuy{Atn3SHG~T3b^!GGf*%zM8KmW2yb{o+A0;(ozT3;`NY; zTU&QH?TyrXF3`-(%nwOP3~X%L1_m>)w~6bqi4H-q+9 zdi8a6m6Vl<0k^gilT%ZfK~VOB6mLRoU#GqSl zGg(kbOsZ(8ph?5x>Z*#1iy+ul^kT8z?WlLCfc^b_7%DC8%w)E8xl+m6n$xc>&{s`O z?X_14W!@0pjrbt6w9Ff1{3fBrH%u#k8E8TyU$3>b73`6&pWxQk)*4${s6(sE%gce? zf{D=-{2CY>-2d}Ox%?TNaOl$WjwQ6ocZNIsNnvh5L3liu`ts&xBzS0UMv1=Y`8_C% zX71X{E+`-?Hu&+&N8iqDuA4*NPeRIVz6(gTxmh;j<3}0fiG)^u!qk)z5fln-1fX~} zwT=uO9S-r=h>MB&eb$fZQwTXdTycwPYisLp?geOs1-A@`x{fwf1N-9MFuhK7zAhX!+^ z%v4rkYMk+x+1Q5W+x){^2R`uXQ_#?`e)ChUeH)n?)ZX5HOX_GY^0mh`1{R)3Tc-c^ zgr2uFGT2IsJx>mJ{HLYe312qmG&9b4gRNK1J6}$jOl|DrHMpM^OpaRo^+PtO<%-t7 ovx-pRJl>tpSNY#|PIXGZ4!; + + + + + + +maug: RetroFlat Input API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Input API
+
+
+ +

Functions and constants for polling and interpreting user input. +More...

+
+Collaboration diagram for RetroFlat Input API:
+
+
+ + + + + +
+ + + + + +

+Topics

 RetroFlat Key Definitions
 Keyboard and mouse controls RetroFlat is aware of, for use within the RetroFlat Input API.
 
+ + + + +

+Data Structures

struct  RETROFLAT_INPUT
 Struct passed to retroflat_poll_input() to hold return data. More...
 
+ + + + + + + + + + + + + + + +

+Macros

#define retroflat_buffer_bksp(buffer, buffer_cur, buffer_sz)
 Remove a character from a text buffer before cursor position.
 
#define retroflat_buffer_insert(c, buffer, buffer_cur, buffer_sz, buffer_mx)
 Insert a character into a text buffer at cursor position.
 
+#define RETROFLAT_INPUT_MOD_SHIFT   0x01
 
+#define RETROFLAT_INPUT_MOD_ALT   0x02
 
+#define RETROFLAT_INPUT_MOD_CTRL   0x04
 
+#define RETROFLAT_INPUT_FORCE_UPPER   0x08
 
+ + + + +

+Functions

RETROFLAT_IN_KEY retroflat_poll_input (struct RETROFLAT_INPUT *input)
 Poll input devices (keyboard/mouse) and return the latest event.
 
+

Detailed Description

+

Functions and constants for polling and interpreting user input.

+

Macro Definition Documentation

+ +

◆ retroflat_buffer_bksp

+ +
+
+ + + + + + + + + + + + + + + + +
#define retroflat_buffer_bksp( buffer,
buffer_cur,
buffer_sz )
+
+Value:
if( 0 < buffer_cur ) { \
+
if( buffer_cur < buffer_sz ) { \
+
memmove( \
+
&(buffer[(buffer_cur) - 1]), \
+
&(buffer[buffer_cur]), \
+
(buffer_sz) - (buffer_cur) ); \
+
} \
+
buffer_cur--; \
+
buffer_sz--; \
+
buffer[buffer_sz] = '\0'; \
+
}
+
+

Remove a character from a text buffer before cursor position.

+ +
+
+ +

◆ retroflat_buffer_insert

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#define retroflat_buffer_insert( c,
buffer,
buffer_cur,
buffer_sz,
buffer_mx )
+
+Value:
if( buffer_sz + 1 < buffer_mx ) { \
+
if( buffer_cur < buffer_sz ) { \
+
memmove( \
+
&(buffer[(buffer_cur) + 1]), \
+
&(buffer[buffer_cur]), \
+
(buffer_sz) - (buffer_cur) ); \
+
} \
+
buffer[buffer_cur] = c; \
+
buffer_cur++; \
+
buffer_sz++; \
+
buffer[buffer_sz] = '\0'; \
+
}
+
+

Insert a character into a text buffer at cursor position.

+ +
+
+

Function Documentation

+ +

◆ retroflat_poll_input()

+ +
+
+ + + + + + + +
RETROFLAT_IN_KEY retroflat_poll_input (struct RETROFLAT_INPUT * input)
+
+ +

Poll input devices (keyboard/mouse) and return the latest event.

+
Parameters
+ + +
inputPointer to a RETROFLAT_INPUT struct to store extended info.
+
+
+
Returns
A symbol from RetroFlat Key Definitions.
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__input.map b/group__maug__retroflt__input.map new file mode 100644 index 00000000..feb6a92d --- /dev/null +++ b/group__maug__retroflt__input.map @@ -0,0 +1,5 @@ + + + + + diff --git a/group__maug__retroflt__input.md5 b/group__maug__retroflt__input.md5 new file mode 100644 index 00000000..229c85f3 --- /dev/null +++ b/group__maug__retroflt__input.md5 @@ -0,0 +1 @@ +29ceb240f59f3f158e89e04bbde386de \ No newline at end of file diff --git a/group__maug__retroflt__input.png b/group__maug__retroflt__input.png new file mode 100644 index 0000000000000000000000000000000000000000..484806bde500cb624f45c6463bcdb704a707778a GIT binary patch literal 6229 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 literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__keydefs.html b/group__maug__retroflt__keydefs.html new file mode 100644 index 00000000..6db8190f --- /dev/null +++ b/group__maug__retroflt__keydefs.html @@ -0,0 +1,264 @@ + + + + + + + +maug: RetroFlat Key Definitions + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Key Definitions
+
+
+ +

Keyboard and mouse controls RetroFlat is aware of, for use within the RetroFlat Input API. +More...

+
+Collaboration diagram for RetroFlat Key Definitions:
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROFLAT_KEY_UP   0
 
+#define RETROFLAT_KEY_DOWN   0
 
+#define RETROFLAT_KEY_RIGHT   0
 
+#define RETROFLAT_KEY_LEFT   0
 
+#define RETROFLAT_KEY_A   0x41
 
+#define RETROFLAT_KEY_B   0x42
 
+#define RETROFLAT_KEY_C   0x43
 
+#define RETROFLAT_KEY_D   0x44
 
+#define RETROFLAT_KEY_E   0x45
 
+#define RETROFLAT_KEY_F   0x46
 
+#define RETROFLAT_KEY_G   0x47
 
+#define RETROFLAT_KEY_H   0x48
 
+#define RETROFLAT_KEY_I   0x49
 
+#define RETROFLAT_KEY_J   0x4a
 
+#define RETROFLAT_KEY_K   0x4b
 
+#define RETROFLAT_KEY_L   0x4c
 
+#define RETROFLAT_KEY_M   0x4d
 
+#define RETROFLAT_KEY_N   0x4e
 
+#define RETROFLAT_KEY_O   0x4f
 
+#define RETROFLAT_KEY_P   0x50
 
+#define RETROFLAT_KEY_Q   0x51
 
+#define RETROFLAT_KEY_R   0x52
 
+#define RETROFLAT_KEY_S   0x53
 
+#define RETROFLAT_KEY_T   0x54
 
+#define RETROFLAT_KEY_U   0x55
 
+#define RETROFLAT_KEY_V   0x56
 
+#define RETROFLAT_KEY_W   0x57
 
+#define RETROFLAT_KEY_X   0x58
 
+#define RETROFLAT_KEY_Y   0x59
 
+#define RETROFLAT_KEY_Z   0x60
 
+#define RETROFLAT_KEY_0   0x30
 
+#define RETROFLAT_KEY_1   0x31
 
+#define RETROFLAT_KEY_2   0x32
 
+#define RETROFLAT_KEY_3   0x33
 
+#define RETROFLAT_KEY_4   0x34
 
+#define RETROFLAT_KEY_5   0x35
 
+#define RETROFLAT_KEY_6   0x36
 
+#define RETROFLAT_KEY_7   0x37
 
+#define RETROFLAT_KEY_8   0x38
 
+#define RETROFLAT_KEY_9   0x39
 
+#define RETROFLAT_KEY_TAB   0
 
+#define RETROFLAT_KEY_SPACE   0
 
+#define RETROFLAT_KEY_ESC   0
 
+#define RETROFLAT_KEY_ENTER   0
 
+#define RETROFLAT_KEY_HOME   0
 
+#define RETROFLAT_KEY_END   0
 
+#define RETROFLAT_MOUSE_B_LEFT   0
 
+#define RETROFLAT_MOUSE_B_RIGHT   0
 
+

Detailed Description

+

Keyboard and mouse controls RetroFlat is aware of, for use within the RetroFlat Input API.

+

The precise type and values of these constants vary by platform.

+
+ + +
+ + diff --git a/group__maug__retroflt__keydefs.map b/group__maug__retroflt__keydefs.map new file mode 100644 index 00000000..ed06ad4b --- /dev/null +++ b/group__maug__retroflt__keydefs.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__keydefs.md5 b/group__maug__retroflt__keydefs.md5 new file mode 100644 index 00000000..80c89a8e --- /dev/null +++ b/group__maug__retroflt__keydefs.md5 @@ -0,0 +1 @@ +100d556cf04979cc3e815863fa2f0bab \ No newline at end of file diff --git a/group__maug__retroflt__keydefs.png b/group__maug__retroflt__keydefs.png new file mode 100644 index 0000000000000000000000000000000000000000..e857d4597587f5f44ac287b97325e526c8ecd355 GIT binary patch literal 4700 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 Rg6$#{d1+;-qBo{N{{hX-S=;~s literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__msg__api.html b/group__maug__retroflt__msg__api.html new file mode 100644 index 00000000..5b571188 --- /dev/null +++ b/group__maug__retroflt__msg__api.html @@ -0,0 +1,135 @@ + + + + + + + +maug: RetroFlat Message API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat Message API
+
+
+ +

These flags can be passed to retroflat_message() to indicate the type of message being conveyed. +More...

+
+Collaboration diagram for RetroFlat Message API:
+
+
+ + + + +
+ + + + + + + + + + + + + + +

+Macros

+#define RETROFLAT_MSG_FLAG_TYPE_MASK   0x07
 This mask covers all possible icon/type flags.
 
+#define RETROFLAT_MSG_FLAG_ERROR   0x01
 This icon/type flag indicates an error. It will try to display messages in an urgent way with a red icon, if possible.
 
+#define RETROFLAT_MSG_FLAG_INFO   0x02
 This icon/type flag indicates an informational notice. It will try to display messages in a definite way, with an i or speech bubble icon, if possible.
 
+#define RETROFLAT_MSG_FLAG_WARNING   0x04
 This icon/type flag indicates a condition the user should be aware of. It will try to display messages in an urgent way with a yellow icon, if possible.
 
+

Detailed Description

+

These flags can be passed to retroflat_message() to indicate the type of message being conveyed.

+
+ + +
+ + diff --git a/group__maug__retroflt__msg__api.map b/group__maug__retroflt__msg__api.map new file mode 100644 index 00000000..cbda4e1a --- /dev/null +++ b/group__maug__retroflt__msg__api.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__msg__api.md5 b/group__maug__retroflt__msg__api.md5 new file mode 100644 index 00000000..073c86a4 --- /dev/null +++ b/group__maug__retroflt__msg__api.md5 @@ -0,0 +1 @@ +7184f89db37ae8c1dd604abdfc835519 \ No newline at end of file diff --git a/group__maug__retroflt__msg__api.png b/group__maug__retroflt__msg__api.png new file mode 100644 index 0000000000000000000000000000000000000000..526579c2b62cde0491860ef18b55d0359eb43fee GIT binary patch literal 4133 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 SYomV~e|2STr3yu>@c#i_@a(++ literal 0 HcmV?d00001 diff --git a/group__maug__retroflt__retval.html b/group__maug__retroflt__retval.html new file mode 100644 index 00000000..b0719c62 --- /dev/null +++ b/group__maug__retroflt__retval.html @@ -0,0 +1,139 @@ + + + + + + + +maug: RetroFlat API Return Values + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat API Return Values
+
+
+ +

Standardized return values from RetroFlat API functions. +More...

+
+Collaboration diagram for RetroFlat API Return Values:
+
+
+ + + + +
+ + + + + + + + + + + + + + + + +

+Macros

+#define RETROFLAT_OK   0x00
 Certain functions return this when there was no problem.
 
+#define RETROFLAT_ERROR_ENGINE   0x01
 
+#define RETROFLAT_ERROR_GRAPHICS   0x02
 
+#define RETROFLAT_ERROR_MOUSE   0x04
 
+#define RETROFLAT_ERROR_BITMAP   0x08
 Returned if there is a problem loading or locking a RETROFLAT_BITMAP struct.
 
+#define RETROFLAT_ERROR_TIMER   0x0f
 
+

Detailed Description

+

Standardized return values from RetroFlat API functions.

+
+ + +
+ + diff --git a/group__maug__retroflt__retval.map b/group__maug__retroflt__retval.map new file mode 100644 index 00000000..e1224d00 --- /dev/null +++ b/group__maug__retroflt__retval.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__retval.md5 b/group__maug__retroflt__retval.md5 new file mode 100644 index 00000000..eeb599e8 --- /dev/null +++ b/group__maug__retroflt__retval.md5 @@ -0,0 +1 @@ +9ed33f0dfbd6efe455242e483f11297a \ No newline at end of file diff --git a/group__maug__retroflt__retval.png b/group__maug__retroflt__retval.png new file mode 100644 index 0000000000000000000000000000000000000000..9c47446326e8e9d97993e74617ec7e0bb21f9746 GIT binary patch literal 4364 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 + + + + + + +maug: RetroFlat VDP API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFlat VDP API
+
+
+ +

Video Display Processor tools for modifying display output. +More...

+
+Collaboration diagram for RetroFlat VDP API:
+
+
+ + + + +
+ + + + + +

+Macros

#define RETROFLAT_VDP_FLAG_PXLOCK   0x01
 Flag for RETROFLAT_STATE::vdp_flags indicating the VDP requires RetroFlat to pixel-lock the frame before passing it (almost always true!)
 
+ + + + +

+Typedefs

typedef MERROR_RETVAL(* retroflat_vdp_proc_t) (struct RETROFLAT_STATE *)
 VDP function called from the VDP library.
 
+ + + + +

+Functions

+MERROR_RETVAL retroflat_vdp_call (const char *proc_name)
 Call a function from the retroflat VDP.
 
+

Detailed Description

+

Video Display Processor tools for modifying display output.

+

The VDP system allows for a plugin to post-process frames in programs that use RetroFlat. The VDP is provided with a bitmap of every frame in RETROFLAT_STATE::vdp_buffer which it processes and outputs to RETROFLAT_STATE::buffer, which is then displayed on the screen.

+

Macro Definition Documentation

+ +

◆ RETROFLAT_VDP_FLAG_PXLOCK

+ +
+
+ + + + +
#define RETROFLAT_VDP_FLAG_PXLOCK   0x01
+
+ +

Flag for RETROFLAT_STATE::vdp_flags indicating the VDP requires RetroFlat to pixel-lock the frame before passing it (almost always true!)

+

This should be set by the VDP during its initialization.

+ +
+
+

Typedef Documentation

+ +

◆ retroflat_vdp_proc_t

+ +
+
+ + + + +
typedef MERROR_RETVAL(* retroflat_vdp_proc_t) (struct RETROFLAT_STATE *)
+
+ +

VDP function called from the VDP library.

+

The VDP plugin should export three functions with this signature:

+ + + + + + + + + +
Function Name Called From
retroflat_vdp_init() retroflat_init()
retroflat_vdp_flip() retroflat_draw_release() on screen buffer
retroflat_vdp_shutdown retroflat_shutdown()
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroflt__vdp.map b/group__maug__retroflt__vdp.map new file mode 100644 index 00000000..084488b8 --- /dev/null +++ b/group__maug__retroflt__vdp.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroflt__vdp.md5 b/group__maug__retroflt__vdp.md5 new file mode 100644 index 00000000..9b431099 --- /dev/null +++ b/group__maug__retroflt__vdp.md5 @@ -0,0 +1 @@ +4cf07cfcc5781078809cdbe549a4b326 \ No newline at end of file diff --git a/group__maug__retroflt__vdp.png b/group__maug__retroflt__vdp.png new file mode 100644 index 0000000000000000000000000000000000000000..170fd0de112cefb51a2d03dba528520d759de518 GIT binary patch literal 3527 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 KIwURosQ&|kx#a8s literal 0 HcmV?d00001 diff --git a/group__maug__retrofp.html b/group__maug__retrofp.html new file mode 100644 index 00000000..3f3c832d --- /dev/null +++ b/group__maug__retrofp.html @@ -0,0 +1,141 @@ + + + + + + + +maug: Maug Retro Fixed Point + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Maug Retro Fixed Point
+
+
+ + + + + +

+Files

file  retrofp.h
 Contains functions and macros for working with fixed-point numbers.
 
+ + + + + + + + +

+Macros

+#define RETROFP_PI   (3141)
 Fixed-point representation of Pi (3.141).
 
+#define retrofp_sin(num, mult)   retrofp_lut( g_retrofp_sin, num, mult )
 
+#define retrofp_cos(num, mult)   retrofp_lut( g_retrofp_cos, num, mult )
 
+ + + + +

+Functions

+int16_t retrofp_lut (const int16_t *SEG_MCONST lut, int16_t num, int16_t mult)
 Given a lookup table, return the corresponding value after trimming precision and making sure number is valid.
 
+ + + + + +

+Variables

+MAUG_CONST int16_t SEG_MCONST g_retrofp_cos []
 
+MAUG_CONST int16_t SEG_MCONST g_retrofp_sin []
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__maug__retroglu.html b/group__maug__retroglu.html new file mode 100644 index 00000000..b9bb598d --- /dev/null +++ b/group__maug__retroglu.html @@ -0,0 +1,371 @@ + + + + + + + +maug: RetroGLU API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGLU API
+
+
+ +

Library of tools for working with RetroFlat and OpenGL. +More...

+
+Collaboration diagram for RetroGLU API:
+
+
+ + + + + + +
+ + + + + + + + + +

+Topics

 RetroGLU OBJ Parser
 
 RetroGLU Sprites
 
 RetroGLU Overlay API
 Convenience macros for drawing a 2D overlay using transparent textures.
 
+ + + + +

+Files

file  retroglu.h
 Library of tools for working with RetroFlat and OpenGL.
 
+ + + + + + + + + + + + + +

+Data Structures

struct  RETROGLU_VERTEX
 
struct  RETROGLU_VTEXTURE
 
struct  RETROGLU_MATERIAL
 
struct  RETROGLU_FACE
 
struct  RETROGLU_OBJ
 
struct  RETROGLU_PROJ_ARGS
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROGLU_PARSER_ERROR   -1
 
+#define RETROGLU_PARSER_TOKEN_SZ_MAX   32
 
+#define RETROGLU_TRACE_LVL   0
 
+#define RETROGLU_SPRITE_TEX_FRAMES_SZ   10
 
+#define glShininessf(side, light, f)   glMaterialf( side, light, f )
 
+#define RETROGLU_FACE_VERTICES_SZ_MAX   3
 
+#define RETROGLU_MATERIAL_NAME_SZ_MAX   32
 
+#define RETROGLU_MATERIAL_LIB_SZ_MAX   32
 
+#define RETROGLU_VERTICES_SZ_MAX   1024
 
+#define RETROGLU_FACES_SZ_MAX   1024
 
+#define RETROGLU_MATERIALS_SZ_MAX   1024
 
+#define RETROGLU_PROJ_ORTHO   0
 
+#define RETROGLU_PROJ_FRUSTUM   1
 
+#define retroglu_enable_lightning()   glEnable( GL_LIGHTING )
 
+#define retroglu_disable_lightning()   glDisable( GL_LIGHTING )
 
+#define retroglu_tex_px_x_to_f(px, sprite)    ((px) * 1.0 / sprite->texture.tex.w)
 
+#define retroglu_tex_px_y_to_f(px, sprite)    ((px) * 1.0 / sprite->texture.tex.h)
 
+#define retroglu_scr_px_x_to_f(px)    (float)(((px) * 1.0 / (retroflat_screen_w() / 2)) - 1.0)
 
+#define retroglu_scr_px_y_to_f(py)    (float)(((py) * 1.0 / (retroflat_screen_h() / 2)) - 1.0)
 
#define retroglu_set_sprite_tex(sprite, texture_id, bmp_w, bmp_h)
 
+#define retroglu_set_sprite_color(sprite, color_in)    memcpy( (sprite)->color, (color_in), 3 * sizeof( float ) )
 
+#define RETROFLAT_COLOR_TABLE_GL(idx, name_l, name_u, r, g, b, cgac, cgad)    extern MAUG_CONST float RETROGLU_COLOR_ ## name_u[];
 
+ + + +

+Typedefs

+typedef float RETROGLU_COLOR[4]
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

+void retroglu_draw_poly (struct RETROGLU_OBJ *obj)
 
+void retroglu_set_tile_clip (struct RETROGLU_TILE *tile, uint32_t px, uint32_t py, uint32_t pw, uint32_t ph, uint8_t flags)
 
+void retroglu_set_sprite_clip (struct RETROGLU_SPRITE *sprite, uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py, uint32_t pw, uint32_t ph, uint8_t flags)
 
+void retroglu_init_sprite_vertices (struct RETROGLU_SPRITE *sprite)
 Setup the sprite vertices for the poly the sprite will be drawn on. This should be called once when the sprite is initialized, but calling it again later shouldn't hurt.
 
+void retroglu_init_sprite_vertices_scale (struct RETROGLU_SPRITE *sprite, float scale)
 
+void retroglu_set_sprite_pos (struct RETROGLU_SPRITE *sprite, uint32_t px, uint32_t py)
 
+void retroglu_tsrot_sprite (struct RETROGLU_SPRITE *sprite)
 
+void retroglu_draw_sprite (struct RETROGLU_SPRITE *sprite)
 Draw the given sprite. This function never uses a list, and can therefore be used to create a draw list.
 
void retroglu_prerender_sprite (struct RETROGLU_SPRITE *sprite, int list_idx, uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py, uint32_t pw, uint32_t ph, uint8_t flags)
 If lists are enabled, prerender the sprite to a list using the given params to retroglu_set_sprite_clip().
 
+void retroglu_jitrender_sprite (struct RETROGLU_SPRITE *sprite, int list_idx)
 If lists are enabled, render the sprite list at list_idx. Otherwise, draw the sprite using retroglu_draw_sprite().
 
+void retroglu_free_sprite (struct RETROGLU_SPRITE *sprite)
 
+MERROR_RETVAL retroglu_init_glyph_tex ()
 
+void retroglu_destroy_glyph_tex ()
 
+void retroglu_string (float x, float y, float z, const RETROGLU_COLOR color, const char *str, size_t str_sz, const char *font_str, uint8_t flags)
 
+

Detailed Description

+

Library of tools for working with RetroFlat and OpenGL.

+

Macro Definition Documentation

+ +

◆ retroglu_set_sprite_tex

+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
#define retroglu_set_sprite_tex( sprite,
texture_id,
bmp_w,
bmp_h )
+
+Value:
sprite->texture_id = texture_id; \
+
sprite->texture_w = bmp_w; \
+
sprite->texture_h = bmp_h;
+
+
+
+

Function Documentation

+ +

◆ retroglu_prerender_sprite()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
void retroglu_prerender_sprite (struct RETROGLU_SPRITE * sprite,
int list_idx,
uint32_t front_px,
uint32_t front_py,
uint32_t back_px,
uint32_t back_py,
uint32_t pw,
uint32_t ph,
uint8_t flags )
+
+ +

If lists are enabled, prerender the sprite to a list using the given params to retroglu_set_sprite_clip().

+
Note
If lists are not enabled, this call does nothing.
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroglu.map b/group__maug__retroglu.map new file mode 100644 index 00000000..8f3df0c3 --- /dev/null +++ b/group__maug__retroglu.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/group__maug__retroglu.md5 b/group__maug__retroglu.md5 new file mode 100644 index 00000000..e04abb19 --- /dev/null +++ b/group__maug__retroglu.md5 @@ -0,0 +1 @@ +ba04b12d6b37b5de650cf8e166260379 \ No newline at end of file diff --git a/group__maug__retroglu.png b/group__maug__retroglu.png new file mode 100644 index 0000000000000000000000000000000000000000..8df7d1b2f79a31605dd1a689db242061216de5fd GIT binary patch literal 10421 zcmZ{~1yqz_*EKve2oi#zvlIKgSf!_dH*#p9)Vy+$jeA-xM!?SdFWqVJa672OD8UW!+ht--M9HK@4c7Y z(8I6IdH?dBS#FMN)o`7sa+lJxioqhzah0zY5(82@d7msS@^!Rjo;`XrmW&wFk6ol+ zI{4WhaEm|&_nF6Z$w-6Y1Lvhw%dCKZN4>nfeg4dZf&c5T3h(F8V*h^kqoX6`mw$u_ z``GO4)`y#$n7T%W}*8xYJLY3S-6-rzd}v@$uV`GvN(d7P%4N5ONBi6u{5rzBsuM6icMU}mwYnKl(;zqD~;X4+4FIgIDg~zb`5#mi>fbe{HN~t|hFaxA({RI4u(sQz*&xTrD|HPR?o1 zRj$ZY?JDnsjj7Y4tYo$h0}@O;4^}yVhT* zeV_X7bN|@bXUJ{)sk*il?iZuA&TPMa{YqTXDJxp)Ngw*^^_u#g{+ogVt3+4t@o*9q zcMF-vk4=q@oAn&Nw!t%`q~v~28vl#a!>zTMri+|azl*bjwaMBFt%-YFTy1@Q(L&Bk z#wI2K$;mXKp`q`t^M{qy!q`_&f!1?|F2)g6qD|n?5&_Ri@g>*udc1FF$#@Z4Hl@gA)K6?5bd3vrUSXM zHTCtpj=yCBgMu`(eM;@(Cd5E-CRm{_@(zFJ~dVT=~Gf10@C3c@7d;n z*0#21&z}>v`@9PxAhYOyFF86k#{J?4$^QC;Hk<2MxjC_?r{_ZATf?}m{w+!PYJPE1UUNKjzK!ou=CKUzjuU;ni+Rj*TJow#xkdrM9$ z-3qN`Z+{PQ`}S?xE?g@uJ~czpNo zN7ujpr=^pXo=%4t7#J9xm?#WnXwNG&^4YuU=H`a@h(s1VUBxG*&+mNbwlRtM{;7>W zJ`BPxkL2XS3bjiH;qwYzFJ8Q`8psVn-6PwtS5DqA%h318{8y2Vw3!*pNQn^}JG;EyS$VY`8g;c$>+|=aAxb(r zy5qgoFn}FlVPP2=8PVO8#6)!(K+r69KrZXN*V3URbE9Q1=tbN}w6(RnySqmlJSxV8 z&Ck5j{;aOz^p~3}+E3QxRImMrq`O8(_rlCf1~PQC+K$dCq#Eg@pw_ z%5U}8=UU%0Pvnt~j!sH?x^~)3rIk8NypVjt}d;mImpi7nZ7=Kad9ywFz!AtML0Vg~N^de~3GG@0!j3hh(X@;quyOSr8=GOMOfD6fPcKne7-4L@z;erpRmegQ?d- zj=yoUefD({Cn6#v7h$LmMMUOjXZ@veW+5#Q8KNFnq@^JjY_0V#c(}Q_uhG)-I4>!6 z_w>ME7k{@!BqSwi9oxQqc?XgfLTPSgr85wZxPN41xigWIU)UmWQ$K~@CW(rcmIFNu z8;J}drqN1ka^EuT=;={b<47FrleoBBWk0105EiFfWzAY!TPqJ)9mgU+`0KMCDfJQcqv(ZlIoOz)AMreR5K~lC!~$hk-pI)4_;5bD zaOwc6n8H`jy*L+FS5^p8d5AsFqs3(8=;-sR{el`hIXOAZwKO5;Pb<8D%CVJIRjjaa z9sT{P<5e~zx2jxIC%!l+ih1oPz_))aHmFxPJKl@`5zTaeY+^#u(b3V`PES{t19C~8 zhmSA8bAOHf@9L^zJex`q)uj;B6b8>2Kcr#8ePMa|Am~$*5O-^Rzp+J68mm|*;{CH{ z&-fgs>Ak$Xs*a#c3yu^UwDj~u-d0Xi)zFY}ap5~YK2AI?G&MEtN28I_VWb&C&iD{X zX@U;Lx`x%o;o_xC#3 zpkQK(Rx4=z_ATc}o}D=jf}Wn9LriRIwz{gSs;r_yz5WSKOl+(qd>>>?rR|v7yc^1T z^=*Ozas}TU21#`ZkAi~2LXupj#P@#C+*fB!CdczArGysdPosi&uh zN{%E_VE`T|L03l_sG9BKpB$j#ulk6H3abg5IKbkvHoqi!@Xrz2O?)@(T7O&??0|!1 zIzfFjt|U2QH0dmfH*N-jLV#DZ<807L7hKHJp>F0gz8@2v(blG()plLrzi++QPe%A& zG=dYJtAnpJDRCv;z1^DcF5KO~U(uPo(~3s`pEc?6H%YK`yz+`hC?cIe^!QBz@K+TI zug;1ZJ-AL66J#_LTA0R6_t8^f*=+r+qFegnH+a+E79DMAl88o5ySz>8v7PAuuZjzMBHI}}jza!%tyehh=lVOPYlHeaj zM4Qtuk_NDke#Jau#uJL@`Xm}*bCR-19LOwM-P>%wfI$DH7;%+q>^OM1jdOSj2Iu?6 zkqS@JUEw8`b1aS~w<>nGU%T+9_Gl|SY^!!j9%7gce#)@6Ii4iBbr=1^cc%}NT>R8- zlErGo3Ty}Mo9pNkE$U3l9VCZqyI%_29QM3g>+m^c+gMxR>aCdrt)#XyA3xvQ+x-gD z{!4;9n1RTq;n1=7Eisa~nX9vJYoh0yv0J4N;e{8TI7IDvA2soWiH=2(Ju`^?;Ti<1r*~0MiOMuINZXlX`EcS*y_PzqubT*$s z<(<_QujLMH9r7&3M0>H#ot^aeNMu#s4UStHB_BTq=jPsg8xg^N@7`^0ZbxMqnO5@! z&Y~X&Z1E>e>C+cuxDT*N{3)AlE~|UFR#^00DN&+YNrZ?5a*nS5-M}%UXk%%qeZhal znv0v8f|xjh7!t&b$)qZ8MXVL_wQYL3F{ki`XxP(?hXJ2nGio1^^#dRE{2a6Cj`FJa zIM4Ee>WDmA^U5FMj_f*+MGr zsK85Q+&QAcc>e>aFx!28=kbeO$rav5PSjkwt!rZyV^B=vb~jHHp}MhiaG>_~`!Yp- z0?NAsbv~L6BHKJTu!NFhZQgjYQ4dvIqn<1+$zif47C4_q{n@|9lPI8<&YQE6k&8)H zJ>}+IDZog9?Kh5#Ndc%sT|%2_+jKD=(vTDDOEGdSh8#~C8|>`vwhj*`^k#|-)jC@O z+wC75%+)S2G_$mna5-CBvn@7iGF)Aklac9%*Iis(08SpOs6=Do;FHtQ6>9yIjiA=V z45dV;A{4ZScI`Bj$XAYzlG@rd0Qc~TKNDX{#;aG~=H!@UCZC)g%zQv1+ulnCad3HU z)>K;!g@SCV@Yu0HTQ;5_+tj(PYO%Q%RFM4J8!=j*kCs@1rv>mhDE@bzRpT3=)!G2}H@CMt;12s=ei+X*$s%2^_GcYhvH&KsLyIB7l8l4FG z(|Kn}d2nc`qpRzKWnWfJO-)QjhQ7l@F{h-YBnd6wo1r|F_^d2LE04DMwA9p&T-gZN zz3CS|lA6frr&c0vYfs?rKxox^I3X240Rmq{Eg_LeVEIpg8-m`Zx_Y&M)D*^WDa5

lAvI2p#Afj$CLeA?b4NgL88G4)O{~w3Zts3_(8a(Tis}=+KwPf#m=Ugy zl>F@PCy#OHo+*1lpn!~f@iPiNA>NxV7)?ZZyVP^fTDLMr?tn)?z+&i=G70^|n1dO= zY}f-w&}LP8zkmN8Ub3>L>7OLM3J$`~%*A=~pFc0rV;Fi+YMTPI*zdv-}WCk9*u(ZVU zvY#24hze+&*Z-!GAdeHP9qjCSfV-~P9B4>MOaBGQwY0P}IzH}ne(F*5`E#KG8!vA> zu#0@`-51uR?{EzXL}Qv-S*+b8b2%^b4LX{bm}Dk^*bIt~r$qRjAF;upz?XK&#hWz|+o~-eBg%dqQ0&?v|vp-gF zaB%+lOcyQz!3#S( zLG(O)_;3>LgZc(`%gu_FRZ5E&7U5~Z(u+Y#(Lhq;RM($@rFSK)$04f+gGJ(K? zGk_)ZqW0AsHmscOXlVc}C~Pcd)Ttt`@5#!_x_f$VgY8sd+IFcoODqD!06?R5;_Jgr z6CPe(t6xRe_xJaU4C<2vr`>~q9L{ZQ^s;4p2WDq8!IHQDyj2-`dyB%XQ8PyFb9kNy z8wMvo@}*$O6p&YdJ4bdgFfi15?A!+J1X|T;?mM36-ij=ICi%XR#r8r6nO*YRbz=*Q zA0q$SaaNwhwZiO)NJ*EfMhrjH)TBJk6vns>Ki*w$fdVD3q|^#K3N_ONb`7?R6YU5a zs+7h@ga9=UDnd?8?Fz;X>eCP{20X${8jyJq2ydP3)Ayt}hB7k2D|DaMhFu|${;aGx z{T*Zl5QdCXMSh15LQ(54P+t@zRETSBkG(a3MzeBoyagdu*eIl=to(PXUJ&?r!=}`t z?*SkdS^xm`x`eMNm`a$vaz5HNhXe+X3W)VUkq)nuvoj|{|69AEkMfj;9*b8Y@%Be2 z{!P^%EN*VTBH*)h=NGDe5j&%{-#Ruvp5-^}3RqF=b0WZekQo{h!tL@$74#1wG4U-< zPGXQ95CMo+&dx6`&d*SOYXn~proB>9Qz@=o2?Po2(6EJ%=t&o}oNn*{izxws1@RuK zDPF27BZHeRV291j&wo`=P!LnS<)$*jI8JhV`}#&w)+ZZ0C_%-KS6a2?Kl^Yv7sm7l zT}T7)ZUM3qEE6YiFvF@9bwo5k`N;y9d~uk$4O#|NLu_`oilihKcp@YW!U<<52RqYV z|F)VgPMVZ5g{#!gfcz5@5t;1%8Neue`M3vsd}jZqzgioKUX3n|B)tv8)3ON@~h zm6Z!%FF+|FzIE#s;&CJ`@^}*BRBis)1|Dnb>KuuhS)Slznwpul-fue1)jEJmT;+dY zJTYA6)l7E4_QIIt0ns&IzglX|1N39;#IOW+>@>?Z7C`FP2q#UWF{x|F)RkO@$TQDcMKxb{s8(Y-z*6~ zaX>tNR1;(a$52UrP0ckiv9Ag{6O~p$sj1iVo@T0@cyTy`2eG!k&i&wlF(e3va-a*f zF=zv7n6&+DmdqxZKt)<|!wF-H0oH;?5SS(Ag^GN?u)f~&WyZG){Mv_}yZJvhK0x4O zrW}Anpz&Jx`Sa)GR8$|SHyK5X_X?(uH{mV=BO`1gB6Ps`bgOMUx>I>IyMXkC)z%(K zca@cv&cYSzohy`-WmQ#ezkVgTt&daC(|5zP27cYUXaY3+FC-1>T;?E~!NNeDeGUx{?ys`Z zj$HNL{6>JOCGe&pC`ss3(5hO+`UQ2{Ya1I;z)og-4j7=Msbxw6`!ZS)a(j;P?DIzd%}HA*Wmv z{hY+b5g7y^+wI$-t*tU(97ZK2Q3E}&1VZAyKV}JrcOncX4tzwgT{Qd}%sKXvi5}n> z0fL!B@}U~vgYBiRs@e=DbXjHP@M!X@t>3Z`;aYzaCdbB7Vc95YXu^V|gQD`Yh;3^n z#%@{q48=GoKikZ}mEh&&-QL;xJ6^?!v2x-2x-&(RVGXp3o=XA^W`518U*{5z0Yup- z9&ns~K*a|)Y7?*^7ToZ>Y~Rl5uiL6YOg_65%YE5-Kt|lXyoQj9G%!urVnyUyzNw!^ zYOka+Jvwb~i7;Nn){Y0Mr&C9OwKH>om+F#=b{wf=Q4+Pun^0FLM)HmVb zHy%77cW`h3%A7Oav^D>8C))2c$nSKX3FUuW>Q}ff4}$A!G7AG^ujUCrj)_XJlq( zR#sLv@FQzA!=t0~00k4D65CHV$b&l!yR?iPfqLO{E%)z6&1YTeDu33ctOF% zI5<9vRWAnuGcxF5M5SeA1?6@eoj{LTTNh&S4SL$!5r z?rV=4OE*W1{9@zdTbcuKpa_wGC8@p#gi0bSUC_Y^$OWcv1@!p3u*)50f_ST;PbQ|O zQc6lBO{d$$VA(>?Bn!x0Jk%B_bm4E`-UM)QUhXYW1`XB%3;+b{1L!0GM>zt5{3bFI z333toSMflzUQPnTwQKnL_3v;2B?z<(F)wQH7OC$Wc7yGSE{9m=E!MC7zP;FmKA#3K zLfIx0OysN`K!W~WSZGy|IFo@~Y;0^iJUo20&`yCdu7RsU9ikWWOaQ3UT**BI9(#w2 zOVa?C9h77Ui#!V}E4R}^J4dvQEXJgJy)pR=U3(kIIIz$f4DG2pF-Fn+Nzs8|Eq_I5=HiOb$P|@k!O(@WaVn}Yk7|vkguq)JKs^5bZ3;dJkg&B7ZxX$m5?U4{DU%mdyXSqk{V9wQ83;q0m`0u8j&Au)v((h&7Bn-1}uV$v-x!KCKyCnhU)>U3y4qbrJ92Le=6+30jtU(_V%A- z%6o6|t@t=61@k7SuK~F4gI9twu@5EQ%eH8!ljG*t^AQNBO=oLs_H)W^%!@>w{wlwh zb_wIOQ8!#N`*4&i%WZtw9Vei9=3v?KW_0GVGS1ftDfnP@cR)+NQNJp7llZ2PUGw!? zrp<@j>}A*wqfdq9EcxDjyajGqvNP40r%erI_T-@>C*yfs-yzRHzv zrx^1OJ2RlG{afL7dK_w5#$#U_o-~MEY0VYRzhAIU3&L~4qwCfED3Br=SNIJ?RJQ`n2IL)&Wfh-MrM7m`3fwf>Hm=4 zY`U+FoqMP6JdN)^9^;CN^8z!CKm9Jt!WSfi4C&in|6^VrYbKqo6_i?hBn|7qbMK`~dG)uLH zkYRBzrEb34+SxhDxt(3_y!>1uHlv>-ddOhU_>`0&5^LAmn9( z%X378BqT*c{%rV8|4;Yqe|7b7Mdxal{{9V5N=h0BW1_9WW9JS#d%?l_3~)_9KR-hd zJz%sy1rnfBZF?P)_J#A{oS>!%l)FZtBL?`zUkp;%$oGg9Xo#ed5fj+az*RsR7NC8h zCAtNz<6-Nmyl_JI@6LTQGuhqUN&sx~3JNztQv%$S0X~Km*Mmlb60cRb4sspS7sZ$g z2Td2sU;%-HVL8+2^9}%ZaBvXg`p^m38bcex8@RlFy<23q?{WCYk1PO+Hk#8=jTOMf z3;1ahA9~wflse0cOSiK5`**3mli>pOBR~`kW`mh$U$r{j=tBqX>B9A5-KtCeU@_$6 zu{C`yhXS>`F+~S60orm+)cw`xPTv#^`TwQozzydC5YP&N9uNU2DkuyL&dxh>91cKc zQQ1s+%Cu?FQhy9x6&giFMMQZ;1*p?+-Q6V6JODnCBg}dVy}40n55w*7n)~}>K*48Z zWQ;cYh`^$~qvd}K>oAxjO`!EzSJujk9gH8$DgnpTEae13M0d}y;R%=`t9BRA{XGIT z^F%>Gt)~Lm?DSVJl(FT@m+gS*z;2sIM^k{A$EBtgI7%?k(?d&0g0EU$bDiMT?w@CM zum43gHi`qCS%MbXUUeV;4IT&wZB^Arm^LunmYC)qrZ?()x+V8$iS8hhci6ZHTeuIJJvol9EE9WzD5m-TFT^ zUcMN%_VefMz$CDs+~-*h9eX(p{8zJs9B(-M9f8qW&ptfn279Nf4-X&T=}-R+kf*62 zFyL`|e)7-yMCjG*Bh6}5filXv2}s}k;$jSB1}@w6>(}L>Qlb_wb|fxt0e4V@CAq>p)!?CCWeb~Q?V7@4{uUJlOIPH^ z#K%QONT`ag-~d?_kBx(a#M~b`#Dl=rkr;b%-yBpvs?WmGQW1j!rlz^$z6x+%z;2tjD17s=4k|w?aQDA~7s0Vk>~s04syZs%bUtA@VBi zRiHEYWQ^VZSU3;;&PCyX2Pn|EtgK?;o=zZ=nb9^}vsAlI;Wm*Lb(RRodhbl-DF zj(hj;7YaKu{1LE@9R>@{{4)C~VQ|4ygq$sqo=_>^iyR)Sv$;-W@wTd&ALEI;b;fxm@(`bK1nOjDx!r4fKf;v@fjOGmgYNRF@JI7Nxsr za0ABo=B!pOj(3MtSOE|V-oJmO@Z?F%<0yLe>vVLA5KoEXhqE~HIjT>fx6Sr6Bj)bi zyC1<>hF=f7+FD!lJAqOqh>D7`z}btAU%#|;Yn_lEH8?c8fT^-VtGWQ-HV!J#N6@4` zfarsuSkcFu{r!E{K+bb418NV#(H$0$2nFU{NrS+;k(6vtHEL%RkZP9*31a{TkP3roZKm{b58MnM{-~mqZ zLQY!%;PV0wwoRL{1Mz(M(R%yt*3M(I|GT?;3@4R(A@J!=DOl&mSTILkVp*(ArAH*) p%c1M8j_KU~uVa4D?z?_L_KSe8mxV$-3C + + + + + + +maug: RetroGLU OBJ Parser + + + + + + + + + + + + + + +

+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGLU OBJ Parser
+
+
+
+Collaboration diagram for RetroGLU OBJ Parser:
+
+
+ + + + + +
+ + + + +

+Topics

 RetroGLU OBJ Parser States
 
+ + + + +

+Data Structures

struct  RETROGLU_PARSER
 As retroglu_parse_obj_c() parses OBJ data, it populates this struct with object information. More...
 
+ + + + + + + +

+Macros

#define retroglu_parser_state(parser, new_state)
 Change the parser state.
 
#define RETROGLU_OBJ_TOKENS(f)
 Table of OBJ file tokens understood by the parser.
 
+ + + + + + +

+Typedefs

+typedef int(* retroglu_mtl_cb) (const char *filename, struct RETROGLU_PARSER *parser, void *data)
 Callback to execute when its associate in RETROGLU_OBJ_TOKENS is found in an OBJ file.
 
+typedef int(* retroglu_token_cb) (struct RETROGLU_PARSER *parser)
 
+ + + + + + + + + + + + + +

+Functions

+void retroglu_init_scene (uint8_t flags)
 
+void retroglu_init_projection (struct RETROGLU_PROJ_ARGS *args)
 
+MERROR_RETVAL retroglu_parse_obj_file (const char *filename, struct RETROGLU_PARSER *parser, struct RETROGLU_OBJ *obj)
 
void retroglu_parse_init (struct RETROGLU_PARSER *parser, struct RETROGLU_OBJ *obj, retroglu_mtl_cb load_mtl, void *load_mtl_data)
 Initialize a RETROGLU_PARSER.
 
MERROR_RETVAL retroglu_parse_obj_c (struct RETROGLU_PARSER *parser, unsigned char c)
 Parse OBJ data into a parser, one character at a time.
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ RETROGLU_OBJ_TOKENS

+ +
+
+ + + + + + + +
#define RETROGLU_OBJ_TOKENS( f)
+
+Value:
f( "v", retroglu_token_vertice ) \
+
f( "vn", retroglu_token_vnormal ) \
+
f( "f", retroglu_token_face ) \
+
f( "usemtl", retroglu_token_usemtl ) \
+
f( "newmtl", retroglu_token_newmtl ) \
+
f( "mtllib", retroglu_token_mtllib ) \
+
f( "Kd", retroglu_token_kd ) \
+
f( "Ka", retroglu_token_ka ) \
+
f( "Ks", retroglu_token_ks ) \
+
f( "Ke", retroglu_token_ks ) \
+
f( "Ns", retroglu_token_ns )
+
+

Table of OBJ file tokens understood by the parser.

+ +
+
+ +

◆ retroglu_parser_state

+ +
+
+ + + + + + + + + + + +
#define retroglu_parser_state( parser,
new_state )
+
+Value:
debug_printf( \
+
RETROGLU_TRACE_LVL, "changing parser to state: %d\n", new_state ); \
+
(parser)->state = new_state;
+
+

Change the parser state.

+
Parameters
+ + + +
Pointerto the RETROGLU_PARSER to modify.
new_stateRetroGLU OBJ Parser States to set the parser to.
+
+
+ +
+
+

Function Documentation

+ +

◆ retroglu_parse_init()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
void retroglu_parse_init (struct RETROGLU_PARSER * parser,
struct RETROGLU_OBJ * obj,
retroglu_mtl_cb load_mtl,
void * load_mtl_data )
+
+related
+
+ +

Initialize a RETROGLU_PARSER.

+
Warning
This should be run before retroglu_parse_obj_c() is called on the parser!
+ +
+
+ +

◆ retroglu_parse_obj_c()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
MERROR_RETVAL retroglu_parse_obj_c (struct RETROGLU_PARSER * parser,
unsigned char c )
+
+related
+
+ +

Parse OBJ data into a parser, one character at a time.

+

Generally, this should loop over a character array loaded from an OBJ file.

+ +
+
+
+ + +
+ + diff --git a/group__maug__retroglu__obj__fsm.map b/group__maug__retroglu__obj__fsm.map new file mode 100644 index 00000000..e57d6cfa --- /dev/null +++ b/group__maug__retroglu__obj__fsm.map @@ -0,0 +1,5 @@ + + + + + diff --git a/group__maug__retroglu__obj__fsm.md5 b/group__maug__retroglu__obj__fsm.md5 new file mode 100644 index 00000000..6694bdfa --- /dev/null +++ b/group__maug__retroglu__obj__fsm.md5 @@ -0,0 +1 @@ +c9e3260cc6ffbb8342f15c4edc496a9f \ No newline at end of file diff --git a/group__maug__retroglu__obj__fsm.png b/group__maug__retroglu__obj__fsm.png new file mode 100644 index 0000000000000000000000000000000000000000..b6890c606d3eecdaa5a1e1f5b5aaa8b08f72313c GIT binary patch literal 7725 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 S>ln^|F&;lsl`EAs3H%>6KTA^p literal 0 HcmV?d00001 diff --git a/group__maug__retroglu__obj__fsm__states.html b/group__maug__retroglu__obj__fsm__states.html new file mode 100644 index 00000000..7775bcfb --- /dev/null +++ b/group__maug__retroglu__obj__fsm__states.html @@ -0,0 +1,217 @@ + + + + + + + +maug: RetroGLU OBJ Parser States + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGLU OBJ Parser States
+
+
+
+Collaboration diagram for RetroGLU OBJ Parser States:
+
+
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROGLU_PARSER_STATE_NONE   0
 
+#define RETROGLU_PARSER_STATE_VERTEX_X   1
 
+#define RETROGLU_PARSER_STATE_VERTEX_Y   2
 
+#define RETROGLU_PARSER_STATE_VERTEX_Z   3
 
+#define RETROGLU_PARSER_STATE_COMMENT   4
 
+#define RETROGLU_PARSER_STATE_FACE_TOKEN   5
 
+#define RETROGLU_PARSER_STATE_FACE_VERTEX   6
 
+#define RETROGLU_PARSER_STATE_FACE_TEXTURE   7
 
+#define RETROGLU_PARSER_STATE_FACE_NORMAL   8
 
+#define RETROGLU_PARSER_STATE_FACE_MATERIAL   9
 
+#define RETROGLU_PARSER_STATE_MATERIAL_NAME   10
 
+#define RETROGLU_PARSER_STATE_MATERIAL_AMB   11
 
+#define RETROGLU_PARSER_STATE_MATERIAL_DIF   12
 
+#define RETROGLU_PARSER_STATE_MATERIAL_SPEC   13
 
+#define RETROGLU_PARSER_STATE_MATERIAL_LIB   14
 
+#define RETROGLU_PARSER_STATE_MTL_KD_R   15
 
+#define RETROGLU_PARSER_STATE_MTL_KD_G   16
 
+#define RETROGLU_PARSER_STATE_MTL_KD_B   17
 
+#define RETROGLU_PARSER_STATE_VNORMAL_X   18
 
+#define RETROGLU_PARSER_STATE_VNORMAL_Y   19
 
+#define RETROGLU_PARSER_STATE_VNORMAL_Z   20
 
+#define RETROGLU_PARSER_STATE_VTEXTURE_X   21
 
+#define RETROGLU_PARSER_STATE_VTEXTURE_Y   22
 
+#define RETROGLU_PARSER_STATE_VTEXTURE_Z   23
 
+#define RETROGLU_PARSER_STATE_MTL_KA_R   24
 
+#define RETROGLU_PARSER_STATE_MTL_KA_G   25
 
+#define RETROGLU_PARSER_STATE_MTL_KA_B   26
 
+#define RETROGLU_PARSER_STATE_MTL_KS_R   27
 
+#define RETROGLU_PARSER_STATE_MTL_KS_G   28
 
+#define RETROGLU_PARSER_STATE_MTL_KS_B   29
 
+#define RETROGLU_PARSER_STATE_MTL_KE_R   30
 
+#define RETROGLU_PARSER_STATE_MTL_KE_G   31
 
+#define RETROGLU_PARSER_STATE_MTL_KE_B   32
 
+#define RETROGLU_PARSER_STATE_MTL_NS   33
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__maug__retroglu__obj__fsm__states.map b/group__maug__retroglu__obj__fsm__states.map new file mode 100644 index 00000000..0ef61f3c --- /dev/null +++ b/group__maug__retroglu__obj__fsm__states.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroglu__obj__fsm__states.md5 b/group__maug__retroglu__obj__fsm__states.md5 new file mode 100644 index 00000000..733cc6c5 --- /dev/null +++ b/group__maug__retroglu__obj__fsm__states.md5 @@ -0,0 +1 @@ +c5f3633b7ea68c8a6adf8276985f1b94 \ No newline at end of file diff --git a/group__maug__retroglu__obj__fsm__states.png b/group__maug__retroglu__obj__fsm__states.png new file mode 100644 index 0000000000000000000000000000000000000000..e4886a8de2ab797d57e0bd5a54d461124d146853 GIT binary patch literal 5826 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 + + + + + + +maug: RetroGLU Overlay API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGLU Overlay API
+
+
+ +

Convenience macros for drawing a 2D overlay using transparent textures. +More...

+
+Collaboration diagram for RetroGLU Overlay API:
+
+
+ + + + +
+ + + + + + + + + + + +

+Macros

#define retroglu_push_overlay(x, y, x_f, y_f, aspect_f)
 Push current projection modelview and prepare useful parameters for drawing a textured overlay.
 
#define retroglu_whf(w, h, w_f, h_f, aspect_f)
 Convert width/height in pixels to proportional float values for OpenGL.
 
#define retroglu_pop_overlay()
 Restore projection modelview previously pushed using retroglu_push().
 
+

Detailed Description

+

Convenience macros for drawing a 2D overlay using transparent textures.

+

Macro Definition Documentation

+ +

◆ retroglu_pop_overlay

+ +
+
+ + + + + + + +
#define retroglu_pop_overlay()
+
+Value:
glPopMatrix(); \
+
glMatrixMode( GL_MODELVIEW );
+
+

Restore projection modelview previously pushed using retroglu_push().

+ +
+
+ +

◆ retroglu_push_overlay

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#define retroglu_push_overlay( x,
y,
x_f,
y_f,
aspect_f )
+
+Value:
/* Switch to projection setup. */ \
+
glMatrixMode( GL_PROJECTION ); \
+
glPushMatrix(); \
+
/* Lighting makes overlay text hard to see. */ \
+
retroglu_disable_lightning(); \
+
/* Use ortho for overlay. */ \
+
glLoadIdentity(); \
+
aspect_f = (float)retroflat_screen_w() / (float)retroflat_screen_h(); \
+
/* Switch to ortho projection proportional to screen size. */ \
+
glOrtho( -1.0f * aspect_f, aspect_f, -1.0f, 1.0f, 0, 10.0f ); \
+
/* -1 to 1 is 2! */ \
+
aspect_f *= 2.0f; \
+
/* Assuming width > height for aspect ratio. */ \
+
x_f = ((x) * aspect_f / retroflat_screen_w()) - (aspect_f / 2); \
+
/* Vertical coords also need to be inverted because OpenGL. */ \
+
y_f = 1.0f - ((y) * 2.0f / retroflat_screen_h()); \
+
#define retroflat_screen_h()
Get the current screen height in pixels.
Definition retroflt.h:2052
+
#define retroflat_screen_w()
Get the current screen width in pixels.
Definition retroflt.h:2049
+
+

Push current projection modelview and prepare useful parameters for drawing a textured overlay.

+ +
+
+ +

◆ retroglu_whf

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#define retroglu_whf( w,
h,
w_f,
h_f,
aspect_f )
+
+Value:
w_f = ((w) * aspect_f / retroflat_screen_w()); \
+
h_f = ((h) * 2.0f / retroflat_screen_h());
+
+

Convert width/height in pixels to proportional float values for OpenGL.

+
Parameters
+ + + + + +
wWidth of an overlay in pixels (read-only int).
hHeight of an overlay in pixels (read-only int).
w_fFloat to assign proportional width of the overlay.
h_fFloat to assign proportional height of the overlay.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__maug__retroglu__overlay.map b/group__maug__retroglu__overlay.map new file mode 100644 index 00000000..f05efcbd --- /dev/null +++ b/group__maug__retroglu__overlay.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroglu__overlay.md5 b/group__maug__retroglu__overlay.md5 new file mode 100644 index 00000000..b234b6cb --- /dev/null +++ b/group__maug__retroglu__overlay.md5 @@ -0,0 +1 @@ +22718922e4e8b5fe79bb46f839d0f827 \ No newline at end of file diff --git a/group__maug__retroglu__overlay.png b/group__maug__retroglu__overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..8fc94acd44841de024078fc07ab52395b5a57286 GIT binary patch literal 4566 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 literal 0 HcmV?d00001 diff --git a/group__maug__retroglu__sprite.html b/group__maug__retroglu__sprite.html new file mode 100644 index 00000000..359871f5 --- /dev/null +++ b/group__maug__retroglu__sprite.html @@ -0,0 +1,135 @@ + + + + + + + +maug: RetroGLU Sprites + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGLU Sprites
+
+
+
+Collaboration diagram for RetroGLU Sprites:
+
+
+ + + + +
+ + + + + + + + + +

+Data Structures

struct  RETROGLU_SPRITE_PARMS
 If draw lists are disabled, this struct holds a list of params for retroglu_set_sprite_clip() so that the sprite can be drawn without a list. More...
 
struct  RETROGLU_SPRITE
 
struct  RETROGLU_TILE
 
+ + + + + + + +

+Macros

+#define RETROGLU_SPRITE_X   0
 
+#define RETROGLU_SPRITE_Y   1
 
+#define RETROGLU_SPRITE_LIST_SZ_MAX   10
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__maug__retroglu__sprite.map b/group__maug__retroglu__sprite.map new file mode 100644 index 00000000..ed5d5aa2 --- /dev/null +++ b/group__maug__retroglu__sprite.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retroglu__sprite.md5 b/group__maug__retroglu__sprite.md5 new file mode 100644 index 00000000..7408809e --- /dev/null +++ b/group__maug__retroglu__sprite.md5 @@ -0,0 +1 @@ +e0cadcd0f94a95933e69ab7c86182b90 \ No newline at end of file diff --git a/group__maug__retroglu__sprite.png b/group__maug__retroglu__sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..791e8155d3cc0fe036ac9d35c376e29a8f9a4748 GIT binary patch literal 4123 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 literal 0 HcmV?d00001 diff --git a/group__maug__retrogui.html b/group__maug__retrogui.html new file mode 100644 index 00000000..235b4df8 --- /dev/null +++ b/group__maug__retrogui.html @@ -0,0 +1,300 @@ + + + + + + + +maug: RetroGUI API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGUI API
+
+
+
+Collaboration diagram for RetroGUI API:
+
+
+ + + + +
+ + + + +

+Topics

 RetroGUI Controls
 
+ + + +

+Files

file  retrogui.h
 
+ + + +

+Data Structures

struct  RETROGUI
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROGUI_FLAGS_DIRTY   0x01
 RETROGUI::flags indicating controls should be redrawn.
 
+#define RETROGUI_TRACE_LVL   0
 
+#define RETROGUI_CTL_TEXT_SZ_MAX   128
 
+#define RETROGUI_CTL_SZ_MAX_INIT   10
 
+#define RETROGUI_PADDING   5
 
+#define RETROGUI_BTN_LBL_SZ_MAX   64
 
+#define RETROGUI_CTL_TEXT_BLINK_FRAMES   15
 
#define retrogui_lock(gui)
 
#define retrogui_unlock(gui)
 
+#define retrogui_is_locked(gui)   (NULL != (gui)->ctls)
 
+#define RETROGUI_IDC_NONE   0
 
+#define RETROGUI_CTL_TABLE_CONSTS(idx, c_name, c_fields)    extern MAUG_CONST uint8_t RETROGUI_CTL_TYPE_ ## c_name;
 
+ + + + + + +

+Typedefs

+typedef size_t RETROGUI_IDC
 Unique identifying constant number for controls.
 
+typedef void(* retrogui_xy_cb) (size_t *x, size_t *y, void *data)
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

+MERROR_RETVAL retrogui_push_listbox_item (struct RETROGUI *gui, RETROGUI_IDC idc, const char *item, size_t item_sz)
 
+union RETROGUI_CTLretrogui_get_ctl_by_idc (struct RETROGUI *gui, size_t idc)
 
RETROGUI_IDC retrogui_poll_ctls (struct RETROGUI *gui, RETROFLAT_IN_KEY *p_input, struct RETROFLAT_INPUT *input_evt)
 Poll for the last clicked control and maintain listboxes and menus.
 
+void retrogui_redraw_ctls (struct RETROGUI *gui)
 
+MERROR_RETVAL retrogui_push_ctl (struct RETROGUI *gui, union RETROGUI_CTL *ctl)
 
+MERROR_RETVAL retrogui_get_ctl_text (struct RETROGUI *gui, RETROGUI_IDC idc, char *buffer, size_t buffer_sz)
 
+size_t retrogui_get_ctl_sel_idx (struct RETROGUI *gui, size_t idc)
 
+MERROR_RETVAL retrogui_init_ctl (union RETROGUI_CTL *ctl, uint8_t type, size_t idc)
 
+MERROR_RETVAL retrogui_init (struct RETROGUI *gui)
 
+void retrogui_free (struct RETROGUI *gui)
 
+ + + +

+Variables

+MAUG_CONST char * gc_retrogui_ctl_names []
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ retrogui_lock

+ +
+
+ + + + + + + +
#define retrogui_lock( gui)
+
+Value:
if( NULL == (gui)->ctls ) { \
+
maug_mlock( (gui)->ctls_h, (gui)->ctls ); \
+
maug_cleanup_if_null_alloc( union RETROGUI_CTL*, (gui)->ctls ); \
+
}
+
Definition retrogui.h:118
+
+
+
+ +

◆ retrogui_unlock

+ +
+
+ + + + + + + +
#define retrogui_unlock( gui)
+
+Value:
if( NULL != (gui)->ctls ) { \
+
maug_munlock( (gui)->ctls_h, (gui)->ctls ); \
+
}
+
+
+
+

Function Documentation

+ +

◆ retrogui_poll_ctls()

+ +
+
+ + + + + + + + + + + + + + + + +
RETROGUI_IDC retrogui_poll_ctls (struct RETROGUI * gui,
RETROFLAT_IN_KEY * p_input,
struct RETROFLAT_INPUT * input_evt )
+
+ +

Poll for the last clicked control and maintain listboxes and menus.

+
Parameters
+ + + +
inputInput integer returned from retroflat_poll_input().
input_evtRETROFLAT_INPUT initialized by retroflat_poll_input().
+
+
+
Returns
IDC of clicked control or RETROGUI_IDC_NONE if none clicked since last poll.
+ +
+
+
+ + +
+ + diff --git a/group__maug__retrogui.map b/group__maug__retrogui.map new file mode 100644 index 00000000..1329c7bf --- /dev/null +++ b/group__maug__retrogui.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retrogui.md5 b/group__maug__retrogui.md5 new file mode 100644 index 00000000..1f3bc70e --- /dev/null +++ b/group__maug__retrogui.md5 @@ -0,0 +1 @@ +651ab8089badcae87c52b4aa07ae4c2c \ No newline at end of file diff --git a/group__maug__retrogui.png b/group__maug__retrogui.png new file mode 100644 index 0000000000000000000000000000000000000000..da64e8403ee787f5e16f530841e94491401d770b GIT binary patch literal 3927 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 + + + + + + +maug: RetroGUI Controls + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroGUI Controls
+
+
+
+Collaboration diagram for RetroGUI Controls:
+
+
+ + + + +
+ + + + + + + +

+Data Structures

struct  RETROGUI_CTL_BASE
 Fields common to ALL RETROGUI_CTL types. More...
 
union  RETROGUI_CTL
 
+ + + + + + + + + + +

+Macros

#define RETROGUI_CTL_TABLE(f)
 Table defining all control types and their specific fields in RETROGUI_CTL.
 
#define RETROGUI_CTL_TABLE_FIELDS(idx, c_name, c_fields)
 Creates the corresponding RETROGUI_* structs from RETROGUI_CTL_TABLE that populate union RETROGUI_CTL.
 
+#define RETROGUI_CTL_TABLE_TYPES(idx, c_name, c_fields)    struct RETROGUI_CTL_ ## c_name c_name;
 Adds the structs created by RETROGUI_CTL_TABLE_FIELDS to union RETROGUI_CTL.
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ RETROGUI_CTL_TABLE

+ +
+
+ + + + + + + +
#define RETROGUI_CTL_TABLE( f)
+
+Value:
f( 0, NONE, void* none; ) \
+
f( 1, LISTBOX, MAUG_MHANDLE list_h; char* list; size_t list_sz; size_t list_sz_max; size_t sel_idx; ) \
+
f( 2, BUTTON, char label[RETROGUI_BTN_LBL_SZ_MAX + 1]; int16_t push_frames; ) \
+
f( 3, TEXTBOX, MAUG_MHANDLE text_h; char* text; size_t text_sz; size_t text_sz_max; size_t text_cur; int16_t blink_frames; )
+
+

Table defining all control types and their specific fields in RETROGUI_CTL.

+

All entries in this table have corresponding retrogui_redraw_*, retrogui_poll_*, retrogui_init_*, and retrogui_push_* functions which are called internally from retrogui_redraw_ctls(), retrogui_poll_ctls(), retrogui_init_ctl(), and retrogui_push_ctl(), respectively.

+ +
+
+ +

◆ RETROGUI_CTL_TABLE_FIELDS

+ +
+
+ + + + + + + + + + + + + + + + +
#define RETROGUI_CTL_TABLE_FIELDS( idx,
c_name,
c_fields )
+
+Value:
struct RETROGUI_CTL_ ## c_name { \
+
struct RETROGUI_CTL_BASE base; \
+
c_fields \
+
};
+
Fields common to ALL RETROGUI_CTL types.
Definition retrogui.h:85
+
+

Creates the corresponding RETROGUI_* structs from RETROGUI_CTL_TABLE that populate union RETROGUI_CTL.

+ +
+
+
+ + +
+ + diff --git a/group__maug__retrogui__ctl.map b/group__maug__retrogui__ctl.map new file mode 100644 index 00000000..67df4c31 --- /dev/null +++ b/group__maug__retrogui__ctl.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retrogui__ctl.md5 b/group__maug__retrogui__ctl.md5 new file mode 100644 index 00000000..4c028930 --- /dev/null +++ b/group__maug__retrogui__ctl.md5 @@ -0,0 +1 @@ +8e4a58263a55c09a13513e894718b1c9 \ No newline at end of file diff --git a/group__maug__retrogui__ctl.png b/group__maug__retrogui__ctl.png new file mode 100644 index 0000000000000000000000000000000000000000..bf33bf6a33b06a5200992f69c7b8641a0744d139 GIT binary patch literal 3965 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 + + + + + + +maug: RetroSound API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroSound API
+
+
+ +

Abstraction layer header for sound on retro systems. +More...

+
+Collaboration diagram for RetroSound API:
+
+
+ + + + +
+ + + + + +

+Topics

 RetroSound State Flags
 Flags indicating global state for the RETROSND_STATE::flags field.
 
+ + + + +

+Files

file  retrosnd.h
 Abstraction layer header for sound on retro systems.
 
+ + + + +

+Data Structures

struct  RETROSND_STATE
 Internal retrosound state struct. Most fields are platform-specific. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROSND_TRACE_LVL   0
 
+#define RETROSND_REG_TRACE_LVL   0
 
+#define SF_BANK_FILENAME_SZ_MAX   30
 
+#define RETROSND_VOICE_BREATH   122
 
+#define RETROSND_VOICE_SEASHORE   123
 
+#define RETROSND_VOICE_BIRD_TWEET   124
 
+#define RETROSND_VOICE_PHONE_RING   125
 
+#define RETROSND_VOICE_HELICOPTER   126
 
+#define RETROSND_VOICE_APPLAUSE   127
 
+#define RETROSND_PC_BIOS_SPKR   0x01
 
+#define RETROSND_PC_BIOS_MPU   0x02
 
+#define RETROSND_PC_BIOS_GUS   0x04
 
+#define RETROSND_PC_BIOS_ADLIB   0x08
 
+#define RETROSND_VOICE_GUNSHOT   128
 Parameter for retrosnd_midi_set_voice() indicating a gunshot sound effect.
 
+ + + + + + + + + + + + + + + + + +

+Functions

MERROR_RETVAL retrosnd_init (struct RETROFLAT_ARGS *args)
 Initialize retrosnd engine.
 
+void retrosnd_set_sf_bank (const char *filename_in)
 Set the name of the voice bank filename to use.
 
+void retrosnd_midi_set_voice (uint8_t channel, uint8_t voice)
 
+void retrosnd_midi_set_control (uint8_t channel, uint8_t key, uint8_t val)
 
+void retrosnd_midi_note_on (uint8_t channel, uint8_t pitch, uint8_t vel)
 
+void retrosnd_midi_note_off (uint8_t channel, uint8_t pitch, uint8_t vel)
 
+void retrosnd_shutdown ()
 
+

Detailed Description

+

Abstraction layer header for sound on retro systems.

+

Function Documentation

+ +

◆ retrosnd_init()

+ +
+
+ + + + + + + +
MERROR_RETVAL retrosnd_init (struct RETROFLAT_ARGS * args)
+
+ +

Initialize retrosnd engine.

+
Parameters
+ + +
argsA pointer to the RETROSND_ARGS struct initialized by the calling program.
+
+
+

The RETROSND_ARGS::snd_io_base field must be initialized with the address or other platform-specific indicator of the MIDI device to use.

+ +
+
+
+ + +
+ + diff --git a/group__maug__retrosnd.map b/group__maug__retrosnd.map new file mode 100644 index 00000000..b0f3b6df --- /dev/null +++ b/group__maug__retrosnd.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retrosnd.md5 b/group__maug__retrosnd.md5 new file mode 100644 index 00000000..43f033a2 --- /dev/null +++ b/group__maug__retrosnd.md5 @@ -0,0 +1 @@ +cc54f3aaab5d72d700d222ea9bec3fbd \ No newline at end of file diff --git a/group__maug__retrosnd.png b/group__maug__retrosnd.png new file mode 100644 index 0000000000000000000000000000000000000000..f7490fc7dea2345cf473d60e36f649470c5de439 GIT binary patch literal 4711 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 literal 0 HcmV?d00001 diff --git a/group__maug__retrosnd__flags.html b/group__maug__retrosnd__flags.html new file mode 100644 index 00000000..aa5be629 --- /dev/null +++ b/group__maug__retrosnd__flags.html @@ -0,0 +1,123 @@ + + + + + + + +maug: RetroSound State Flags + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroSound State Flags
+
+
+ +

Flags indicating global state for the RETROSND_STATE::flags field. +More...

+
+Collaboration diagram for RetroSound State Flags:
+
+
+ + + + +
+ + + + + +

+Macros

+#define RETROSND_FLAG_INIT   0x01
 Flag in RETROSND_STATE::flags indicating initialization was successful.
 
+

Detailed Description

+

Flags indicating global state for the RETROSND_STATE::flags field.

+
+ + +
+ + diff --git a/group__maug__retrosnd__flags.map b/group__maug__retrosnd__flags.map new file mode 100644 index 00000000..d71a3e8a --- /dev/null +++ b/group__maug__retrosnd__flags.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__maug__retrosnd__flags.md5 b/group__maug__retrosnd__flags.md5 new file mode 100644 index 00000000..36e220c3 --- /dev/null +++ b/group__maug__retrosnd__flags.md5 @@ -0,0 +1 @@ +6dec614ebc444e41a9df9926c7a7b007 \ No newline at end of file diff --git a/group__maug__retrosnd__flags.png b/group__maug__retrosnd__flags.png new file mode 100644 index 0000000000000000000000000000000000000000..da485f4f033f5691be084c1d6b417d412af3cddb GIT binary patch literal 4681 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
V@xK3Xa{y%+7#W8bgi0>DBJhO!_wPf1i{5+u zn8Cg)#&&;g$fIF=+!Qz+abaTvp_|XIrq-gFU4cSnFD}}FVK!bFr$foJ@2dj*!@0)7 z=lc+o9~4>de=O_e11k8N1`k^1d&;-GkLn!#^3DR@aE=xu2-xk(S zL`dkt-@e|!s}!XA`ubcR3xESa_+(&zs!s=yxyNZm}1Zlyr`bT}#$|;OSXqsRmlR zW7SjD0Wkbgga)Uiuz*smcVD6ay07BM-6r^z6Il@Cq3G6f+x9`{TjmlhfVD5^51?j^ z*s0CjW@k;K{b*Mxe5)Al=H~WyW5XRd^tW%}2?E+4e@DeY*#I(4=FA0)8Fle0iL+X1rtiSCsyCF@6(ucyn?rI z3aKIu>t(W#bFD9idBO?X5WFf(=v&M!t+7j2O9yD~?Dd52rKv!=Z608mOMd)hj;17^_ zp|P>Cp + + + + + + +maug: Micro-PrintF API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Micro-PrintF API
+
+
+ +

Independently-implemented printf API for old compilers. +More...

+ + + + +

+Files

file  uprintf.h
 
+ + + +

+Data Structures

union  MAUG_FMT_SPEC
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define NEWLINE_STR   "\n"
 
+#define UPRINTF_BUFFER_SZ_MAX   1024
 
+#define platform_file   FILE*
 
+#define platform_fprintf   fprintf
 
+#define platform_vfprintf   vfprintf
 
+#define platform_fopen   fopen
 
+#define platform_fflush   fflush
 
+#define platform_fclose   fclose
 
+#define LOG_ERR_TARGET   stderr
 
+#define LOG_STD_TARGET   stdout
 
+#define SIZE_T_FMT   "%u"
 
+#define SSIZE_T_FMT   "%d"
 
+#define OFF_T_FMT   "%lu"
 
+#define DEBUG_THRESHOLD   1
 
+#define debug_printf(...)
 
+#define error_printf(...)
 
+#define size_printf(...)
 
+#define size_multi_printf(...)
 
+#define logging_init()
 
+#define logging_shutdown()
 
#define maug_bufcat(c, buf, buf_idx, buf_sz, cleanup)
 
#define maug_bufpad(pad_c, pad_sz, i, buf, buf_idx, buf_sz, cleanup)
 
#define maug_xtoa(num, base, rem, dest, dest_idx, digits, digits_done, pad)
 
+#define maug_hctoi(c)    ('9' > (c) ? (c) - '0' : 'a' > (c) ? 10 + (c) - 'A' : 10 + (c) - 'a')
 Convert a single char hex digit to the int it represents.
 
+ + + + + + + + + + + + + + + + + +

+Functions

+int maug_digits (long int num, int base)
 
+int maug_zdigits (size_t num, int base)
 
+int maug_itoa (long int num, char *dest, int dest_sz, int base)
 
+int maug_utoa (uint32_t num, char *dest, int dest_sz, int base)
 
+int maug_ztoa (size_t num, char *dest, int dest_sz, int base)
 
+void maug_vsnprintf (char *buffer, int buffer_sz, const char *fmt, va_list vargs)
 
+void maug_snprintf (char *buffer, int buffer_sz, const char *fmt,...)
 
+void maug_printf (const char *fmt,...)
 
+ + + +

+Variables

+uint32_t g_maug_printf_line
 
+

Detailed Description

+

Independently-implemented printf API for old compilers.

+

Macro Definition Documentation

+ +

◆ maug_bufcat

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
#define maug_bufcat( c,
buf,
buf_idx,
buf_sz,
cleanup )
+
+Value:
buf[buf_idx++] = c; \
+
if( buf_idx >= buf_sz ) { goto cleanup; }
+
+
+
+ +

◆ maug_bufpad

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define maug_bufpad( pad_c,
pad_sz,
i,
buf,
buf_idx,
buf_sz,
cleanup )
+
+Value:
i = 0; \
+
while( i < pad_sz ) { \
+
maug_bufcat( pad_c, buffer, buffer_idx, buffer_sz, cleanup ); \
+
i++; \
+
}
+
+
+
+ +

◆ maug_xtoa

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define maug_xtoa( num,
base,
rem,
dest,
dest_idx,
digits,
digits_done,
pad )
+
+Value:
dest_idx += digits; \
+
while( 0 != num ) { \
+
/* Get the 1's place. */ \
+
rem = num % base; \
+
dest[--dest_idx] = (9 < rem) ? \
+
/* > 10, so it's a letter. */ \
+
(rem - 10) + 'a' : \
+
/* < 10, so it's a number. */ \
+
rem + '0'; \
+
/* Move the next place value into range. */ \
+
num /= base; \
+
digits_done++; \
+
} \
+
while( digits_done < digits ) { \
+
dest[--dest_idx] = '0'; \
+
digits_done++; \
+
}
+
+
+
+
+ + +
+ + diff --git a/group__retrofont.html b/group__retrofont.html new file mode 100644 index 00000000..7d16513c --- /dev/null +++ b/group__retrofont.html @@ -0,0 +1,194 @@ + + + + + + + +maug: RetroFont API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroFont API
+
+
+ + + + +

+Files

file  retrofnt.h
 
+ + + +

+Data Structures

struct  RETROFONT
 
+ + + + + + + + + + +

+Macros

+#define RETROFONT_PRESENT   1
 
+#define RETROFONT_LINE_SZ   80
 
+#define RETROFONT_TRACE_LVL   0
 
#define retrofont_glyph_at(p_font, idx)
 Get a pointer to the glyph with the given index in the given font.
 
+ + + + + + + + + +

+Functions

+MERROR_RETVAL retrofont_load (const char *font_name, MAUG_MHANDLE *p_font_h, uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count)
 
+void retrofont_blit_glyph (struct RETROFLAT_BITMAP *target, RETROFLAT_COLOR color, char c, struct RETROFONT *font, size_t x, size_t y, uint8_t flags)
 
+void retrofont_string (struct RETROFLAT_BITMAP *target, RETROFLAT_COLOR color, const char *str, size_t str_sz, MAUG_MHANDLE font_h, size_t x, size_t y, size_t max_w, size_t max_h, uint8_t flags)
 
+MERROR_RETVAL retrofont_string_sz (struct RETROFLAT_BITMAP *target, const char *str, size_t str_sz, MAUG_MHANDLE font_h, size_t max_w, size_t max_h, size_t *out_w_p, size_t *out_h_p, uint8_t flags)
 
+ + + + + + + + + + + + + +

+Variables

+uint16_t RETROFONT::sz
 
+uint16_t RETROFONT::first_glyph
 
+uint16_t RETROFONT::glyphs_count
 
+uint8_t RETROFONT::glyph_w
 
+uint8_t RETROFONT::glyph_h
 
+uint8_t RETROFONT::glyph_sz
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ retrofont_glyph_at

+ +
+
+ + + + + + + + + + + +
#define retrofont_glyph_at( p_font,
idx )
+
+Value:
&(((uint8_t*)(p_font))[(p_font)->sz + \
+
((p_font)->glyph_sz * (idx - (p_font)->first_glyph))])
+
+

Get a pointer to the glyph with the given index in the given font.

+ +
+
+
+ + +
+ + diff --git a/group__retrohtr.html b/group__retrohtr.html new file mode 100644 index 00000000..abb32129 --- /dev/null +++ b/group__retrohtr.html @@ -0,0 +1,379 @@ + + + + + + + +maug: Retro HyperText Rendering API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Retro HyperText Rendering API
+
+
+ + + + +

+Files

file  retrohtr.h
 
+ + + + + +

+Data Structures

struct  RETROHTR_RENDER_NODE
 
struct  RETROHTR_RENDER_TREE
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROHTR_RENDER_NODES_INIT_SZ   10
 
+#define RETROHTR_TRACE_LVL   0
 
+#define RETROHTR_EDGE_UNKNOWN   0
 
+#define RETROHTR_EDGE_LEFT   1
 
+#define RETROHTR_EDGE_TOP   2
 
+#define RETROHTR_EDGE_INSIDE   4
 
+#define retrohtr_node(tree, idx)   (0 <= idx ? &((tree)->nodes[idx]) : NULL)
 
#define retrohtr_node_parent(tree, idx)
 
#define retrohtr_tree_lock(tree)
 
#define retrohtr_tree_unlock(tree)
 
+#define retrohtr_tree_is_locked(tree)   (NULL != (tree)->nodes)
 
+#define retrohtr_node_screen_x(tree, node_idx)    ((tree)->nodes[node_idx].x)
 
+#define retrohtr_node_screen_y(tree, node_idx)    ((tree)->nodes[node_idx].y)
 
+ + + + + + + + + + + + + + + + + + +

+Functions

+MERROR_RETVAL retrohtr_tree_create (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, size_t x, size_t y, size_t w, size_t h, ssize_t tag_idx, ssize_t node_idx, size_t d)
 
MERROR_RETVAL retrohtr_apply_styles (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *parent_style, struct MCSS_STYLE *effect_style, ssize_t tag_idx)
 Create a style node that is a composite of a parent style and the styles applicable to the classes/IDs of a tag and its immediate styles.
 
+MERROR_RETVAL retrohtr_tree_size (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *prev_sibling_style, struct MCSS_STYLE *parent_style, ssize_t node_idx, size_t d)
 
+MERROR_RETVAL retrohtr_tree_pos (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *prev_sibling_style, struct MCSS_STYLE *parent_style, ssize_t node_idx, size_t d)
 
+void retrohtr_tree_draw (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, ssize_t node_idx, size_t d)
 
+void retrohtr_tree_dump (struct RETROHTR_RENDER_TREE *tree, struct MHTML_PARSER *parser, ssize_t iter, size_t d)
 
+void retrohtr_tree_free (struct RETROHTR_RENDER_TREE *tree)
 
+MERROR_RETVAL retrohtr_tree_init (struct RETROHTR_RENDER_TREE *tree)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Variables

+ssize_t RETROHTR_RENDER_NODE::x
 
+ssize_t RETROHTR_RENDER_NODE::y
 
+size_t RETROHTR_RENDER_NODE::w
 
+size_t RETROHTR_RENDER_NODE::h
 
+size_t RETROHTR_RENDER_NODE::m_l
 
+size_t RETROHTR_RENDER_NODE::m_r
 
+size_t RETROHTR_RENDER_NODE::m_t
 
+size_t RETROHTR_RENDER_NODE::m_b
 
+uint8_t RETROHTR_RENDER_NODE::pos
 
+uint8_t RETROHTR_RENDER_NODE::pos_flags
 
+uint8_t RETROHTR_RENDER_NODE::edge
 
+RETROFLAT_COLOR RETROHTR_RENDER_NODE::bg
 
+RETROFLAT_COLOR RETROHTR_RENDER_NODE::fg
 
+ssize_t RETROHTR_RENDER_NODE::tag
 
+ssize_t RETROHTR_RENDER_NODE::parent
 Index of container's render node in RETROHTR_RENDER_TREE.
 
+ssize_t RETROHTR_RENDER_NODE::first_child
 Index of first child's render node in RETROHTR_RENDER_TREE.
 
+ssize_t RETROHTR_RENDER_NODE::next_sibling
 Index of next sibling's render node in RETROHTR_RENDER_TREE.
 
+struct RETROFLAT_BITMAP RETROHTR_RENDER_NODE::bitmap
 
+MAUG_MHANDLE RETROHTR_RENDER_TREE::nodes_h
 
+struct RETROHTR_RENDER_NODERETROHTR_RENDER_TREE::nodes
 Locked pointer to nodes when locked with retrohtr_tree_lock().
 
+size_t RETROHTR_RENDER_TREE::nodes_sz
 Current active number of nodes in RETROHTR_RENDER_NODE::nodes_h.
 
+size_t RETROHTR_RENDER_TREE::nodes_sz_max
 Current alloc'd number of nodes in RETROHTR_RENDER_NODE::nodes_h.
 
+ssize_t RETROHTR_RENDER_TREE::font_idx
 
+struct RETROGUI RETROHTR_RENDER_TREE::gui
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ retrohtr_node_parent

+ +
+
+ + + + + + + + + + + +
#define retrohtr_node_parent( tree,
idx )
+
+Value:
(0 <= idx && 0 <= (tree)->nodes[idx].parent ? \
+
&((tree)->nodes[(tree)->nodes[idx].parent]) : NULL)
+
+
+
+ +

◆ retrohtr_tree_lock

+ +
+
+ + + + + + + +
#define retrohtr_tree_lock( tree)
+
+Value:
if( NULL == (tree)->nodes ) { \
+
maug_mlock( (tree)->nodes_h, (tree)->nodes ); \
+
maug_cleanup_if_null_alloc( struct RETROHTR_RENDER_NODE*, (tree)->nodes ); \
+
}
+
Definition retrohtr.h:24
+
+
+
+ +

◆ retrohtr_tree_unlock

+ +
+
+ + + + + + + +
#define retrohtr_tree_unlock( tree)
+
+Value:
if( NULL != (tree)->nodes ) { \
+
maug_munlock( (tree)->nodes_h, (tree)->nodes ); \
+
}
+
+
+
+

Function Documentation

+ +

◆ retrohtr_apply_styles()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
MERROR_RETVAL retrohtr_apply_styles (struct MHTML_PARSER * parser,
struct RETROHTR_RENDER_TREE * tree,
struct MCSS_STYLE * parent_style,
struct MCSS_STYLE * effect_style,
ssize_t tag_idx )
+
+ +

Create a style node that is a composite of a parent style and the styles applicable to the classes/IDs of a tag and its immediate styles.

+
Parameters
+ + + + +
tag_idxIndex of a tag in the parser tree to derive styles from.
parent_styleLocked pointer to an MCSS_STYLE for the parent node to build on.
effect_styleLocked pointer to an MCSS_STYLE to clear and replace with the combined style information from the parent and indexed tag.
+
+
+ +
+
+
+ + +
+ + diff --git a/group__retrotile.html b/group__retrotile.html new file mode 100644 index 00000000..13b1b5f4 --- /dev/null +++ b/group__retrotile.html @@ -0,0 +1,215 @@ + + + + + + + +maug: RetroTile API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroTile API
+
+
+ +

Functions and structures for working with tilemaps/grids. +More...

+
+Collaboration diagram for RetroTile API:
+
+
+ + + + + + +
+ + + + + + + + + +

+Topics

 RetroTile Tile Definitions
 
 RetroTile Parser
 
 RetroTile Generators
 Tools for procedurally generating tilemaps.
 
+ + + + + + + + + + +

+Data Structures

struct  RETROTILE_LAYER
 
struct  RETROTILE
 
struct  RETROTILE_DATA_DS
 Internal data structure used by retrotile_gen_diamond_square_iter(). More...
 
struct  RETROTILE_DATA_BORDER
 
+ + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROTILE_NAME_SZ_MAX   10
 Maximum number of chars in a RETROTILE::name.
 
+#define RETROTILE_TILESET_IMAGE_STR_SZ_MAX   48
 Maximum number of chars in a RETROTILE_TILE_DEF::image_path.
 
+#define RETROTILE_TILE_SCALE_DEFAULT   1.0f
 Default value for RETROTILE::tile_scale.
 
+#define RETROTILE_TRACE_LVL   0
 If defined, bring debug printf statements up to this level.
 
+#define RETROTILE_VORONOI_DEFAULT_SPB   8
 
+#define RETROTILE_VORONOI_DEFAULT_DRIFT   4
 
+#define retrotile_mstate_name(state)   state
 
+#define retrotile_get_tile(tilemap, layer, x, y)    (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
 
+#define retrotile_set_tile(tilemap, layer, x, y, new_val)    (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
 
#define retrotile_get_tiles_p(layer)
 
+ + + + + + + + + +

+Variables

+MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets8_x [8]
 
+MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets8_y [8]
 
+MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets4_x [4]
 
+MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets4_y [4]
 
+

Detailed Description

+

Functions and structures for working with tilemaps/grids.

+

Macro Definition Documentation

+ +

◆ retrotile_get_tiles_p

+ +
+
+ + + + + + + +
#define retrotile_get_tiles_p( layer)
+
+Value:
((retrotile_tile_t*)(((uint8_t*)(layer)) + \
+
sizeof( struct RETROTILE_LAYER )))
+
Definition retrotil.h:91
+
+
+
+
+ + +
+ + diff --git a/group__retrotile.map b/group__retrotile.map new file mode 100644 index 00000000..519becf5 --- /dev/null +++ b/group__retrotile.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/group__retrotile.md5 b/group__retrotile.md5 new file mode 100644 index 00000000..49bb1739 --- /dev/null +++ b/group__retrotile.md5 @@ -0,0 +1 @@ +712d748f0b0702aceee2a84af5500a5e \ No newline at end of file diff --git a/group__retrotile.png b/group__retrotile.png new file mode 100644 index 0000000000000000000000000000000000000000..7702741ec9ac595df39120411a6d6842e9096816 GIT binary patch literal 7943 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 + + + + + + +maug: RetroTile Tile Definitions + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroTile Tile Definitions
+
+
+
+Collaboration diagram for RetroTile Tile Definitions:
+
+
+ + + + + +
+ + + + +

+Topics

 RetroTile Custom Property Types
 
+ + + +

+Data Structures

struct  RETROTILE_TILE_DEF
 
+ + + + + + + + + + + + + + + + + + + +

+Macros

+#define RETROTILE_DIR4_NORTH   0
 
+#define RETROTILE_DIR4_EAST   1
 
+#define RETROTILE_DIR4_SOUTH   2
 
+#define RETROTILE_DIR4_WEST   3
 
+#define RETROTILE_DIR8_NORTH   0
 
+#define RETROTILE_DIR8_EAST   2
 
+#define RETROTILE_DIR8_SOUTH   4
 
+#define RETROTILE_DIR8_WEST   6
 
+#define RETROTILE_IDX_FMT   "%u"
 
+ + + +

+Typedefs

+typedef int16_t retrotile_tile_t
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__retrotile__defs.map b/group__retrotile__defs.map new file mode 100644 index 00000000..cfd25e2c --- /dev/null +++ b/group__retrotile__defs.map @@ -0,0 +1,5 @@ + + + + + diff --git a/group__retrotile__defs.md5 b/group__retrotile__defs.md5 new file mode 100644 index 00000000..b24df297 --- /dev/null +++ b/group__retrotile__defs.md5 @@ -0,0 +1 @@ +883236ae272d1250ed5fe9cc7246658a \ No newline at end of file diff --git a/group__retrotile__defs.png b/group__retrotile__defs.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd9d7bde7d57d823fc236f312e05c60a9713063 GIT binary patch literal 7134 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 W+S@kp(%`}lLq_tYMCtR_{{I6ss5#64 literal 0 HcmV?d00001 diff --git a/group__retrotile__defs__types.html b/group__retrotile__defs__types.html new file mode 100644 index 00000000..ba5cbfca --- /dev/null +++ b/group__retrotile__defs__types.html @@ -0,0 +1,133 @@ + + + + + + + +maug: RetroTile Custom Property Types + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroTile Custom Property Types
+
+
+
+Collaboration diagram for RetroTile Custom Property Types:
+
+
+ + + + +
+ + + + + + + + + + + + + + +

+Macros

+#define RETROTILE_PARSER_MODE_MAP   0
 
+#define RETROTILE_PARSER_MODE_DEFS   1
 
+#define RETROTILE_TILE_FLAG_BLOCK   0x01
 
+#define RETROTILE_TILE_FLAG_ROT_X   0x02
 
+#define RETROTILE_TILE_FLAG_ROT_Z   0x04
 
+#define RETROTILE_TILE_FLAG_PRTCL_FIRE   0x08
 
+

Detailed Description

+
+ + +
+ + diff --git a/group__retrotile__defs__types.map b/group__retrotile__defs__types.map new file mode 100644 index 00000000..d0fcfcf5 --- /dev/null +++ b/group__retrotile__defs__types.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__retrotile__defs__types.md5 b/group__retrotile__defs__types.md5 new file mode 100644 index 00000000..6255704f --- /dev/null +++ b/group__retrotile__defs__types.md5 @@ -0,0 +1 @@ +38b767c18bfa90d87c0eff66652a2dcc \ No newline at end of file diff --git a/group__retrotile__defs__types.png b/group__retrotile__defs__types.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb91d1fa2dc5e3e982b31acb26805ff1b0a48dd GIT binary patch literal 5448 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 IsM)^wA5jFg&j0`b literal 0 HcmV?d00001 diff --git a/group__retrotile__gen.html b/group__retrotile__gen.html new file mode 100644 index 00000000..f207ea70 --- /dev/null +++ b/group__retrotile__gen.html @@ -0,0 +1,334 @@ + + + + + + + +maug: RetroTile Generators + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroTile Generators
+
+
+ +

Tools for procedurally generating tilemaps. +More...

+
+Collaboration diagram for RetroTile Generators:
+
+
+ + + + +
+ + + + + + +

+Typedefs

+typedef MERROR_RETVAL(* retrotile_ani_cb) (void *animation_cb_data, int16_t iter)
 
+typedef MERROR_RETVAL(* retrotile_gen_cb) (struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
 
+ + + + + + + + + + + + + + + + + + + +

+Functions

MERROR_RETVAL retrotile_gen_diamond_square_iter (struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
 Generate tilemap terrain using diamond square algorithm.
 
MERROR_RETVAL retrotile_gen_voronoi_iter (struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
 Generate tilemap terrain using voronoi graph.
 
MERROR_RETVAL retrotile_gen_smooth_iter (struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
 Average the values in adjacent tiles over an already-generated tilemap.
 
+MERROR_RETVAL retrotile_gen_borders_iter (struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
 Given a list of RETROTILE_DATA_BORDER structs, this will search for occurrences of RETROTILE_DATA_BORDER::center next to RETROTILE_DATA_BORDER::outside and replace with the appropriate border between the two!
 
+struct RETROTILE_LAYERretrotile_get_layer_p (struct RETROTILE *tilemap, uint32_t layer_idx)
 
+MERROR_RETVAL retrotile_alloc_tile_defs (MAUG_MHANDLE *p_tile_defs_h, size_t *p_tile_defs_count, size_t ndefs)
 
+MERROR_RETVAL retrotile_alloc (MAUG_MHANDLE *p_tilemap_h, size_t w, size_t h, size_t layers_count)
 
+

Detailed Description

+

Tools for procedurally generating tilemaps.

+

Function Documentation

+ +

◆ retrotile_gen_diamond_square_iter()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MERROR_RETVAL retrotile_gen_diamond_square_iter (struct RETROTILE * t,
retrotile_tile_t min_z,
retrotile_tile_t max_z,
uint32_t tuning,
size_t layer_idx,
uint8_t flags,
void * data,
retrotile_ani_cb animation_cb,
void * animation_cb_data )
+
+ +

Generate tilemap terrain using diamond square algorithm.

+

See retrotile_gen_cb() for details.

+
Warning
This can be very slow!
+
+This will generate a complete new tilemap!
+ +
+
+ +

◆ retrotile_gen_smooth_iter()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MERROR_RETVAL retrotile_gen_smooth_iter (struct RETROTILE * t,
retrotile_tile_t min_z,
retrotile_tile_t max_z,
uint32_t tuning,
size_t layer_idx,
uint8_t flags,
void * data,
retrotile_ani_cb animation_cb,
void * animation_cb_data )
+
+ +

Average the values in adjacent tiles over an already-generated tilemap.

+

This is designed to be used with tilemaps that use their tile indexes as Z values rather than indexes in a table of tile definitions.

+ +
+
+ +

◆ retrotile_gen_voronoi_iter()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MERROR_RETVAL retrotile_gen_voronoi_iter (struct RETROTILE * t,
retrotile_tile_t min_z,
retrotile_tile_t max_z,
uint32_t tuning,
size_t layer_idx,
uint8_t flags,
void * data,
retrotile_ani_cb animation_cb,
void * animation_cb_data )
+
+ +

Generate tilemap terrain using voronoi graph.

+

See retrotile_gen_cb() for details.

+

This is more suitable for purely 2D tilesets, as the changes between indexes are very abrupt!

+
Warning
This will generate a complete new tilemap!
+ +
+
+
+ + +
+ + diff --git a/group__retrotile__gen.map b/group__retrotile__gen.map new file mode 100644 index 00000000..f59a1b59 --- /dev/null +++ b/group__retrotile__gen.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__retrotile__gen.md5 b/group__retrotile__gen.md5 new file mode 100644 index 00000000..a380f923 --- /dev/null +++ b/group__retrotile__gen.md5 @@ -0,0 +1 @@ +cda5b31f3eab4f3c00aa2b7f94044626 \ No newline at end of file diff --git a/group__retrotile__gen.png b/group__retrotile__gen.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdeeea12867ecc3ebe96edc1a7542dcbe6c3208 GIT binary patch literal 3713 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 Qof3k)Zld%4n$yGo0G75W&;S4c literal 0 HcmV?d00001 diff --git a/group__retrotile__parser.html b/group__retrotile__parser.html new file mode 100644 index 00000000..1db718a5 --- /dev/null +++ b/group__retrotile__parser.html @@ -0,0 +1,176 @@ + + + + + + + +maug: RetroTile Parser + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
RetroTile Parser
+
+
+
+Collaboration diagram for RetroTile Parser:
+
+
+ + + + +
+ + + + +

+Data Structures

struct  RETROTILE_PARSER
 
+ + + +

+Macros

#define RETROTILE_PARSER_MSTATE_TABLE(f)
 
+ + + +

+Typedefs

+typedef MERROR_RETVAL(* retrotile_tj_parse_cb) (const char *filename, MAUG_MHANDLE *p_tm_h, MAUG_MHANDLE *p_td_h, size_t *p_td_c)
 
+ + + + + +

+Functions

+MERROR_RETVAL retrotile_parse_json_c (struct RETROTILE_PARSER *parser, char c)
 
+MERROR_RETVAL retrotile_parse_json_file (const char *filename, MAUG_MHANDLE *p_tilemap_h, MAUG_MHANDLE *p_tile_defs_h, size_t *p_tile_defs_count)
 
+

Detailed Description

+

Macro Definition Documentation

+ +

◆ RETROTILE_PARSER_MSTATE_TABLE

+ +
+
+ + + + + + + +
#define RETROTILE_PARSER_MSTATE_TABLE( f)
+
+Value:
f( MTILESTATE_NONE, 0, "", 0, 0 ) \
+
f( MTILESTATE_HEIGHT, 1, "height", 0 , 0 ) \
+
f( MTILESTATE_WIDTH, 2, "width", 0 , 0 ) \
+
f( MTILESTATE_LAYERS, 3, "layers", 0 , 0 ) \
+
f( MTILESTATE_LAYER_DATA, 4, "data", 15 /* LAYER */, 0 ) \
+
f( MTILESTATE_LAYER_NAME, 5, "name", 15 /* LAYER */, 0 ) \
+
f( MTILESTATE_TILES, 6, "tiles", 0 , 1 ) \
+
f( MTILESTATE_TILES_ID, 7, "id", 6 /* TILES */ , 1 ) \
+
f( MTILESTATE_TILES_IMAGE, 8, "image", 6 /* TILES */ , 1 ) \
+
f( MTILESTATE_TILESETS, 9, "tilesets", 0 , 0 ) \
+
f( MTILESTATE_TILESETS_SRC, 10, "source", 9 /* TILESETS */, 0 ) \
+
f( MTILESTATE_TILESETS_FGID, 11, "firstgid",9 /* TILESETS */, 0 ) \
+
f( MTILESTATE_TILESETS_PROP, 12, "firstgid",9 /* TILESETS */, 0 ) \
+
f( MTILESTATE_GRID, 13, "grid", 0 , 1 ) \
+
f( MTILESTATE_TILES_PROP, 14, "properties",6 /* TILES */ , 1 ) \
+
f( MTILESTATE_LAYER, 15, "layers", /* [sic] */ 3 , 0 ) \
+
f( MTILESTATE_TILES_PROP_NAME, 16, "name", 14 /* TILES_PROP */ , 1 ) \
+
f( MTILESTATE_TILES_PROP_VAL, 17, "value", 14 /* TILES_PROP */ , 1 )
+
+
+
+
+ + +
+ + diff --git a/group__retrotile__parser.map b/group__retrotile__parser.map new file mode 100644 index 00000000..d9e56d8a --- /dev/null +++ b/group__retrotile__parser.map @@ -0,0 +1,4 @@ + + + + diff --git a/group__retrotile__parser.md5 b/group__retrotile__parser.md5 new file mode 100644 index 00000000..38876047 --- /dev/null +++ b/group__retrotile__parser.md5 @@ -0,0 +1 @@ +f35f2650936516b5693007b8da40f57c \ No newline at end of file diff --git a/group__retrotile__parser.png b/group__retrotile__parser.png new file mode 100644 index 0000000000000000000000000000000000000000..c1122394687ae55dd70deb749d1c22a8bf6d24ed GIT binary patch literal 3114 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 + + + + + + +maug: maug + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
maug
+
+
+

Augmented minimal standard library for C89 and legacy compilers.

+

The API is currently in flux and is not yet completely final!

+

Current maug-based projects may be found under The maug topic on GitHub!

+

Design Constraints

+

Maug has the following design goals and constraints:

+
    +
  • Must work in C89 compilers. C99-like features like stdint or snprintf are available by internal implementation.
  • +
  • Memory allocation uses a flat model (calloc/free), with no handle management.
  • +
  • Standard library calls are allowed, so long as they are universally available even in very old C89 compilers.
  • +
+

Roadmap

+
    +
  • Rename Retroflat functions with maug_ to create a coherent namespace.
  • +
  • Clearly enumerate which headers rely on which to create modular hierarchy.
  • +
  • Solidify API.
  • +
  • Setup Makefile to compile .solib/.dll/.ovl dynamic libs.
  • +
+

Modules

+

Makefiles

+

Inside of the make subdirectory are a number of Makefiles that can be included from a project's Makefile in order to more conveniently build assets.

+

retroflt

+

#include <retroflt.h>

+

RetroFlat is a rough, quick-and-dirty compatibility layer for making graphical programs that work on Win16 (32-bit via OpenWatcom's Win386), MS-DOS (32-bit via DOS/32a or DOS4GW via Allegro), and possibly other platforms in the future.

+

This documentation is also available at https://indigoparadox.github.io/maug/group__maug__retroflt.html.

+

mtypes

+

#include <mtypes.h>

+

Rough common approximation of types for interoperability between our projects.

+

Includes common types from stdint.h, guaranteed to be of the named size:

+
    +
  • int8_t
  • +
  • uint8_t
  • +
  • int16_t
  • +
  • uint16_t
  • +
  • int32_t
  • +
  • uint32_t
  • +
+

When using this header, do not include stdint.h. This header will include it if the current platform supports it. Otherwise, it will improvise.

+

uprintf

+

#include <uprintf.h>

+

An augmented printf for tracing, debugging, and error reporting.

+

To use, include uprintf.h and call logging\_init() in program startup.

+

Be sure to call logging\_shutdown() on program cleanup.

+

Logging can then be performed by calling:

+
    +
  • debug\_printf( lvl, format, ... ) - Prints debug message.
      +
    • lvl - Immediacy level of debug message. See DEBUG_THRESHOLD below.
    • +
    • format - printf()-style format string.
    • +
    • ... - Variable arguments to format.
    • +
    +
  • +
  • error\_printf( format, ... ) - Prints to stderr.
      +
    • format - printf()-style format string.
    • +
    • ... - Variable arguments to format.
    • +
    +
  • +
+

uprintf's behavior can be modified by defining the following before inclusion:

+ + + + + + + + + + + + + + + + + + + +
Define Description
platform_file Type to use instead of stdlib's FILE for log ptr.
platform_fopen Function to use instead of fopen() to create a log ptr.
platform_fclose Function to close log ptr.
platform_fflush Function to flush log ptr to buffer.
platform_fprintf Function to print to log ptr with a format string.
DEBUG_THRESHOLD debug_printf() w/ this or higher lvl will be displayed.
DEBUG_LOG If defined, debug will be output to LOG_FILE_NAME.
ANCIENT_C Use static functions where vararg macros unsupported.
+
+ +
+ + +
+ + diff --git a/jquery.js b/jquery.js new file mode 100644 index 00000000..1dffb65b --- /dev/null +++ b/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/marge_8h_source.html b/marge_8h_source.html new file mode 100644 index 00000000..b3a40101 --- /dev/null +++ b/marge_8h_source.html @@ -0,0 +1,372 @@ + + + + + + + +maug: marge.h Source File + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+
+
+
marge.h
+
+
+
1
+
2#ifndef MARGE_H
+
3#define MARGE_H
+
4
+
5/* For strlen, strncpy */
+
6#include <string.h>
+
7
+
8#include <merror.h>
+
9
+
16/*
+
17 * | ::MAUG_CLI_SIGIL | Specify the sigil prepended to command-line args. |
+
18 * | MAUG_NO_CLI_SZ | Disable ::MAUG_CLI_SZ command-line args. |
+
19 */
+
20
+
21#ifndef MAUG_CLI_SIGIL_SZ
+
22# define MAUG_CLI_SIGIL_SZ 1
+
23#endif /* !MAUG_CLI_SIGIL_SZ */
+
24
+
25#if !defined( MAUG_CLI_SIGIL ) && defined( MAUG_OS_WIN )
+
26# define MAUG_CLI_SIGIL "/"
+
27#elif !defined( MAUG_CLI_SIGIL ) && defined( MAUG_OS_DOS )
+
28# define MAUG_CLI_SIGIL "/"
+
29#elif !defined( MAUG_CLI_SIGIL ) && defined( MAUG_OS_DOS_REAL )
+
30# define MAUG_CLI_SIGIL "/"
+
31#elif !defined( MAUG_CLI_SIGIL )
+
36# define MAUG_CLI_SIGIL "-"
+
37#endif /* !MAUG_CLI_SIGIL */
+
38
+
39
+
40#ifndef MAUG_CLI_ARG_LIST_SZ_MAX
+
41# define MAUG_CLI_ARG_LIST_SZ_MAX 20
+
42#endif /* !MAUG_CLI_ARG_LIST_SZ_MAX */
+
43
+
44#ifndef MAUG_CLI_ARG_HELP_SZ_MAX
+
45# define MAUG_CLI_ARG_HELP_SZ_MAX 127
+
46#endif /* !MAUG_CLI_ARG_HELP_SZ_MAX */
+
47
+
48#ifndef MAUG_CLI_ARG_SZ_MAX
+
49# define MAUG_CLI_ARG_SZ_MAX 20
+
50#endif /* !MAUG_CLI_ARG_SZ_MAX */
+
51
+
52typedef MERROR_RETVAL (*maug_cli_cb)( const char* arg, void* data );
+
53
+
+
55#define MAUG_CLI( f ) \
+
56 f( MAUG_CLI_SIGIL "h", 3, "Display help and exit.", maug_cli_h, NULL )
+
+
57
+
58int maug_parse_args( int argc, char* argv[] );
+
59
+ +
69 const char* arg, int arg_sz, const char* help, int help_sz,
+
70 maug_cli_cb arg_cb, maug_cli_cb def_cb, void* data );
+
71
+
72#ifdef MARGE_C
+
73
+
74/* == Global Tables == */
+
75
+
76#define MAUG_CLI_ARG_ARG( arg, arg_sz, help, arg_callback, def_callback ) \
+
77 arg,
+
78
+
79static char g_maug_cli_args[MAUG_CLI_ARG_LIST_SZ_MAX][MAUG_CLI_ARG_SZ_MAX] = {
+
80 MAUG_CLI( MAUG_CLI_ARG_ARG )
+
81 ""
+
82};
+
83
+
84#define MAUG_CLI_ARG_SZ( arg, arg_sz, help, arg_callback, def_callback ) \
+
85 arg_sz,
+
86
+
87static int g_maug_cli_arg_sz[MAUG_CLI_ARG_LIST_SZ_MAX] = {
+
88 MAUG_CLI( MAUG_CLI_ARG_SZ )
+
89 0
+
90};
+
91
+
92#define MAUG_CLI_ARG_HELP( arg, arg_sz, help, arg_callback, def_callback ) \
+
93 help,
+
94
+
95static char g_maug_cli_arg_help[MAUG_CLI_ARG_LIST_SZ_MAX][MAUG_CLI_ARG_HELP_SZ_MAX] = {
+
96 MAUG_CLI( MAUG_CLI_ARG_HELP )
+
97 ""
+
98};
+
99
+
100#define MAUG_CLI_ARG_DATA( arg, arg_sz, help, arg_callback, def_callback ) NULL,
+
101static void* g_maug_cli_data[MAUG_CLI_ARG_LIST_SZ_MAX] = {
+
102 MAUG_CLI( MAUG_CLI_ARG_DATA )
+
103 NULL
+
104};
+
105
+
106#define MAUG_CLI_ARG_CALLED( arg, arg_sz, help, arg_callback, def_callback ) 0,
+
107static int g_maug_cli_arg_called[MAUG_CLI_ARG_LIST_SZ_MAX] = {
+
108 MAUG_CLI( MAUG_CLI_ARG_CALLED )
+
109 0
+
110};
+
111
+
112/* == Function Definitions = = */
+
113
+
114static int maug_cli_h( const char* arg, void* args ) {
+
115 int i = 0;
+
116
+
117 fprintf( stderr, "usage:\n\n" );
+
118
+
119 /* Display help for all available options. */
+
120 while( '\0' != g_maug_cli_args[i][0] ) {
+
121 fprintf( stderr, "\t%s\t%s\n", g_maug_cli_args[i],
+
122 g_maug_cli_arg_help[i] );
+
123 i++;
+
124 }
+
125
+
126 fprintf( stderr, "\n" );
+
127
+
128 /* TODO: Coherent error code. */
+
129 return -1;
+
130}
+
131
+
132/* === */
+
133
+
134/* Define these below the built-in callbacks, above. */
+
135#define MAUG_CLI_ARG_CB( arg, arg_sz, help, arg_callback, def_callback ) \
+
136 arg_callback,
+
137
+
138maug_cli_cb g_maug_cli_arg_callbacks[MAUG_CLI_ARG_LIST_SZ_MAX] = {
+
139 MAUG_CLI( MAUG_CLI_ARG_CB )
+
140 NULL
+
141};
+
142
+
143#define MAUG_CLI_DEF_CB( arg, arg_sz, help, arg_callback, def_callback ) \
+
144 def_callback,
+
145
+
146maug_cli_cb g_maug_cli_def_callbacks[MAUG_CLI_ARG_LIST_SZ_MAX] = {
+
147 MAUG_CLI( MAUG_CLI_DEF_CB )
+
148 NULL
+
149};
+
150
+
151int maug_parse_args( int argc, char* argv[] ) {
+
152 int arg_i = 0,
+
153 const_i = 0,
+
154 last_i = 0,
+
155 retval = 0;
+
156
+
157 for( arg_i = 1 ; argc > arg_i ; arg_i++ ) {
+
158 debug_printf( 1, "found arg: %s", argv[arg_i] );
+
159 const_i = 0;
+
160 while( '\0' != g_maug_cli_args[const_i][0] ) {
+
161 if( 0 == strncmp(
+
162 g_maug_cli_args[const_i],
+
163 argv[arg_i],
+
164 g_maug_cli_arg_sz[const_i]
+
165 ) ) {
+
166 /* Save this matched index for the next pass. */
+
167 last_i = const_i;
+
168
+
169 /* Increment called count and run the callback. */
+
170 g_maug_cli_arg_called[const_i]++;
+
171 retval = g_maug_cli_arg_callbacks[const_i]( argv[arg_i],
+
172 g_maug_cli_data[const_i] );
+
173 if( MERROR_OK != retval ) {
+
174 goto cleanup;
+
175 }
+
176
+
177 /* We found a match, so go to the next arg. */
+
178 break;
+
179 }
+
180 const_i++;
+
181 }
+
182
+
183 if( '\0' == g_maug_cli_args[const_i][0] ) {
+
184 /* No valid arg was found, so we must be passing data to the last one!
+
185 */
+
186 g_maug_cli_arg_called[last_i]++;
+
187 retval = g_maug_cli_arg_callbacks[last_i]( argv[arg_i],
+
188 g_maug_cli_data[last_i] );
+
189 if( MERROR_OK != retval ) {
+
190 goto cleanup;
+
191 }
+
192 }
+
193 }
+
194
+
195 /* TODO: Run default callbacks for any args not called. */
+
196 const_i = 0;
+
197 while( '\0' != g_maug_cli_args[const_i][0] ) {
+
198 if(
+
199 0 == g_maug_cli_arg_called[const_i] &&
+
200 NULL != g_maug_cli_def_callbacks[const_i]
+
201 ) {
+
202 debug_printf( 1, "calling default arg for uncalled \"%s\"...",
+
203 g_maug_cli_args[const_i] );
+
204 retval =
+
205 g_maug_cli_def_callbacks[const_i]( "", g_maug_cli_data[const_i] );
+
206 if( MERROR_OK != retval ) {
+
207 goto cleanup;
+
208 }
+
209 }
+
210 const_i++;
+
211 }
+
212
+
213cleanup:
+
214
+
215 return retval;
+
216}
+
217
+
218/* === */
+
219
+ +
221 const char* arg, int arg_sz, const char* help, int help_sz,
+
222 maug_cli_cb arg_cb, maug_cli_cb def_cb, void* data
+
223) {
+
224 int slot_idx = 0;
+
225
+
226 /* Find empty arg slot. */
+
227 while(
+
228 '\0' != g_maug_cli_args[slot_idx][0] &&
+
229 MAUG_CLI_ARG_LIST_SZ_MAX > slot_idx
+
230 ) {
+
231 slot_idx++;
+
232 }
+
233
+
234 /* TODO: Check for duplicate arg. */
+
235
+
236 /* Sanity checking and sizing. */
+
237 if( MAUG_CLI_ARG_LIST_SZ_MAX - 1 <= slot_idx ) {
+
238 return MERROR_OVERFLOW;
+
239 }
+
240
+
241 if( 0 >= arg_sz ) {
+
242 arg_sz = strlen( arg );
+
243 }
+
244 assert( arg_sz < MAUG_CLI_ARG_SZ_MAX );
+
245
+
246 if( 0 >= help_sz ) {
+
247 help_sz = strlen( help );
+
248 }
+
249 assert( help_sz < MAUG_CLI_ARG_HELP_SZ_MAX );
+
250
+
251 /* Add arg to arrays. */
+
252
+
253 strncpy( g_maug_cli_args[slot_idx], arg, arg_sz );
+
254 g_maug_cli_args[slot_idx + 1][0] = '\0';
+
255
+
256 strncpy( g_maug_cli_arg_help[slot_idx], help, help_sz );
+
257 g_maug_cli_arg_help[slot_idx + 1][0] = '\0';
+
258
+
259 g_maug_cli_arg_sz[slot_idx] = arg_sz;
+
260 g_maug_cli_arg_sz[slot_idx + 1] = 0;
+
261
+
262 g_maug_cli_arg_callbacks[slot_idx] = arg_cb;
+
263 g_maug_cli_arg_callbacks[slot_idx + 1] = NULL;
+
264
+
265 g_maug_cli_def_callbacks[slot_idx] = def_cb;
+
266 g_maug_cli_def_callbacks[slot_idx + 1] = NULL;
+
267
+
268 g_maug_cli_arg_called[slot_idx] = 0;
+
269 g_maug_cli_arg_called[slot_idx + 1] = 0;
+
270
+
271 g_maug_cli_data[slot_idx] = data;
+
272 g_maug_cli_data[slot_idx + 1] = NULL;
+
273
+
274 return MERROR_OK;
+
275}
+
276
+
277#endif /* MARGE_C */
+
278
+
279 /* maug_cli */
+
280
+
281#endif /* MARGE_H */
+
282
+
#define MAUG_CLI(f)
Default CLI arguments for all RetroFlat programs.
Definition marge.h:55
+
MERROR_RETVAL maug_add_arg(const char *arg, int arg_sz, const char *help, int help_sz, maug_cli_cb arg_cb, maug_cli_cb def_cb, void *data)
Add a command-line argument to the built-in parser.
+
int MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition merror.h:19
+ +
+ + +
+ + diff --git a/menu.js b/menu.js new file mode 100644 index 00000000..0fd1e990 --- /dev/null +++ b/menu.js @@ -0,0 +1,134 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search,treeview) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(treeview); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 00000000..06d776cd --- /dev/null +++ b/menudata.js @@ -0,0 +1,78 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Related Pages",url:"pages.html"}, +{text:"Topics",url:"topics.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"f",url:"functions.html#index_f"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Functions",url:"functions_func.html"}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"v",url:"functions_vars.html#index_v"}, +{text:"w",url:"functions_vars.html#index_w"}]}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"m",url:"globals.html#index_m"}, +{text:"n",url:"globals.html#index_n"}, +{text:"r",url:"globals.html#index_r"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"m",url:"globals_func.html#index_m"}, +{text:"r",url:"globals_func.html#index_r"}]}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Macros",url:"globals_defs.html",children:[ +{text:"m",url:"globals_defs.html#index_m"}, +{text:"n",url:"globals_defs.html#index_n"}, +{text:"r",url:"globals_defs.html#index_r"}]}]}]}]} diff --git a/merror_8h.html b/merror_8h.html new file mode 100644 index 00000000..bf8f0ca6 --- /dev/null +++ b/merror_8h.html @@ -0,0 +1,184 @@ + + + + + + + +maug: merror.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    merror.h File Reference
    +
    +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + + +
    +
    +

    Go to the source code of this file.

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

    +Macros

    +#define MERROR_OK   0x0000
     
    +#define MERROR_ALLOC   0x0001
     
    +#define MERROR_OVERFLOW   0x0002
     
    +#define MERROR_FILE   0x0004
     
    +#define MERROR_USR   0x0008
     
    +#define MERROR_PARSE   0x0010
     
    +#define MERROR_GUI   0x0020
     
    +#define MERROR_SND   0x0020
     
    +#define MERROR_WAIT   0x0040
     
    +#define MERROR_TIMEOUT   0x0080
     
    #define maug_cleanup_if_null_msg(type, ptr, err, msg)
     
    +#define maug_cleanup_if_null(type, ptr, err)    maug_cleanup_if_null_msg( type, ptr, err, "failed to allocate " #ptr "!" )
     
    +#define maug_cleanup_if_null_alloc(type, ptr)    maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to allocate " #ptr "!" )
     
    +#define maug_cleanup_if_null_file(ptr)    maug_cleanup_if_null_msg( FILE*, ptr, MERROR_FILE, "failed to open FILE!" )
     
    #define maug_cleanup_if_not_ok()
     
    #define maug_cleanup_if_lt(a, b, fmt, err)
     
    +#define maug_cleanup_if_lt_overflow(a, b)    maug_cleanup_if_lt( a, b, SIZE_T_FMT, MERROR_OVERFLOW )
     
    #define maug_cleanup_if_ge(a, b, fmt, err)
     
    +#define maug_cleanup_if_ge_overflow(a, b)    maug_cleanup_if_ge( a, (size_t)(b), SIZE_T_FMT, MERROR_OVERFLOW )
     
    + + + + +

    +Typedefs

    +typedef int MERROR_RETVAL
     Return type indicating function returns a value from this list.
     
    +
    + + +
    + + diff --git a/merror_8h__dep__incl.map b/merror_8h__dep__incl.map new file mode 100644 index 00000000..a0007076 --- /dev/null +++ b/merror_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/merror_8h__dep__incl.md5 b/merror_8h__dep__incl.md5 new file mode 100644 index 00000000..fec3c950 --- /dev/null +++ b/merror_8h__dep__incl.md5 @@ -0,0 +1 @@ +ba5d3ab3e4ae45e26c4452fd6f2e9cba \ No newline at end of file diff --git a/merror_8h__dep__incl.png b/merror_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..0a30b2aa5063089860621a42b04bd6c9c15cf000 GIT binary patch literal 3887 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 + + + + + + +maug: merror.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    merror.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef MERROR_H
    +
    3#define MERROR_H
    +
    4
    +
    19typedef int MERROR_RETVAL;
    +
    20
    +
    21#define MERROR_OK 0x0000
    +
    22
    +
    23#define MERROR_ALLOC 0x0001
    +
    24
    +
    25#define MERROR_OVERFLOW 0x0002
    +
    26
    +
    27#define MERROR_FILE 0x0004
    +
    28
    +
    29#define MERROR_USR 0x0008
    +
    30
    +
    31#define MERROR_PARSE 0x0010
    +
    32
    +
    33#define MERROR_GUI 0x0020
    +
    34
    +
    35#define MERROR_SND 0x0020
    +
    36
    +
    37#define MERROR_WAIT 0x0040
    +
    38
    +
    39#define MERROR_TIMEOUT 0x0080
    +
    40
    +
    41 /* maug_error_retvals */
    +
    42
    +
    43#define maug_cleanup_if_null_msg( type, ptr, err, msg ) \
    +
    44 if( (type)NULL == ptr ) { \
    +
    45 error_printf( msg ); \
    +
    46 retval = err; \
    +
    47 goto cleanup; \
    +
    48 }
    +
    49
    +
    50#define maug_cleanup_if_null( type, ptr, err ) \
    +
    51 maug_cleanup_if_null_msg( type, ptr, err, "failed to allocate " #ptr "!" )
    +
    52
    +
    53#define maug_cleanup_if_null_alloc( type, ptr ) \
    +
    54 maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to allocate " #ptr "!" )
    +
    55
    +
    56#define maug_cleanup_if_null_file( ptr ) \
    +
    57 maug_cleanup_if_null_msg( FILE*, ptr, MERROR_FILE, "failed to open FILE!" )
    +
    58
    +
    59#define maug_cleanup_if_not_ok() \
    +
    60 if( MERROR_OK != retval ) { \
    +
    61 goto cleanup; \
    +
    62 }
    +
    63
    +
    64#define maug_cleanup_if_lt( a, b, fmt, err ) \
    +
    65 if( (a) < (b) ) { \
    +
    66 error_printf( fmt " is less than " fmt "!", a, b ); \
    +
    67 retval = err; \
    +
    68 goto cleanup; \
    +
    69 }
    +
    70
    +
    71#define maug_cleanup_if_lt_overflow( a, b ) \
    +
    72 maug_cleanup_if_lt( a, b, SIZE_T_FMT, MERROR_OVERFLOW )
    +
    73
    +
    74#define maug_cleanup_if_ge( a, b, fmt, err ) \
    +
    75 if( (a) >= (b) ) { \
    +
    76 error_printf( fmt " is greater or equal to " fmt "!", a, b ); \
    +
    77 retval = err; \
    +
    78 goto cleanup; \
    +
    79 }
    +
    80
    +
    81#define maug_cleanup_if_ge_overflow( a, b ) \
    +
    82 maug_cleanup_if_ge( a, (size_t)(b), SIZE_T_FMT, MERROR_OVERFLOW )
    +
    83
    +
    84 /* maug_error */
    +
    85
    +
    86#endif /* MERROR_H */
    +
    87
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    + + +
    + + diff --git a/mfile_8h.html b/mfile_8h.html new file mode 100644 index 00000000..44851d44 --- /dev/null +++ b/mfile_8h.html @@ -0,0 +1,206 @@ + + + + + + + +maug: mfile.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    mfile.h File Reference
    +
    +
    +
    #include <sys/stat.h>
    +
    +Include dependency graph for mfile.h:
    +
    +
    + + + + + +
    +
    +This graph shows which files directly or indirectly include this file:
    +
    +
    + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    union  MFILE_HANDLE
     
    struct  MFILE_CADDY
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define MFILE_CADDY_TYPE_FILE_READ   0x01
     A standard UNIX file opened for reading.
     
    +#define MFILE_CADDY_TYPE_MEM_BUFFER   0x80
     An array of bytes in memory abstracted through this library.
     
    +#define mfile_check_lock(p_file)   (NULL != (p_file)->mem_buffer)
     
    #define mfile_default_case(p_file)
     
    #define mfile_seek(p_file, idx)
     
    #define mfile_has_bytes(p_file)
     
    #define mfile_cread(p_file, p_c)
     
    #define mfile_cread_at(p_file, p_c, idx)
     
    #define mfile_u16read_at(p_file, p_u16, idx)
     
    #define mfile_u16read_lsbf_at(p_file, p_u16, idx)
     
    #define mfile_u32read_at(p_file, p_u32, idx)
     
    #define mfile_u32read_lsbf(p_file, p_u32)
     
    #define mfile_u32read_lsbf_at(p_file, p_u32, idx)
     
    +#define mfile_get_sz(p_file)   ((p_file)->sz)
     
    #define mfile_reset(p_file)
     
    + + + +

    +Typedefs

    +typedef struct MFILE_CADDY mfile_t
     
    + + + + + + + + + + + + + + +

    +Functions

    +MERROR_RETVAL mfile_read_block (mfile_t *p_f, uint8_t *buf, off_t buf_sz)
     
    +MERROR_RETVAL mfile_read_line (mfile_t *, char *buffer, off_t buffer_sz)
     
    +MERROR_RETVAL mfile_lock_buffer (MAUG_MHANDLE, mfile_t *p_file)
     Lock a buffer and assign it to an mfile_t to read/write.
     
    MERROR_RETVAL mfile_open_read (const char *filename, mfile_t *p_file)
     Open a file and read it into memory or memory-map it.
     
    +void mfile_close (mfile_t *p_file)
     Close a file opened with mfile_open_read().
     
    +
    + + +
    + + diff --git a/mfile_8h__dep__incl.map b/mfile_8h__dep__incl.map new file mode 100644 index 00000000..1f6f0a09 --- /dev/null +++ b/mfile_8h__dep__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mfile_8h__dep__incl.md5 b/mfile_8h__dep__incl.md5 new file mode 100644 index 00000000..eac0c23d --- /dev/null +++ b/mfile_8h__dep__incl.md5 @@ -0,0 +1 @@ +5c1fdd20797494005d9a0eeefabcf99f \ No newline at end of file diff --git a/mfile_8h__dep__incl.png b/mfile_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..3f458fa8f9283d2c2f8b3af343ae177f4f968a00 GIT binary patch literal 3873 zcmZXXcQjmG+r|eEB6=7#;YpAXgi)dlPeha`5xsXYL`&3UL`#GOBO(}ebP>JJDA5Kp zqKi6)V4^){^dS0s^1Xk2>s#O1>+HSO-uK$=y4N|sE5^`3oB1-|We^C&tn*OA7-$QC z*XI%)Q0ws(tOE_5v!1pF=;BYwZ7og$fmkMWH13H8tDM#_t?H%ZYrAz20++ zt=lxqizzW{*I<2o9Q?_{)|2zq^Q)@bA0<4IaMZUlg~`^rP3uATxgzGo?0iqw&qco@ zu8x~eUfVqeDL=J>Sj8+&tda73@;lCl1aBlR&{Pi-R-M`>{TN<`wVx60wXb5r-Rg!3 zjy0ANTyZ_lHMZF@&ht|ZUC{28yGAs0g;IY+Zx)AjIJH#;=5wH?@A z?BbR8NM_}rzvT)0dO0WTSZsNDdDa(y4Z#C>la|H<^6>Cb3_T7gJ}xaO=_KzT-++zO z!Ej~Icb9aoaB%26dbBYv;r?${wIuG(+)TXK&Pe*B^OG%JB|l+~TLw>vXm3*si=?b9 zeRFdzGc&WVdqdFE?Jiac8#Ge{xvD+8yu3UpH0;-?Hid{u@LwJB?P6At4m#P+QdHotm7S zOIF7G2o}eGxaP7k)6n)~E|(20E2I`2tjuv!AGFZ%nnpug+n?x-p;~ooGATA-=jGM$ z@{&kQOl0DbjsWh-!_$+v-vHl(ZMGi%m^`Or=IgF??eFdDQy&XE&JvXO;7m_X2f1h9 zaPj=1jj5eN<#7-(v66jqw(2YN$+?HToSdPJjUF7X^y+YvR!u|Ee}&1uD)mR}tBa+b zNP1SEvu5oC0lRoXKWsBkyfcP4Di<$i^0{98D`VAHVl6>^H$T&dktkn~NC|=pX(1K> zWq)nW=TOnmJzpESewmT6hPWXIEMj5d7BmpyHi)20hq%zu($bomn^UhkK!#CJ?ugx8 zKeW$WU)}IOp0Mr+ZkcD$-v0iRkd6qd2VF~~nF6V=+gRzkI-WsgeH-d%GXyfi30xrJ zXxZb=z+(=v{%;q%@hUHQeH}Off&d9A&CBbgT>6JYrsoU!__M6rkT90sKJg|t>B3(kG z@s>JdBZ?`oZw--$vz85VL~DQNkD}?&;B0A`9X&#G@JB_~sebaY>|k>R|J2NK-OZ(I zp(TOkCUQR4mW2Yf@qG?y!^pWI8Td%Ym+N?CeM}nKz>9^xo%Y;LjZ^e3&1Q=!1}2xP z%>sIQDOWAPoN%(Y9p_?JaJ}=vdwE&vI|;vHVw|AWY-*_RPuUN4!d{#p_d>HCP*Ll4 z5l$tyhJM^UYbL(4O}Kf? z?DX9E1073l7lZWK3bEU-g%go)p601NwLXkvN6oG0FMqtmuKRGri-Iz_Y0}af&&HnZ zsl~p0+a*yntT^DWiN&PaNmL1wQgXBIGCyZ1RQLPtp{!20vu{|N%&(9q)eJ4^qfI)_ zwyvBskHzoX<+BBHUbu|kP07ESSD4oCZ^zxYE5}>!t#T@ujx-PJ1FwL|x%PLO zxztSiGmJzr;(qo6hB-Vnt&U)1&&$p%8MyIV2eA>U+sToe`trD5@20*bkh*oIpuE_K zhUI3P-Wj&no3^YP5K%rn(^d$3*1`4KOtQ{YC{|14baZV)40Z3jpCVUOuBAvdxF`83 zS-5X)gSG(pTnWk{sTtzqRVYKId&$x)i?ZF@`y|>HDk!#CmuGdzaL?-_{V)IS+G%3D9QY-j|L5tVrg{}3!7vo>?62kCm0rV z-fH>>^*$`X@OojN4T|Px2?X8N^a@qQln}& zh_aq5(zr3OXTCiv?;s6D?+B!XFjj!`&Wq^a9*PQ#q0Bh|UdXx~b7iu!O;6P$C>w1n zU_~`sMMi|cYmae2$R&*Y&v5F&M~SC>l)t$>M~;e&<)*z(hbR&-hRi<+`O@(&wm=h8 zHZ+&t!D^pbz8>iG`jSDhwvPfdffq}XMqN}+mkk?Ve@-gWPk9=Y-R~RxB<>A)ovh=K zQ!$i|!slR}VJbmLP2I#dC^*cm>B_`_PzRefQ$i-HXI{OH$4=x^xns@R=}HlF!l-V~ zHU_E}DzaVw-ICA8V*70fBsM;!BXxhiW`H7L;khlZBBTy}bc!KZor)F4jsBbHMQcU9 z7y0xoCA`Js%Ayl(l5LU9AVuZ;O0ATm!0gQrqWpq1*%Q1T9|-Vf>@vH8bkh-^79EKf zR1ifO;3?U$VZV`?3CB_-=C&C-V9yq&VDvlhK1$$}T>Ut<*<$gLM;P8s{e5nBt{BoH z!PPI001uH|Vj1(kqoTMvv>^EA92*I0sqRWu_kooQ;6oe{l}X&cqAukoPX`E4YxUr^ zs|mg#VudiAZ9=y~7dxl;EU!li0ghPO?KSBrh>u5nea;N~!cdZ4!)p#|*tgHV3ym8M zUO%N%bi(Xq5v)Q)p2UtWC+aWcyv8GfEgb#^Pyz*xKhlLvnB6=~L*cpANz$s`C=DfN zMJ7t%e9a45;ONPA&+cAIN`K&E^6v*7%)+Wc1K?Do^1(mQkc!rxfAbJoN@^@z#GWXoQHTSkws&+KZ zAnaf$9cPFpubjEk8BUaei74f2_MGj z=RXx5w4UaDk8iE09#!Te2OVZk2CC|a$;+#%f}T;&m{KtuEDFy)c{!DmlCsv^CLkDM z_{9NVUqX#5WH~&GZr(I@3H_Ft1N?udR`aN1?j0!1;(i(5k!R^_fYra1`~P(JU*Oy7 zu{1Wu22R=GW5Kwy{M`KfH-&}5UB`?T4x#&CcJ|dRjFpkm{g9B57W{9&@-utHu^x33F!O!~ z6st%M+V=km8yy{8T3O-atuSe}Lx90x1fTrn)PBu?0J#UzOp8GDN=b3{jqBH6hn*eQ z1n+x*YU}EhLVioj!Ul4IXUv;bK&7|bs!mi?bWJ*rxB>gUy$E32?#Khy>sPV_8%&Ih zI@2I7FZU-bViFQo0k#A1L-B_*8P+%y~bq5||*>!EU9XVksli}ZTP`+e9bMolphMlK1qswr_jq(tKM z^z22@FpA%C+!Ej9&XNkFSC#$GkEXZ^u6dkXirSi+M?C5ar`fe1e{rS2-sqXD_fRA$|p)Wc$|OZ;3+MGx7aB-eskw zg>J*y#+H_%#RjNPK!{0xe*RJy>picjgWo$p0h+Tp;Z=N|>wus6*cI^PiEtd3BzEz+ zwEv2}+#{DAQjg+QmMnu?01vLLe3<__g+hCa6C|LB9W}|i-1rer#tu!`#A%Y@_wv$Sy>seV${UgSTSJDFtzT;qnud`rL;$QH9m9AlR1DVI4k`7&P32i?tRKk1Nqj)`O#`lQd-*dvR4})Irl{HS8!{E zL;DVn|EiK-cemU*1n?uedU{qZL6U)ifyv3qAG5QExE)S^55=K>exD3IoWq}NwLdm8 zVlRH21M7-rE_Z0pPM3AFukp4y=OO3b#yuVTywfX`Q0=#@3tAb>#2;)B9~msadhm|L zb?oyaz?vWc+aM5r>U;U}X9(p8C?SdSU*y-+_vcxFu1$72S3}N($UjvaVDZq zA(I# literal 0 HcmV?d00001 diff --git a/mfile_8h__incl.map b/mfile_8h__incl.map new file mode 100644 index 00000000..a2fac1c1 --- /dev/null +++ b/mfile_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/mfile_8h__incl.md5 b/mfile_8h__incl.md5 new file mode 100644 index 00000000..5a01a374 --- /dev/null +++ b/mfile_8h__incl.md5 @@ -0,0 +1 @@ +23b3b83b9896bd70560a7a1e7936b1ab \ No newline at end of file diff --git a/mfile_8h__incl.png b/mfile_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f8b43b7a1a7f2860a5941b33a21408c111cf6ab0 GIT binary patch literal 2561 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

    + + + + + + +maug: mfile.h Source File + + + + + + + + + + + + + + +

    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    mfile.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef MFILE_H
    +
    3#define MFILE_H
    +
    4
    +
    5#if !defined( MFILE_MMAP )
    +
    6# include <sys/stat.h>
    +
    7#endif /* !MFILE_MMAP */
    +
    8
    +
    31#define MFILE_CADDY_TYPE_FILE_READ 0x01
    +
    32
    +
    36#define MFILE_CADDY_TYPE_MEM_BUFFER 0x80
    +
    37
    +
    38 /* maug_mfile_types */
    +
    39
    +
    + +
    41 FILE* file;
    +
    42 MAUG_MHANDLE mem;
    +
    43};
    +
    +
    44
    +
    + +
    47 uint8_t type;
    + +
    50 off_t sz;
    +
    51 off_t last_read;
    + +
    55 uint8_t* mem_buffer;
    +
    56};
    +
    +
    57
    +
    58typedef struct MFILE_CADDY mfile_t;
    +
    59
    +
    60#define mfile_check_lock( p_file ) (NULL != (p_file)->mem_buffer)
    +
    61
    +
    62#define mfile_default_case( p_file ) \
    +
    63 default: \
    +
    64 error_printf( "unknown file type: %d", (p_file)->type ); \
    +
    65 break;
    +
    66
    +
    67#define mfile_seek( p_file, idx ) \
    +
    68 switch( (p_file)->type ) { \
    +
    69 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    70 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    71 break; \
    +
    72 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    73 (p_file)->mem_cursor = idx; \
    +
    74 break; \
    +
    75 mfile_default_case( p_file ); \
    +
    76 }
    +
    77
    +
    78#define mfile_has_bytes( p_file ) \
    +
    79 ((MFILE_CADDY_TYPE_FILE_READ == ((p_file)->type) ? \
    +
    80 (off_t)ftell( (p_file)->h.file ) : \
    +
    81 (p_file)->mem_cursor) < (p_file)->sz)
    +
    82
    +
    83#define mfile_cread( p_file, p_c ) \
    +
    84 switch( (p_file)->type ) { \
    +
    85 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    86 (p_file)->last_read = fread( p_c, 1, 1, (p_file)->h.file ); \
    +
    87 break; \
    +
    88 mfile_default_case( p_file ); \
    +
    89 }
    +
    90
    +
    91#define mfile_cread_at( p_file, p_c, idx ) \
    +
    92 switch( (p_file)->type ) { \
    +
    93 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    94 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    95 (p_file)->last_read = fread( p_c, 1, 1, (p_file)->h.file ); \
    +
    96 break; \
    +
    97 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    98 *p_c = (p_file)->mem_buffer[idx]; \
    +
    99 (p_file)->mem_cursor += 1; \
    +
    100 break; \
    +
    101 mfile_default_case( p_file ); \
    +
    102 }
    +
    103
    +
    104#define mfile_u16read_at( p_file, p_u16, idx ) \
    +
    105 switch( (p_file)->type ) { \
    +
    106 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    107 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    108 (p_file)->last_read = \
    +
    109 fread( (((uint8_t*)p_u16) + 1), 1, 1, (p_file)->h.file ); \
    +
    110 (p_file)->last_read += \
    +
    111 fread( ((uint8_t*)p_u16), 1, 1, (p_file)->h.file ); \
    +
    112 break; \
    +
    113 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    114 ((uint8_t*)(p_u16))[0] = (p_file)->mem_buffer[idx]; \
    +
    115 ((uint8_t*)(p_u16))[1] = (p_file)->mem_buffer[idx + 1]; \
    +
    116 (p_file)->mem_cursor += 2; \
    +
    117 break; \
    +
    118 mfile_default_case( p_file ); \
    +
    119 }
    +
    120
    +
    121#define mfile_u16read_lsbf_at( p_file, p_u16, idx ) \
    +
    122 switch( (p_file)->type ) { \
    +
    123 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    124 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    125 (p_file)->last_read = fread( p_u16, 1, 2, (p_file)->h.file ); \
    +
    126 break; \
    +
    127 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    128 ((uint8_t*)(p_u16))[0] = (p_file)->mem_buffer[idx + 1]; \
    +
    129 ((uint8_t*)(p_u16))[1] = (p_file)->mem_buffer[idx]; \
    +
    130 (p_file)->mem_cursor += 2; \
    +
    131 break; \
    +
    132 mfile_default_case( p_file ); \
    +
    133 }
    +
    134
    +
    135#define mfile_u32read_at( p_file, p_u32, idx ) \
    +
    136 switch( (p_file)->type ) { \
    +
    137 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    138 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    139 (p_file)->last_read = \
    +
    140 fread( (((uint8_t*)p_u32) + 3), 1, 1, (p_file)->h.file ); \
    +
    141 (p_file)->last_read += \
    +
    142 fread( (((uint8_t*)p_u32) + 2), 1, 1, (p_file)->h.file ); \
    +
    143 (p_file)->last_read += \
    +
    144 fread( (((uint8_t*)p_u32) + 1), 1, 1, (p_file)->h.file ); \
    +
    145 (p_file)->last_read += \
    +
    146 fread( ((uint8_t*)p_u32), 1, 1, (p_file)->h.file ); \
    +
    147 break; \
    +
    148 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    149 ((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[idx]; \
    +
    150 ((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[idx + 1]; \
    +
    151 ((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[idx + 2]; \
    +
    152 ((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[idx + 3]; \
    +
    153 (p_file)->mem_cursor += 4; \
    +
    154 break; \
    +
    155 mfile_default_case( p_file ); \
    +
    156 }
    +
    157
    +
    158#define mfile_u32read_lsbf( p_file, p_u32 ) \
    +
    159 switch( (p_file)->type ) { \
    +
    160 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    161 (p_file)->last_read = fread( p_u32, 1, 4, (p_file)->h.file ); \
    +
    162 break; \
    +
    163 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    164 ((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[(p_file)->mem_cursor]; \
    +
    165 ((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[(p_file)->mem_cursor + 1]; \
    +
    166 ((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[(p_file)->mem_cursor + 2]; \
    +
    167 ((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[(p_file)->mem_cursor + 3]; \
    +
    168 (p_file)->mem_cursor += 4; \
    +
    169 break; \
    +
    170 mfile_default_case( p_file ); \
    +
    171 }
    +
    172
    +
    173#define mfile_u32read_lsbf_at( p_file, p_u32, idx ) \
    +
    174 switch( (p_file)->type ) { \
    +
    175 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    176 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    177 (p_file)->last_read = fread( p_u32, 1, 4, (p_file)->h.file ); \
    +
    178 break; \
    +
    179 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    180 ((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[idx]; \
    +
    181 ((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[idx + 1]; \
    +
    182 ((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[idx + 2]; \
    +
    183 ((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[idx + 3]; \
    +
    184 (p_file)->mem_cursor += 4; \
    +
    185 break; \
    +
    186 mfile_default_case( p_file ); \
    +
    187 }
    +
    188
    +
    189#define mfile_get_sz( p_file ) ((p_file)->sz)
    +
    190
    +
    191#define mfile_reset( p_file ) \
    +
    192 switch( (p_file)->type ) { \
    +
    193 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    194 fseek( (p_file)->h.file, 0, SEEK_SET ); \
    +
    195 break; \
    +
    196 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    197 (p_file)->mem_cursor = 0; \
    +
    198 break; \
    +
    199 mfile_default_case( p_file ); \
    +
    200 }
    +
    201
    +
    202MERROR_RETVAL mfile_read_block( mfile_t* p_f, uint8_t* buf, off_t buf_sz );
    +
    203
    +
    204MERROR_RETVAL mfile_read_line( mfile_t*, char* buffer, off_t buffer_sz );
    +
    205
    +
    209MERROR_RETVAL mfile_lock_buffer( MAUG_MHANDLE, mfile_t* p_file );
    +
    210
    +
    215MERROR_RETVAL mfile_open_read( const char* filename, mfile_t* p_file );
    +
    216
    +
    220void mfile_close( mfile_t* p_file );
    +
    221
    +
    222#ifdef MFILE_C
    +
    223
    +
    224#ifdef MFILE_MMAP
    +
    225# include <sys/mman.h> /* mmap() */
    +
    226# include <unistd.h> /* close() */
    +
    227# include <fcntl.h> /* open() */
    +
    228# include <sys/stat.h> /* fstat() */
    +
    229#else
    +
    230# include <stdio.h>
    +
    231#endif /* RETROFLAT_OS_UNIX */
    +
    232
    +
    233MERROR_RETVAL mfile_read_block( mfile_t* p_f, uint8_t* buf, off_t buf_sz ) {
    +
    234 MERROR_RETVAL retval = MERROR_OK;
    +
    235 off_t i_read = 0;
    +
    236
    +
    237 if( MFILE_CADDY_TYPE_FILE_READ == p_f->type ) {
    +
    238 i_read = fread( buf, 1, buf_sz, p_f->h.file );
    +
    239 if( i_read != buf_sz ) {
    +
    240 error_printf(
    +
    241 "block read size did not match size read! (" SIZE_T_FMT " vs "
    +
    242 SIZE_T_FMT ")", i_read, buf_sz );
    +
    243 retval = MERROR_FILE;
    +
    244 }
    +
    245 goto cleanup;
    +
    246 }
    +
    247
    +
    248 /* Assume we're reading a memory buffer. */
    +
    249 memcpy( buf, p_f->mem_buffer, buf_sz < p_f->sz ? buf_sz : p_f->sz );
    +
    250 if( p_f->sz <= buf_sz ) {
    +
    251 error_printf(
    +
    252 "block read size did not match size read! (" SIZE_T_FMT " vs "
    +
    253 SIZE_T_FMT ")", p_f->sz, buf_sz );
    +
    254 retval = MERROR_FILE;
    +
    255 }
    +
    256
    +
    257cleanup:
    +
    258
    +
    259 return retval;
    +
    260
    +
    261}
    +
    262
    +
    263MERROR_RETVAL mfile_read_line( mfile_t* p_f, char* buffer, off_t buffer_sz ) {
    +
    264 MERROR_RETVAL retval = MERROR_OK;
    +
    265 off_t i = 0;
    +
    266
    +
    267 if( MFILE_CADDY_TYPE_FILE_READ == p_f->type ) {
    +
    268 /* Trivial case; use a native function. Much faster! */
    +
    269 fgets( buffer, buffer_sz - 1, p_f->h.file );
    +
    270 goto cleanup;
    +
    271 }
    +
    272
    +
    273 /* Assume we're reading a memory buffer. */
    +
    274
    +
    275 while( i < buffer_sz - 1 && mfile_has_bytes( p_f ) ) {
    +
    276 /* Check for potential overflow. */
    +
    277 if( i + 1 >= buffer_sz ) {
    +
    278 error_printf( "overflow reading string from file!" );
    +
    279 retval = MERROR_OVERFLOW;
    +
    280 break;
    +
    281 }
    +
    282
    +
    283 mfile_cread( p_f, &(buffer[i]) );
    +
    284 if( '\n' == buffer[i] ) {
    +
    285 /* Break on newline and overwrite it below. */
    +
    286 break;
    +
    287 }
    +
    288 i++;
    +
    289 }
    +
    290
    +
    291 assert( i < buffer_sz ); /* while() above stops before buffer_sz! */
    +
    292
    +
    293 /* Append a null terminator. */
    +
    294 buffer[i] = '\0';
    +
    295
    +
    296cleanup:
    +
    297
    +
    298 return retval;
    +
    299}
    +
    300
    +
    301MERROR_RETVAL mfile_lock_buffer( MAUG_MHANDLE handle, mfile_t* p_file ) {
    +
    302 MERROR_RETVAL retval = MERROR_OK;
    +
    303
    +
    304 debug_printf( 1, "locking handle %p as file %p...", handle, p_file );
    +
    305
    +
    306 maug_mzero( p_file, sizeof( mfile_t ) );
    +
    307 maug_mlock( handle, p_file->mem_buffer );
    + +
    309
    +
    310 return retval;
    +
    311}
    +
    312
    +
    313MERROR_RETVAL mfile_open_read( const char* filename, mfile_t* p_file ) {
    +
    314 MERROR_RETVAL retval = MERROR_OK;
    +
    315# ifdef MFILE_MMAP
    +
    316 uint8_t* bytes_ptr = NULL;
    +
    317 struct stat st;
    +
    318 int in_file = 0;
    +
    319# else
    +
    320 struct stat file_stat;
    +
    321# endif /* MFILE_MMAP */
    +
    322
    +
    323 /* MAUG_MHANDLE* p_bytes_ptr_h, off_t* p_bytes_sz */
    +
    324
    +
    325# ifdef MFILE_MMAP
    +
    326
    +
    327 in_file = open( filename, O_RDONLY );
    +
    328 if( 0 >= in_file ) {
    +
    329 error_printf( "could not open file: %s", filename );
    +
    330 retval = MERROR_FILE;
    +
    331 goto cleanup;
    +
    332 }
    +
    333
    +
    334 fstat( in_file, &st );
    +
    335
    +
    336 *p_bytes_ptr_h =
    +
    337 mmap( (caddr_t)0, st.st_size, PROT_READ, MAP_SHARED, in_file, 0 );
    +
    338 maug_cleanup_if_null_alloc( uint8_t*, *p_bytes_ptr_h );
    +
    339 *p_bytes_sz = st.st_size;
    +
    340
    +
    341cleanup:
    +
    342
    +
    343 if( 0 < in_file ) {
    +
    344 close( in_file );
    +
    345 }
    +
    346
    +
    347# else
    +
    348
    +
    349 /* Get the file size from the OS. */
    +
    350 stat( filename, &file_stat );
    +
    351 p_file->sz = file_stat.st_size;
    +
    352
    +
    353# define MFILE_GOT_FILE_SIZE 1
    +
    354
    +
    355 /* Open the permanent file handle. */
    +
    356 p_file->h.file = fopen( filename, "rb" );
    +
    357 if( NULL == p_file->h.file ) {
    +
    358 error_printf( "could not open file: %s", filename );
    +
    359 retval = MERROR_FILE;
    +
    360 goto cleanup;
    +
    361 }
    +
    362
    +
    363#ifndef MFILE_GOT_FILE_SIZE
    +
    364 /* The standard is not required to support SEEK_END, among other issues.
    +
    365 * This is probably the worst way to get file size.
    +
    366 */
    +
    367 debug_printf( 2, "falling back to seek file size..." );
    +
    368 fseek( p_file->h.file, 0, SEEK_END );
    +
    369 p_file->sz = ftell( p_file->h.file );
    +
    370 fseek( p_file->h.file, 0, SEEK_SET );
    +
    371#endif /* MAUG_OS_* */
    +
    372
    +
    373 debug_printf( 1, "opened file %s (" SIZE_T_FMT " bytes)...",
    +
    374 filename, p_file->sz );
    +
    375 /* debug_printf( 3, "XXX %ld bytes", file_stat.st_size );
    +
    376 debug_printf( 3, "XXX size_t: %d, off_t: %d", sizeof( size_t ), sizeof( off_t ) ); */
    +
    377
    + +
    379
    +
    380/*
    +
    381 *p_bytes_ptr_h = maug_malloc( 1, *p_bytes_sz );
    +
    382 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_bytes_ptr_h );
    +
    383
    +
    384 maug_mlock( *p_bytes_ptr_h, bytes_ptr );
    +
    385 maug_cleanup_if_null_alloc( uint8_t*, bytes_ptr );
    +
    386
    +
    387 bytes_rd = fread( bytes_ptr, 1, *p_bytes_sz, in_file );
    +
    388 if( bytes_rd < *p_bytes_sz ) {
    +
    389 error_printf( "could not read entire file!" );
    +
    390 retval = MERROR_FILE;
    +
    391 goto cleanup;
    +
    392 }
    +
    393
    +
    394cleanup:
    +
    395
    +
    396 if( NULL != bytes_ptr ) {
    +
    397 maug_munlock( *p_bytes_ptr_h, bytes_ptr );
    +
    398 }
    +
    399
    +
    400 if( NULL != in_file ) {
    +
    401 fclose( in_file );
    +
    402 }
    +
    403
    +
    404*/
    +
    405
    +
    406cleanup:
    +
    407
    +
    408# endif /* MFILE_MMAP */
    +
    409
    +
    410 return retval;
    +
    411}
    +
    412
    +
    413void mfile_close( mfile_t* p_file ) {
    +
    414# ifdef MFILE_MMAP
    +
    415 munmap( bytes_ptr_h, bytes_sz );
    +
    416# else
    +
    417 /* maug_mfree( bytes_ptr_h ); */
    +
    418 switch( p_file->type ) {
    +
    419 case 0:
    +
    420 /* Do nothing silently. */
    +
    421 break;
    +
    422
    + +
    424 fclose( p_file->h.file );
    +
    425 p_file->type = 0;
    +
    426 break;
    +
    427
    + +
    429 if( NULL != p_file->mem_buffer ) {
    +
    430 maug_munlock( p_file->h.mem, p_file->mem_buffer );
    +
    431 debug_printf( 1, "unlocked handle %p from file %p...",
    +
    432 p_file->h.mem, p_file );
    +
    433 p_file->type = 0;
    +
    434 }
    +
    435 break;
    +
    436
    +
    437 mfile_default_case( p_file );
    +
    438 }
    +
    439# endif /* MFILE_MMAP */
    +
    440}
    +
    441
    +
    442#endif /* MFILE_C */
    +
    443
    +
    444 /* maug_mfile */
    +
    445
    +
    446#endif /* !MFILE_H */
    +
    447
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    #define MFILE_CADDY_TYPE_FILE_READ
    A standard UNIX file opened for reading.
    Definition mfile.h:31
    +
    #define MFILE_CADDY_TYPE_MEM_BUFFER
    An array of bytes in memory abstracted through this library.
    Definition mfile.h:36
    +
    MERROR_RETVAL mfile_lock_buffer(MAUG_MHANDLE, mfile_t *p_file)
    Lock a buffer and assign it to an mfile_t to read/write.
    +
    MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
    Open a file and read it into memory or memory-map it.
    +
    void mfile_close(mfile_t *p_file)
    Close a file opened with mfile_open_read().
    +
    Definition mfile.h:45
    +
    off_t mem_cursor
    Current position if its type is MFILE_CADDY_TYPE_MEM_BUFFER.
    Definition mfile.h:53
    +
    uint8_t type
    The RetroFile Types flag describing this file.
    Definition mfile.h:47
    +
    union MFILE_HANDLE h
    The physical handle or pointer to access the file by.
    Definition mfile.h:49
    +
    uint8_t * mem_buffer
    Locked pointer for MFILE_HANDLE::mem.
    Definition mfile.h:55
    +
    Definition mfile.h:40
    +
    + + +
    + + diff --git a/mfmt_8h.html b/mfmt_8h.html new file mode 100644 index 00000000..0e044988 --- /dev/null +++ b/mfmt_8h.html @@ -0,0 +1,231 @@ + + + + + + + +maug: mfmt.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    mfmt.h File Reference
    +
    +
    +
    #include <mfile.h>
    +
    +Include dependency graph for mfmt.h:
    +
    +
    + + + + + + + +
    +
    +

    Go to the source code of this file.

    + + + + + + + + + + +

    +Data Structures

    struct  MFMT_STRUCT
     Generic image description struct. More...
     
    struct  MFMT_STRUCT_BMPINFO
     BITMAPINFO struct that comes before Windows bitmap data. More...
     
    struct  MFMT_STRUCT_BMPFILE
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define MFMT_BMPINFO_OFS_WIDTH   4
     
    +#define MFMT_BMPINFO_OFS_HEIGHT   8
     
    +#define MFMT_BMPINFO_OFS_COLOR_PLANES   12
     
    +#define MFMT_BMPINFO_OFS_BPP   14
     
    +#define MFMT_BMPINFO_OFS_COMPRESSION   16
     
    +#define MFMT_BMPINFO_OFS_SZ   20
     
    +#define MFMT_BMPINFO_OFS_HRES   24
     
    +#define MFMT_BMPINFO_OFS_VRES   28
     
    +#define MFMT_BMPINFO_OFS_PAL_SZ   32
     
    +#define MFMT_BMPINFO_OFS_IMP_COLORS   36
     
    +#define MFMT_BMP_COMPRESSION_NONE   (0)
     MFMT_STRUCT_BMPINFO::compression value indicating none.
     
    +#define MFMT_BMP_COMPRESSION_RLE8   (1)
     MFMT_STRUCT_BMPINFO::compression value indicating 8-bit RLE.
     
    +#define MFMT_BMP_COMPRESSION_RLE4   (2)
     MFMT_STRUCT_BMPINFO::compression value indicating 4-bit RLE.
     
    +#define MFMT_DECOMP_FLAG_4BIT   0x01
     
    +#define MFMT_DECOMP_FLAG_8BIT   0x02
     
    +#define MFMT_PX_FLAG_INVERT_Y   0x01
     
    +#define MFMT_TRACE_BMP_LVL   0
     
    +#define MFMT_TRACE_RLE_LVL   0
     
    #define mfmt_bmp_check_header()
     
    + + + + + + + + + + + + + +

    +Typedefs

    typedef MERROR_RETVAL(* mfmt_decode) (mfile_t *p_file_in, off_t file_offset, off_t file_sz, size_t line_w, MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags)
     Callback to decode compressed data.
     
    +typedef MERROR_RETVAL(* mfmt_read_header_cb) (struct MFMT_STRUCT *header, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t *p_flags)
     Callback to read image header and get properties.
     
    +typedef MERROR_RETVAL(* mfmt_read_palette_cb) (struct MFMT_STRUCT *header, uint32_t *palette, size_t palette_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
     Callback to read image palette into 24-bit RGB values.
     
    +typedef MERROR_RETVAL(* mfmt_read_px_cb) (struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
     Callback to read image pixels into 8-bit values.
     
    + + + + + + + + + + +

    +Functions

    +MERROR_RETVAL mfmt_decode_rle (mfile_t *p_file_in, off_t file_offset, off_t file_sz, size_t line_w, MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags)
     
    +MERROR_RETVAL mfmt_read_bmp_header (struct MFMT_STRUCT *header, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t *p_flags)
     
    +MERROR_RETVAL mfmt_read_bmp_palette (struct MFMT_STRUCT *header, uint32_t *palette, size_t palette_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
     
    +MERROR_RETVAL mfmt_read_bmp_px (struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
     Read mfmt_bitmap pixels into an 8-bit memory bitmap.
     
    +
    + + +
    + + diff --git a/mfmt_8h__incl.map b/mfmt_8h__incl.map new file mode 100644 index 00000000..2371c756 --- /dev/null +++ b/mfmt_8h__incl.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mfmt_8h__incl.md5 b/mfmt_8h__incl.md5 new file mode 100644 index 00000000..b9fb3c6a --- /dev/null +++ b/mfmt_8h__incl.md5 @@ -0,0 +1 @@ +dc128a9941b7c0819051573b7054769a \ No newline at end of file diff --git a/mfmt_8h__incl.png b/mfmt_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..7848556a72c5248c6736eaa0a57c1b0052d07e6c GIT binary patch literal 3676 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 Z^j + + + + + + +maug: mfmt.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    mfmt.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef MFMT_H
    +
    3#define MFMT_H
    +
    4
    +
    5#include <mfile.h>
    +
    6
    +
    22#define MFMT_BMPINFO_OFS_WIDTH 4
    +
    23#define MFMT_BMPINFO_OFS_HEIGHT 8
    +
    24#define MFMT_BMPINFO_OFS_COLOR_PLANES 12
    +
    25#define MFMT_BMPINFO_OFS_BPP 14
    +
    26#define MFMT_BMPINFO_OFS_COMPRESSION 16
    +
    27#define MFMT_BMPINFO_OFS_SZ 20
    +
    28#define MFMT_BMPINFO_OFS_HRES 24
    +
    29#define MFMT_BMPINFO_OFS_VRES 28
    +
    30#define MFMT_BMPINFO_OFS_PAL_SZ 32
    +
    31#define MFMT_BMPINFO_OFS_IMP_COLORS 36
    +
    32
    +
    34#define MFMT_BMP_COMPRESSION_NONE (0)
    +
    36#define MFMT_BMP_COMPRESSION_RLE8 (1)
    +
    38#define MFMT_BMP_COMPRESSION_RLE4 (2)
    +
    39
    +
    40 /* maug_fmt_bmp */
    +
    41
    +
    42#define MFMT_DECOMP_FLAG_4BIT 0x01
    +
    43#define MFMT_DECOMP_FLAG_8BIT 0x02
    +
    44
    +
    45#define MFMT_PX_FLAG_INVERT_Y 0x01
    +
    46
    +
    47#ifndef MFMT_TRACE_BMP_LVL
    +
    48# define MFMT_TRACE_BMP_LVL 0
    +
    49#endif /* !MFMT_TRACE_BMP_LVL */
    +
    50
    +
    51#ifndef MFMT_TRACE_RLE_LVL
    +
    52# define MFMT_TRACE_RLE_LVL 0
    +
    53#endif /* !MFMT_TRACE_RLE_LVL */
    +
    54
    +
    + +
    58 uint32_t sz;
    +
    59};
    +
    +
    60
    +
    66#define mfmt_bmp_check_header() \
    +
    67 if( 40 == header->sz ) { \
    +
    68 header_bmp_info = (struct MFMT_STRUCT_BMPINFO*)header; \
    +
    69 } else if( 0x4d42 == *((uint16_t*)header) ) { \
    +
    70 debug_printf( MFMT_TRACE_BMP_LVL, "bmp file header detected" ); \
    +
    71 header_bmp_file = (struct MFMT_STRUCT_BMPFILE*)header; \
    +
    72 header_bmp_info = &(header_bmp_file->info); \
    +
    73 } else { \
    +
    74 error_printf( "unable to select read header!" ); \
    +
    75 retval = MERROR_FILE; \
    +
    76 goto cleanup; \
    +
    77 }
    +
    78
    +
    + +
    82 uint32_t sz;
    +
    84 int32_t width;
    +
    86 int32_t height;
    +
    88 uint16_t color_planes;
    +
    90 uint16_t bpp;
    +
    92 uint32_t compression;
    +
    94 uint32_t img_sz;
    +
    96 uint32_t hres;
    +
    98 uint32_t vres;
    + +
    102 uint32_t imp_colors;
    +
    103};
    +
    +
    104
    +
    + +
    106 char magic[2];
    +
    107 uint32_t file_sz;
    +
    108 uint16_t reserved1;
    +
    109 uint16_t reserved2;
    +
    110 uint32_t px_offset;
    +
    111 struct MFMT_STRUCT_BMPINFO info;
    +
    112};
    +
    +
    113
    +
    114 /* maug_fmt_bmp */
    +
    115
    + +
    126 mfile_t* p_file_in, off_t file_offset, off_t file_sz, size_t line_w,
    +
    127 MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags );
    +
    128
    + +
    133 struct MFMT_STRUCT* header, mfile_t* p_file_in,
    +
    134 uint32_t file_offset, off_t file_sz, uint8_t* p_flags );
    +
    135
    + +
    140 struct MFMT_STRUCT* header, uint32_t* palette, size_t palette_sz,
    +
    141 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz,
    +
    142 uint8_t flags );
    +
    143
    + +
    148 struct MFMT_STRUCT* header, uint8_t SEG_FAR* px, off_t px_sz,
    +
    149 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz,
    +
    150 uint8_t flags );
    +
    151
    +
    152MERROR_RETVAL mfmt_decode_rle(
    +
    153 mfile_t* p_file_in, off_t file_offset, off_t file_sz, size_t line_w,
    +
    154 MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags );
    +
    155
    +
    156MERROR_RETVAL mfmt_read_bmp_header(
    +
    157 struct MFMT_STRUCT* header, mfile_t* p_file_in,
    +
    158 uint32_t file_offset, off_t file_sz, uint8_t* p_flags );
    +
    159
    +
    160MERROR_RETVAL mfmt_read_bmp_palette(
    +
    161 struct MFMT_STRUCT* header, uint32_t* palette, size_t palette_sz,
    +
    162 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz,
    +
    163 uint8_t flags );
    +
    164
    + +
    169 struct MFMT_STRUCT* header, uint8_t SEG_FAR* px, off_t px_sz,
    +
    170 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz,
    +
    171 uint8_t flags );
    +
    172
    +
    173#ifdef MFMT_C
    +
    174
    +
    175MERROR_RETVAL mfmt_decode_rle(
    +
    176 mfile_t* p_file_in, off_t file_offset, off_t file_sz, size_t line_w,
    +
    177 MAUG_MHANDLE buffer_out_h, off_t buffer_out_sz, uint8_t flags
    +
    178) {
    +
    179 MERROR_RETVAL retval = MERROR_OK;
    +
    180 uint8_t* buffer_out = NULL;
    +
    181 off_t in_byte_cur = 0,
    +
    182 out_byte_cur = 0;
    +
    183 uint8_t out_mask_cur = 0xf0,
    +
    184 run_char = 0,
    +
    185 run_count = 0,
    +
    186 decode_state = 0,
    +
    187 unpadded_written = 0,
    +
    188 line_px_written = 0,
    +
    189 lines_out = 0,
    +
    190 byte_buffer = 0;
    +
    191
    +
    192 #define MFMT_RLE_DECODE_RUN 0
    +
    193 #define MFMT_RLE_DECODE_CHAR 1
    +
    194 #define MFMT_RLE_DECODE_ABS_RIGHT 2
    +
    195 #define MFMT_RLE_DECODE_ABS_DOWN 3
    +
    196 #define MFMT_RLE_DECODE_ESC 4
    +
    197 #define MFMT_RLE_DECODE_LITERAL 5
    +
    198 #define MFMT_RLE_DECODE_LITERAL_PAD 6
    +
    199
    +
    200 assert( flags == MFMT_DECOMP_FLAG_4BIT );
    +
    201
    +
    202 #define mfmt_decode_rle_state( new_state ) \
    +
    203 debug_printf( MFMT_TRACE_RLE_LVL, "new state: %s", #new_state ); \
    +
    204 decode_state = new_state;
    +
    205
    +
    206 #define mfmt_decode_rle_check_eol() \
    +
    207 if( line_px_written >= line_w ) { \
    +
    208 debug_printf( MFMT_TRACE_RLE_LVL, \
    +
    209 "EOL: %u px written (between runs)", \
    +
    210 line_px_written ); \
    +
    211 mfmt_decode_rle_reset_line(); \
    +
    212 }
    +
    213
    +
    214 /* Flip between odd/even nibble as advanced. */
    +
    215 #define mfmt_decode_rle_advance_mask() \
    +
    216 out_mask_cur >>= 4; \
    +
    217 if( 0 == out_mask_cur ) { \
    +
    218 out_byte_cur++; \
    +
    219 if( out_byte_cur > buffer_out_sz ) { \
    +
    220 error_printf( \
    +
    221 "out byte " SIZE_T_FMT " outside of " SIZE_T_FMT \
    +
    222 " pixel buffer!", out_byte_cur, buffer_out_sz ); \
    +
    223 retval = MERROR_OVERFLOW; \
    +
    224 goto cleanup; \
    +
    225 } else if( out_byte_cur < buffer_out_sz ) { \
    +
    226 /* We're not at the end of the file yet! */ \
    +
    227 buffer_out[out_byte_cur] = 0; \
    +
    228 } \
    +
    229 out_mask_cur = 0xf0; \
    +
    230 }
    +
    231
    +
    232 #define mfmt_decode_rle_reset_line() \
    +
    233 if( line_w != line_px_written ) { \
    +
    234 error_printf( \
    +
    235 "line written pixels %u does not match line width " SIZE_T_FMT, \
    +
    236 line_px_written, line_w ); \
    +
    237 retval = MERROR_OVERFLOW; \
    +
    238 goto cleanup; \
    +
    239 } \
    +
    240 line_px_written = 0; \
    +
    241 out_mask_cur = 0xf0; \
    +
    242 lines_out++; \
    +
    243 debug_printf( MFMT_TRACE_RLE_LVL, "now on line: %u", lines_out );
    +
    244
    +
    245 #define mfmt_decode_rle_inc_line_w( incr ) \
    +
    246 line_px_written += incr; \
    +
    247 if( line_w < line_px_written ) { \
    +
    248 error_printf( \
    +
    249 "line byte %u outside of " SIZE_T_FMT \
    +
    250 " line width!", line_px_written, line_w ); \
    +
    251 retval = MERROR_OVERFLOW; \
    +
    252 goto cleanup; \
    +
    253 }
    +
    254
    +
    255 debug_printf( 1, "decompressing RLE into temporary buffer..." );
    +
    256
    +
    257 maug_mlock( buffer_out_h, buffer_out );
    +
    258
    +
    259 do {
    +
    260 mfile_cread_at(
    +
    261 p_file_in, &(byte_buffer), file_offset + in_byte_cur++ );
    +
    262 debug_printf( MFMT_TRACE_RLE_LVL, "in byte " SIZE_T_FMT
    +
    263 ": 0x%02x, out byte " SIZE_T_FMT ", line px: %u",
    +
    264 in_byte_cur, byte_buffer, out_byte_cur, line_px_written );
    +
    265
    +
    266 switch( byte_buffer ) {
    +
    267 case 0:
    +
    268 if( MFMT_RLE_DECODE_RUN == decode_state ) {
    +
    269 mfmt_decode_rle_state( MFMT_RLE_DECODE_ESC );
    +
    270 break;
    +
    271
    +
    272 } else if( MFMT_RLE_DECODE_LITERAL_PAD == decode_state ) {
    +
    273 /* This is just a padding byte to make sure literals are %16. */
    +
    274 assert( 0 == byte_buffer );
    +
    275 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    276 break;
    +
    277
    +
    278 } else if( MFMT_RLE_DECODE_ESC == decode_state ) {
    +
    279 /* This is an EOL marker. */
    +
    280 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    281 "EOL: %u px written", line_px_written );
    +
    282 while( line_px_written < line_w ) {
    +
    283 /* Pad out the end of the line. */
    +
    284 assert( 0 == line_px_written % 2 );
    +
    285 buffer_out[out_byte_cur++] = 0x00;
    +
    286 mfmt_decode_rle_inc_line_w( 2 );
    +
    287 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    288 "padded line (%u written)", line_px_written );
    +
    289 }
    +
    290 mfmt_decode_rle_reset_line();
    +
    291
    +
    292 /* Diversion over, go back to hunting for runs. */
    +
    293 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    294 break;
    +
    295 }
    +
    296
    +
    297 case 1:
    +
    298 if( MFMT_RLE_DECODE_ESC == decode_state ) {
    +
    299 debug_printf( MFMT_TRACE_RLE_LVL, "EOBM" );
    +
    300 /* End of bitmap, so pad the rest of the file. */
    +
    301
    +
    302 while( out_byte_cur < buffer_out_sz ) {
    +
    303 /* Pad out the end of the line. */
    +
    304 assert( 0 == line_px_written % 2 );
    +
    305 mfmt_decode_rle_check_eol();
    +
    306 buffer_out[out_byte_cur++] = 0x00;
    +
    307 mfmt_decode_rle_inc_line_w( 2 );
    +
    308 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    309 "padded file (%u written)", line_px_written );
    +
    310 }
    +
    311
    +
    312 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    313 break;
    +
    314 }
    +
    315
    +
    316 case 2:
    +
    317 if( MFMT_RLE_DECODE_ESC == decode_state ) {
    +
    318 debug_printf( MFMT_TRACE_RLE_LVL, "absolute mode: right" );
    +
    319 /* TODO: Absolute mode. */
    +
    320 assert( 1 == 0 );
    +
    321 mfmt_decode_rle_state( MFMT_RLE_DECODE_ABS_RIGHT );
    +
    322 break;
    +
    323 }
    +
    324
    +
    325 default:
    +
    326 switch( decode_state ) {
    +
    327 case MFMT_RLE_DECODE_LITERAL:
    +
    328
    +
    329 mfmt_decode_rle_check_eol();
    +
    330
    +
    331 run_count -= 2;
    +
    332 unpadded_written += 2;
    +
    333 mfmt_decode_rle_inc_line_w( 2 );
    +
    334 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    335 "writing literal: 0x%02x (%u left, unpadded run val: %u)",
    +
    336 byte_buffer, run_count, unpadded_written );
    +
    337 buffer_out[out_byte_cur++] = byte_buffer;
    +
    338
    +
    339 if( 0 == run_count ) {
    +
    340 if( 0 != unpadded_written % 4 ) {
    +
    341 /* Uneven number of literals copied. */
    +
    342 /* Ignore the byte, as it's a pad to word-size/16-bits. */
    +
    343 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    344 "unpadded: %u, next is pad byte", unpadded_written );
    +
    345 /* assert( 0 == byte_buffer ); */
    +
    346 mfmt_decode_rle_state( MFMT_RLE_DECODE_LITERAL_PAD );
    +
    347 } else {
    +
    348
    +
    349 /* Diversion over, go back to hunting for runs. */
    +
    350 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    351 }
    +
    352 }
    +
    353 break;
    +
    354
    +
    355 case MFMT_RLE_DECODE_ESC:
    +
    356 run_count = byte_buffer;
    +
    357 unpadded_written = 0;
    +
    358 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    359 "literal mode: %u nibbles", run_count );
    +
    360 assert( 0 == run_count % 2 );
    +
    361 mfmt_decode_rle_state( MFMT_RLE_DECODE_LITERAL );
    +
    362 break;
    +
    363
    +
    364 case MFMT_RLE_DECODE_ABS_RIGHT:
    +
    365 debug_printf( MFMT_TRACE_RLE_LVL, "absolute mode: up" );
    +
    366 /* TODO: Absolute mode. */
    +
    367 assert( 1 == 0 );
    +
    368 mfmt_decode_rle_state( MFMT_RLE_DECODE_ABS_DOWN );
    +
    369 break;
    +
    370
    +
    371 case MFMT_RLE_DECODE_RUN:
    +
    372
    +
    373 mfmt_decode_rle_check_eol();
    +
    374
    +
    375 run_count = byte_buffer;
    +
    376 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    377 "starting run: %u nibbles", run_count );
    +
    378 mfmt_decode_rle_state( MFMT_RLE_DECODE_CHAR );
    +
    379 break;
    +
    380
    +
    381 case MFMT_RLE_DECODE_CHAR:
    +
    382 assert( 0 != run_count );
    +
    383 run_char = byte_buffer;
    +
    384 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    385 "%u-long run of 0x%02x...", run_count, run_char );
    +
    386 do {
    +
    387 /* Expand the run into the prescribed number of nibbles. */
    +
    388 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    389 "writing 0x%02x & 0x%02x #%u (line px #%u)...",
    +
    390 run_char, out_mask_cur, run_count, line_px_written );
    +
    391 buffer_out[out_byte_cur] |= (run_char & out_mask_cur);
    +
    392 mfmt_decode_rle_advance_mask();
    +
    393 mfmt_decode_rle_inc_line_w( 1 );
    +
    394 run_count--;
    +
    395
    +
    396 } while( 0 < run_count );
    +
    397
    +
    398 /* Diversion over, go back to hunting for runs. */
    +
    399 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    400 break;
    +
    401
    +
    402 }
    +
    403 break;
    +
    404 }
    +
    405 } while( in_byte_cur < file_sz );
    +
    406
    +
    407 debug_printf(
    +
    408 MFMT_TRACE_RLE_LVL, "wrote " SIZE_T_FMT " bytes (%u lines)",
    +
    409 out_byte_cur, lines_out );
    +
    410
    +
    411cleanup:
    +
    412
    +
    413 if( NULL != buffer_out ) {
    +
    414 maug_munlock( buffer_out_h, buffer_out );
    +
    415 }
    +
    416
    +
    417 return retval;
    +
    418}
    +
    419
    +
    420MERROR_RETVAL mfmt_read_bmp_header(
    +
    421 struct MFMT_STRUCT* header, mfile_t* p_file_in,
    +
    422 uint32_t file_offset, off_t file_sz, uint8_t* p_flags
    +
    423) {
    +
    424 MERROR_RETVAL retval = MERROR_OK;
    +
    425 struct MFMT_STRUCT_BMPINFO* header_bmp_info = NULL;
    +
    426 struct MFMT_STRUCT_BMPFILE* header_bmp_file = NULL;
    +
    427 uint32_t file_hdr_sz = 0;
    +
    428 off_t header_offset = 0;
    +
    429
    +
    430 mfmt_bmp_check_header();
    +
    431
    +
    432 if( NULL != header_bmp_file ) {
    +
    433 header_offset = 14; /* Size of info header. */
    +
    434
    +
    435 /* Grab file header info. */
    +
    436 mfile_u32read_lsbf_at( p_file_in, &(header_bmp_file->file_sz),
    +
    437 file_offset + 2 );
    +
    438 mfile_u32read_lsbf_at( p_file_in, &(header_bmp_file->px_offset),
    +
    439 file_offset + 10 );
    +
    440 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    441 "bitmap file " UPRINTF_U32_FMT " bytes long, px at "
    +
    442 UPRINTF_U32_FMT " bytes",
    +
    443 header_bmp_file->file_sz, header_bmp_file->px_offset );
    +
    444 }
    +
    445
    +
    446 /* Read the bitmap image header. */
    +
    447 mfile_u32read_lsbf_at( p_file_in, &(file_hdr_sz),
    +
    448 file_offset + header_offset );
    +
    449 if( 40 != file_hdr_sz ) { /* Windows BMP. */
    +
    450 error_printf( "invalid header size: " UPRINTF_U32_FMT, file_hdr_sz );
    +
    451 retval = MERROR_FILE;
    +
    452 goto cleanup;
    +
    453 }
    +
    454 debug_printf(
    +
    455 MFMT_TRACE_BMP_LVL, "bitmap header is " UPRINTF_U32_FMT " bytes",
    +
    456 file_hdr_sz );
    +
    457
    +
    458 if( 40 > file_sz - (file_offset + header_offset) ) {
    +
    459 error_printf(
    +
    460 "bitmap header overflow! (only " SIZE_T_FMT " bytes remain!)",
    +
    461 file_sz - (file_offset + header_offset) );
    +
    462 retval = MERROR_OVERFLOW;
    +
    463 goto cleanup;
    +
    464 }
    +
    465
    +
    466 /* Read bitmap image dimensions. */
    +
    467 mfile_u32read_lsbf_at( p_file_in, &(header_bmp_info->width),
    +
    468 file_offset + header_offset + MFMT_BMPINFO_OFS_WIDTH );
    +
    469 mfile_u32read_lsbf_at( p_file_in, &(header_bmp_info->height),
    +
    470 file_offset + header_offset + MFMT_BMPINFO_OFS_HEIGHT );
    +
    471 if( 0 > header_bmp_info->height ) {
    +
    472 debug_printf(
    +
    473 MFMT_TRACE_BMP_LVL, "bitmap Y coordinate is inverted..." );
    +
    474 *p_flags |= MFMT_PX_FLAG_INVERT_Y;
    +
    475 }
    +
    476
    +
    477 mfile_u32read_lsbf_at( p_file_in, &(header_bmp_info->img_sz),
    +
    478 file_offset + header_offset + MFMT_BMPINFO_OFS_SZ );
    +
    479
    +
    480 /* Check that we're a palettized image. */
    +
    481 mfile_u16read_lsbf_at( p_file_in, &(header_bmp_info->bpp),
    +
    482 file_offset + header_offset + MFMT_BMPINFO_OFS_BPP );
    +
    483 if( 8 < header_bmp_info->bpp ) {
    +
    484 error_printf( "invalid bitmap bpp: %u", header_bmp_info->bpp );
    +
    485 retval = MERROR_FILE;
    +
    486 goto cleanup;
    +
    487 }
    +
    488
    +
    489 /* Make sure there's no weird compression. */
    +
    490 mfile_u32read_lsbf_at( p_file_in,
    +
    491 &(header_bmp_info->compression),
    +
    492 file_offset + header_offset + MFMT_BMPINFO_OFS_COMPRESSION );
    +
    493 if(
    +
    494 MFMT_BMP_COMPRESSION_NONE != header_bmp_info->compression &&
    +
    495 MFMT_BMP_COMPRESSION_RLE4 != header_bmp_info->compression
    +
    496 ) {
    +
    497 error_printf( "invalid bitmap compression: " UPRINTF_U32_FMT,
    +
    498 header_bmp_info->compression );
    +
    499 retval = MERROR_FILE;
    +
    500 goto cleanup;
    +
    501 }
    +
    502
    +
    503 mfile_u32read_lsbf_at( p_file_in,
    +
    504 &(header_bmp_info->palette_ncolors),
    +
    505 file_offset + header_offset + MFMT_BMPINFO_OFS_PAL_SZ );
    +
    506
    +
    507 debug_printf( 2, "bitmap is " UPRINTF_S32_FMT " x " UPRINTF_S32_FMT
    +
    508 ", %u bpp (palette has " UPRINTF_U32_FMT " colors)",
    +
    509 header_bmp_info->width, header_bmp_info->height,
    +
    510 header_bmp_info->bpp, header_bmp_info->palette_ncolors );
    +
    511
    +
    512cleanup:
    +
    513
    +
    514 return retval;
    +
    515}
    +
    516
    +
    517MERROR_RETVAL mfmt_read_bmp_palette(
    +
    518 struct MFMT_STRUCT* header, uint32_t* palette, size_t palette_sz,
    +
    519 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags
    +
    520) {
    +
    521 MERROR_RETVAL retval = MERROR_OK;
    +
    522 struct MFMT_STRUCT_BMPINFO* header_bmp_info = NULL;
    +
    523 struct MFMT_STRUCT_BMPFILE* header_bmp_file = NULL;
    +
    524 off_t i = 0;
    +
    525
    +
    526 mfmt_bmp_check_header();
    +
    527
    +
    528 mfile_seek( p_file_in, file_offset );
    +
    529 for( i = 0 ; header_bmp_info->palette_ncolors > i ; i++ ) {
    +
    530 if( i * 4 > palette_sz ) {
    +
    531 error_printf( "palette overflow!" );
    +
    532 retval = MERROR_OVERFLOW;
    +
    533 goto cleanup;
    +
    534 }
    +
    535 mfile_u32read_lsbf( p_file_in, &(palette[i]) );
    +
    536 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    537 "set palette entry " SIZE_T_FMT " to " UPRINTF_X32_FMT,
    +
    538 i, palette[i] );
    +
    539 }
    +
    540
    +
    541cleanup:
    +
    542
    +
    543 return retval;
    +
    544}
    +
    545
    + +
    547 struct MFMT_STRUCT* header, uint8_t SEG_FAR* px, off_t px_sz,
    +
    548 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags
    +
    549) {
    +
    550 MERROR_RETVAL retval = MERROR_OK;
    +
    551 struct MFMT_STRUCT_BMPINFO* header_bmp_info = NULL;
    +
    552 struct MFMT_STRUCT_BMPFILE* header_bmp_file = NULL;
    +
    553 int32_t x = 0,
    +
    554 y = 0;
    +
    555 uint32_t i = 0,
    +
    556 byte_in_idx = 0,
    +
    557 byte_out_idx = 0,
    +
    558 bit_idx = 0;
    +
    559 uint8_t byte_buffer = 0,
    +
    560 byte_mask = 0,
    +
    561 pixel_buffer = 0;
    +
    562 MAUG_MHANDLE decomp_buffer_h = (MAUG_MHANDLE)NULL;
    +
    563 mfile_t file_decomp;
    +
    564 mfile_t *p_file_bmp = p_file_in;
    +
    565
    +
    566 /* Check header for validation and info on how to decode pixels. */
    +
    567
    +
    568 mfmt_bmp_check_header();
    +
    569
    +
    570 if( 0 == header_bmp_info->height ) {
    +
    571 error_printf( "bitmap height is 0!" );
    +
    572 retval = MERROR_FILE;
    +
    573 goto cleanup;
    +
    574 }
    +
    575
    +
    576 if( 0 == header_bmp_info->width ) {
    +
    577 error_printf( "bitmap width is 0!" );
    +
    578 retval = MERROR_FILE;
    +
    579 goto cleanup;
    +
    580 }
    +
    581
    +
    582 if( 0 == header_bmp_info->bpp ) {
    +
    583 error_printf( "bitmap BPP is 0!" );
    +
    584 retval = MERROR_FILE;
    +
    585 goto cleanup;
    +
    586 }
    +
    587
    +
    588 if( 8 < header_bmp_info->bpp ) {
    +
    589 error_printf( ">8BPP bitmaps not supported!" );
    +
    590 retval = MERROR_FILE;
    +
    591 goto cleanup;
    +
    592 }
    +
    593
    +
    594 maug_mzero( &file_decomp, sizeof( mfile_t ) );
    +
    595 if( MFMT_BMP_COMPRESSION_RLE4 == header_bmp_info->compression ) {
    +
    596 debug_printf( 1, "allocating decompression buffer..." );
    +
    597
    +
    598 /* Create a temporary memory buffer and decompress into it. */
    +
    599 decomp_buffer_h = maug_malloc(
    +
    600 header_bmp_info->width, header_bmp_info->height );
    +
    601 maug_cleanup_if_null_alloc( MAUG_MHANDLE, decomp_buffer_h );
    +
    602
    +
    603 retval = mfmt_decode_rle(
    +
    604 p_file_in, file_offset, header_bmp_info->img_sz,
    +
    605 header_bmp_info->width,
    +
    606 decomp_buffer_h, header_bmp_info->width * header_bmp_info->height,
    +
    607 MFMT_DECOMP_FLAG_4BIT );
    +
    608 maug_cleanup_if_not_ok();
    +
    609
    +
    610 retval = mfile_lock_buffer( decomp_buffer_h, &file_decomp );
    +
    611 maug_cleanup_if_not_ok();
    +
    612
    +
    613 /* Switch out the file used below for the decomp buffer mfile_t. */
    +
    614 p_file_bmp = &file_decomp;
    +
    615 }
    +
    616
    +
    617 /* TODO: Handle padding for non-conforming images. */
    +
    618 assert( 0 == header_bmp_info->width % 4 );
    +
    619
    +
    620 #define mfmt_read_bmp_px_out_idx() \
    +
    621 (MFMT_PX_FLAG_INVERT_Y == (MFMT_PX_FLAG_INVERT_Y & flags) ? \
    +
    622 ((header_bmp_info->height - y - 1) * header_bmp_info->width) : \
    +
    623 ((y) * header_bmp_info->width))
    +
    624
    +
    625 y = header_bmp_info->height - 1;
    +
    626 byte_out_idx = mfmt_read_bmp_px_out_idx();
    +
    627 mfile_seek( p_file_bmp, file_offset );
    +
    628 while( 0 <= y ) {
    +
    629 /* Each iteration is a single, fresh pixel. */
    +
    630 pixel_buffer = 0;
    +
    631
    +
    632 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    633 "byte in: " UPRINTF_U32_FMT " (" SIZE_T_FMT
    +
    634 "), bit " UPRINTF_U32_FMT ", y: " UPRINTF_U32_FMT
    +
    635 ", x: " UPRINTF_U32_FMT "), byte out: " UPRINTF_U32_FMT,
    +
    636 byte_in_idx, file_sz, bit_idx, y, x, byte_out_idx );
    +
    637
    +
    638 /* Buffer bounds check. */
    +
    639 if( px_sz <= byte_out_idx ) {
    +
    640 error_printf(
    +
    641 "byte " UPRINTF_U32_FMT " outside of " SIZE_T_FMT
    +
    642 " pixel buffer!", byte_out_idx, px_sz );
    +
    643 retval = MERROR_OVERFLOW;
    +
    644 goto cleanup;
    +
    645 }
    +
    646
    +
    647 /* Byte finished check. */
    +
    648 if( 0 == bit_idx ) {
    +
    649 if( byte_in_idx >= file_sz ) {
    +
    650 /* TODO: Figure out why ICO parser messes up size. */
    +
    651 error_printf(
    +
    652 "input bitmap has insufficient size " SIZE_T_FMT " bytes)!",
    +
    653 file_sz );
    +
    654 /* retval = MERROR_OVERFLOW;
    +
    655 goto cleanup; */
    +
    656 }
    +
    657
    +
    658 /* Move on to a new byte. */
    +
    659 mfile_cread(
    +
    660 p_file_bmp, &(byte_buffer) );
    +
    661 byte_in_idx++;
    +
    662
    +
    663 /* Start at 8 bits from the right (0 from the left). */
    +
    664 bit_idx = 8;
    +
    665
    +
    666 /* Build a bitwise mask based on the bitmap's BPP. */
    +
    667 byte_mask = 0;
    +
    668 for( i = 0 ; header_bmp_info->bpp > i ; i++ ) {
    +
    669 byte_mask >>= 1;
    +
    670 byte_mask |= 0x80;
    +
    671 }
    +
    672 }
    +
    673
    +
    674 /* Use the byte mask to place the bits for this pixel in the
    +
    675 * pixel buffer.
    +
    676 */
    +
    677 pixel_buffer |= byte_buffer & byte_mask;
    +
    678
    +
    679 /* Shift the pixel buffer so the index lines up at the first bit. */
    +
    680 pixel_buffer >>=
    +
    681 /* Index starts from the right, so the current bits from the left
    +
    682 * minus 1 * bpp.
    +
    683 */
    +
    684 (bit_idx - header_bmp_info->bpp);
    +
    685 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    686 "byte_mask: 0x%02x, bit_idx: " UPRINTF_U32_FMT
    +
    687 ", pixel_buffer: 0x%02x",
    +
    688 byte_mask, bit_idx, pixel_buffer );
    +
    689
    +
    690 /* Place the pixel buffer at the X/Y in the grid. */
    +
    691 debug_printf( MFMT_TRACE_BMP_LVL, "writing byte %u (x: %u, y: %u)",
    +
    692 byte_out_idx, x, y );
    +
    693 px[byte_out_idx] = pixel_buffer;
    +
    694 byte_out_idx++;
    +
    695
    +
    696 /* Increment the bits position byte mask by the bpp so it's pointing
    +
    697 * to the next pixel in the bitmap for the next go around.
    +
    698 */
    +
    699 byte_mask >>= header_bmp_info->bpp;
    +
    700 bit_idx -= header_bmp_info->bpp;
    +
    701
    +
    702 /* Move to the next pixel. */
    +
    703 x++;
    +
    704 if( x >= header_bmp_info->width ) {
    +
    705 /* Move to the next row of the input. */
    +
    706 y--;
    +
    707 x = 0;
    +
    708 while( byte_in_idx % 4 != 0 ) {
    +
    709 byte_in_idx++;
    +
    710 mfile_seek( p_file_bmp, file_offset + byte_in_idx );
    +
    711 }
    +
    712
    +
    713 /* Move to the next row of the output. */
    +
    714 byte_out_idx = mfmt_read_bmp_px_out_idx();
    +
    715
    +
    716 /* TODO Get past the padding. */
    +
    717
    +
    718 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    719 "new row starting at byte_out_idx: " UPRINTF_U32_FMT,
    +
    720 byte_out_idx );
    +
    721 }
    +
    722 }
    +
    723
    +
    724cleanup:
    +
    725
    +
    726 mfile_close( &file_decomp );
    +
    727 /* decomp_buffer_h = file_decomp.h.mem; */
    +
    728
    +
    729 if( NULL != decomp_buffer_h ) {
    +
    730 debug_printf( 1, "freeing decomp buffer %p...", decomp_buffer_h );
    +
    731 maug_mfree( decomp_buffer_h );
    +
    732 }
    +
    733
    +
    734 return retval;
    +
    735}
    +
    736
    +
    737#endif /* MFMT_C */
    +
    738
    +
    739 /* maug_fmt */
    +
    740
    +
    741#endif /* !MFMT_H */
    +
    742
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define MFMT_BMP_COMPRESSION_NONE
    MFMT_STRUCT_BMPINFO::compression value indicating none.
    Definition mfmt.h:34
    +
    #define MFMT_BMP_COMPRESSION_RLE4
    MFMT_STRUCT_BMPINFO::compression value indicating 4-bit RLE.
    Definition mfmt.h:38
    +
    MERROR_RETVAL mfmt_read_bmp_px(struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
    Read mfmt_bitmap pixels into an 8-bit memory bitmap.
    +
    MERROR_RETVAL(* mfmt_read_header_cb)(struct MFMT_STRUCT *header, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t *p_flags)
    Callback to read image header and get properties.
    Definition mfmt.h:132
    +
    MERROR_RETVAL(* mfmt_read_px_cb)(struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
    Callback to read image pixels into 8-bit values.
    Definition mfmt.h:147
    +
    MERROR_RETVAL(* mfmt_read_palette_cb)(struct MFMT_STRUCT *header, uint32_t *palette, size_t palette_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
    Callback to read image palette into 24-bit RGB values.
    Definition mfmt.h:139
    +
    MERROR_RETVAL(* mfmt_decode)(mfile_t *p_file_in, off_t file_offset, off_t file_sz, size_t line_w, MAUG_MHANDLE buffer_out, off_t buffer_out_sz, uint8_t flags)
    Callback to decode compressed data.
    Definition mfmt.h:125
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    MERROR_RETVAL mfile_lock_buffer(MAUG_MHANDLE, mfile_t *p_file)
    Lock a buffer and assign it to an mfile_t to read/write.
    +
    void mfile_close(mfile_t *p_file)
    Close a file opened with mfile_open_read().
    + +
    Definition mfile.h:45
    +
    Definition mfmt.h:105
    +
    BITMAPINFO struct that comes before Windows bitmap data.
    Definition mfmt.h:80
    +
    uint32_t compression
    Type of compression used.
    Definition mfmt.h:92
    +
    uint32_t vres
    Vertical resolution in pixels per inch (unsupported).
    Definition mfmt.h:98
    +
    uint16_t bpp
    Number of bits per pixel (only =<8 are supported).
    Definition mfmt.h:90
    +
    uint16_t color_planes
    Number of color planes (only 0 or 1 are supported).
    Definition mfmt.h:88
    +
    uint32_t sz
    Size of this struct in bytes (only 40 is supported).
    Definition mfmt.h:82
    +
    uint32_t imp_colors
    Definition mfmt.h:102
    +
    uint32_t img_sz
    Size of pixel data in bytes.
    Definition mfmt.h:94
    +
    uint32_t hres
    Horizontal resolution in pixels per inch (unsupported).
    Definition mfmt.h:96
    +
    uint32_t palette_ncolors
    Number of palette colors in this bitmap (<256 supported).
    Definition mfmt.h:100
    +
    int32_t width
    Width of the bitmap in pixels.
    Definition mfmt.h:84
    +
    int32_t height
    Height of the bitmap in pixels.
    Definition mfmt.h:86
    +
    Generic image description struct.
    Definition mfmt.h:56
    +
    uint32_t sz
    Size of this struct (use to tell apart).
    Definition mfmt.h:58
    +
    + + +
    + + diff --git a/mhtml_8h_source.html b/mhtml_8h_source.html new file mode 100644 index 00000000..cffc5210 --- /dev/null +++ b/mhtml_8h_source.html @@ -0,0 +1,1031 @@ + + + + + + + +maug: mhtml.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    mhtml.h
    +
    +
    +
    1
    +
    2#ifndef MHTML_H
    +
    3#define MHTML_H
    +
    4
    +
    5#ifndef MHTML_PARSER_TOKEN_SZ_MAX
    +
    6# define MHTML_PARSER_TOKEN_SZ_MAX 1024
    +
    7#endif /* !MHTML_PARSER_TOKEN_SZ_MAX */
    +
    8
    +
    9#ifndef MHTML_PARSER_TAGS_INIT_SZ
    +
    10# define MHTML_PARSER_TAGS_INIT_SZ 10
    +
    11#endif /* !MHTML_PARSER_TAGS_INIT_SZ */
    +
    12
    +
    13#ifdef MHTML_C
    +
    14# define MCSS_C
    +
    15#endif /* MHTML_C */
    +
    16
    +
    17#ifndef MHTML_DUMP_LINE_SZ
    +
    18# define MHTML_DUMP_LINE_SZ 255
    +
    19#endif /* !MHTML_DUMP_LINE_SZ */
    +
    20
    +
    21#ifndef MHTML_SRC_HREF_SZ_MAX
    +
    22# define MHTML_SRC_HREF_SZ_MAX 128
    +
    23#endif /* !MHTML_SRC_HREF_SZ_MAX */
    +
    24
    +
    25#ifndef MHTML_TRACE_LVL
    +
    26# define MHTML_TRACE_LVL 0
    +
    27#endif /* !MHTML_TRACE_LVL */
    +
    28
    +
    30#define MHTML_TAG_FLAG_STYLE 0x02
    +
    31
    +
    32#define MHTML_INPUT_TYPE_BUTTON 0x01
    +
    33
    +
    34#include <mparser.h>
    +
    35#include <mcss.h>
    +
    36
    +
    37#define MHTML_ATTRIB_TABLE( f ) \
    +
    38 f( NONE, 0 ) \
    +
    39 f( STYLE, 1 ) \
    +
    40 f( CLASS, 2 ) \
    +
    41 f( ID, 3 ) \
    +
    42 f( NAME, 4 ) \
    +
    43 f( SRC, 5 ) \
    +
    44 f( TYPE, 6 ) \
    +
    45 f( VALUE, 7 )
    +
    46
    +
    47#define MHTML_TAG_TABLE( f ) \
    +
    48 f( 0, NONE, void* none;, NONE ) \
    +
    49 f( 1, BODY, void* none;, BLOCK ) \
    +
    50 f( 2, DIV, void* none;, BLOCK ) \
    +
    51 f( 3, HEAD, void* none;, NONE ) \
    +
    52 f( 4, HTML, void* none;, BLOCK ) \
    +
    53 f( 5, TEXT, MAUG_MHANDLE content; size_t content_sz;, INLINE ) \
    +
    54 f( 6, TITLE, MAUG_MHANDLE content; size_t content_sz;, NONE ) \
    +
    55 f( 7, SPAN, void* none;, INLINE ) \
    +
    56 f( 8, BR, void* none;, BLOCK ) \
    +
    57 f( 9, STYLE, void* none;, NONE ) \
    +
    58 f( 10, IMG, char src[MHTML_SRC_HREF_SZ_MAX + 1]; size_t src_sz;, BLOCK ) \
    +
    59 f( 11, INPUT, uint8_t input_type; char name[MCSS_ID_SZ_MAX + 1]; size_t name_sz; char value[MCSS_ID_SZ_MAX + 1]; size_t value_sz;, INLINE )
    +
    60
    +
    61#define MHTML_PARSER_PSTATE_TABLE( f ) \
    +
    62 f( MHTML_PSTATE_NONE, 0 ) \
    +
    63 f( MHTML_PSTATE_ELEMENT, 1 ) \
    +
    64 f( MHTML_PSTATE_ATTRIB_KEY, 2 ) \
    +
    65 f( MHTML_PSTATE_ATTRIB_VAL, 3 ) \
    +
    66 f( MHTML_PSTATE_END_ELEMENT, 4 ) \
    +
    67 f( MHTML_PSTATE_STRING, 5 ) \
    +
    68 f( MHTML_PSTATE_STYLE, 6 )
    +
    69
    +
    70/* TODO: Function names should be verb_noun! */
    +
    71
    +
    72#define mhtml_tag( parser, idx ) (&((parser)->tags[idx]))
    +
    73
    +
    74#define mhtml_tag_parent( parser, idx ) \
    +
    75 (0 <= (parser)->tags[idx].parent ? \
    +
    76 (&((parser)->tags[(parser)->tags[idx].parent]])) : NULL)
    +
    77
    +
    78#define mhtml_tag_child( parser, idx ) \
    +
    79 (0 <= (parser)->tags[idx].first_child ? \
    +
    80 (&((parser)->tags[(parser)->tags[idx].first_child]])) : NULL)
    +
    81
    +
    82#define mhtml_tag_sibling( parser, idx ) \
    +
    83 (0 <= (parser)->tags[idx].next_sibling ? \
    +
    84 (&((parser)->tags[(parser)->tags[idx].next_sibling]])) : NULL)
    +
    85
    +
    86#define mhtml_parser_pstate( parser ) \
    +
    87 mparser_pstate( parser )
    +
    88
    +
    89#define mhtml_parser_pstate_push( parser, new_pstate ) \
    +
    90 mparser_pstate_push( mhtml, parser, new_pstate )
    +
    91
    +
    92#define mhtml_parser_pstate_pop( parser ) \
    +
    93 mparser_pstate_pop( mhtml, parser )
    +
    94
    +
    95#define mhtml_parser_invalid_c( parser, c, retval ) \
    +
    96 mparser_invalid_c( mhtml, parser, c, retval )
    +
    97
    +
    98#define mhtml_parser_reset_token( parser ) \
    +
    99 mparser_reset_token( mhtml, parser )
    +
    100
    +
    101#define mhtml_parser_append_token( parser, c ) \
    +
    102 mparser_append_token( mhtml, parser, c, MHTML_PARSER_TOKEN_SZ_MAX )
    +
    103
    +
    104#define mhtml_parser_lock( parser ) \
    +
    105 if( NULL == (parser)->tags ) { \
    +
    106 maug_mlock( (parser)->tags_h, (parser)->tags ); \
    +
    107 maug_cleanup_if_null_alloc( union MHTML_TAG*, (parser)->tags ); \
    +
    108 } \
    +
    109 mcss_parser_lock( &((parser)->styler) );
    +
    110
    +
    111#define mhtml_parser_unlock( parser ) \
    +
    112 if( NULL != (parser)->tags ) { \
    +
    113 maug_munlock( (parser)->tags_h, (parser)->tags ); \
    +
    114 } \
    +
    115 mcss_parser_unlock( &((parser)->styler) );
    +
    116
    +
    117#define mhtml_parser_is_locked( parser ) (NULL != (parser)->tags)
    +
    118
    +
    + +
    120 uint16_t type;
    +
    121 uint8_t flags;
    +
    122 ssize_t parent;
    +
    123 ssize_t first_child;
    +
    124 ssize_t next_sibling;
    +
    125 ssize_t style;
    +
    126 char classes[MCSS_CLASS_SZ_MAX + 1];
    +
    127 size_t classes_sz;
    +
    128 char id[MCSS_ID_SZ_MAX + 1];
    +
    129 size_t id_sz;
    +
    130};
    +
    +
    131
    +
    132#define MHTML_TAG_TABLE_STRUCT( tag_id, tag_name, fields, disp ) \
    +
    133 struct MHTML_TAG_ ## tag_name { \
    +
    134 struct MHTML_TAG_BASE base; \
    +
    135 fields \
    +
    136 };
    +
    137
    +
    138MHTML_TAG_TABLE( MHTML_TAG_TABLE_STRUCT )
    +
    139
    +
    140#define MHTML_TAG_TABLE_UNION_FIELD( tag_id, tag_name, fields, disp ) \
    +
    141 struct MHTML_TAG_ ## tag_name tag_name;
    +
    142
    +
    + +
    144 struct MHTML_TAG_BASE base; /* Should line up w/ 1st "base" in all types. */
    +
    145 MHTML_TAG_TABLE( MHTML_TAG_TABLE_UNION_FIELD )
    +
    146};
    +
    +
    147
    +
    + +
    149 uint16_t pstate[MPARSER_STACK_SZ_MAX];
    +
    150 size_t pstate_sz;
    +
    151 uint16_t attrib_key;
    +
    152 char token[MHTML_PARSER_TOKEN_SZ_MAX];
    +
    153 size_t token_sz;
    +
    154 size_t i;
    +
    155 MAUG_MHANDLE tags_h;
    +
    156 union MHTML_TAG* tags;
    +
    157 size_t tags_sz;
    +
    158 size_t tags_sz_max;
    +
    159 ssize_t tag_iter;
    +
    164 uint8_t tag_flags;
    +
    165 struct MCSS_PARSER styler;
    +
    166 ssize_t body_idx;
    +
    167};
    +
    +
    168
    +
    169MERROR_RETVAL mhtml_parser_free( struct MHTML_PARSER* parser );
    +
    170
    +
    171MERROR_RETVAL mhtml_pop_tag( struct MHTML_PARSER* parser );
    +
    172
    +
    173MERROR_RETVAL mhtml_parse_c( struct MHTML_PARSER* parser, char c );
    +
    174
    +
    175MERROR_RETVAL mhtml_parser_init( struct MHTML_PARSER* parser );
    +
    176
    +
    177void mhtml_dump_tree( struct MHTML_PARSER* parser, ssize_t iter, size_t d );
    +
    178
    +
    179#ifdef MHTML_C
    +
    180
    +
    181#define MHTML_PSTATE_TABLE_CONST( name, idx ) \
    +
    182 MAUG_CONST uint8_t SEG_MCONST name = idx;
    +
    183
    +
    184MHTML_PARSER_PSTATE_TABLE( MHTML_PSTATE_TABLE_CONST )
    +
    185
    +
    186MPARSER_PSTATE_NAMES( MHTML_PARSER_PSTATE_TABLE, mhtml )
    +
    187
    +
    188#define MHTML_TAG_TABLE_CONST( tag_id, tag_name, fields, disp ) \
    +
    189 MAUG_CONST uint16_t SEG_MCONST MHTML_TAG_TYPE_ ## tag_name = tag_id;
    +
    190
    +
    191MHTML_TAG_TABLE( MHTML_TAG_TABLE_CONST )
    +
    192
    +
    193#define MHTML_TAG_TABLE_NAMES( tag_id, tag_name, fields, disp ) \
    +
    194 #tag_name,
    +
    195
    +
    196MAUG_CONST char* SEG_MCONST gc_mhtml_tag_names[] = {
    +
    197 MHTML_TAG_TABLE( MHTML_TAG_TABLE_NAMES )
    +
    198 ""
    +
    199};
    +
    200
    +
    201#define MHTML_PSTATE_TABLE_NAME( name, idx ) \
    +
    202 #name,
    +
    203
    +
    204static MAUG_CONST char* SEG_MCONST gc_mhtml_attrib_names[] = {
    +
    205 MHTML_ATTRIB_TABLE( MHTML_PSTATE_TABLE_NAME )
    +
    206 ""
    +
    207};
    +
    208
    +
    209#define MHTML_ATTRIB_TABLE_NAME( attrib_name, attrib_id ) \
    +
    210 MAUG_CONST uint16_t SEG_MCONST MHTML_ATTRIB_KEY_ ## attrib_name = attrib_id;
    +
    211
    +
    212MHTML_ATTRIB_TABLE( MHTML_ATTRIB_TABLE_NAME )
    +
    213
    +
    214ssize_t mhtml_get_next_free_tag( struct MHTML_PARSER* parser ) {
    +
    215 uint8_t auto_unlocked = 0;
    +
    216 ssize_t retidx = -1;
    +
    217 MAUG_MHANDLE new_tags_h = (MAUG_MHANDLE)NULL;
    +
    218
    +
    219 if( NULL != parser->tags ) {
    +
    220 debug_printf( MHTML_TRACE_LVL, "auto-unlocking tags..." );
    +
    221 maug_munlock( parser->tags_h, parser->tags );
    +
    222 auto_unlocked = 1;
    +
    223 }
    +
    224
    +
    225 assert( 0 < parser->tags_sz_max );
    +
    226 assert( NULL == parser->tags );
    +
    227 assert( (MAUG_MHANDLE)NULL != parser->tags_h );
    +
    228 if( parser->tags_sz_max <= parser->tags_sz + 1 ) {
    +
    229 /* We've run out of tags, so double the available number. */
    +
    230 /* TODO: Check for sz overflow. */
    +
    231 new_tags_h = maug_mrealloc(
    +
    232 parser->tags_h, parser->tags_sz_max * 2, sizeof( union MHTML_TAG ) );
    +
    233 if( (MAUG_MHANDLE)NULL == new_tags_h ) {
    +
    234 error_printf(
    +
    235 "unable to reallocate " SIZE_T_FMT " tags!",
    +
    236 parser->tags_sz_max * 2 );
    +
    237 goto cleanup;
    +
    238 }
    +
    239 parser->tags_h = new_tags_h;
    +
    240 parser->tags_sz_max *= 2;
    +
    241 }
    +
    242
    +
    243 /* Assume handle is unlocked. */
    +
    244 assert( NULL == parser->tags );
    +
    245 maug_mlock( parser->tags_h, parser->tags );
    +
    246 if( NULL == parser->tags ) {
    +
    247 error_printf( "unable to lock tags!" );
    +
    248 goto cleanup;
    +
    249 }
    +
    250
    +
    251 /* Zero out the last tag, add it to the list, and return its index. */
    +
    252 debug_printf( MHTML_TRACE_LVL,
    +
    253 "zeroing tag " SIZE_T_FMT " (of " SIZE_T_FMT ")...",
    +
    254 parser->tags_sz, parser->tags_sz_max );
    +
    255 maug_mzero( &(parser->tags[parser->tags_sz]), sizeof( union MHTML_TAG ) );
    +
    256 retidx = parser->tags_sz;
    +
    257 parser->tags_sz++;
    +
    258
    +
    259 /* Compensate for cleanup below. */
    +
    260 maug_munlock( parser->tags_h, parser->tags );
    +
    261
    +
    262cleanup:
    +
    263
    +
    264 if( auto_unlocked ) {
    +
    265 maug_mlock( parser->tags_h, parser->tags );
    +
    266 }
    +
    267
    +
    268 return retidx;
    +
    269}
    +
    270
    +
    271MERROR_RETVAL mhtml_parser_free( struct MHTML_PARSER* parser ) {
    +
    272 size_t i = 0;
    +
    273 MERROR_RETVAL retval = MERROR_OK;
    +
    274
    +
    275 debug_printf( MHTML_TRACE_LVL, "freeing HTML parser..." );
    +
    276
    +
    277 mhtml_parser_lock( parser );
    +
    278
    +
    279 for( i = 0 ; parser->tags_sz > i ; i++ ) {
    +
    280 if(
    +
    281 (
    +
    282 MHTML_TAG_TYPE_TEXT == parser->tags[i].base.type ||
    +
    283 MHTML_TAG_TYPE_STYLE == parser->tags[i].base.type
    +
    284 ) &&
    +
    285 (MAUG_MHANDLE)NULL != parser->tags[i].TEXT.content
    +
    286 ) {
    +
    287 maug_mfree( parser->tags[i].TEXT.content );
    +
    288 }
    +
    289 }
    +
    290
    +
    291cleanup:
    +
    292
    +
    293 mcss_parser_free( &(parser->styler) );
    +
    294
    +
    295 if( NULL != parser->tags ) {
    +
    296 maug_munlock( parser->tags_h, parser->tags );
    +
    297 }
    +
    298
    +
    299 if( NULL != parser->tags_h ) {
    +
    300 maug_mfree( parser->tags_h );
    +
    301 }
    +
    302
    +
    303 return retval;
    +
    304}
    +
    305
    +
    306MERROR_RETVAL mhtml_pop_tag( struct MHTML_PARSER* parser ) {
    +
    307 MERROR_RETVAL retval = MERROR_OK;
    +
    308
    +
    309 /* Move up from current tag. */
    +
    310 mhtml_parser_lock( parser );
    +
    311 assert( parser->tag_iter >= 0 );
    +
    312 parser->tag_iter = parser->tags[parser->tag_iter].base.parent;
    +
    313
    +
    314 if( 0 <= parser->tag_iter ) {
    +
    315 debug_printf( MHTML_TRACE_LVL,
    +
    316 "moved iter back to tag %s (" SIZE_T_FMT ")",
    +
    317 gc_mhtml_tag_names[parser->tags[parser->tag_iter].base.type],
    +
    318 parser->tag_iter );
    +
    319 } else {
    +
    320 debug_printf( MHTML_TRACE_LVL, "moved iter back to root (-1)" );
    +
    321 }
    +
    322
    +
    323cleanup:
    +
    324
    +
    325 return retval;
    +
    326}
    +
    327
    +
    328MERROR_RETVAL mhtml_push_tag( struct MHTML_PARSER* parser ) {
    +
    329 MERROR_RETVAL retval = MERROR_OK;
    +
    330 ssize_t new_tag_idx = -1,
    +
    331 tag_child_idx = 0;
    +
    332
    +
    333 new_tag_idx = mhtml_get_next_free_tag( parser );
    +
    334 if( 0 > new_tag_idx ) {
    +
    335 /* Allocating new tag failed! */
    +
    336 retval = MERROR_ALLOC;
    +
    337 goto cleanup;
    +
    338 }
    +
    339
    +
    340 mhtml_parser_lock( parser );
    +
    341
    +
    342 parser->tags[new_tag_idx].base.parent = -1;
    +
    343 parser->tags[new_tag_idx].base.first_child = -1;
    +
    344 parser->tags[new_tag_idx].base.next_sibling = -1;
    +
    345 parser->tags[new_tag_idx].base.style = -1;
    +
    346
    +
    347 parser->tags[new_tag_idx].base.flags = parser->tag_flags;
    +
    348 parser->tag_flags = 0;
    +
    349
    +
    350 if( 0 <= parser->tag_iter ) {
    +
    351 /* Set new tag parent to current tag. */
    +
    352 parser->tags[new_tag_idx].base.parent = parser->tag_iter;
    +
    353
    +
    354 /* Add new tag to current tag's children. */
    +
    355 if( 0 > parser->tags[parser->tag_iter].base.first_child ) {
    +
    356 parser->tags[parser->tag_iter].base.first_child = new_tag_idx;
    +
    357 } else {
    +
    358 /* Find the last sibling child. */
    +
    359 tag_child_idx = parser->tags[parser->tag_iter].base.first_child;
    +
    360 debug_printf( MHTML_TRACE_LVL,
    +
    361 "tci: " SSIZE_T_FMT " ns: " SSIZE_T_FMT,
    +
    362 tag_child_idx, parser->tags[tag_child_idx].base.next_sibling );
    +
    363 while(
    +
    364 0 <= tag_child_idx &&
    +
    365 0 <= parser->tags[tag_child_idx].base.next_sibling
    +
    366 ) {
    +
    367 tag_child_idx = parser->tags[tag_child_idx].base.next_sibling;
    +
    368 debug_printf( MHTML_TRACE_LVL,
    +
    369 "tci: " SSIZE_T_FMT, tag_child_idx );
    +
    370 }
    +
    371 assert( 0 <= tag_child_idx );
    +
    372 parser->tags[tag_child_idx].base.next_sibling = new_tag_idx;
    +
    373 }
    +
    374 }
    +
    375
    +
    376 parser->tag_iter = new_tag_idx;
    +
    377
    +
    378cleanup:
    +
    379
    +
    380 return retval;
    +
    381}
    +
    382
    +
    383MERROR_RETVAL mhtml_push_element_tag( struct MHTML_PARSER* parser ) {
    +
    384 MERROR_RETVAL retval = MERROR_OK;
    +
    385 size_t i = 0;
    +
    386
    +
    387 mparser_token_upper( parser, i );
    +
    388
    +
    389 if( 0 == strncmp( "STYLE", parser->token, 6 ) ) {
    +
    390 /* Special case: style tag. Don't push a new tag here, but set a flag for
    +
    391 * the text tag next created by mhtml_push_tag() so the contents are
    +
    392 * directly attached to the style tag.
    +
    393 */
    +
    394 parser->tag_flags |= MHTML_TAG_FLAG_STYLE;
    +
    395 goto cleanup;
    +
    396 }
    +
    397
    +
    398 retval = mhtml_push_tag( parser );
    +
    399 maug_cleanup_if_not_ok();
    +
    400
    +
    401 /* Figure out tag type. */
    +
    402 i = 0;
    +
    403 while( '\0' != gc_mhtml_tag_names[i][0] ) {
    +
    404 if(
    +
    405 parser->token_sz == strlen( gc_mhtml_tag_names[i] ) &&
    +
    406 0 == strncmp(
    +
    407 gc_mhtml_tag_names[i], parser->token, parser->token_sz )
    +
    408 ) {
    +
    409 debug_printf( MHTML_TRACE_LVL,
    +
    410 "new tag (" SSIZE_T_FMT ") type: %s",
    +
    411 parser->tag_iter, gc_mhtml_tag_names[i] );
    +
    412 parser->tags[parser->tag_iter].base.type = i;
    +
    413
    +
    414 if( MHTML_TAG_TYPE_BODY == i ) {
    +
    415 /* Special case: body tag. Keep track of it for later so it can
    +
    416 * be passed to the renderer.
    +
    417 */
    +
    418 assert( -1 == parser->body_idx );
    +
    419 parser->body_idx = parser->tag_iter;
    +
    420 debug_printf( MHTML_TRACE_LVL,
    +
    421 "set body index to: " SSIZE_T_FMT,
    +
    422 parser->body_idx );
    +
    423 }
    +
    424
    +
    425 goto cleanup;
    +
    426 }
    +
    427 i++;
    +
    428 }
    +
    429
    +
    430 error_printf( "could not find type for new tag (" SSIZE_T_FMT ")",
    +
    431 parser->tag_iter );
    +
    432
    +
    433cleanup:
    +
    434
    +
    435 return retval;
    +
    436}
    +
    437
    +
    438MERROR_RETVAL mhtml_push_text_tag( struct MHTML_PARSER* parser ) {
    +
    439 MERROR_RETVAL retval = MERROR_OK;
    +
    440 char* tag_content = NULL;
    +
    441 size_t i = 0;
    +
    442
    +
    443 retval = mhtml_push_tag( parser );
    +
    444 maug_cleanup_if_not_ok();
    +
    445
    +
    446 if(
    +
    447 MHTML_TAG_FLAG_STYLE == (MHTML_TAG_FLAG_STYLE &
    +
    448 parser->tags[parser->tag_iter].base.flags)
    +
    449 ) {
    +
    450 parser->tags[parser->tag_iter].base.type = MHTML_TAG_TYPE_STYLE;
    +
    451 } else {
    +
    452 parser->tags[parser->tag_iter].base.type = MHTML_TAG_TYPE_TEXT;
    +
    453 }
    +
    454
    +
    455 /* Allocate text memory. */
    +
    456 parser->tags[parser->tag_iter].TEXT.content =
    +
    457 maug_malloc( parser->token_sz + 1, 1 );
    +
    458 maug_cleanup_if_null_alloc(
    +
    459 MAUG_MHANDLE, parser->tags[parser->tag_iter].TEXT.content );
    +
    460 maug_mlock( parser->tags[parser->tag_iter].TEXT.content, tag_content );
    +
    461 maug_cleanup_if_null_alloc( char*, tag_content );
    +
    462
    +
    463 if( MHTML_TAG_TYPE_STYLE == parser->tags[parser->tag_iter].base.type ) {
    +
    464 /* TODO: If it's the last character and there's still a token, process it! */
    +
    465 debug_printf( MHTML_TRACE_LVL, "parsing STYLE tag..." );
    +
    466 for( ; parser->token_sz > i ; i++ ) {
    +
    467 retval = mcss_parse_c( &(parser->styler), parser->token[i] );
    +
    468 maug_cleanup_if_not_ok();
    +
    469 }
    +
    470 debug_printf( 1, "out of style characters..." );
    +
    471 mcss_parser_flush( &(parser->styler) );
    +
    472 mcss_parser_reset( &(parser->styler) );
    +
    473 } else {
    +
    474 /* Eliminate trailing spaces. */
    +
    475 while( ' ' == parser->token[parser->token_sz - 1] ) {
    +
    476 parser->token_sz--;
    +
    477 }
    +
    478
    +
    479 /* Copy token to tag text. */
    +
    480 strncpy( tag_content, parser->token, parser->token_sz );
    +
    481 tag_content[parser->token_sz] = '\0';
    +
    482 parser->tags[parser->tag_iter].TEXT.content_sz = parser->token_sz;
    +
    483 }
    +
    484
    +
    485 debug_printf( 1, "done processing tag contents..." );
    +
    486
    +
    487 maug_munlock( parser->tags[parser->tag_iter].TEXT.content, tag_content );
    +
    488
    +
    489cleanup:
    +
    490
    +
    491 return retval;
    +
    492}
    +
    493
    +
    494MERROR_RETVAL mhtml_push_attrib_key( struct MHTML_PARSER* parser ) {
    +
    495 MERROR_RETVAL retval = MERROR_OK;
    +
    496 size_t i = 0;
    +
    497
    +
    498 debug_printf( MHTML_TRACE_LVL, "attrib: %s", parser->token );
    +
    499
    +
    500 mparser_token_upper( parser, i );
    +
    501
    +
    502 /* Figure out attrib type. */
    +
    503 i = 0;
    +
    504 while( '\0' != gc_mhtml_attrib_names[i][0] ) {
    +
    505 if(
    +
    506 parser->token_sz == strlen( gc_mhtml_attrib_names[i] ) &&
    +
    507 0 == strncmp(
    +
    508 gc_mhtml_attrib_names[i], parser->token, parser->token_sz )
    +
    509 ) {
    +
    510 debug_printf( MHTML_TRACE_LVL, "new attrib type: %s", gc_mhtml_attrib_names[i] );
    +
    511 parser->attrib_key = i;
    +
    512 goto cleanup;
    +
    513 }
    +
    514 i++;
    +
    515 }
    +
    516
    +
    517 error_printf( "unknown attrib: %s", parser->token );
    +
    518
    +
    519cleanup:
    +
    520
    +
    521 return retval;
    +
    522}
    +
    523
    +
    524MERROR_RETVAL mhtml_push_attrib_val( struct MHTML_PARSER* parser ) {
    +
    525 MERROR_RETVAL retval = MERROR_OK;
    +
    526 size_t i = 0;
    +
    527
    +
    528 /* TODO: Equip styler to manage its own locking. */
    +
    529 mhtml_parser_lock( parser );
    +
    530
    +
    531 if( MHTML_ATTRIB_KEY_STYLE == parser->attrib_key ) {
    +
    532 debug_printf( MHTML_TRACE_LVL, "style: %s", parser->token );
    +
    533 /* TODO: Parse and attach style. */
    +
    534
    +
    535 retval = mcss_push_style( &(parser->styler) );
    +
    536 maug_cleanup_if_not_ok();
    +
    537
    +
    538 /* Set the new style as this tag's explicit style. */
    +
    539 parser->tags[parser->tag_iter].base.style = parser->styler.styles_sz - 1;
    +
    540
    +
    541 for( ; parser->token_sz > i ; i++ ) {
    +
    542 retval = mcss_parse_c( &(parser->styler), parser->token[i] );
    +
    543 maug_cleanup_if_not_ok();
    +
    544 }
    +
    545 debug_printf( 1, "out of style characters..." );
    +
    546 mcss_parser_flush( &(parser->styler) );
    +
    547
    +
    548 goto cleanup;
    +
    549
    +
    550 } else if( MHTML_ATTRIB_KEY_CLASS == parser->attrib_key ) {
    +
    551 strncpy(
    +
    552 parser->tags[parser->tag_iter].base.classes,
    +
    553 parser->token,
    +
    554 MCSS_CLASS_SZ_MAX );
    +
    555 parser->tags[parser->tag_iter].base.classes_sz = parser->token_sz;
    +
    556
    +
    557 } else if( MHTML_ATTRIB_KEY_ID == parser->attrib_key ) {
    +
    558 strncpy(
    +
    559 parser->tags[parser->tag_iter].base.id,
    +
    560 parser->token,
    +
    561 MCSS_ID_SZ_MAX );
    +
    562 parser->tags[parser->tag_iter].base.id_sz = parser->token_sz;
    +
    563
    +
    564 } else if( MHTML_ATTRIB_KEY_SRC == parser->attrib_key ) {
    +
    565 /* TODO: Validate tag type. */
    +
    566 strncpy(
    +
    567 parser->tags[parser->tag_iter].IMG.src,
    +
    568 parser->token,
    +
    569 MHTML_SRC_HREF_SZ_MAX );
    +
    570 parser->tags[parser->tag_iter].IMG.src_sz = parser->token_sz;
    +
    571
    +
    572 } else if( MHTML_ATTRIB_KEY_TYPE == parser->attrib_key ) {
    +
    573 /* TODO: Validate tag type. */
    +
    574
    +
    575 if( 0 == strncpy( parser->token, "button", 7 ) ) {
    +
    576 parser->tags[parser->tag_iter].INPUT.input_type =
    +
    577 MHTML_INPUT_TYPE_BUTTON;
    +
    578 }
    +
    579
    +
    580 } else if( MHTML_ATTRIB_KEY_NAME == parser->attrib_key ) {
    +
    581 /* TODO: Validate tag type. */
    +
    582 strncpy(
    +
    583 parser->tags[parser->tag_iter].INPUT.name,
    +
    584 parser->token,
    +
    585 MCSS_ID_SZ_MAX );
    +
    586 parser->tags[parser->tag_iter].INPUT.name_sz = parser->token_sz;
    +
    587
    +
    588 } else if( MHTML_ATTRIB_KEY_VALUE == parser->attrib_key ) {
    +
    589 /* TODO: Validate tag type. */
    +
    590 strncpy(
    +
    591 parser->tags[parser->tag_iter].INPUT.value,
    +
    592 parser->token,
    +
    593 MCSS_ID_SZ_MAX );
    +
    594 parser->tags[parser->tag_iter].INPUT.value_sz = parser->token_sz;
    +
    595 }
    +
    596
    +
    597cleanup:
    +
    598
    +
    599 return retval;
    +
    600}
    +
    601
    +
    602MERROR_RETVAL mhtml_parse_c( struct MHTML_PARSER* parser, char c ) {
    +
    603 MERROR_RETVAL retval = MERROR_OK;
    +
    604
    +
    605 switch( c ) {
    +
    606 case '<':
    +
    607 if( MHTML_PSTATE_NONE == mhtml_parser_pstate( parser ) ) {
    +
    608 if( 0 < parser->token_sz ) {
    +
    609 retval = mhtml_push_text_tag( parser );
    +
    610 maug_cleanup_if_not_ok();
    +
    611
    +
    612 if(
    +
    613 /* See special exception in mhtml_push_tag(). Style tags don't
    +
    614 * push their subordinate text, so popping here would be
    +
    615 * uneven!
    +
    616 */
    +
    617 MHTML_TAG_TYPE_STYLE !=
    +
    618 parser->tags[parser->tag_iter].base.type
    +
    619 ) {
    +
    620 /* Pop out of text so next tag isn't a child of it. */
    +
    621 retval = mhtml_pop_tag( parser );
    +
    622 maug_cleanup_if_not_ok();
    +
    623 }
    +
    624 }
    +
    625 mhtml_parser_pstate_push( parser, MHTML_PSTATE_ELEMENT )
    +
    626 mhtml_parser_reset_token( parser );
    +
    627
    +
    628 } else {
    +
    629 mhtml_parser_invalid_c( parser, c, retval );
    +
    630 }
    +
    631 break;
    +
    632
    +
    633 case '>':
    +
    634 if( MHTML_PSTATE_ELEMENT == mhtml_parser_pstate( parser ) ) {
    +
    635 retval = mhtml_push_element_tag( parser );
    +
    636 maug_cleanup_if_not_ok();
    +
    637 mhtml_parser_pstate_pop( parser );
    +
    638 mhtml_parser_reset_token( parser );
    +
    639
    +
    640 } else if( MHTML_PSTATE_ATTRIB_KEY == mhtml_parser_pstate( parser ) ) {
    +
    641 mhtml_parser_pstate_pop( parser );
    +
    642 assert( MHTML_PSTATE_ELEMENT == mhtml_parser_pstate( parser ) );
    +
    643 mhtml_parser_pstate_pop( parser ); /* Pop element. */
    +
    644 mhtml_parser_reset_token( parser );
    +
    645
    +
    646 } else if( MHTML_PSTATE_END_ELEMENT == mhtml_parser_pstate( parser ) ) {
    +
    647
    +
    648 retval = mhtml_pop_tag( parser );
    +
    649 maug_cleanup_if_not_ok();
    +
    650
    +
    651 mhtml_parser_pstate_pop( parser );
    +
    652 if( MHTML_PSTATE_ATTRIB_KEY == mhtml_parser_pstate( parser ) ) {
    +
    653 mhtml_parser_pstate_pop( parser );
    +
    654 }
    +
    655 assert( MHTML_PSTATE_ELEMENT == mhtml_parser_pstate( parser ) );
    +
    656 mhtml_parser_pstate_pop( parser ); /* Pop element. */
    +
    657 mhtml_parser_reset_token( parser );
    +
    658
    +
    659 } else if( MHTML_PSTATE_STRING == mhtml_parser_pstate( parser ) ) {
    +
    660 mhtml_parser_append_token( parser, c );
    +
    661
    +
    662 } else if( MHTML_PSTATE_NONE == mhtml_parser_pstate( parser ) ) {
    +
    663 mhtml_parser_append_token( parser, c );
    +
    664
    +
    665 } else {
    +
    666 mhtml_parser_invalid_c( parser, c, retval );
    +
    667 }
    +
    668 break;
    +
    669
    +
    670 case '/':
    +
    671 if(
    +
    672 MHTML_PSTATE_ELEMENT == mhtml_parser_pstate( parser ) &&
    +
    673 0 == parser->token_sz
    +
    674 ) {
    +
    675 /* Start of a close tag. */
    +
    676 mhtml_parser_pstate_push( parser, MHTML_PSTATE_END_ELEMENT );
    +
    677
    +
    678 } else if( MHTML_PSTATE_ATTRIB_KEY == mhtml_parser_pstate( parser ) ) {
    +
    679 /* Close of a self-closing tag. */
    +
    680 mhtml_parser_pstate_push( parser, MHTML_PSTATE_END_ELEMENT );
    +
    681
    +
    682 } else if( MHTML_PSTATE_STRING == mhtml_parser_pstate( parser ) ) {
    +
    683 mhtml_parser_append_token( parser, c );
    +
    684
    +
    685 } else if( MHTML_PSTATE_NONE == mhtml_parser_pstate( parser ) ) {
    +
    686 mhtml_parser_append_token( parser, c );
    +
    687
    +
    688 } else {
    +
    689 mhtml_parser_invalid_c( parser, c, retval );
    +
    690 }
    +
    691 break;
    +
    692
    +
    693 case '=':
    +
    694 if( MHTML_PSTATE_ATTRIB_KEY == mhtml_parser_pstate( parser ) ) {
    +
    695 retval = mhtml_push_attrib_key( parser );
    +
    696 maug_cleanup_if_not_ok();
    +
    697 mhtml_parser_pstate_push( parser, MHTML_PSTATE_ATTRIB_VAL );
    +
    698 mhtml_parser_reset_token( parser );
    +
    699
    +
    700 } else if( MHTML_PSTATE_ATTRIB_VAL == mhtml_parser_pstate( parser ) ) {
    +
    701 mhtml_parser_append_token( parser, c );
    +
    702
    +
    703 } else if( MHTML_PSTATE_NONE == mhtml_parser_pstate( parser ) ) {
    +
    704 mhtml_parser_append_token( parser, c );
    +
    705
    +
    706 } else {
    +
    707 mhtml_parser_invalid_c( parser, '_', retval );
    +
    708 }
    +
    709 break;
    +
    710
    +
    711 case '"':
    +
    712 if( MHTML_PSTATE_ATTRIB_VAL == mhtml_parser_pstate( parser ) ) {
    +
    713 mhtml_parser_pstate_push( parser, MHTML_PSTATE_STRING );
    +
    714 mhtml_parser_reset_token( parser );
    +
    715
    +
    716 } else if( MHTML_PSTATE_STRING == mhtml_parser_pstate( parser ) ) {
    +
    717 retval = mhtml_push_attrib_val( parser );
    +
    718 maug_cleanup_if_not_ok();
    +
    719 mhtml_parser_pstate_pop( parser );
    +
    720 assert( MHTML_PSTATE_ATTRIB_VAL == mhtml_parser_pstate( parser ) );
    +
    721 mhtml_parser_pstate_pop( parser );
    +
    722 mhtml_parser_reset_token( parser );
    +
    723
    +
    724 } else if( MHTML_PSTATE_NONE == mhtml_parser_pstate( parser ) ) {
    +
    725 mhtml_parser_append_token( parser, c );
    +
    726
    +
    727 } else {
    +
    728 mhtml_parser_invalid_c( parser, '_', retval );
    +
    729 }
    +
    730 break;
    +
    731
    +
    732 case '\r':
    +
    733 case '\n':
    +
    734 case '\t':
    +
    735 break;
    +
    736
    +
    737 case ' ':
    +
    738 if( MHTML_PSTATE_ELEMENT == mhtml_parser_pstate( parser ) ) {
    +
    739 retval = mhtml_push_element_tag( parser );
    +
    740 maug_cleanup_if_not_ok();
    +
    741 mhtml_parser_pstate_push( parser, MHTML_PSTATE_ATTRIB_KEY );
    +
    742 mhtml_parser_reset_token( parser );
    +
    743
    +
    744 } else if( MHTML_PSTATE_STRING == mhtml_parser_pstate( parser ) ) {
    +
    745 mhtml_parser_append_token( parser, c );
    +
    746
    +
    747 } else if( MHTML_PSTATE_ATTRIB_KEY == mhtml_parser_pstate( parser ) ) {
    +
    748 /* Do nothing. */
    +
    749
    +
    750 } else if( MHTML_PSTATE_NONE == mhtml_parser_pstate( parser ) ) {
    +
    751 /* Avoid a token that's only whitespace. */
    +
    752 if(
    +
    753 0 < parser->token_sz &&
    +
    754 ' ' != parser->token[parser->token_sz - 1]
    +
    755 ) {
    +
    756 mhtml_parser_append_token( parser, ' ' );
    +
    757 }
    +
    758
    +
    759 } else {
    +
    760 mhtml_parser_invalid_c( parser, '_', retval );
    +
    761 }
    +
    762 break;
    +
    763
    +
    764 default:
    +
    765 mhtml_parser_append_token( parser, c );
    +
    766 break;
    +
    767 }
    +
    768
    +
    769 parser->i++;
    +
    770
    +
    771cleanup:
    +
    772
    +
    773 mhtml_parser_unlock( parser );
    +
    774
    +
    775 return retval;
    +
    776}
    +
    777
    +
    778MERROR_RETVAL mhtml_parser_init( struct MHTML_PARSER* parser ) {
    +
    779 MERROR_RETVAL retval = MERROR_OK;
    +
    780
    +
    781 assert( 0 == parser->tags_sz );
    +
    782 assert( (MAUG_MHANDLE)NULL == parser->tags );
    +
    783
    +
    784 /* Perform initial tag allocation. */
    +
    785 parser->tags_sz_max = MHTML_PARSER_TAGS_INIT_SZ;
    +
    786 debug_printf( MHTML_TRACE_LVL, "allocating " SIZE_T_FMT " tags...",
    +
    787 parser->tags_sz_max );
    +
    788 parser->tags_h = maug_malloc(
    +
    789 parser->tags_sz_max, sizeof( union MHTML_TAG ) );
    +
    790 assert( (MAUG_MHANDLE)NULL != parser->tags_h );
    +
    791 if( NULL == parser->tags_h ) {
    +
    792 error_printf( "unable to allocate " SIZE_T_FMT " tags!",
    +
    793 parser->tags_sz_max );
    +
    794 goto cleanup;
    +
    795 }
    +
    796
    +
    797 parser->tag_iter = -1;
    +
    798 parser->body_idx = -1;
    +
    799
    +
    800 retval = mcss_parser_init( &(parser->styler) );
    +
    801 maug_cleanup_if_not_ok();
    +
    802
    +
    803cleanup:
    +
    804
    +
    805 return retval;
    +
    806}
    +
    807
    +
    808void mhtml_dump_tree(
    +
    809 struct MHTML_PARSER* parser, ssize_t iter, size_t d
    +
    810) {
    +
    811 size_t i = 0;
    +
    812 char* tag_content = NULL;
    +
    813 char dump_line[MHTML_DUMP_LINE_SZ + 1];
    +
    814
    +
    815 if( 0 > iter ) {
    +
    816 return;
    +
    817 }
    +
    818
    +
    819 for( i = 0 ; d > i ; i++ ) {
    +
    820 maug_snprintf( dump_line, MHTML_DUMP_LINE_SZ, " " );
    +
    821 }
    +
    822 if( MHTML_TAG_TYPE_TEXT == parser->tags[iter].base.type ) {
    +
    823 maug_mlock( parser->tags[iter].TEXT.content, tag_content );
    +
    824 if( NULL == tag_content ) {
    +
    825 error_printf( "could not lock tag content!" );
    +
    826 return;
    +
    827 }
    +
    828
    +
    829 if(
    +
    830 strlen( dump_line ) + 7 /* ("TEXT: \n") */
    +
    831 + strlen( tag_content ) < MHTML_DUMP_LINE_SZ
    +
    832 ) {
    +
    833 maug_snprintf( &(dump_line[strlen( dump_line )]),
    +
    834 MHTML_DUMP_LINE_SZ - strlen( dump_line ),
    +
    835 "TEXT: %s\n", tag_content );
    +
    836 }
    +
    837
    +
    838 maug_munlock( parser->tags[iter].TEXT.content, tag_content );
    +
    839
    +
    840 } else {
    +
    841 if(
    +
    842 strlen( dump_line ) +
    +
    843 strlen( gc_mhtml_tag_names[parser->tags[iter].base.type] ) <
    +
    844 MHTML_DUMP_LINE_SZ
    +
    845 ) {
    +
    846 strcat( dump_line,
    +
    847 gc_mhtml_tag_names[parser->tags[iter].base.type] );
    +
    848 }
    +
    849
    +
    850 if(
    +
    851 0 <= parser->tags[iter].base.style &&
    +
    852 strlen( dump_line ) + 9 /* (styled) */ < MHTML_DUMP_LINE_SZ
    +
    853 ) {
    +
    854 strcat( dump_line, " (styled)" );
    +
    855 }
    +
    856
    +
    857 if(
    +
    858 0 < parser->tags[iter].base.id_sz &&
    +
    859 strlen( dump_line ) + 7 /* (id: ) */
    +
    860 + strlen( parser->tags[iter].base.id ) < MHTML_DUMP_LINE_SZ
    +
    861 ) {
    +
    862 maug_snprintf( &(dump_line[strlen( dump_line )]),
    +
    863 MHTML_DUMP_LINE_SZ - strlen( dump_line ),
    +
    864 " (id: %s)", parser->tags[iter].base.id );
    +
    865 }
    +
    866
    +
    867 if(
    +
    868 0 < parser->tags[iter].base.classes_sz &&
    +
    869 strlen( dump_line ) + 12 /* (classes: ) */
    +
    870 + strlen( parser->tags[iter].base.id ) < MHTML_DUMP_LINE_SZ
    +
    871 ) {
    +
    872 maug_snprintf( &(dump_line[strlen( dump_line )]),
    +
    873 MHTML_DUMP_LINE_SZ - strlen( dump_line ),
    +
    874 " (classes: %s)", parser->tags[iter].base.classes );
    +
    875 }
    +
    876
    +
    877 if(
    +
    878 MHTML_TAG_TYPE_IMG == parser->tags[iter].base.type &&
    +
    879 0 < parser->tags[iter].IMG.src_sz &&
    +
    880 strlen( dump_line ) + 8 /* (src: ) */
    +
    881 + strlen( parser->tags[iter].IMG.src ) < MHTML_DUMP_LINE_SZ
    +
    882 ) {
    +
    883 maug_snprintf( &(dump_line[strlen( dump_line )]),
    +
    884 MHTML_DUMP_LINE_SZ - strlen( dump_line ),
    +
    885 " (src: %s)", parser->tags[iter].IMG.src );
    +
    886 }
    +
    887
    +
    888 if(
    +
    889 MHTML_TAG_TYPE_INPUT == parser->tags[iter].base.type &&
    +
    890 0 < parser->tags[iter].INPUT.value_sz &&
    +
    891 strlen( dump_line ) + 10 /* (value: ) */
    +
    892 + strlen( parser->tags[iter].INPUT.value ) < MHTML_DUMP_LINE_SZ
    +
    893 ) {
    +
    894 maug_snprintf( &(dump_line[strlen( dump_line )]),
    +
    895 MHTML_DUMP_LINE_SZ - strlen( dump_line ),
    +
    896 " (value: %s)", parser->tags[iter].INPUT.value );
    +
    897 }
    +
    898
    +
    899 }
    +
    900
    +
    901 debug_printf( 1, "%s", dump_line );
    +
    902
    +
    903 mhtml_dump_tree( parser, parser->tags[iter].base.first_child, d + 1 );
    +
    904
    +
    905 mhtml_dump_tree( parser, parser->tags[iter].base.next_sibling, d );
    +
    906}
    +
    907
    +
    908#else
    +
    909
    +
    910#define MHTML_TAG_TABLE_CONST( tag_id, tag_name, fields, disp ) \
    +
    911 extern MAUG_CONST uint16_t SEG_MCONST MHTML_TAG_TYPE_ ## tag_name;
    +
    912
    +
    913MHTML_TAG_TABLE( MHTML_TAG_TABLE_CONST )
    +
    914
    +
    915extern MAUG_CONST char* SEG_MCONST gc_mhtml_tag_names[];
    +
    916
    +
    917#endif /* MHTML_C */
    +
    918
    +
    919#endif /* !MHTML_H */
    +
    920
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    #define maug_mrealloc(handle, nmemb, sz)
    Definition mmem.h:53
    +
    Definition mhtml.h:148
    +
    uint8_t tag_flags
    Flags to be pushed to MHTML_TAG_BASE::flags on next mhtml_push_tag().
    Definition mhtml.h:164
    +
    Definition mhtml.h:119
    +
    Definition mhtml.h:143
    +
    + + +
    + + diff --git a/minus.svg b/minus.svg new file mode 100644 index 00000000..f70d0c1a --- /dev/null +++ b/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/minusd.svg b/minusd.svg new file mode 100644 index 00000000..5f8e8796 --- /dev/null +++ b/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mmem_8h.html b/mmem_8h.html new file mode 100644 index 00000000..04414025 --- /dev/null +++ b/mmem_8h.html @@ -0,0 +1,151 @@ + + + + + + + +maug: mmem.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    mmem.h File Reference
    +
    +
    +
    #include <stdlib.h>
    +
    +Include dependency graph for mmem.h:
    +
    +
    + + + + + +
    +
    +

    Go to the source code of this file.

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

    +Macros

    +#define maug_malloc(nmemb, sz)   malloc( sz * nmemb )
     
    #define maug_mrealloc(handle, nmemb, sz)   realloc( handle, (sz) * (nmemb) )
     
    #define maug_mzero(ptr, sz)   memset( ptr, '\0', sz )
     Zero the block of memory pointed to by ptr.
     
    +#define maug_mcpy(ptr_dest, ptr_src, sz)   memcpy( ptr_dest, ptr_src, sz )
     
    +#define maug_mfree(handle)   free( handle ); handle = NULL;
     
    +#define maug_mlock(handle, ptr)   ptr = handle; handle = NULL;
     
    +#define maug_munlock(handle, ptr)   handle = ptr; ptr = NULL;
     
    #define maug_mrealloc_test(new_handle, handle, nmemb, sz)
     
    + + + +

    +Typedefs

    +typedef void * MAUG_MHANDLE
     
    +
    + + +
    + + diff --git a/mmem_8h__incl.map b/mmem_8h__incl.map new file mode 100644 index 00000000..cef90fd3 --- /dev/null +++ b/mmem_8h__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/mmem_8h__incl.md5 b/mmem_8h__incl.md5 new file mode 100644 index 00000000..e2ad9d49 --- /dev/null +++ b/mmem_8h__incl.md5 @@ -0,0 +1 @@ +89d3351e1249431ee676ca62c37a40f2 \ No newline at end of file diff --git a/mmem_8h__incl.png b/mmem_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..224b83f5b56bf7b3a5300e705c31bcb18f43a941 GIT binary patch literal 2240 zcmbVOXIPWT77mCZN(T{FK}bRukTnuEQ3mxfIdT)Y2 zAg~asG${cLC?GYIp!Bkzf9`Yd{=CmTXU>mz=AAin&b%`OLyQ*3*^6gEAP|R+HrfdA zzswZ^2Kwq)v_9a#*1B3~(8;fs(Ucbh0zqErpw*0VDfCnqXFUsMioe~yCPF{%t!B6B zBiTFRCM9?y7q~q<$t3eNuRg)xit|fuv^}bpkpJzJBY}ad^}WnPQr3fn#@esE@Tzi{ z(BwCnjFzSwBJ6INjoeSIwfh6Ha;RFLXZLAuI^A7$v#J?n zGX~LG$7a+$#3zAKUN`?vZHngpCILlnZnS&onu5eq+3>-Kcl7ka+J@`k{QUe)@t5A- zq@2h;%z;&FYuHDH48Zs^HKe}<@lpo{S~h1XLPOhJVnfyyhWGBxM%MaEMn&ZGBQE(k z*xR=_BN5(=r`AZ*#U z7WyUR<=tB7f992zMy!mLZ5b|0o=iu>Du+iUrluti-vEHDYlp z)*?qs9#MJ|5nY{~BFf4sLqkJMJJiJOZR}{NMJO;^K_PBt=CNfHUg0S#idM~Zcz6hb zKtL^HV*N`>uKRz^zbn*3qtX7d zT>m7=vjk~uY=p3}!Bte6bnA&kuD-s$zg)-K+HCR%@$Juu6T`Xs*_D;NTwGio;g^C2 z?dLk9;Kn8<9Calho=;m>mTa%^{PbNF)#lyy`N-xBMC{IKl*PMt630MjXWfE8ol2d-7v(5QM|yuf13{ zWwhXtJ=7STJ`FD_ zDhfgbO%9`S$dB`@sLstzz6YbfdE-Uwp7nva=kwAOm3r>8gHfqf2=;fYS1LshLS&Yj zb3F$S{;OI6uGi-aAhJe0|0?7E3qTVaE~a$t_jr`PmNOtn2abT$8J-IsOz$O(+DpFn z?x>hAzZJWLJG;vkh=o=hl^KE{TQ`u%BFsXA zG%Cf5S+@8;q`41My_IH-U|#Fzky1C=s&^jf49I0JjPU zhu2;bR@>flBCWbeFsDep<=OuJ<0R>0`QlfrE%Tb9plHMolD9u^^u0DA%4Kt-oS;R| zt?k-7=8T{{IVlD%WcNm(KZxO!cupIN^KgvXP2kJ^Nze^piA073M8K=m7!TB=_~5<* z3H$`sTe_R{j+eLP z{$j;6LhvT@Z7deq-hR}~(oMrlU%*BI_sI6=^2n*IM?dN`dZmxJ`Wo2+kh&4Izv@&kv z_U42i84B}S9VhQ@&emh;7g;$4Gcqy)C`4hKYl(`u4G|t5o~g#Yc>xK4Vg74dP>PCA zJizI>`AtLB?{NINuom&M7y=PfbieG{bDAgLc7Ui{3>)};+=4p~4_|7AT~Nd0{{Zwy{OZ-R zv4wyeH*O4%j*iY(j6$JM$l%E;El0<~KbYt8Wef_1BI3zpvd{_gf}oeP39YivHk(9B zOGyy~o)jr*>8#@7;;}O5@$vEQ{ysMG36N2Z?&Ae_Cnu){nX%8G|BTw^*XmvwA~L`n zVB~X}o}ZtptgI{qT5cv|VR?ISVj`r^76l;>z1O8y*>M56YQ${@S~Os(BL?p7zmJt# zWET_=P(hq`t*rW6->?-F7JdW97Tzzi5@bx97#g;uDtWzAa5|rum?$bHR^j^P574im zH#S7%xn3IEp<48>c>x6V3A6O4*n3Kv<%F>YjAGumh(u^^BSX5XD{+T4{ zr3E=~MOApIG7QuqC(t=}JMc*^GF&rz5VT>nSh*jyJhU + + + + + + +maug: mmem.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    mmem.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef MMEM_H
    +
    3#define MMEM_H
    +
    4
    +
    11#if defined( MAUG_OS_PALM )
    +
    12
    +
    13/* TODO */
    +
    14#pragma message( "warning: not implemented!" )
    +
    15
    +
    16#elif defined( MAUG_OS_DOS_REAL )
    +
    17
    +
    18#include <stdlib.h> /* malloc() */
    +
    19
    +
    20typedef void* MAUG_MHANDLE;
    +
    21
    +
    22/* TODO: These need refinement/tuning for DOS low-memory/segments! */
    +
    23#define maug_malloc( nmemb, sz ) malloc( sz * nmemb )
    +
    24
    +
    29#define maug_mrealloc( handle, nmemb, sz ) realloc( handle, (sz) * (nmemb) )
    +
    30
    +
    31#define maug_mzero( ptr, sz ) memset( ptr, '\0', sz )
    +
    32
    +
    33#define maug_mcpy( ptr_dest, ptr_src, sz ) memcpy( ptr_dest, ptr_src, sz )
    +
    34
    +
    35#define maug_mfree( handle ) free( handle ); handle = NULL;
    +
    36
    +
    37#define maug_mlock( handle, ptr ) ptr = handle; handle = NULL;
    +
    38
    +
    39#define maug_munlock( handle, ptr ) handle = ptr; ptr = NULL;
    +
    40
    +
    41#else
    +
    42
    +
    43# include <stdlib.h> /* For *alloc() */
    +
    44
    +
    45typedef void* MAUG_MHANDLE;
    +
    46
    +
    47#define maug_malloc( nmemb, sz ) malloc( sz * nmemb )
    +
    48
    +
    53#define maug_mrealloc( handle, nmemb, sz ) realloc( handle, (sz) * (nmemb) )
    +
    54
    +
    60#define maug_mzero( ptr, sz ) memset( ptr, '\0', sz )
    +
    61
    +
    62#define maug_mcpy( ptr_dest, ptr_src, sz ) memcpy( ptr_dest, ptr_src, sz )
    +
    63
    +
    64#define maug_mfree( handle ) free( handle ); handle = NULL;
    +
    65
    +
    66#define maug_mlock( handle, ptr ) ptr = handle; handle = NULL;
    +
    67
    +
    68#define maug_munlock( handle, ptr ) handle = ptr; ptr = NULL;
    +
    69
    +
    70#endif
    +
    71
    +
    72#define maug_mrealloc_test( new_handle, handle, nmemb, sz ) \
    +
    73 maug_cleanup_if_lt_overflow( (sz) * (nmemb), sz ); \
    +
    74 new_handle = maug_mrealloc( handle, nmemb, sz ); \
    +
    75 maug_cleanup_if_null_alloc( MAUG_MHANDLE, new_handle ); \
    +
    76 handle = new_handle;
    +
    77
    +
    78 /* maug_mem */
    +
    79
    +
    80#endif /* !MMEM_H */
    +
    81
    +
    + + +
    + + diff --git a/mplug_8h_source.html b/mplug_8h_source.html new file mode 100644 index 00000000..bfb843a7 --- /dev/null +++ b/mplug_8h_source.html @@ -0,0 +1,216 @@ + + + + + + + +maug: mplug.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    mplug.h
    +
    +
    +
    1
    +
    2#ifndef MPLUG_H
    +
    3#define MPLUG_H
    +
    4
    +
    5typedef MERROR_RETVAL (*mplug_proc_t)( void* data, size_t data_sz );
    +
    6
    +
    7/* TODO: Have plugins have a way to set log output. */
    +
    8
    +
    9#ifdef RETROFLAT_OS_WIN
    +
    10typedef HMODULE mplug_mod_t;
    +
    11# define MPLUG_EXPORT extern __declspec( dllexport )
    +
    12#else
    +
    13typedef void* mplug_mod_t;
    +
    14# define MPLUG_EXPORT
    +
    15#endif /* RETROFLAT_OS_WIN */
    +
    16
    +
    17MERROR_RETVAL mplug_load(
    +
    18 const char* plugin_path, mplug_mod_t* p_mod_exe );
    +
    19
    +
    20MERROR_RETVAL mplug_call(
    +
    21 mplug_mod_t mod_exe, const char* proc_name, void* data, size_t data_sz );
    +
    22
    +
    23void mplug_free( mplug_mod_t mod_exe );
    +
    24
    +
    25#ifdef MPLUG_C
    +
    26
    +
    27#if defined( RETROFLAT_OS_UNIX )
    +
    28# include <dlfcn.h>
    +
    29#endif /* RETROFLAT_OS_WIN */
    +
    30
    +
    31MERROR_RETVAL mplug_load(
    +
    32 const char* plugin_basename, mplug_mod_t* p_mod_exe
    +
    33) {
    +
    34 MERROR_RETVAL retval = MERROR_OK;
    +
    35 char plugin_path[MAUG_PATH_SZ_MAX + 1];
    +
    36#ifdef RETROFLAT_OS_WIN
    +
    37 size_t i = 0;
    +
    38#endif /* RETROFLAT_OS_WIN */
    +
    39
    +
    40 memset( plugin_path, '\0', MAUG_PATH_SZ_MAX + 1 );
    +
    41
    +
    42#if defined( RETROFLAT_OS_UNIX )
    +
    43 maug_snprintf( plugin_path, MAUG_PATH_SZ_MAX, "%s.so", plugin_basename );
    +
    44 *p_mod_exe = dlopen( plugin_path, RTLD_LAZY );
    +
    45#elif defined( RETROFLAT_OS_WIN )
    +
    46 maug_snprintf(
    +
    47 plugin_path, MAUG_PATH_SZ_MAX, "%s.dll", plugin_basename );
    +
    48 for( i = 0 ; MAUG_PATH_SZ_MAX > i ; i++ ) {
    +
    49 if( '/' == plugin_path[i] ) {
    +
    50 plugin_path[i] = '\\';
    +
    51 }
    +
    52 }
    +
    53 *p_mod_exe = LoadLibrary( plugin_path );
    +
    54#else
    +
    55# pragma message( "warning: dlopen undefined!" )
    +
    56#endif /* RETROFLAT_OS_UNIX */
    +
    57
    +
    58 if( NULL == *p_mod_exe ) {
    +
    59 error_printf( "unable to load module: %s", plugin_path );
    +
    60 retval = MERROR_FILE;
    +
    61 }
    +
    62
    +
    63 return retval;
    +
    64}
    +
    65
    +
    66MERROR_RETVAL mplug_call(
    +
    67 mplug_mod_t mod_exe, const char* proc_name, void* data, size_t data_sz
    +
    68) {
    +
    69 MERROR_RETVAL retval = MERROR_OK;
    +
    70 mplug_proc_t plugin_proc = (mplug_proc_t)NULL;
    +
    71#ifdef RETROFLAT_OS_WIN
    +
    72 char proc_name_ex[MAUG_PATH_SZ_MAX + 1];
    +
    73#endif /* RETROFLAT_OS_WIN */
    +
    74
    +
    75#ifdef RETROFLAT_OS_UNIX
    +
    76 plugin_proc = dlsym( mod_exe, proc_name );
    +
    77#elif defined( RETROFLAT_OS_WIN )
    +
    78 memset( proc_name_ex, '\0', MAUG_PATH_SZ_MAX + 1 );
    +
    79
    +
    80 /* Append a _ to the proc_name to match calling convention name scheme. */
    +
    81 maug_snprintf( proc_name_ex, MAUG_PATH_SZ_MAX, "%s_", proc_name );
    +
    82 plugin_proc = (mplug_proc_t)GetProcAddress( mod_exe, proc_name_ex );
    +
    83#else
    +
    84# pragma message( "dlsym undefined!" )
    +
    85#endif
    +
    86
    +
    87 if( (mplug_proc_t)NULL == plugin_proc ) {
    +
    88 error_printf( "unable to load proc: %s", proc_name );
    +
    89 retval = MERROR_FILE;
    +
    90 goto cleanup;
    +
    91 }
    +
    92
    +
    93 retval = plugin_proc( data, data_sz );
    +
    94
    +
    95cleanup:
    +
    96 return retval;
    +
    97}
    +
    98
    +
    99void mplug_free( mplug_mod_t mod_exe ) {
    +
    100#ifdef RETROFLAT_OS_UNIX
    +
    101 dlclose( mod_exe );
    +
    102#elif defined( RETROFLAT_OS_WIN )
    +
    103 FreeLibrary( mod_exe );
    +
    104#else
    +
    105# pragma message( "dlclose undefined!" )
    +
    106#endif /* RETROFLAT_OS_UNIX || RETROFLAT_OS_WIN */
    +
    107}
    +
    108
    +
    109#endif /* MPLUG_C */
    +
    110
    +
    111#endif /* !MPLUG_H */
    +
    112
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    + + +
    + + diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..72a58a529ed3a9ed6aa0c51a79cf207e026deee2 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQVE_ejv*C{Z|{2ZH7M}7UYxc) zn!W8uqtnIQ>_z8U literal 0 HcmV?d00001 diff --git a/nav_fd.png b/nav_fd.png new file mode 100644 index 0000000000000000000000000000000000000000..032fbdd4c54f54fa9a2e6423b94ef4b2ebdfaceb GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQU#tajv*C{Z|C~*H7f|XvG1G8 zt7aS*L7xwMeS}!z6R#{C5tIw-s~AJ==F^i}x3XyJseHR@yF& zerFf(Zf;Dd{+(0lDIROL@Sj-Ju2JQ8&-n%4%q?>|^bShc&lR?}7HeMo@BDl5N(aHY Uj$gdr1MOz;boFyt=akR{0D!zeaR2}S literal 0 HcmV?d00001 diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 0000000000000000000000000000000000000000..2093a237a94f6c83e19ec6e5fd42f7ddabdafa81 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrB!3HFm1ilyoDK$?Q$B+ufw|5PB85lU25BhtE tr?otc=hd~V+ws&_A@j8Fiv!KF$B+ufw|5=67#uj90@pIL wZ=Q8~_Ju`#59=RjDrmm`tMD@M=!-l18IR?&vFVdQ&MBb@0HFXL6W-eg#Jd_@e6*DPn)w;=|1H}Zvm9l6xXXB%>yL=NQU;mg M>FVdQ&MBb@0Bdt1Qvd(} literal 0 HcmV?d00001 diff --git a/navtree.css b/navtree.css new file mode 100644 index 00000000..69211d4a --- /dev/null +++ b/navtree.css @@ -0,0 +1,149 @@ +#nav-tree .children_ul { + margin:0; + padding:4px; +} + +#nav-tree ul { + list-style:none outside none; + margin:0px; + padding:0px; +} + +#nav-tree li { + white-space:nowrap; + margin:0px; + padding:0px; +} + +#nav-tree .plus { + margin:0px; +} + +#nav-tree .selected { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + color: var(--nav-text-active-color); + text-shadow: var(--nav-text-active-shadow); +} + +#nav-tree .selected .arrow { + color: var(--nav-arrow-selected-color); + text-shadow: none; +} + +#nav-tree img { + margin:0px; + padding:0px; + border:0px; + vertical-align: middle; +} + +#nav-tree a { + text-decoration:none; + padding:0px; + margin:0px; +} + +#nav-tree .label { + margin:0px; + padding:0px; + font: 12px var(--font-family-nav); +} + +#nav-tree .label a { + padding:2px; +} + +#nav-tree .selected a { + text-decoration:none; + color:var(--nav-text-active-color); +} + +#nav-tree .children_ul { + margin:0px; + padding:0px; +} + +#nav-tree .item { + margin:0px; + padding:0px; +} + +#nav-tree { + padding: 0px 0px; + font-size:14px; + overflow:auto; +} + +#doc-content { + overflow:auto; + display:block; + padding:0px; + margin:0px; + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#side-nav { + padding:0 6px 0 0; + margin: 0px; + display:block; + position: absolute; + left: 0px; + width: $width; + overflow : hidden; +} + +.ui-resizable .ui-resizable-handle { + display:block; +} + +.ui-resizable-e { + background-image:var(--nav-splitbar-image); + background-size:100%; + background-repeat:repeat-y; + background-attachment: scroll; + cursor:ew-resize; + height:100%; + right:0; + top:0; + width:6px; +} + +.ui-resizable-handle { + display:none; + font-size:0.1px; + position:absolute; + z-index:1; +} + +#nav-tree-contents { + margin: 6px 0px 0px 0px; +} + +#nav-tree { + background-repeat:repeat-x; + background-color: var(--nav-background-color); + -webkit-overflow-scrolling : touch; /* iOS 5+ */ +} + +#nav-sync { + position:absolute; + top:5px; + right:24px; + z-index:0; +} + +#nav-sync img { + opacity:0.3; +} + +#nav-sync img:hover { + opacity:0.9; +} + +@media print +{ + #nav-tree { display: none; } + div.ui-resizable-handle { display: none; position: relative; } +} + diff --git a/open.png b/open.png new file mode 100644 index 0000000000000000000000000000000000000000..30f75c7efe2dd0c9e956e35b69777a02751f048b GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{VPM$7~Ar*{o?;hlAFyLXmaDC0y znK1_#cQqJWPES%4Uujug^TE?jMft$}Eq^WaR~)%f)vSNs&gek&x%A9X9sM + + + + + + +maug: Related Pages + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    + + +
     Todo List
    +
    +
    + + +
    + + diff --git a/plus.svg b/plus.svg new file mode 100644 index 00000000..07520165 --- /dev/null +++ b/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plusd.svg b/plusd.svg new file mode 100644 index 00000000..0c65bfe9 --- /dev/null +++ b/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/resize.js b/resize.js new file mode 100644 index 00000000..7d8cdc7d --- /dev/null +++ b/resize.js @@ -0,0 +1,145 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +function initResizable(treeview) { + let sidenav,navtree,content,header,footer,barWidth=6; + const RESIZE_COOKIE_NAME = ''+'width'; + + function resizeWidth() { + const sidenavWidth = $(sidenav).outerWidth(); + content.css({marginLeft:parseInt(sidenavWidth)+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(sidenavWidth)+"px"}); + } + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + function restoreWidth(navWidth) { + content.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + if (typeof page_layout!=='undefined' && page_layout==1) { + footer.css({marginLeft:parseInt(navWidth)+barWidth+"px"}); + } + sidenav.css({width:navWidth + "px"}); + } + + function resizeHeight(treeview) { + const headerHeight = header.outerHeight(); + const windowHeight = $(window).height(); + let contentHeight; + if (treeview) + { + const footerHeight = footer.outerHeight(); + let navtreeHeight,sideNavHeight; + if (typeof page_layout==='undefined' || page_layout==0) { /* DISABLE_INDEX=NO */ + contentHeight = windowHeight - headerHeight - footerHeight; + navtreeHeight = contentHeight; + sideNavHeight = contentHeight; + } else if (page_layout==1) { /* DISABLE_INDEX=YES */ + contentHeight = windowHeight - footerHeight; + navtreeHeight = windowHeight - headerHeight; + sideNavHeight = windowHeight; + } + navtree.css({height:navtreeHeight + "px"}); + sidenav.css({height:sideNavHeight + "px"}); + } + else + { + contentHeight = windowHeight - headerHeight; + } + content.css({height:contentHeight + "px"}); + if (location.hash.slice(1)) { + (document.getElementById(location.hash.slice(1))||document.body).scrollIntoView(); + } + } + + function collapseExpand() { + let newWidth; + if (sidenav.width()>0) { + newWidth=0; + } else { + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + newWidth = (width>250 && width<$(window).width()) ? width : 250; + } + restoreWidth(newWidth); + const sidenavWidth = $(sidenav).outerWidth(); + Cookie.writeSetting(RESIZE_COOKIE_NAME,sidenavWidth-barWidth); + } + + header = $("#top"); + content = $("#doc-content"); + footer = $("#nav-path"); + sidenav = $("#side-nav"); + if (!treeview) { +// title = $("#titlearea"); +// titleH = $(title).height(); +// let animating = false; +// content.on("scroll", function() { +// slideOpts = { duration: 200, +// step: function() { +// contentHeight = $(window).height() - header.outerHeight(); +// content.css({ height : contentHeight + "px" }); +// }, +// done: function() { animating=false; } +// }; +// if (content.scrollTop()>titleH && title.css('display')!='none' && !animating) { +// title.slideUp(slideOpts); +// animating=true; +// } else if (content.scrollTop()<=titleH && title.css('display')=='none' && !animating) { +// title.slideDown(slideOpts); +// animating=true; +// } +// }); + } else { + navtree = $("#nav-tree"); + $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } }); + $(sidenav).resizable({ minWidth: 0 }); + } + $(window).resize(function() { resizeHeight(treeview); }); + if (treeview) + { + const device = navigator.userAgent.toLowerCase(); + const touch_device = device.match(/(iphone|ipod|ipad|android)/); + if (touch_device) { /* wider split bar for touch only devices */ + $(sidenav).css({ paddingRight:'20px' }); + $('.ui-resizable-e').css({ width:'20px' }); + $('#nav-sync').css({ right:'34px' }); + barWidth=20; + } + const width = Cookie.readSetting(RESIZE_COOKIE_NAME,250); + if (width) { restoreWidth(width); } else { resizeWidth(); } + } + resizeHeight(treeview); + const url = location.href; + const i=url.indexOf("#"); + if (i>=0) window.location.hash=url.substr(i); + const _preventDefault = function(evt) { evt.preventDefault(); }; + if (treeview) + { + $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault); + $(".ui-resizable-handle").dblclick(collapseExpand); + } + $(window).on('load',resizeHeight); +} +/* @license-end */ diff --git a/retrocon_8h_source.html b/retrocon_8h_source.html new file mode 100644 index 00000000..6b6bb2d3 --- /dev/null +++ b/retrocon_8h_source.html @@ -0,0 +1,493 @@ + + + + + + + +maug: retrocon.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrocon.h
    +
    +
    +
    1
    +
    2#ifndef RETROCON_H
    +
    3#define RETROCON_H
    +
    4
    +
    5#ifdef RETROFLAT_OS_DOS_REAL
    +
    6# define RETROCON_DISABLE
    +
    7#endif
    +
    8
    +
    9/* TODO: Use new retrofont API. */
    +
    10
    +
    11#define RETROCON_DEBOUNCE_WAIT 3
    +
    12
    +
    13#define RETROCON_FLAG_ACTIVE 0x01
    +
    14
    +
    15#ifdef RETROCON_DISABLE
    +
    16
    +
    17struct RETROCON {
    +
    18 uint8_t flags;
    +
    19 RETROFLAT_COLOR lbuffer_color;
    +
    20 RETROFLAT_COLOR sbuffer_color;
    +
    21 RETROFLAT_COLOR bg_color;
    +
    22};
    +
    23
    +
    24# define retrocon_init( con ) (MERROR_OK)
    +
    25
    +
    26# define retrocon_add_command( con, cmd, cb, cb_data )
    +
    27
    +
    28# define retrocon_display( con, display )
    +
    29
    +
    30# define retrocon_print_line( con, line )
    +
    31
    +
    32# define retrocon_exec_line( con, line, line_sz )
    +
    33
    +
    34# define retrocon_debounce( con, c )
    +
    35
    +
    36# define retrocon_input( con, p_c, input_evt )
    +
    37
    +
    38#else
    +
    39
    +
    45#ifndef RETROCON_SBUFFER_SZ_MAX
    +
    46# define RETROCON_SBUFFER_SZ_MAX 4096
    +
    47#endif /* !RETROCON_SBUFFER_SZ_MAX */
    +
    48
    +
    49#ifndef RETROCON_SBUFFER_LINES_MAX
    +
    50# define RETROCON_SBUFFER_LINES_MAX 30
    +
    51#endif /* !RETROCON_SBUFFER_LINES_MAX */
    +
    52
    +
    53#ifndef RETROCON_LBUFFER_SZ_MAX
    +
    54# define RETROCON_LBUFFER_SZ_MAX 256
    +
    55#endif /* !RETROCON_LBUFFER_SZ_MAX */
    +
    56
    +
    57#ifndef RETROCON_ACTIVE_KEY
    +
    58# define RETROCON_ACTIVE_KEY RETROFLAT_KEY_GRAVE
    +
    59#endif /* !RETROCON_ACTIVE_KEY */
    +
    60
    +
    61#ifndef RETROCON_CB_NAME_SZ_MAX
    +
    62# define RETROCON_CB_NAME_SZ_MAX 32
    +
    63#endif /* !RETROCON_CB_NAME_SZ_MAX */
    +
    64
    +
    65#ifndef RETROCON_CB_SZ_MAX
    +
    66# define RETROCON_CB_SZ_MAX 128
    +
    67#endif /* !RETROCON_CB_SZ_MAX */
    +
    68
    +
    69#ifndef RETROCON_WIN_H
    +
    70# define RETROCON_WIN_H 110
    +
    71#endif /* !RETROCON_WIN_H */
    +
    72
    +
    73struct RETROCON;
    +
    74
    +
    75typedef MERROR_RETVAL (*retrocon_cb)(
    +
    76 struct RETROCON* con, const char* line, size_t line_sz, void* data );
    +
    77
    +
    +
    78struct RETROCON {
    +
    79 uint8_t flags;
    +
    80 int input_prev;
    +
    81 int debounce_wait;
    +
    82 char sbuffer[RETROCON_SBUFFER_SZ_MAX + 1];
    +
    83 size_t sbuffer_sz;
    +
    84 size_t sbuffer_lines[RETROCON_SBUFFER_LINES_MAX];
    +
    85 size_t sbuffer_lines_sz;
    +
    86 char lbuffer[RETROCON_LBUFFER_SZ_MAX + 1];
    +
    87 size_t lbuffer_sz;
    +
    88 void* callback_data[RETROCON_CB_SZ_MAX];
    +
    89 char callback_names[RETROCON_CB_SZ_MAX][RETROCON_CB_NAME_SZ_MAX + 1];
    +
    90 retrocon_cb callbacks[RETROCON_CB_SZ_MAX];
    +
    91 size_t callbacks_sz;
    +
    92 RETROFLAT_COLOR lbuffer_color;
    +
    93 RETROFLAT_COLOR sbuffer_color;
    +
    94 RETROFLAT_COLOR bg_color;
    +
    95};
    +
    +
    96
    +
    97MERROR_RETVAL retrocon_init( struct RETROCON* con );
    +
    98
    +
    99MERROR_RETVAL retrocon_add_command(
    +
    100 struct RETROCON* con, const char* cmd, retrocon_cb cb, void* cb_data );
    +
    101
    +
    102MERROR_RETVAL retrocon_display(
    +
    103 struct RETROCON* con, struct RETROFLAT_BITMAP* display );
    +
    104
    +
    105void retrocon_print_line( struct RETROCON* con, const char* line );
    +
    106
    +
    107MERROR_RETVAL retrocon_exec_line(
    +
    108 struct RETROCON* con, const char* line, size_t line_sz );
    +
    109
    +
    110int retrocon_debounce( struct RETROCON* con, int c );
    +
    111
    + +
    121 struct RETROCON* con, RETROFLAT_IN_KEY* p_c,
    +
    122 struct RETROFLAT_INPUT* input_evt );
    +
    123
    +
    124#ifdef RETROCON_C
    +
    125
    +
    126static MERROR_RETVAL retrocon_cmd_print(
    +
    127 struct RETROCON* con, const char* line, size_t line_sz, void* data
    +
    128) {
    +
    129 MERROR_RETVAL retval = MERROR_OK;
    +
    130 char* print_line = NULL;
    +
    131
    +
    132 print_line = strchr( line, ' ' );
    +
    133 if( NULL == print_line ) {
    +
    134 /* Not technically an error. */
    +
    135 goto cleanup;
    +
    136 }
    +
    137
    +
    138 /* Skip space. */
    +
    139 print_line++;
    +
    140
    +
    141 retrocon_print_line( con, print_line );
    +
    142
    +
    143cleanup:
    +
    144
    +
    145 return retval;
    +
    146}
    +
    147
    +
    148static MERROR_RETVAL retrocon_cmd_quit(
    +
    149 struct RETROCON* con, const char* line, size_t line_sz, void* data
    +
    150) {
    +
    151 MERROR_RETVAL retval = MERROR_OK;
    +
    152
    +
    153 retroflat_quit( 0 );
    +
    154
    +
    155 return retval;
    +
    156}
    +
    157
    +
    158MERROR_RETVAL retrocon_init( struct RETROCON* con ) {
    +
    159 MERROR_RETVAL retval = MERROR_OK;
    +
    160
    +
    161 con->sbuffer_color = RETROFLAT_COLOR_DARKBLUE;
    +
    162 con->lbuffer_color = RETROFLAT_COLOR_BLACK;
    +
    163 con->bg_color = RETROFLAT_COLOR_WHITE;
    +
    164
    +
    165 retval = retrocon_add_command( con, "PRINT", retrocon_cmd_print, NULL );
    +
    166 retval = retrocon_add_command( con, "QUIT", retrocon_cmd_quit, NULL );
    +
    167
    +
    168 return retval;
    +
    169}
    +
    170
    +
    171MERROR_RETVAL retrocon_add_command(
    +
    172 struct RETROCON* con, const char* cmd, retrocon_cb cb, void* cb_data
    +
    173) {
    +
    174 MERROR_RETVAL retval = MERROR_OK;
    +
    175
    +
    176 maug_cleanup_if_ge_overflow( con->callbacks_sz + 1, RETROCON_CB_SZ_MAX );
    +
    177
    +
    178 strncpy(
    +
    179 con->callback_names[con->callbacks_sz], cmd, RETROCON_CB_NAME_SZ_MAX );
    +
    180
    +
    181 con->callbacks[con->callbacks_sz] = cb;
    +
    182
    +
    183 con->callback_data[con->callbacks_sz] = cb_data;
    +
    184
    +
    185 con->callbacks_sz++;
    +
    186
    +
    187cleanup:
    +
    188
    +
    189 return retval;
    +
    190}
    +
    191
    +
    192MERROR_RETVAL retrocon_display(
    +
    193 struct RETROCON* con, struct RETROFLAT_BITMAP* display
    +
    194) {
    +
    195 MERROR_RETVAL retval = MERROR_OK;
    +
    196 size_t i = 0,
    +
    197 line_sz = 0;
    +
    198
    +
    199 if( RETROCON_FLAG_ACTIVE != (RETROCON_FLAG_ACTIVE & con->flags) ) {
    +
    200 goto cleanup;
    +
    201 }
    +
    202
    +
    203 if( (RETROFLAT_COLOR)0 == con->bg_color ) {
    +
    204 error_printf( "colors not set!" );
    +
    205 goto cleanup;
    +
    206 }
    +
    207
    + +
    209 NULL, con->bg_color, 10, 10,
    +
    210 300, RETROCON_WIN_H, RETROFLAT_FLAGS_FILL );
    +
    211
    + +
    213 NULL, con->lbuffer_color, con->lbuffer, -1, NULL,
    +
    214 15, 15, 0 );
    +
    215
    +
    216 /* Draw each line, one by one. */
    +
    217 for( i = 0 ; con->sbuffer_lines_sz > i ; i++ ) {
    +
    218 if( i + 1 < con->sbuffer_lines_sz ) {
    +
    219 line_sz = con->sbuffer_lines[i + 1] - con->sbuffer_lines[i];
    +
    220 } else {
    +
    221 line_sz = -1;
    +
    222 }
    +
    223
    + +
    225 NULL, con->sbuffer_color,
    +
    226 &(con->sbuffer[con->sbuffer_lines[i]]), line_sz, NULL,
    +
    227 15, 25 + (i * 10), 0 );
    +
    228 }
    +
    229
    +
    230cleanup:
    +
    231
    +
    232 return retval;
    +
    233}
    +
    234
    +
    235void retrocon_print_line( struct RETROCON* con, const char* line ) {
    +
    236 size_t line_sz = 0;
    +
    237 size_t i = 0;
    +
    238
    +
    239 line_sz = strlen( line );
    +
    240 if( line_sz + con->sbuffer_sz >= RETROCON_SBUFFER_SZ_MAX ) {
    +
    241 /* TODO: Handle line overflow better? (i.e. scroll) */
    +
    242 con->sbuffer_sz = 0;
    +
    243 con->sbuffer[con->sbuffer_sz] = '\0';
    +
    244 con->sbuffer_lines_sz = 0;
    +
    245 }
    +
    246
    +
    247 assert( line_sz < RETROCON_SBUFFER_SZ_MAX );
    +
    248
    +
    249 /* Create line pointer for display function. */
    +
    250 con->sbuffer_lines[con->sbuffer_lines_sz++] = con->sbuffer_sz;
    +
    251
    +
    252 /* Copy line to buffer and terminate with newline. */
    +
    253 for( i = 0 ; line_sz > i ; i++ ) {
    +
    254 con->sbuffer[con->sbuffer_sz + i] = line[i];
    +
    255 }
    +
    256
    +
    257 con->sbuffer[con->sbuffer_sz + line_sz] = '\0';
    +
    258
    +
    259 debug_printf( 1, "println: %s (at " SIZE_T_FMT " chars)",
    +
    260 &(con->sbuffer[con->sbuffer_sz]),
    +
    261 con->sbuffer_lines[con->sbuffer_lines_sz - 1] );
    +
    262
    +
    263 con->sbuffer_sz += line_sz;
    +
    264}
    +
    265
    +
    266MERROR_RETVAL retrocon_exec_line(
    +
    267 struct RETROCON* con, const char* line, size_t line_sz
    +
    268) {
    +
    269 MERROR_RETVAL retval = MERROR_OK;
    +
    270 size_t i = 0;
    +
    271
    +
    272 /* Find callback with name starting line. */
    +
    273 for( i = 0 ; con->callbacks_sz > i ; i++ ) {
    +
    274 if(
    +
    275 0 == strncmp(
    +
    276 /* TODO: Compare up to first space in line. */
    +
    277 con->callback_names[i], line, strlen( con->callback_names[i] ) )
    +
    278 ) {
    +
    279 retval = con->callbacks[i](
    +
    280 con, line, line_sz, con->callback_data[i] );
    +
    281 goto cleanup;
    +
    282 }
    +
    283 }
    +
    284
    +
    285 retrocon_print_line( con, "COMMAND NOT FOUND!" );
    +
    286
    +
    287cleanup:
    +
    288
    +
    289 return retval;
    +
    290}
    +
    291
    +
    292int retrocon_debounce( struct RETROCON* con, int c ) {
    +
    293 if( 0 == c ) {
    +
    294 return 0;
    +
    295 }
    +
    296
    +
    297 /* Debounce/disallow repeat even if it's allowed outside. */
    +
    298 if( con->input_prev == c && 0 < con->debounce_wait ) {
    +
    299 con->debounce_wait--;
    +
    300 debug_printf( 0, "dbwait (%d)", con->debounce_wait );
    +
    301 return 0;
    +
    302 } else {
    +
    303 con->input_prev = c;
    +
    304 con->debounce_wait = RETROCON_DEBOUNCE_WAIT;
    +
    305 debug_printf( 0, "new prev: %c", c );
    +
    306 }
    +
    307
    +
    308 return c;
    +
    309}
    +
    310
    + +
    312 struct RETROCON* con, RETROFLAT_IN_KEY* p_c,
    +
    313 struct RETROFLAT_INPUT* input_evt
    +
    314) {
    +
    315 MERROR_RETVAL retval = MERROR_OK;
    +
    316 int c = 0;
    +
    317
    +
    318 /* TODO: Use new retroflat_buffer_* macros! */
    +
    319
    +
    320 /* Put keycode on retrocon track. Clear pass-track if console active. */
    +
    321 c = *p_c;
    +
    322 if( RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags) ) {
    +
    323 *p_c = 0;
    +
    324 }
    +
    325
    +
    326 /* Debounce retrocon track only! */
    +
    327 if( !retrocon_debounce( con, c ) ) {
    +
    328 goto cleanup;
    +
    329 }
    +
    330
    +
    331 /* Process input. */
    +
    332 switch( c ) {
    +
    333 case RETROCON_ACTIVE_KEY:
    +
    334 if( RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags) ) {
    +
    335 con->flags &= ~RETROCON_FLAG_ACTIVE;
    +
    336 } else {
    +
    337 con->flags |= RETROCON_FLAG_ACTIVE;
    +
    338 }
    +
    339 break;
    +
    340
    +
    341 case 0:
    +
    342 break;
    +
    343
    +
    344 case 0x08:
    +
    345 /* Backspace. */
    +
    346 if( 0 < con->lbuffer_sz ) {
    +
    347 con->lbuffer_sz--;
    +
    348 con->lbuffer[con->lbuffer_sz] = '\0';
    +
    349 }
    +
    350 break;
    +
    351
    +
    352 case '\r':
    +
    353 case '\n':
    +
    354 if( 0 == con->lbuffer_sz ) {
    +
    355 /* Do nothing if line is empty. */
    +
    356 break;
    +
    357 }
    +
    358
    +
    359 /* Execute/reset line. */
    +
    360 retval = retrocon_exec_line( con, con->lbuffer, con->lbuffer_sz );
    +
    361 con->lbuffer_sz = 0;
    +
    362 con->lbuffer[con->lbuffer_sz] = '\0';
    +
    363 break;
    +
    364
    +
    365 default:
    +
    366 c = retroflat_vk_to_ascii(
    +
    367 c, input_evt->key_flags | RETROFLAT_INPUT_FORCE_UPPER );
    +
    368 if(
    +
    369 /* Active and printable chars get added to line buffer. */
    +
    370 RETROCON_FLAG_ACTIVE == (RETROCON_FLAG_ACTIVE & con->flags) &&
    +
    371 0 < c
    +
    372 ) {
    +
    373 con->lbuffer[con->lbuffer_sz++] = c;
    +
    374 con->lbuffer[con->lbuffer_sz] = '\0';
    +
    375 }
    +
    376 break;
    +
    377 }
    +
    378
    +
    379cleanup:
    +
    380
    +
    381 return retval;
    +
    382}
    +
    383
    +
    384#endif /* RETROCON_C */
    +
    385
    +
    386 /* maug_console */
    +
    387
    +
    388#endif /* RETROCON_DISABLE */
    +
    389
    +
    390#endif /* !RETROCON_H */
    +
    391
    +
    MERROR_RETVAL retrocon_input(struct RETROCON *con, RETROFLAT_IN_KEY *p_c, struct RETROFLAT_INPUT *input_evt)
    Process input from retroflat_poll_input() and apply it to the console, if open.
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    void retroflat_rect(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
    Draw a rectangle onto the target RETROFLAT_BITMAP.
    +
    #define RETROFLAT_FLAGS_FILL
    Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
    Definition retroflt.h:369
    +
    void retroflat_string(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, const char *str, int str_sz, const char *font_str, int16_t x_orig, int16_t y_orig, uint8_t flags)
    Draw a text string at the specified location in the specified font and color on the target RETROFLAT_...
    +
    #define retroflat_quit(retval_in)
    This should be called in order to quit a program using RetroFlat.
    Definition retroflt.h:2061
    +
    Definition retrocon.h:78
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:878
    +
    + + +
    + + diff --git a/retroflt_8h.html b/retroflt_8h.html new file mode 100644 index 00000000..024a6030 --- /dev/null +++ b/retroflt_8h.html @@ -0,0 +1,754 @@ + + + + + + + +maug: retroflt.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retroflt.h File Reference
    +
    +
    + +

    Abstraction layer header for retro systems. +More...

    +
    #include <mtypes.h>
    +#include <stdarg.h>
    +#include <marge.h>
    +#include <uprintf.h>
    +
    +Include dependency graph for retroflt.h:
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    +
    +

    Go to the source code of this file.

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

    +Data Structures

    struct  RETROFLAT_INPUT
     Struct passed to retroflat_poll_input() to hold return data. More...
     
    struct  RETROFLAT_BITMAP
     Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine if a valid bitmap is loaded. More...
     
    struct  RETROFLAT_ARGS
     Struct containing configuration values for a RetroFlat program. More...
     
    struct  RETROFLAT_STATE
     Global singleton containing state for the current platform. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define RETROFLAT_BITMAP_TRACE_LVL   0
     
    +#define RETROFLAT_KB_TRACE_LVL   0
     
    #define RETROFLAT_COLOR_TABLE(f)
     This macro defines all colors supported by RetroFlat for primative operations, particularly using retroflat_px().
     
    +#define RETROFLAT_COLOR_NULL   (-1)
     
    +#define RETROFLAT_COLORS_SZ   16
     
    +#define RETROFLAT_OK   0x00
     Certain functions return this when there was no problem.
     
    +#define RETROFLAT_ERROR_ENGINE   0x01
     
    +#define RETROFLAT_ERROR_GRAPHICS   0x02
     
    +#define RETROFLAT_ERROR_MOUSE   0x04
     
    +#define RETROFLAT_ERROR_BITMAP   0x08
     Returned if there is a problem loading or locking a RETROFLAT_BITMAP struct.
     
    +#define RETROFLAT_ERROR_TIMER   0x0f
     
    #define retroflat_read_lsbf_32(bytes, offset)
     
    +#define retroflat_read_lsbf_16(bytes, offset)    ((bytes[offset]) | (bytes[offset + 1] << 8))
     
    +#define RETROFLAT_FLAGS_FILL   0x01
     Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
     
    +#define RETROFLAT_FLAGS_OPAQUE   0x01
     Flag for retroflat_create_bitmap() to create a bitmap without transparency.
     
    #define RETROFLAT_FLAGS_ALL_CAPS   0x02
     Flag for retroflat_string() and retroflat_string_sz() to print text in all capital letters. Non-letters are unmodified.
     
    +#define RETROFLAT_FLAGS_LITERAL_PATH   0x02
     Flag for retroflat_load_bitmap() to not use assets path.
     
    #define RETROFLAT_FLAGS_OUTLINE   0x04
     Flag for retroflat_string() and retroflat_string_sz() to print text as outline-only.
     
    #define RETROFLAT_FLAGS_SCREEN_BUFFER   0x80
     Flag for retroflat_create_bitmap() to create a WinG-backed bitmap.
     
    #define RETROFLAT_FLAGS_RUNNING   0x01
     Flag indicating that retroflat_loop() should continue executing.
     
    #define RETROFLAT_FLAGS_UNLOCK_FPS   0x02
     Flag indicating FPS should not be capped.
     
    #define RETROFLAT_FLAGS_KEY_REPEAT   0x04
     Flag indicating keyboard repeat is enabled.
     
    #define RETROFLAT_FLAGS_SCREENSAVER   0x08
     Flag indicating the current application is running as a screensaver.
     
    +#define RETROFLAT_FLAGS_SCALE2X   0x10
     Only supported on some platforms: Attempt to scale screen by 2X.
     
    +#define RETROFLAT_BUFFER_INT   0x00
     
    +#define RETROFLAT_BUFFER_STRING   0x01
     
    +#define RETROFLAT_BUFFER_FLOAT   0x02
     
    +#define RETROFLAT_BUFFER_BOOL   0x04
     
    #define RETROFLAT_CONFIG_FLAG_W   0x01
     Flag indicating config object should be opened for WRITING only.
     
    +#define RETROFLAT_CONFIG_FLAG_BIN   0x02
     Flag indicating config object holds BINARY data.
     
    +#define RETROFLAT_MSG_FLAG_TYPE_MASK   0x07
     This mask covers all possible icon/type flags.
     
    +#define RETROFLAT_MSG_FLAG_ERROR   0x01
     This icon/type flag indicates an error. It will try to display messages in an urgent way with a red icon, if possible.
     
    +#define RETROFLAT_MSG_FLAG_INFO   0x02
     This icon/type flag indicates an informational notice. It will try to display messages in a definite way, with an i or speech bubble icon, if possible.
     
    +#define RETROFLAT_MSG_FLAG_WARNING   0x04
     This icon/type flag indicates a condition the user should be aware of. It will try to display messages in an urgent way with a yellow icon, if possible.
     
    #define RETROFLAT_VDP_FLAG_PXLOCK   0x01
     Flag for RETROFLAT_STATE::vdp_flags indicating the VDP requires RetroFlat to pixel-lock the frame before passing it (almost always true!)
     
    +#define RETROFLAT_FLAGS_SCREEN_LOCK   0x02
     
    +#define RETROFLAT_BITMAP_EXT   "bmp"
     The filename suffix to be appended with a "." to filenames passed to retroflat_load_bitmap(). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_OPENGL_BPP   32
     
    +#define RETROFLAT_TXP_R   0x00
     Compiler-define-overridable constant indicating the Red value of the transparency color on platforms that support it (mainly Win16/SDL). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_TXP_G   0x00
     Compiler-define-overridable constant indicating the Green value of the transparency color on platforms that support it (mainly Win16/SDL). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_TXP_B   0x00
     Compiler-define-overridable constant indicating the Blue value of the transparency color on platforms that support it (mainly Win16/SDL). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_TXP_PAL_IDX   0
     
    +#define RETROFLAT_DEFAULT_SCREEN_W   320
     
    +#define RETROFLAT_DEFAULT_SCREEN_H   200
     
    +#define RETROFLAT_GL_Z   -0.001
     
    #define retroflat_on_resize(w, h)
     
    +#define RETROFLAT_LINE_THICKNESS   1
     Line drawing thickness (only works on some platforms). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_PI   3.14159
     
    #define RETROFLAT_FPS   30
     Target Frames Per Second.
     
    +#define retroflat_fps_next()   (1000 / RETROFLAT_FPS)
     
    +#define RETROFLAT_WINDOW_CLASS   "RetroFlatWindowClass"
     Unique window class to use on some platforms (e.g. Win32). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_WIN_FRAME_TIMER_ID   6001
     Unique ID for the timer that execute frame draws in Win16/Win32. Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_WIN_LOOP_TIMER_ID   6002
     Unique ID for the timer that execute loop ticks in Win16/Win32. Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_MSG_MAX   4096
     Maximum number of characters possible in a message using retroflat_message(). Is a RetroFlat Compiler Definitions.
     
    +#define RETROFLAT_PATH_MAX   256
     Maximum size allocated for asset paths.
     
    +#define RETROFLAT_TITLE_MAX   255
     
    #define RETROFLAT_VDP_ARGS_SZ_MAX   255
     
    +#define RETROFLAT_PATH_SEP   '/'
     The valid path separator on the target platform.
     
    +#define RETROFLAT_ASSETS_PATH_MAX   (RETROFLAT_PATH_MAX >> 1)
     Maximum size of the assets path, to allow room for appending.
     
    +#define NDS_OAM_ACTIVE   &oamMain
     Active sprite engine screen on Nintendo DS.
     
    +#define NDS_SPRITES_ACTIVE   24
     Maximum number of sprites active on-screen on Nintendo DS.
     
    +#define RETROFLAT_CONFIG_LN_SZ_MAX   255
     
    +#define RETROFLAT_CONFIG_EXT   ".ini"
     
    +#define RETROFLAT_BMP_COLORS_SZ_MAX   256
     
    +#define retroflat_cmp_asset_path(a, b)   strncmp( a, b, RETROFLAT_PATH_MAX )
     Compare two asset paths. Return 0 if they're the same.
     
    #define retroflat_buffer_bksp(buffer, buffer_cur, buffer_sz)
     Remove a character from a text buffer before cursor position.
     
    #define retroflat_buffer_insert(c, buffer, buffer_cur, buffer_sz, buffer_mx)
     Insert a character into a text buffer at cursor position.
     
    +#define RETROFLAT_INPUT_MOD_SHIFT   0x01
     
    +#define RETROFLAT_INPUT_MOD_ALT   0x02
     
    +#define RETROFLAT_INPUT_MOD_CTRL   0x04
     
    +#define RETROFLAT_INPUT_FORCE_UPPER   0x08
     
    +#define retroflat_bitmap_ok(bitmap)   (NULL != (bitmap)->b)
     Check to see if a bitmap is loaded.
     
    +#define retroflat_screen_w()
     Get the current screen width in pixels.
     
    +#define retroflat_screen_h()
     Get the current screen height in pixels.
     
    +#define retroflat_screen_buffer()   (&(g_retroflat_state->buffer))
     Get the direct screen buffer or the VDP buffer if a VDP is loaded.
     
    #define retroflat_quit(retval_in)
     This should be called in order to quit a program using RetroFlat.
     
    +#define RETROFLAT_COLOR_BLACK   0
     
    +#define RETROFLAT_COLOR_DARKBLUE   1
     
    +#define RETROFLAT_COLOR_DARKGREEN   2
     
    +#define RETROFLAT_COLOR_TEAL   3
     
    +#define RETROFLAT_COLOR_DARKRED   4
     
    +#define RETROFLAT_COLOR_VIOLET   5
     
    +#define RETROFLAT_COLOR_BROWN   6
     
    +#define RETROFLAT_COLOR_GRAY   7
     
    +#define RETROFLAT_COLOR_DARKGRAY   8
     
    +#define RETROFLAT_COLOR_BLUE   9
     
    +#define RETROFLAT_COLOR_GREEN   10
     
    +#define RETROFLAT_COLOR_CYAN   11
     
    +#define RETROFLAT_COLOR_RED   12
     
    +#define RETROFLAT_COLOR_MAGENTA   13
     
    +#define RETROFLAT_COLOR_YELLOW   14
     
    +#define RETROFLAT_COLOR_WHITE   15
     
    +#define RETROFLAT_KEY_UP   0
     
    +#define RETROFLAT_KEY_DOWN   0
     
    +#define RETROFLAT_KEY_RIGHT   0
     
    +#define RETROFLAT_KEY_LEFT   0
     
    +#define RETROFLAT_KEY_A   0x41
     
    +#define RETROFLAT_KEY_B   0x42
     
    +#define RETROFLAT_KEY_C   0x43
     
    +#define RETROFLAT_KEY_D   0x44
     
    +#define RETROFLAT_KEY_E   0x45
     
    +#define RETROFLAT_KEY_F   0x46
     
    +#define RETROFLAT_KEY_G   0x47
     
    +#define RETROFLAT_KEY_H   0x48
     
    +#define RETROFLAT_KEY_I   0x49
     
    +#define RETROFLAT_KEY_J   0x4a
     
    +#define RETROFLAT_KEY_K   0x4b
     
    +#define RETROFLAT_KEY_L   0x4c
     
    +#define RETROFLAT_KEY_M   0x4d
     
    +#define RETROFLAT_KEY_N   0x4e
     
    +#define RETROFLAT_KEY_O   0x4f
     
    +#define RETROFLAT_KEY_P   0x50
     
    +#define RETROFLAT_KEY_Q   0x51
     
    +#define RETROFLAT_KEY_R   0x52
     
    +#define RETROFLAT_KEY_S   0x53
     
    +#define RETROFLAT_KEY_T   0x54
     
    +#define RETROFLAT_KEY_U   0x55
     
    +#define RETROFLAT_KEY_V   0x56
     
    +#define RETROFLAT_KEY_W   0x57
     
    +#define RETROFLAT_KEY_X   0x58
     
    +#define RETROFLAT_KEY_Y   0x59
     
    +#define RETROFLAT_KEY_Z   0x60
     
    +#define RETROFLAT_KEY_0   0x30
     
    +#define RETROFLAT_KEY_1   0x31
     
    +#define RETROFLAT_KEY_2   0x32
     
    +#define RETROFLAT_KEY_3   0x33
     
    +#define RETROFLAT_KEY_4   0x34
     
    +#define RETROFLAT_KEY_5   0x35
     
    +#define RETROFLAT_KEY_6   0x36
     
    +#define RETROFLAT_KEY_7   0x37
     
    +#define RETROFLAT_KEY_8   0x38
     
    +#define RETROFLAT_KEY_9   0x39
     
    +#define RETROFLAT_KEY_TAB   0
     
    +#define RETROFLAT_KEY_SPACE   0
     
    +#define RETROFLAT_KEY_ESC   0
     
    +#define RETROFLAT_KEY_ENTER   0
     
    +#define RETROFLAT_KEY_HOME   0
     
    +#define RETROFLAT_KEY_END   0
     
    +#define RETROFLAT_MOUSE_B_LEFT   0
     
    +#define RETROFLAT_MOUSE_B_RIGHT   0
     
    +#define RETROFLAT_COLOR_TABLE_CONSTS(idx, name_l, name_u, r, g, b, cgac, cgad)    extern MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u;
     
    + + + + + + + + + + + + + + + + + + + + +

    +Typedefs

    +typedef int8_t RETROFLAT_COLOR
     Defines an index in the platform-specific color-table.
     
    typedef MERROR_RETVAL(* retroflat_vdp_proc_t) (struct RETROFLAT_STATE *)
     VDP function called from the VDP library.
     
    +typedef MERROR_RETVAL(* retroflat_proc_resize_t) (uint16_t new_w, uint16_t new_h, void *data)
     
    +typedef char retroflat_asset_path[RETROFLAT_PATH_MAX]
     Path/name used to load an asset from disk.
     
    +typedef void(* retroflat_loop_iter) (void *data)
     Prototype for the main loop function passed to retroflat_loop().
     
    typedef FILE * RETROFLAT_CONFIG
     A configuration object to use with the RetroFlat Config API.
     
    +typedef int RETROFLAT_COLOR_DEF
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    +MERROR_RETVAL retroflat_loop (retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void *data)
     This should be called once in the main body of the program in order to enter the main loop. The main loop will continuously call loop_iter with data as an argument until retroflat_quit() is called.
     
    void retroflat_message (uint8_t flags, const char *title, const char *format,...)
     Display a message in a dialog box and/or on stderr.
     
    MERROR_RETVAL retroflat_init (int argc, char *argv[], struct RETROFLAT_ARGS *args)
     Initialize RetroFlat and its underlying layers. This should be called once at the beginning of the program and should quit if the return value indicates any failures.
     
    void retroflat_shutdown (int retval)
     Deinitialize RetroFlat and its underlying layers. This should be called once at the end of the program, after retroflat_loop().
     
    +MERROR_RETVAL retroflat_vdp_call (const char *proc_name)
     Call a function from the retroflat VDP.
     
    +void retroflat_set_title (const char *format,...)
     
    +retroflat_ms_t retroflat_get_ms ()
     
    +uint32_t retroflat_get_rand ()
     
    +char retroflat_vk_to_ascii (RETROFLAT_IN_KEY k, uint8_t flags)
     
    MERROR_RETVAL retroflat_load_bitmap (const char *filename, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
     Load a bitmap into the given RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to the limitations enumerated in RetroFlat Bitmap API.
     
    +MERROR_RETVAL retroflat_create_bitmap (size_t w, size_t h, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
     
    void retroflat_destroy_bitmap (struct RETROFLAT_BITMAP *bitmap)
     Unload a bitmap from a RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on the stack).
     
    void retroflat_blit_bitmap (struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
     Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
     
    MERROR_RETVAL retroflat_draw_lock (struct RETROFLAT_BITMAP *bmp)
     Lock a bitmap for drawing. This will be done automatically if necessary and not called explicitly, but performance should improve if done before a batch of drawing operations.
     
    +MERROR_RETVAL retroflat_draw_release (struct RETROFLAT_BITMAP *bmp)
     
    +void retroflat_px (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, uint8_t flags)
     
    void retroflat_rect (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
     Draw a rectangle onto the target RETROFLAT_BITMAP.
     
    void retroflat_ellipse (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
     Draw an ellipse onto the target RETROFLAT_BITMAP.
     
    void retroflat_line (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags)
     Draw a straight line onto the target RETROFLAT_BITMAP.
     
    +void retroflat_cursor (struct RETROFLAT_BITMAP *target, uint8_t flags)
     
    void retroflat_string_sz (struct RETROFLAT_BITMAP *target, const char *str, size_t str_sz, const char *font_str, size_t *w_out, size_t *h_out, uint8_t flags)
     Get the size in pixels of a text string when drawn with a given font by retroflat_string().
     
    void retroflat_string (struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, const char *str, int str_sz, const char *font_str, int16_t x_orig, int16_t y_orig, uint8_t flags)
     Draw a text string at the specified location in the specified font and color on the target RETROFLAT_BITMAP.
     
    +void retroflat_get_palette (uint8_t idx, uint32_t *rgb)
     
    +MERROR_RETVAL retroflat_set_palette (uint8_t idx, uint32_t rgb)
     
    +void retroflat_set_proc_resize (retroflat_proc_resize_t on_resize_in, void *data_in)
     
    +void retroflat_resize_v ()
     
    RETROFLAT_IN_KEY retroflat_poll_input (struct RETROFLAT_INPUT *input)
     Poll input devices (keyboard/mouse) and return the latest event.
     
    MERROR_RETVAL retroflat_config_open (RETROFLAT_CONFIG *config, uint8_t flags)
     Open a configuration file/registry/SRAM/etc handle.
     
    +void retroflat_config_close (RETROFLAT_CONFIG *config)
     
    size_t retroflat_config_write (RETROFLAT_CONFIG *config, const char *sect_name, const char *key_name, uint8_t buffer_type, void *buffer, size_t buffer_sz_max)
     Write the contents of a buffer to a config object.
     
    size_t retroflat_config_read (RETROFLAT_CONFIG *config, const char *sect_name, const char *key_name, uint8_t buffer_type, void *buffer_out, size_t buffer_out_sz_max, const void *default_out, size_t default_out_sz)
     Write the contents of a buffer to a config object.
     
    + + + + + +

    +Variables

    +MAUG_CONST char *SEG_MCONST gc_retroflat_color_names []
     
    +struct RETROFLAT_STATEg_retroflat_state
     
    +

    Detailed Description

    +

    Abstraction layer header for retro systems.

    +

    RetroFlat is a compatibility layer for making graphical programs that work on Win16 (32-bit via OpenWatcom's Win386), MS-DOS (32-bit via DOS/32a or DOS4GW via Allegro), and possibly other platforms in the future.

    +

    To use, define RETROFLT_C before including this header from your main.c.

    +

    You may include this header in other .c files, as well, but RETROFLT_C should ONLY be declared ONCE in the entire program.

    +

    maug.h should also be included before this header.

    +
    + + +
    + + diff --git a/retroflt_8h__incl.map b/retroflt_8h__incl.map new file mode 100644 index 00000000..15cc0ad1 --- /dev/null +++ b/retroflt_8h__incl.map @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/retroflt_8h__incl.md5 b/retroflt_8h__incl.md5 new file mode 100644 index 00000000..260d31f5 --- /dev/null +++ b/retroflt_8h__incl.md5 @@ -0,0 +1 @@ +c0c833296036b6bfb17318dd4e615609 \ No newline at end of file diff --git a/retroflt_8h__incl.png b/retroflt_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..f92dc405648b6d3a27d2185d333e4436a8f504d1 GIT binary patch literal 19440 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 literal 0 HcmV?d00001 diff --git a/retroflt_8h_source.html b/retroflt_8h_source.html new file mode 100644 index 00000000..540e85e3 --- /dev/null +++ b/retroflt_8h_source.html @@ -0,0 +1,7081 @@ + + + + + + + +maug: retroflt.h Source File + + + + + + + + + + + + + + +

    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retroflt.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROFLT_H
    +
    3#define RETROFLT_H
    +
    4
    +
    5#include <mtypes.h>
    +
    6
    +
    261/* === Generic Includes and Defines === */
    +
    262
    +
    263#ifndef RETROFLAT_BITMAP_TRACE_LVL
    +
    264# define RETROFLAT_BITMAP_TRACE_LVL 0
    +
    265#endif /* !RETROFLAT_BITMAP_TRACE_LVL */
    +
    266
    +
    267#ifndef RETROFLAT_KB_TRACE_LVL
    +
    268# define RETROFLAT_KB_TRACE_LVL 0
    +
    269#endif /* !RETROFLAT_KB_TRACE_LVL */
    +
    270
    +
    271#include <stdarg.h>
    +
    272
    +
    273#include <marge.h>
    +
    274
    +
    275#ifdef RETROFLAT_API_WINCE
    +
    276/* WinCE is very similar to Win32, so we'll mostly use that with some exceptions below. */
    +
    277# define RETROFLAT_API_WIN32
    +
    278#endif /* RETROFLAT_API_WINCE */
    +
    279
    +
    +
    295#define RETROFLAT_COLOR_TABLE( f ) \
    +
    296 f( 0, black, BLACK, 0, 0, 0, BLACK, BLACK ) \
    +
    297 f( 1, darkblue, DARKBLUE, 0, 0, 170, CYAN, BLACK ) \
    +
    298 f( 2, darkgreen, DARKGREEN, 0, 170, 0, CYAN, BLACK ) \
    +
    299 f( 3, teal, TEAL, 0, 170, 170, CYAN, CYAN ) \
    +
    300 f( 4, darkred, DARKRED, 170, 0, 0, MAGENTA, BLACK ) \
    +
    301 f( 5, violet, VIOLET, 170, 0, 170, MAGENTA, BLACK ) \
    +
    302 f( 6, brown, BROWN, 170, 85, 0, CYAN, MAGENTA ) \
    +
    303 f( 7, gray, GRAY, 170, 170, 170, WHITE, BLACK ) \
    +
    304 f( 8, darkgray, DARKGRAY, 85, 85, 85, WHITE, BLACK ) \
    +
    305 f( 9, blue, BLUE, 85, 85, 255, CYAN, WHITE ) \
    +
    306 f( 10, green, GREEN, 85, 255, 85, CYAN, CYAN ) \
    +
    307 f( 11, cyan, CYAN, 85, 255, 255, CYAN, CYAN ) \
    +
    308 f( 12, red, RED, 255, 85, 85, MAGENTA, WHITE ) \
    +
    309 f( 13, magenta, MAGENTA, 255, 85, 255, MAGENTA, MAGENTA ) \
    +
    310 f( 14, yellow, YELLOW, 255, 255, 85, CYAN, MAGENTA ) \
    +
    311 f( 15, white, WHITE, 255, 255, 255, WHITE, WHITE )
    +
    +
    312
    +
    314typedef int8_t RETROFLAT_COLOR;
    +
    315
    +
    316# define RETROFLAT_COLOR_NULL (-1)
    +
    317
    +
    318# define RETROFLAT_COLORS_SZ 16
    +
    319
    +
    322/* TODO: Mouse is broken under DOS/Allegro. */
    +
    323#if defined( RETROFLAT_OS_UNIX ) || defined( RETROFLAT_OS_WIN )
    +
    324#define RETROFLAT_MOUSE
    +
    325#endif /* RETROFLAT_OS_WIN || RETROFLAT_OS_WIN */
    +
    326
    +
    334#define RETROFLAT_OK 0x00
    +
    335#define RETROFLAT_ERROR_ENGINE 0x01
    +
    336#define RETROFLAT_ERROR_GRAPHICS 0x02
    +
    337#define RETROFLAT_ERROR_MOUSE 0x04
    +
    338
    +
    343#define RETROFLAT_ERROR_BITMAP 0x08
    +
    344#define RETROFLAT_ERROR_TIMER 0x0f
    +
    345
    +
    346 /* maug_retroflt_retval */
    +
    347
    +
    348#define retroflat_read_lsbf_32( bytes, offset ) \
    +
    349 ((bytes[offset]) | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) \
    +
    350 | (bytes[offset + 3] << 24))
    +
    351
    +
    352#define retroflat_read_lsbf_16( bytes, offset ) \
    +
    353 ((bytes[offset]) | (bytes[offset + 1] << 8))
    +
    354
    +
    369#define RETROFLAT_FLAGS_FILL 0x01
    +
    370
    +
    375#define RETROFLAT_FLAGS_OPAQUE 0x01
    +
    376
    +
    383#define RETROFLAT_FLAGS_ALL_CAPS 0x02
    +
    384
    +
    388#define RETROFLAT_FLAGS_LITERAL_PATH 0x02
    +
    389
    +
    396#define RETROFLAT_FLAGS_OUTLINE 0x04
    +
    397
    +
    404#define RETROFLAT_FLAGS_SCREEN_BUFFER 0x80
    +
    405
    +
    406 /* maug_retroflt_drawing */
    +
    407
    +
    419#define RETROFLAT_FLAGS_RUNNING 0x01
    +
    420
    +
    425#define RETROFLAT_FLAGS_UNLOCK_FPS 0x02
    +
    426
    +
    431#define RETROFLAT_FLAGS_KEY_REPEAT 0x04
    +
    432
    +
    437#define RETROFLAT_FLAGS_SCREENSAVER 0x08
    +
    438
    +
    442#define RETROFLAT_FLAGS_SCALE2X 0x10
    +
    443
    +
    444 /* maug_retroflt_flags */
    +
    445
    +
    456#define RETROFLAT_BUFFER_INT 0x00
    +
    457
    +
    458#define RETROFLAT_BUFFER_STRING 0x01
    +
    459
    +
    460#define RETROFLAT_BUFFER_FLOAT 0x02
    +
    461
    +
    462#define RETROFLAT_BUFFER_BOOL 0x04
    +
    463
    +
    464 /* maug_retroflt_config_btypes */
    +
    465
    +
    480#define RETROFLAT_CONFIG_FLAG_W 0x01
    +
    481
    +
    485#define RETROFLAT_CONFIG_FLAG_BIN 0x02
    +
    486
    +
    487 /* maug_retroflt_config_flags */
    +
    488
    +
    489 /* maug_retroflt_config */
    +
    490
    +
    499#define RETROFLAT_MSG_FLAG_TYPE_MASK 0x07
    +
    500
    +
    505#define RETROFLAT_MSG_FLAG_ERROR 0x01
    +
    506
    +
    512#define RETROFLAT_MSG_FLAG_INFO 0x02
    +
    513
    +
    519#define RETROFLAT_MSG_FLAG_WARNING 0x04
    +
    520
    +
    521 /* maug_retroflt_msg_flags */
    +
    522
    +
    523struct RETROFLAT_STATE;
    +
    524
    +
    544#define RETROFLAT_VDP_FLAG_PXLOCK 0x01
    +
    545
    + +
    558
    +
    559 /* maug_retroflt_vdp */
    +
    560
    +
    561typedef MERROR_RETVAL (*retroflat_proc_resize_t)(
    +
    562 uint16_t new_w, uint16_t new_h, void* data );
    +
    563
    +
    569#define RETROSND_ARGS_FLAG_LIST_DEVS 0x01
    +
    570
    +
    602#define RETROFLAT_FLAGS_LOCK 0x01
    +
    603
    +
    604#define RETROFLAT_FLAGS_SCREEN_LOCK 0x02
    +
    605
    +
    610#ifndef RETROFLAT_BITMAP_EXT
    +
    611# define RETROFLAT_BITMAP_EXT "bmp"
    +
    612#endif /* !RETROFLAT_BITMAP_EXT */
    +
    613
    +
    614#ifndef RETROFLAT_OPENGL_BPP
    +
    615# define RETROFLAT_OPENGL_BPP 32
    +
    616#endif /* !RETROFLAT_OPENGL_BPP */
    +
    617
    +
    618/* Transparency background color: black by default, to match Allegro. */
    +
    619#ifndef RETROFLAT_TXP_R
    +
    625# define RETROFLAT_TXP_R 0x00
    +
    626#endif /* !RETROFLAT_TXP_R */
    +
    627
    +
    628#ifndef RETROFLAT_TXP_G
    +
    634# define RETROFLAT_TXP_G 0x00
    +
    635#endif /* !RETROFLAT_TXP_G */
    +
    636
    +
    637#ifndef RETROFLAT_TXP_B
    +
    643# define RETROFLAT_TXP_B 0x00
    +
    644#endif /* !RETROFLAT_TXP_B */
    +
    645
    +
    646#ifndef RETROFLAT_TXP_PAL_IDX
    +
    647# define RETROFLAT_TXP_PAL_IDX 0
    +
    648#endif /* !RETROFLAT_TXP_PAL_IDX */
    +
    649
    +
    650 /* maug_retroflt_bitmap */
    +
    651
    +
    652#ifndef RETROFLAT_DEFAULT_SCREEN_W
    +
    653# define RETROFLAT_DEFAULT_SCREEN_W 320
    +
    654#endif /* RETROFLAT_DEFAULT_SCREEN_W */
    +
    655
    +
    656#ifndef RETROFLAT_DEFAULT_SCREEN_H
    +
    657# define RETROFLAT_DEFAULT_SCREEN_H 200
    +
    658#endif /* RETROFLAT_DEFAULT_SCREEN_H */
    +
    659
    +
    660#ifndef RETROFLAT_GL_Z
    +
    661# define RETROFLAT_GL_Z -0.001
    +
    662#endif /* !RETROFLAT_GL_Z */
    +
    663
    +
    664#define retroflat_on_resize( w, h ) \
    +
    665 g_retroflat_state->screen_w = w; \
    +
    666 g_retroflat_state->screen_h = h;
    +
    667
    +
    673#ifndef RETROFLAT_LINE_THICKNESS
    +
    678# define RETROFLAT_LINE_THICKNESS 1
    +
    679#endif /* !RETROFLAT_LINE_THICKNESS */
    +
    680
    +
    681#define RETROFLAT_PI 3.14159
    +
    682
    +
    683 /* maug_retroflt_drawing */
    +
    684
    +
    690#ifndef RETROFLAT_FPS
    +
    695# define RETROFLAT_FPS 30
    +
    696#endif /* !RETROFLAT_FPS */
    +
    697
    +
    698#define retroflat_fps_next() (1000 / RETROFLAT_FPS)
    +
    699
    +
    700#ifndef RETROFLAT_WINDOW_CLASS
    +
    705# define RETROFLAT_WINDOW_CLASS "RetroFlatWindowClass"
    +
    706#endif /* !RETROFLAT_WINDOW_CLASS */
    +
    707
    +
    708#ifndef RETROFLAT_WIN_FRAME_TIMER_ID
    +
    713# define RETROFLAT_WIN_FRAME_TIMER_ID 6001
    +
    714#endif /* !RETROFLAT_WIN_FRAME_TIMER_ID */
    +
    715
    +
    716#ifndef RETROFLAT_WIN_LOOP_TIMER_ID
    +
    721# define RETROFLAT_WIN_LOOP_TIMER_ID 6002
    +
    722#endif /* !RETROFLAT_WIN_LOOP_TIMER_ID */
    +
    723
    +
    724#ifndef RETROFLAT_MSG_MAX
    +
    729# define RETROFLAT_MSG_MAX 4096
    +
    730#endif /* !RETROFLAT_MSG_MAX */
    +
    731
    +
    732#ifndef RETROFLAT_PATH_MAX
    +
    734# define RETROFLAT_PATH_MAX 256
    +
    735#endif /* !RETROFLAT_PATH_MAX */
    +
    736
    +
    737#ifndef RETROFLAT_TITLE_MAX
    +
    738# define RETROFLAT_TITLE_MAX 255
    +
    739#endif /* !RETROFLAT_TITLE_MAX */
    +
    740
    +
    741#ifndef RETROFLAT_VDP_ARGS_SZ_MAX
    +
    745# define RETROFLAT_VDP_ARGS_SZ_MAX 255
    +
    746#endif /* !RETROFLAT_VDP_ARGS_SZ_MAX */
    +
    747
    +
    748#if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    749# if !defined( RETROFLAT_WIN_STYLE )
    +
    750# if defined( RETROFLAT_API_WINCE )
    +
    751# define RETROFLAT_WIN_STYLE (WS_VISIBLE)
    +
    752# else
    +
    753# define RETROFLAT_WIN_STYLE (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME)
    +
    754# endif /* RETROFLAT_API_WINCE */
    +
    755# endif /* !RETROFLAT_WIN_STYLE */
    +
    756#endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    757
    +
    758#if defined( RETROFLAT_API_SDL2 )
    +
    759# if !defined( NO_RETROFLAT_RESIZABLE )
    +
    760# define RETROFLAT_WIN_FLAGS SDL_WINDOW_RESIZABLE
    +
    761# else
    +
    762# define RETROFLAT_WIN_FLAGS 0
    +
    763# endif /* !NO_RETROFLAT_RESIZABLE */
    +
    764#endif /* RETROFLAT_API_SDL2 */
    +
    765
    +
    766#if defined( RETROFLAT_API_SDL1 )
    +
    767# define RETROFLAT_SDL_CC_FLAGS (SDL_RLEACCEL | SDL_SRCCOLORKEY)
    +
    768#elif defined( RETROFLAT_API_SDL2 )
    +
    769# define RETROFLAT_SDL_CC_FLAGS (SDL_TRUE)
    +
    770#endif /* RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 */
    +
    771
    +
    772#ifdef RETROFLAT_OS_DOS
    +
    773# define RETROFLAT_PATH_SEP '\\'
    +
    774#else
    +
    776# define RETROFLAT_PATH_SEP '/'
    +
    777#endif /* RETROFLAT_OS_DOS */
    +
    778
    +
    780#define RETROFLAT_ASSETS_PATH_MAX (RETROFLAT_PATH_MAX >> 1)
    +
    781
    +
    782#ifndef NDS_OAM_ACTIVE
    +
    784# define NDS_OAM_ACTIVE &oamMain
    +
    785#endif /* !NDS_OAM_ACTIVE */
    +
    786
    +
    787#ifndef NDS_SPRITES_ACTIVE
    +
    789# define NDS_SPRITES_ACTIVE 24
    +
    790#endif /* !NDS_SPRITES_ACTIVE */
    +
    791
    +
    792#ifndef RETROFLAT_CONFIG_LN_SZ_MAX
    +
    793# define RETROFLAT_CONFIG_LN_SZ_MAX 255
    +
    794#endif /* !RETROFLAT_CONFIG_LN_SZ_MAX */
    +
    795
    +
    796#ifndef RETROFLAT_CONFIG_EXT
    +
    797# define RETROFLAT_CONFIG_EXT ".ini"
    +
    798#endif /* !RETROFLAT_CONFIG_EXT */
    +
    799
    +
    800#ifndef RETROFLAT_BMP_COLORS_SZ_MAX
    +
    801# define RETROFLAT_BMP_COLORS_SZ_MAX 256
    +
    802#endif /* !RETROFLAT_BMP_COLORS_SZ_MAX */
    +
    803
    +
    804 /* maug_retroflt_compiling */
    +
    805
    + +
    817
    +
    821#define retroflat_cmp_asset_path( a, b ) strncmp( a, b, RETROFLAT_PATH_MAX )
    +
    822
    +
    823 /* maug_retroflt_assets */
    +
    824
    +
    828typedef void (*retroflat_loop_iter)(void* data);
    +
    829
    +
    +
    839#define retroflat_buffer_bksp( buffer, buffer_cur, buffer_sz ) \
    +
    840 if( 0 < buffer_cur ) { \
    +
    841 if( buffer_cur < buffer_sz ) { \
    +
    842 memmove( \
    +
    843 &(buffer[(buffer_cur) - 1]), \
    +
    844 &(buffer[buffer_cur]), \
    +
    845 (buffer_sz) - (buffer_cur) ); \
    +
    846 } \
    +
    847 buffer_cur--; \
    +
    848 buffer_sz--; \
    +
    849 buffer[buffer_sz] = '\0'; \
    +
    850 }
    +
    +
    851
    +
    +
    855#define retroflat_buffer_insert( c, buffer, buffer_cur, buffer_sz, buffer_mx ) \
    +
    856 if( buffer_sz + 1 < buffer_mx ) { \
    +
    857 if( buffer_cur < buffer_sz ) { \
    +
    858 memmove( \
    +
    859 &(buffer[(buffer_cur) + 1]), \
    +
    860 &(buffer[buffer_cur]), \
    +
    861 (buffer_sz) - (buffer_cur) ); \
    +
    862 } \
    +
    863 buffer[buffer_cur] = c; \
    +
    864 buffer_cur++; \
    +
    865 buffer_sz++; \
    +
    866 buffer[buffer_sz] = '\0'; \
    +
    867 }
    +
    +
    868
    +
    869#define RETROFLAT_INPUT_MOD_SHIFT 0x01
    +
    870
    +
    871#define RETROFLAT_INPUT_MOD_ALT 0x02
    +
    872
    +
    873#define RETROFLAT_INPUT_MOD_CTRL 0x04
    +
    874
    +
    875#define RETROFLAT_INPUT_FORCE_UPPER 0x08
    +
    876
    +
    + + + +
    889 uint8_t key_flags;
    +
    890};
    +
    +
    891
    +
    892 /* maug_retroflt_input */
    +
    893
    +
    894#ifdef RETROFLAT_OPENGL
    +
    895struct RETROFLAT_GLTEX {
    +
    896 MAUG_MHANDLE bytes_h;
    +
    897 uint8_t* bytes;
    +
    898 uint32_t bpp;
    +
    899 uint32_t sz;
    +
    900 uint8_t* px;
    +
    901 uint32_t id;
    +
    902 size_t w;
    +
    903 size_t h;
    +
    904};
    +
    905#endif /* RETROFLAT_OPENGL */
    +
    906
    +
    907/* === OS-Specific Includes and Defines === */
    +
    908
    +
    909#if defined( RETROFLAT_OS_WIN ) && !defined( MAUG_WINDOWS_H )
    +
    910# include <windows.h>
    +
    911# define MAUG_WINDOWS_H
    +
    912#endif /* !MAUG_WINDOWS_H */
    +
    913
    +
    914/* === API-Specific Includes and Defines === */
    +
    915
    +
    916#if defined( RETROFLAT_API_ALLEGRO )
    +
    917
    +
    918# ifdef RETROFLAT_OPENGL
    +
    919# error "opengl support not implemented for allegro"
    +
    920# endif /* RETROFLAT_OPENGL */
    +
    921
    +
    922/* == Allegro == */
    +
    923
    +
    924# include <allegro.h>
    +
    925
    +
    926# ifdef RETROFLAT_OS_DOS
    +
    927# include <dos.h>
    +
    928# include <conio.h>
    +
    929# endif /* RETROFLAT_OS_DOS */
    +
    930
    +
    931#include <time.h> /* For srand() */
    +
    932
    +
    933# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    934# define RETROFLAT_CONFIG_USE_FILE
    +
    935# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    936
    +
    937typedef FILE* RETROFLAT_CONFIG;
    +
    938typedef int16_t RETROFLAT_IN_KEY;
    +
    939typedef uint32_t retroflat_ms_t;
    +
    940
    +
    941#define RETROFLAT_MS_FMT "%u"
    +
    942
    +
    943struct RETROFLAT_BITMAP {
    +
    944 size_t sz;
    +
    945 uint8_t flags;
    +
    946 BITMAP* b;
    +
    947};
    +
    948
    +
    949typedef int RETROFLAT_COLOR_DEF;
    +
    950
    +
    951# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->b)
    +
    952# define retroflat_bitmap_locked( bmp ) (0)
    +
    953# ifdef RETROFLAT_OPENGL
    +
    954# define retroflat_bitmap_w( bmp ) ((bmp)->tex.w)
    +
    955# define retroflat_bitmap_h( bmp ) ((bmp)->tex.h)
    +
    956# else
    +
    957# define retroflat_bitmap_w( bmp ) (NULL == (bmp) ? SCREEN_W : (bmp)->b->w)
    +
    958# define retroflat_bitmap_h( bmp ) (NULL == (bmp) ? SCREEN_H : (bmp)->b->h)
    +
    959# endif /* RETROFLAT_OPENGL */
    +
    960# define retroflat_screen_w() SCREEN_W
    +
    961# define retroflat_screen_h() SCREEN_H
    +
    962# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    963# define retroflat_root_win() (NULL) /* TODO */
    +
    964# define retroflat_px_lock( bmp )
    +
    965# define retroflat_px_release( bmp )
    +
    966# ifdef RETROFLAT_VDP
    +
    967# define retroflat_vdp_lock( bmp )
    +
    968# define retroflat_vdp_release( bmp )
    +
    969# endif /* RETROFLAT_VDP */
    +
    970
    +
    971# define retroflat_quit( retval_in ) \
    +
    972 g_retroflat_state->retroflat_flags &= ~RETROFLAT_FLAGS_RUNNING; \
    +
    973 g_retroflat_state->retval = retval_in;
    +
    974
    +
    975# define RETROFLAT_MOUSE_B_LEFT -1
    +
    976# define RETROFLAT_MOUSE_B_RIGHT -2
    +
    977
    +
    978# define RETROFLAT_KEY_UP KEY_UP
    +
    979# define RETROFLAT_KEY_DOWN KEY_DOWN
    +
    980# define RETROFLAT_KEY_RIGHT KEY_RIGHT
    +
    981# define RETROFLAT_KEY_LEFT KEY_LEFT
    +
    982# define RETROFLAT_KEY_A KEY_A
    +
    983# define RETROFLAT_KEY_B KEY_B
    +
    984# define RETROFLAT_KEY_C KEY_C
    +
    985# define RETROFLAT_KEY_D KEY_D
    +
    986# define RETROFLAT_KEY_E KEY_E
    +
    987# define RETROFLAT_KEY_F KEY_F
    +
    988# define RETROFLAT_KEY_G KEY_G
    +
    989# define RETROFLAT_KEY_H KEY_H
    +
    990# define RETROFLAT_KEY_I KEY_I
    +
    991# define RETROFLAT_KEY_J KEY_J
    +
    992# define RETROFLAT_KEY_K KEY_K
    +
    993# define RETROFLAT_KEY_L KEY_L
    +
    994# define RETROFLAT_KEY_M KEY_M
    +
    995# define RETROFLAT_KEY_N KEY_N
    +
    996# define RETROFLAT_KEY_O KEY_O
    +
    997# define RETROFLAT_KEY_P KEY_P
    +
    998# define RETROFLAT_KEY_Q KEY_Q
    +
    999# define RETROFLAT_KEY_R KEY_R
    +
    1000# define RETROFLAT_KEY_S KEY_S
    +
    1001# define RETROFLAT_KEY_T KEY_T
    +
    1002# define RETROFLAT_KEY_U KEY_U
    +
    1003# define RETROFLAT_KEY_V KEY_V
    +
    1004# define RETROFLAT_KEY_W KEY_W
    +
    1005# define RETROFLAT_KEY_X KEY_X
    +
    1006# define RETROFLAT_KEY_Y KEY_Y
    +
    1007# define RETROFLAT_KEY_Z KEY_Z
    +
    1008# define RETROFLAT_KEY_0 KEY_0
    +
    1009# define RETROFLAT_KEY_1 KEY_1
    +
    1010# define RETROFLAT_KEY_2 KEY_2
    +
    1011# define RETROFLAT_KEY_3 KEY_3
    +
    1012# define RETROFLAT_KEY_4 KEY_4
    +
    1013# define RETROFLAT_KEY_5 KEY_5
    +
    1014# define RETROFLAT_KEY_6 KEY_6
    +
    1015# define RETROFLAT_KEY_7 KEY_7
    +
    1016# define RETROFLAT_KEY_8 KEY_8
    +
    1017# define RETROFLAT_KEY_9 KEY_9
    +
    1018# define RETROFLAT_KEY_TAB KEY_TAB
    +
    1019# define RETROFLAT_KEY_SPACE KEY_SPACE
    +
    1020# define RETROFLAT_KEY_ESC KEY_ESC
    +
    1021# define RETROFLAT_KEY_ENTER KEY_ENTER
    +
    1022# define RETROFLAT_KEY_HOME KEY_HOME
    +
    1023# define RETROFLAT_KEY_END KEY_END
    +
    1024# define RETROFLAT_KEY_DELETE KEY_DEL
    +
    1025# define RETROFLAT_KEY_PGUP KEY_PGUP
    +
    1026# define RETROFLAT_KEY_PGDN KEY_PGDN
    +
    1027# define RETROFLAT_KEY_GRAVE KEY_BACKQUOTE
    +
    1028# define RETROFLAT_KEY_BKSP KEY_BACKSPACE
    +
    1029# define RETROFLAT_KEY_SLASH KEY_SLASH
    +
    1030# define RETROFLAT_KEY_SEMICOLON KEY_SEMICOLON
    +
    1031# define RETROFLAT_KEY_PERIOD KEY_STOP
    +
    1032# define RETROFLAT_KEY_COMMA KEY_COMMA
    +
    1033# define RETROFLAT_KEY_EQUALS KEY_EQUALS
    +
    1034# define RETROFLAT_KEY_DASH KEY_MINUS
    +
    1035# define RETROFLAT_KEY_BRACKETL KEY_OPENBRACE
    +
    1036# define RETROFLAT_KEY_BRACKETR KEY_CLOSEBRACE
    +
    1037# define RETROFLAT_KEY_BACKSLASH KEY_BACKSLASH
    +
    1038# define RETROFLAT_KEY_QUOTE KEY_QUOTE
    +
    1039
    +
    1040#elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    1041
    +
    1042# if defined( RETROFLAT_API_SDL2 ) && defined( RETROFLAT_OPENGL )
    +
    1043# error "opengl support not implemented for SDL 2"
    +
    1044# endif /* RETROFLAT_API_SDL2 && RETROFLAT_OPENGL */
    +
    1045
    +
    1046# include <time.h> /* For srand() */
    +
    1047
    +
    1048# if defined( RETROFLAT_OS_WASM )
    +
    1049# include <emscripten.h>
    +
    1050# endif /* RETROFLAT_OS_WASM */
    +
    1051
    +
    1052# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    1053# define RETROFLAT_CONFIG_USE_FILE
    +
    1054# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    1055
    +
    1056# include <SDL.h>
    +
    1057# if defined( RETROFLAT_API_SDL1 ) && !defined( RETROFLAT_OS_WASM )
    +
    1058# include <SDL_getenv.h>
    +
    1059# endif /* RETROFLAT_API_SDL1 */
    +
    1060
    +
    1061# if !defined( RETROFLAT_SOFT_SHAPES ) && !defined( RETROFLAT_OPENGL )
    +
    1062# define RETROFLAT_SOFT_SHAPES
    +
    1063# endif /* !RETROFLAT_SOFT_SHAPES */
    +
    1064
    +
    1065# if !defined( RETROFLAT_SOFT_LINES ) && !defined( RETROFLAT_OPENGL )
    +
    1066/* TODO: Do we need soft lines for this? */
    +
    1067# define RETROFLAT_SOFT_LINES
    +
    1068# endif /* !RETROFLAT_SOFT_LINES */
    +
    1069
    +
    1070typedef FILE* RETROFLAT_CONFIG;
    +
    1071#ifdef RETROFLAT_API_SDL2
    +
    1072typedef int32_t RETROFLAT_IN_KEY;
    +
    1073#else
    +
    1074typedef int16_t RETROFLAT_IN_KEY;
    +
    1075#endif /* RETROFLAT_API_SDL2 */
    +
    1076typedef uint32_t retroflat_ms_t;
    +
    1077
    +
    1078#define RETROFLAT_MS_FMT "%u"
    +
    1079
    +
    1080struct RETROFLAT_BITMAP {
    +
    1081 size_t sz;
    +
    1082 uint8_t flags;
    +
    1083 SDL_Surface* surface;
    +
    1084# ifdef RETROFLAT_API_SDL1
    +
    1085 /* SDL1 autolock counter. */
    +
    1086 ssize_t autolock_refs;
    +
    1087# else
    +
    1088 /* SDL2 texture pointers. */
    +
    1089 SDL_Texture* texture;
    +
    1090 SDL_Renderer* renderer;
    +
    1091# endif /* RETROFLAT_API_SDL1 */
    +
    1092# ifdef RETROFLAT_OPENGL
    +
    1093 struct RETROFLAT_GLTEX tex;
    +
    1094# endif /* RETROFLAT_OPENGL */
    +
    1095};
    +
    1096
    +
    1097# define RETROFLAT_KEY_UP SDLK_UP
    +
    1098# define RETROFLAT_KEY_DOWN SDLK_DOWN
    +
    1099# define RETROFLAT_KEY_RIGHT SDLK_RIGHT
    +
    1100# define RETROFLAT_KEY_LEFT SDLK_LEFT
    +
    1101# define RETROFLAT_KEY_A SDLK_a
    +
    1102# define RETROFLAT_KEY_B SDLK_b
    +
    1103# define RETROFLAT_KEY_C SDLK_c
    +
    1104# define RETROFLAT_KEY_D SDLK_d
    +
    1105# define RETROFLAT_KEY_E SDLK_e
    +
    1106# define RETROFLAT_KEY_F SDLK_f
    +
    1107# define RETROFLAT_KEY_G SDLK_g
    +
    1108# define RETROFLAT_KEY_H SDLK_h
    +
    1109# define RETROFLAT_KEY_I SDLK_i
    +
    1110# define RETROFLAT_KEY_J SDLK_j
    +
    1111# define RETROFLAT_KEY_K SDLK_k
    +
    1112# define RETROFLAT_KEY_L SDLK_l
    +
    1113# define RETROFLAT_KEY_M SDLK_m
    +
    1114# define RETROFLAT_KEY_N SDLK_n
    +
    1115# define RETROFLAT_KEY_O SDLK_o
    +
    1116# define RETROFLAT_KEY_P SDLK_p
    +
    1117# define RETROFLAT_KEY_Q SDLK_q
    +
    1118# define RETROFLAT_KEY_R SDLK_r
    +
    1119# define RETROFLAT_KEY_S SDLK_s
    +
    1120# define RETROFLAT_KEY_T SDLK_t
    +
    1121# define RETROFLAT_KEY_U SDLK_u
    +
    1122# define RETROFLAT_KEY_V SDLK_v
    +
    1123# define RETROFLAT_KEY_W SDLK_w
    +
    1124# define RETROFLAT_KEY_X SDLK_x
    +
    1125# define RETROFLAT_KEY_Y SDLK_y
    +
    1126# define RETROFLAT_KEY_Z SDLK_z
    +
    1127# define RETROFLAT_KEY_0 SDLK_0
    +
    1128# define RETROFLAT_KEY_1 SDLK_1
    +
    1129# define RETROFLAT_KEY_2 SDLK_2
    +
    1130# define RETROFLAT_KEY_3 SDLK_3
    +
    1131# define RETROFLAT_KEY_4 SDLK_4
    +
    1132# define RETROFLAT_KEY_5 SDLK_5
    +
    1133# define RETROFLAT_KEY_6 SDLK_6
    +
    1134# define RETROFLAT_KEY_7 SDLK_7
    +
    1135# define RETROFLAT_KEY_8 SDLK_8
    +
    1136# define RETROFLAT_KEY_9 SDLK_9
    +
    1137# define RETROFLAT_KEY_TAB SDLK_TAB
    +
    1138# define RETROFLAT_KEY_SPACE SDLK_SPACE
    +
    1139# define RETROFLAT_KEY_ESC SDLK_ESCAPE
    +
    1140# define RETROFLAT_KEY_ENTER SDLK_RETURN
    +
    1141# define RETROFLAT_KEY_HOME SDLK_HOME
    +
    1142# define RETROFLAT_KEY_END SDLK_END
    +
    1143# define RETROFLAT_KEY_DELETE SDLK_DELETE
    +
    1144# define RETROFLAT_KEY_PGUP SDLK_PAGEUP
    +
    1145# define RETROFLAT_KEY_PGDN SDLK_PAGEDOWN
    +
    1146# define RETROFLAT_KEY_GRAVE SDLK_BACKQUOTE
    +
    1147# define RETROFLAT_KEY_SLASH SDLK_SLASH
    +
    1148# define RETROFLAT_KEY_BKSP SDLK_BACKSPACE
    +
    1149# define RETROFLAT_KEY_SEMICOLON SDLK_SEMICOLON
    +
    1150# define RETROFLAT_KEY_PERIOD SDLK_PERIOD
    +
    1151# define RETROFLAT_KEY_COMMA SDLK_COMMA
    +
    1152# define RETROFLAT_KEY_EQUALS SDLK_EQUALS
    +
    1153# define RETROFLAT_KEY_DASH SDLK_MINUS
    +
    1154# define RETROFLAT_KEY_BACKSLASH SDLK_BACKSLASH
    +
    1155# define RETROFLAT_KEY_QUOTE SDLK_QUOTE
    +
    1156# define RETROFLAT_KEY_BRACKETL SDLK_LEFTBRACKET
    +
    1157# define RETROFLAT_KEY_BRACKETR SDLK_RIGHTBRACKET
    +
    1158
    +
    1159# define RETROFLAT_MOUSE_B_LEFT -1
    +
    1160# define RETROFLAT_MOUSE_B_RIGHT -2
    +
    1161
    +
    1162# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->surface)
    +
    1163# ifdef RETROFLAT_OPENGL
    +
    1164# define retroflat_bitmap_w( bmp ) ((bmp)->tex.w)
    +
    1165# define retroflat_bitmap_h( bmp ) ((bmp)->tex.h)
    +
    1166# else
    +
    1167# define retroflat_bitmap_w( bmp ) \
    +
    1168 (NULL == (bmp) || NULL == (bmp)->surface ? \
    +
    1169 g_retroflat_state->screen_v_w : (bmp)->surface->w)
    +
    1170# define retroflat_bitmap_h( bmp ) \
    +
    1171 (NULL == (bmp) || NULL == (bmp)->surface ? \
    +
    1172 g_retroflat_state->screen_v_h : (bmp)->surface->h)
    +
    1173# endif /* RETROFLAT_OPENGL */
    +
    1174# ifdef RETROFLAT_API_SDL1
    +
    1175# define retroflat_bitmap_locked( bmp ) \
    +
    1176 (RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & (bmp)->flags))
    +
    1177# else
    +
    1178# define retroflat_bitmap_locked( bmp ) (NULL != (bmp)->renderer)
    +
    1179# endif
    +
    1180# define retroflat_screen_w() (g_retroflat_state->screen_v_w)
    +
    1181# define retroflat_screen_h() (g_retroflat_state->screen_v_h)
    +
    1182
    +
    1183# ifdef RETROFLAT_VDP
    +
    1184# define retroflat_screen_buffer() \
    +
    1185 (NULL == g_retroflat_state->vdp_buffer ? \
    +
    1186 &(g_retroflat_state->buffer) : g_retroflat_state->vdp_buffer)
    +
    1187# else
    +
    1188# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1189# endif /* RETROFLAT_VDP */
    +
    1190# define retroflat_root_win() (NULL) /* TODO */
    +
    1191
    +
    1192# if defined( RETROFLAT_API_SDL1 ) && !defined( RETROFLAT_OPENGL )
    +
    1193/* Special pixel lock JUST for SDL1 surfaces. */
    +
    1194# define retroflat_px_lock( bmp ) \
    +
    1195 if( NULL != bmp ) { \
    +
    1196 (bmp)->autolock_refs++; \
    +
    1197 SDL_LockSurface( (bmp)->surface ); \
    +
    1198 }
    +
    1199# define retroflat_px_release( bmp ) \
    +
    1200 if( NULL != bmp ) { \
    +
    1201 assert( 0 < (bmp)->autolock_refs ); \
    +
    1202 (bmp)->autolock_refs--; \
    +
    1203 SDL_UnlockSurface( (bmp)->surface ); \
    +
    1204 }
    +
    1205# ifdef RETROFLAT_VDP
    +
    1206# define retroflat_vdp_lock( bmp ) retroflat_px_lock( bmp )
    +
    1207# define retroflat_vdp_release( bmp ) retroflat_px_release( bmp )
    +
    1208# endif /* RETROFLAT_VDP */
    +
    1209# else
    +
    1210/* Pixel lock above does not apply to SDL2 surfaces or bitmap textures. */
    +
    1211# define retroflat_px_lock( bmp )
    +
    1212# define retroflat_px_release( bmp )
    +
    1213# endif
    +
    1214
    +
    1215# define retroflat_quit( retval_in ) \
    +
    1216 g_retroflat_state->retroflat_flags &= ~RETROFLAT_FLAGS_RUNNING; \
    +
    1217 g_retroflat_state->retval = retval_in;
    +
    1218
    +
    1219# define END_OF_MAIN()
    +
    1220
    +
    1221 /* SDL Icon */
    +
    1222# if defined( RETROFLT_C ) && defined( RETROFLAT_SDL_ICO )
    +
    1223# include <sdl_ico.h>
    +
    1224# endif /* RETROFLT_C && RETROFLAT_SDL_ICO */
    +
    1225
    +
    1226 /* SDL Colors */
    +
    1227# ifdef RETROFLAT_OPENGL
    +
    1228typedef float MAUG_CONST* RETROFLAT_COLOR_DEF;
    +
    1229#else
    +
    1230typedef SDL_Color RETROFLAT_COLOR_DEF;
    +
    1231# endif /* RETROFLAT_OPENGL */
    +
    1232
    +
    1233#elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    1234
    +
    1235/* == Win16/Win32 == */
    +
    1236
    +
    1237typedef int16_t RETROFLAT_IN_KEY;
    +
    1238typedef uint32_t retroflat_ms_t;
    +
    1239
    +
    1240# define RETROFLAT_MS_FMT "%lu"
    +
    1241
    +
    1242# if defined( RETROFLAT_API_WIN16 ) && defined( RETROFLAT_OPENGL )
    +
    1243# error "opengl support not implemented for win16"
    +
    1244# endif /* RETROFLAT_API_SDL2 && RETROFLAT_OPENGL */
    +
    1245
    +
    1246# include <mmsystem.h>
    +
    1247
    +
    1248# ifndef RETROFLAT_API_WINCE
    +
    1249# include <time.h> /* For srand() */
    +
    1250# endif /* !RETROFLAT_API_WINCE */
    +
    1251
    +
    1252# ifdef RETROFLAT_WING
    +
    1253
    +
    1254# if defined( RETROFLAT_API_WIN32 )
    +
    1255# define WINGAPI WINAPI
    +
    1256# else
    +
    1257# define WINGAPI WINAPI _loadds
    +
    1258# endif
    +
    1259
    +
    1260# define RETROFLAT_WING_LLTABLE( f ) \
    +
    1261 f( HDC, WinGCreateDC, 1001 ) \
    +
    1262 f( BOOL, WinGRecommendDIBFormat, 1002 ) \
    +
    1263 f( HBITMAP, WinGCreateBitmap, 1003 ) \
    +
    1264 f( BOOL, WinGStretchBlt, 1009 )
    +
    1265
    +
    1266typedef int16_t RETROFLAT_IN_KEY;
    +
    1267typedef uint32_t retroflat_ms_t;
    +
    1268typedef uint32_t retroflat_ms_t;
    +
    1269
    +
    1270# define RETROFLAT_MS_FMT "%lu"
    +
    1271
    +
    1272typedef HDC (WINGAPI *WinGCreateDC_t)();
    +
    1273typedef BOOL (WINGAPI *WinGRecommendDIBFormat_t)( BITMAPINFO FAR* );
    +
    1274typedef HBITMAP (WINGAPI *WinGCreateBitmap_t)(
    +
    1275 HDC, BITMAPINFO const FAR*, void FAR* FAR* );
    +
    1276typedef BOOL (WINGAPI *WinGStretchBlt_t)(
    +
    1277 HDC, int, int, int, int, HDC, int, int, int, int );
    +
    1278
    +
    1279# define RETROFLAT_WING_LLTABLE_STRUCT_MEMBERS( retval, proc, ord ) \
    +
    1280 proc ## _t proc;
    +
    1281
    +
    1282struct RETROFLAT_WING_MODULE {
    +
    1283 HMODULE module;
    +
    1284 uint8_t success;
    +
    1285 RETROFLAT_WING_LLTABLE( RETROFLAT_WING_LLTABLE_STRUCT_MEMBERS )
    +
    1286};
    +
    1287# endif /* RETROFLAT_WING */
    +
    1288
    +
    1289struct RETROFLAT_BMI {
    +
    1290 BITMAPINFOHEADER header;
    +
    1291 RGBQUAD colors[RETROFLAT_BMP_COLORS_SZ_MAX];
    +
    1292};
    +
    1293
    +
    1294# ifdef RETROFLAT_API_WIN32
    +
    1295typedef HKEY RETROFLAT_CONFIG;
    +
    1296# else
    +
    1297typedef int RETROFLAT_CONFIG;
    +
    1298# endif /* RETROFLAT_API_WIN32 */
    +
    1299
    +
    1300struct RETROFLAT_BITMAP {
    +
    1301 size_t sz;
    +
    1302 uint8_t flags;
    +
    1303 HBITMAP b;
    +
    1304 HBITMAP mask;
    +
    1305 HDC hdc_b;
    +
    1306 HDC hdc_mask;
    +
    1307 HBITMAP old_hbm_b;
    +
    1308 HBITMAP old_hbm_mask;
    +
    1309# ifdef RETROFLAT_API_WIN16
    +
    1310 uint8_t far* bits;
    +
    1311# else
    +
    1312 uint8_t* bits;
    +
    1313# endif /* RETROFLAT_API_WIN16 */
    +
    1314 ssize_t autolock_refs;
    +
    1315# ifdef RETROFLAT_OPENGL
    +
    1316 struct RETROFLAT_GLTEX tex;
    +
    1317# endif /* RETROFLAT_OPENGL */
    +
    1318 struct RETROFLAT_BMI bmi;
    +
    1319};
    +
    1320
    +
    1321LPSTR* retroflat_win_cli( LPSTR cmd_line, int* argc_out );
    +
    1322
    +
    1323# ifdef RETROFLAT_OPENGL
    +
    1324
    +
    1325typedef float MAUG_CONST* RETROFLAT_COLOR_DEF;
    +
    1326
    +
    1327# else
    +
    1328
    +
    1329/* Use Windoes API and generate brushes/pens for GDI. */
    +
    1330
    +
    1331typedef COLORREF RETROFLAT_COLOR_DEF;
    +
    1332
    +
    1333/* === Setup Brush Cache === */
    +
    1334
    +
    1335/* This will be initialized in setup, so just preserve the number. */
    +
    1336# define RETROFLAT_COLOR_TABLE_WIN_BRUSH( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1337 (HBRUSH)NULL,
    +
    1338
    +
    1339# define RETROFLAT_COLOR_TABLE_WIN_BRSET( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1340 gc_retroflat_win_brushes[idx] = CreateSolidBrush( RGB( r, g, b ) );
    +
    1341
    +
    1342# define RETROFLAT_COLOR_TABLE_WIN_BRRM( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1343 if( (HBRUSH)NULL != gc_retroflat_win_brushes[idx] ) { \
    +
    1344 DeleteObject( gc_retroflat_win_brushes[idx] ); \
    +
    1345 gc_retroflat_win_brushes[idx] = (HBRUSH)NULL; \
    +
    1346 }
    +
    1347
    +
    1348/* === End Setup Brush Cache === */
    +
    1349
    +
    1350/* === Setup Pen Cache === */
    +
    1351
    +
    1352# define RETROFLAT_COLOR_TABLE_WIN_PENS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1353 (HPEN)NULL,
    +
    1354
    +
    1355# define RETROFLAT_COLOR_TABLE_WIN_PNSET( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1356 gc_retroflat_win_pens[idx] = CreatePen( \
    +
    1357 PS_SOLID, RETROFLAT_LINE_THICKNESS, RGB( r, g, b ) );
    +
    1358
    +
    1359# define RETROFLAT_COLOR_TABLE_WIN_PENRM( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1360 if( (HPEN)NULL != gc_retroflat_win_pens[idx] ) { \
    +
    1361 DeleteObject( gc_retroflat_win_pens[idx] ); \
    +
    1362 gc_retroflat_win_pens[idx] = (HPEN)NULL; \
    +
    1363 }
    +
    1364
    +
    1365/* === End Setup Pen Cache === */
    +
    1366
    +
    1367# ifdef RETROFLT_C
    +
    1368
    +
    1369HBRUSH gc_retroflat_win_brushes[] = {
    +
    1370 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_BRUSH )
    +
    1371};
    +
    1372
    +
    1373static HPEN gc_retroflat_win_pens[] = {
    +
    1374 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_PENS )
    +
    1375};
    +
    1376
    +
    1377# else
    +
    1378
    +
    1379extern HBRUSH gc_retroflat_win_brushes[];
    +
    1380
    +
    1381# endif /* RETROFLT_C */
    +
    1382
    +
    1383/* Create a brush and set it to the target HDC. */
    +
    1384# define retroflat_win_setup_brush( old_brush, target, color, flags ) \
    +
    1385 if( RETROFLAT_FLAGS_FILL != (RETROFLAT_FLAGS_FILL & flags) ) { \
    +
    1386 old_brush = \
    +
    1387 SelectObject( target->hdc_b, GetStockObject( NULL_BRUSH ) ); \
    +
    1388 } else { \
    +
    1389 old_brush = SelectObject( \
    +
    1390 target->hdc_b, gc_retroflat_win_brushes[color] ); \
    +
    1391 }
    +
    1392
    +
    1393/* Create a pen and set it to the target HDC. */
    +
    1394# define retroflat_win_setup_pen( old_pen, target, color, flags ) \
    +
    1395 old_pen = \
    +
    1396 SelectObject( target->hdc_b, gc_retroflat_win_pens[color] );
    +
    1397
    +
    1398# define retroflat_win_cleanup_brush( old_brush, target ) \
    +
    1399 if( (HBRUSH)NULL != old_brush ) { \
    +
    1400 SelectObject( target->hdc_b, old_brush ); \
    +
    1401 }
    +
    1402
    +
    1403# define retroflat_win_cleanup_pen( old_pen, target ) \
    +
    1404 if( (HPEN)NULL != old_pen ) { \
    +
    1405 SelectObject( target->hdc_b, old_pen ); \
    +
    1406 }
    +
    1407
    +
    1408# endif /* RETROFLAT_OPENGL */
    +
    1409
    +
    1410/* TODO: This is a parallel bitmap system... maybe move OPENGL stuff into its
    +
    1411 * own header that takes over graphics stuff in OPENGL mode? */
    +
    1412# ifdef RETROFLAT_OPENGL
    +
    1413# define retroflat_bitmap_w( bmp ) ((bmp)->tex.w)
    +
    1414# define retroflat_bitmap_h( bmp ) ((bmp)->tex.h)
    +
    1415# define retroflat_bitmap_locked( bmp ) (NULL != (bmp)->tex.bytes)
    +
    1416# else
    +
    1417# define retroflat_bitmap_w( bmp ) ((bmp)->bmi.header.biWidth)
    +
    1418# define retroflat_bitmap_h( bmp ) ((bmp)->bmi.header.biHeight)
    +
    1419# define retroflat_bitmap_locked( bmp ) ((HDC)NULL != (bmp)->hdc_b)
    +
    1420# endif /* RETROFLAT_OPENGL */
    +
    1421/* TODO: Adapt this for the OPENGL test above? */
    +
    1422# define retroflat_bitmap_ok( bitmap ) ((HBITMAP)NULL != (bitmap)->b)
    +
    1423
    +
    1424# ifdef RETROFLAT_VDP
    +
    1425
    +
    1426# ifdef RETROFLAT_API_WIN16
    +
    1427# error "VDP not supported in Win16!"
    +
    1428# endif /* RETROFLAT_API_WIN16 */
    +
    1429
    +
    1430# define retroflat_vdp_lock( bmp ) \
    +
    1431 assert( NULL != (bmp)->hdc_b ); \
    +
    1432 /* Confirm header info. */ \
    +
    1433 (bmp)->autolock_refs++; \
    +
    1434 if( \
    +
    1435 1 == (bmp)->autolock_refs && \
    +
    1436 RETROFLAT_FLAGS_SCREEN_BUFFER != \
    +
    1437 (RETROFLAT_FLAGS_SCREEN_BUFFER & (bmp)->flags) \
    +
    1438 ) { \
    +
    1439 assert( NULL == (bmp)->bits ); \
    +
    1440 assert( (bmp)->bmi.header.biBitCount == 32 ); \
    +
    1441 assert( (bmp)->bmi.header.biWidth > 0 ); \
    +
    1442 assert( (bmp)->bmi.header.biHeight > 0 ); \
    +
    1443 assert( (bmp)->bmi.header.biSizeImage == \
    +
    1444 (bmp)->bmi.header.biWidth * (bmp)->bmi.header.biHeight * 4 ); \
    +
    1445 (bmp)->bits = VirtualAlloc( \
    +
    1446 0, (bmp)->bmi.header.biSizeImage, \
    +
    1447 MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE ); \
    +
    1448 /* TODO: Check alloc without assert! */ \
    +
    1449 assert( NULL != (bmp)->bits ); \
    +
    1450 /* Get bitmap bits from bitmap HDC into bitmap->bits so that the bitmap
    +
    1451 * can be altered byte-by-byte.
    +
    1452 */ \
    +
    1453 GetDIBits( (bmp)->hdc_b, (bmp)->b, 0, (bmp)->bmi.header.biHeight, \
    +
    1454 (bmp)->bits, (BITMAPINFO*)&((bmp)->bmi), DIB_RGB_COLORS ); \
    +
    1455 }
    +
    1456
    +
    1457# define retroflat_vdp_release( bmp ) \
    +
    1458 assert( 0 < (bmp)->autolock_refs ); \
    +
    1459 (bmp)->autolock_refs--; \
    +
    1460 if( \
    +
    1461 0 == (bmp)->autolock_refs && \
    +
    1462 RETROFLAT_FLAGS_SCREEN_BUFFER != \
    +
    1463 (RETROFLAT_FLAGS_SCREEN_BUFFER & (bmp)->flags) \
    +
    1464 ) { \
    +
    1465 /* TODO: Causes alpha blending in mdemos? */ \
    +
    1466 if( \
    +
    1467 /* Set bitmap bits from bitmap->bits into HDC. */ \
    +
    1468 SetDIBits( g_retroflat_state->hdc_win, (bmp)->b, 0, \
    +
    1469 (bmp)->bmi.header.biHeight, (bmp)->bits, \
    +
    1470 (BITMAPINFO*)&((bmp)->bmi), DIB_RGB_COLORS ) < \
    +
    1471 (bmp)->bmi.header.biHeight \
    +
    1472 ) { \
    +
    1473 error_printf( "SetDIBits failed!" ); \
    +
    1474 } \
    +
    1475 VirtualFree( (bmp)->bits, 0, MEM_RELEASE ); \
    +
    1476 (bmp)->bits = NULL; \
    +
    1477 }
    +
    1478
    +
    1479# define retroflat_screen_buffer() \
    +
    1480 (NULL == g_retroflat_state->vdp_buffer ? \
    +
    1481 &(g_retroflat_state->buffer) : g_retroflat_state->vdp_buffer)
    +
    1482
    +
    1483# else
    +
    1484
    +
    1485# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1486
    +
    1487# endif /* RETROFLAT_VDP */
    +
    1488
    +
    1489# define retroflat_px_lock( bmp )
    +
    1490# define retroflat_px_release( bmp )
    +
    1491# define retroflat_screen_w() (g_retroflat_state->screen_v_w)
    +
    1492# define retroflat_screen_h() (g_retroflat_state->screen_v_h)
    +
    1493# define retroflat_root_win() (g_retroflat_state->window)
    +
    1494# define retroflat_quit( retval_in ) PostQuitMessage( retval_in );
    +
    1495
    +
    1496# ifndef VK_OEM_1
    +
    1497# define VK_OEM_1 0xba
    +
    1498# endif /* !VK_OEM_1 */
    +
    1499
    +
    1500# ifndef VK_OEM_2
    +
    1501# define VK_OEM_2 0xbf
    +
    1502# endif /* !VK_OEM_2 */
    +
    1503
    +
    1504# ifndef VK_OEM_3
    +
    1505# define VK_OEM_3 0xc0
    +
    1506# endif /* !VK_OEM_3 */
    +
    1507
    +
    1508# ifndef VK_OEM_4
    +
    1509# define VK_OEM_4 0xdb
    +
    1510# endif /* !VK_OEM_4 */
    +
    1511
    +
    1512# ifndef VK_OEM_5
    +
    1513# define VK_OEM_5 0xdc
    +
    1514# endif /* !VK_OEM_5 */
    +
    1515
    +
    1516# ifndef VK_OEM_6
    +
    1517# define VK_OEM_6 0xdd
    +
    1518# endif /* !VK_OEM_6 */
    +
    1519
    +
    1520# ifndef VK_OEM_7
    +
    1521# define VK_OEM_7 0xde
    +
    1522# endif /* !VK_OEM_7 */
    +
    1523
    +
    1524# ifndef VK_OEM_MINUS
    +
    1525# define VK_OEM_MINUS 0xbd
    +
    1526# endif /* !VK_OEM_MINUS */
    +
    1527
    +
    1528# ifndef VK_OEM_PLUS
    +
    1529# define VK_OEM_PLUS 0xbb
    +
    1530# endif /* !VK_OEM_PLUS */
    +
    1531
    +
    1532# ifndef VK_OEM_PERIOD
    +
    1533# define VK_OEM_PERIOD 0xbe
    +
    1534# endif /* !VK_OEM_PERIOD */
    +
    1535
    +
    1536# ifndef VK_OEM_COMMA
    +
    1537# define VK_OEM_COMMA 0xbc
    +
    1538# endif /* !VK_OEM_COMMA */
    +
    1539
    +
    1540# define RETROFLAT_KEY_GRAVE VK_OEM_3
    +
    1541# define RETROFLAT_KEY_SLASH VK_OEM_2
    +
    1542# define RETROFLAT_KEY_UP VK_UP
    +
    1543# define RETROFLAT_KEY_DOWN VK_DOWN
    +
    1544# define RETROFLAT_KEY_RIGHT VK_RIGHT
    +
    1545# define RETROFLAT_KEY_LEFT VK_LEFT
    +
    1546# define RETROFLAT_KEY_BKSP VK_BACK
    +
    1547# define RETROFLAT_KEY_A 0x41
    +
    1548# define RETROFLAT_KEY_B 0x42
    +
    1549# define RETROFLAT_KEY_C 0x43
    +
    1550# define RETROFLAT_KEY_D 0x44
    +
    1551# define RETROFLAT_KEY_E 0x45
    +
    1552# define RETROFLAT_KEY_F 0x46
    +
    1553# define RETROFLAT_KEY_G 0x47
    +
    1554# define RETROFLAT_KEY_H 0x48
    +
    1555# define RETROFLAT_KEY_I 0x49
    +
    1556# define RETROFLAT_KEY_J 0x4a
    +
    1557# define RETROFLAT_KEY_K 0x4b
    +
    1558# define RETROFLAT_KEY_L 0x4c
    +
    1559# define RETROFLAT_KEY_M 0x4d
    +
    1560# define RETROFLAT_KEY_N 0x4e
    +
    1561# define RETROFLAT_KEY_O 0x4f
    +
    1562# define RETROFLAT_KEY_P 0x50
    +
    1563# define RETROFLAT_KEY_Q 0x51
    +
    1564# define RETROFLAT_KEY_R 0x52
    +
    1565# define RETROFLAT_KEY_S 0x53
    +
    1566# define RETROFLAT_KEY_T 0x54
    +
    1567# define RETROFLAT_KEY_U 0x55
    +
    1568# define RETROFLAT_KEY_V 0x56
    +
    1569# define RETROFLAT_KEY_W 0x57
    +
    1570# define RETROFLAT_KEY_X 0x58
    +
    1571# define RETROFLAT_KEY_Y 0x59
    +
    1572# define RETROFLAT_KEY_Z 0x60
    +
    1573# define RETROFLAT_KEY_0 0x30
    +
    1574# define RETROFLAT_KEY_1 0x31
    +
    1575# define RETROFLAT_KEY_2 0x32
    +
    1576# define RETROFLAT_KEY_3 0x33
    +
    1577# define RETROFLAT_KEY_4 0x34
    +
    1578# define RETROFLAT_KEY_5 0x35
    +
    1579# define RETROFLAT_KEY_6 0x36
    +
    1580# define RETROFLAT_KEY_7 0x37
    +
    1581# define RETROFLAT_KEY_8 0x38
    +
    1582# define RETROFLAT_KEY_9 0x39
    +
    1583# define RETROFLAT_KEY_TAB VK_TAB
    +
    1584# define RETROFLAT_KEY_SPACE VK_SPACE
    +
    1585# define RETROFLAT_KEY_ESC VK_ESCAPE
    +
    1586# define RETROFLAT_KEY_ENTER VK_RETURN
    +
    1587# define RETROFLAT_KEY_HOME VK_HOME
    +
    1588# define RETROFLAT_KEY_END VK_END
    +
    1589# define RETROFLAT_KEY_DELETE VK_DELETE
    +
    1590# define RETROFLAT_KEY_PGUP VK_PRIOR
    +
    1591# define RETROFLAT_KEY_PGDN VK_NEXT
    +
    1592# define RETROFLAT_KEY_SEMICOLON VK_OEM_1
    +
    1593# define RETROFLAT_KEY_PERIOD VK_OEM_PERIOD
    +
    1594# define RETROFLAT_KEY_COMMA VK_OEM_COMMA
    +
    1595# define RETROFLAT_KEY_EQUALS VK_OEM_PLUS
    +
    1596# define RETROFLAT_KEY_DASH VK_OEM_MINUS
    +
    1597# define RETROFLAT_KEY_BACKSLASH VK_OEM_5
    +
    1598# define RETROFLAT_KEY_QUOTE VK_OEM_7
    +
    1599# define RETROFLAT_KEY_BRACKETL VK_OEM_4
    +
    1600# define RETROFLAT_KEY_BRACKETR VK_OEM_6
    +
    1601
    +
    1602# define RETROFLAT_MOUSE_B_LEFT VK_LBUTTON
    +
    1603# define RETROFLAT_MOUSE_B_RIGHT VK_RBUTTON
    +
    1604
    +
    1605/* Set the calling convention for WinMain, depending on Win16/Win32. */
    +
    1606# if defined( RETROFLAT_API_WIN16 )
    +
    1607# define WINXAPI PASCAL
    +
    1608# elif defined( RETROFLAT_API_WIN32 )
    +
    1609# define WINXAPI WINAPI
    +
    1610# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    1611
    +
    1612/* TODO: Verify this on multi-monitor Win32 systems. */
    +
    1613#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
    +
    1614#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
    +
    1615
    +
    1616#define main( argc, argv ) retroflat_main( argc, argv )
    +
    1617
    +
    1618/* Improvise a rough WinMain to call main(). */
    +
    1619#define END_OF_MAIN() \
    +
    1620 int WINXAPI WinMain( \
    +
    1621 HINSTANCE hInstance, HINSTANCE hPrevInstance, \
    +
    1622 LPSTR lpCmdLine, int nCmdShow \
    +
    1623 ) { \
    +
    1624 LPSTR* rf_argv = NULL; \
    +
    1625 int rf_argc = 0; \
    +
    1626 int retval = 0; \
    +
    1627 g_retroflat_instance = hInstance; \
    +
    1628 g_retroflat_cmd_show = nCmdShow; \
    +
    1629 rf_argv = retroflat_win_cli( lpCmdLine, &rf_argc ); \
    +
    1630 retval = retroflat_main( rf_argc, rf_argv ); \
    +
    1631 free( rf_argv ); \
    +
    1632 return retval; \
    +
    1633 }
    +
    1634
    +
    1635/* Convenience macro for auto-locking inside of draw functions. */
    +
    1636/* TODO: Use maug_cleanup and assume retval. */
    +
    1637#define retroflat_internal_autolock_bitmap( bmp, lock_auto ) \
    +
    1638 if( !retroflat_bitmap_locked( bmp ) ) { \
    +
    1639 retval = retroflat_draw_lock( bmp ); \
    +
    1640 maug_cleanup_if_not_ok(); \
    +
    1641 lock_auto = 1; \
    +
    1642 }
    +
    1643
    +
    1644#elif defined( RETROFLAT_API_LIBNDS )
    +
    1645
    +
    1646/* == Nintendo DS == */
    +
    1647
    +
    1648# include <nds.h>
    +
    1649
    +
    1650/* NDS doesn't have primitives. */
    +
    1651# ifndef RETROFLAT_SOFT_SHAPES
    +
    1652# define RETROFLAT_SOFT_SHAPES
    +
    1653# endif /* !RETROFLAT_SOFT_SHAPES */
    +
    1654
    +
    1655# ifndef RETROFLAT_SOFT_LINES
    +
    1656# define RETROFLAT_SOFT_LINES
    +
    1657# endif /* !RETROFLAT_SOFT_LINES */
    +
    1658
    +
    1659# define BG_TILE_W_PX 8
    +
    1660# define BG_TILE_H_PX 8
    +
    1661# define BG_W_TILES 32
    +
    1662
    +
    1663typedef int16_t RETROFLAT_IN_KEY;
    +
    1664typedef uint32_t retroflat_ms_t;
    +
    1665typedef void* RETROFLAT_CONFIG;
    +
    1666
    +
    1667#define RETROFLAT_MS_FMT "%lu"
    +
    1668
    +
    1669struct RETROFLAT_BITMAP {
    +
    1670 size_t sz;
    +
    1671 uint8_t flags;
    +
    1672 uint16_t* b;
    +
    1673# ifdef RETROFLAT_OPENGL
    +
    1674 struct RETROFLAT_GLTEX tex;
    +
    1675 ssize_t w;
    +
    1676 ssize_t h;
    +
    1677# endif /* RETROFLAT_OPENGL */
    +
    1678};
    +
    1679
    +
    1680typedef int RETROFLAT_COLOR_DEF;
    +
    1681
    +
    1682# ifdef RETROFLAT_NDS_WASD
    +
    1683# define RETROFLAT_KEY_A KEY_LEFT
    +
    1684# define RETROFLAT_KEY_D KEY_RIGHT
    +
    1685# define RETROFLAT_KEY_W KEY_UP
    +
    1686# define RETROFLAT_KEY_S KEY_DOWN
    +
    1687# endif /* RETROFLAT_NDS_WASD */
    +
    1688# define RETROFLAT_KEY_LEFT KEY_LEFT
    +
    1689# define RETROFLAT_KEY_RIGHT KEY_RIGHT
    +
    1690# define RETROFLAT_KEY_UP KEY_UP
    +
    1691# define RETROFLAT_KEY_DOWN KEY_DOWN
    +
    1692# define RETROFLAT_KEY_ENTER KEY_START
    +
    1693# define RETROFLAT_KEY_SPACE KEY_A
    +
    1694# define RETROFLAT_KEY_ESC KEY_B
    +
    1695# define RETROFLAT_MOUSE_B_LEFT (-1)
    +
    1696# define RETROFLAT_MOUSE_B_RIGHT (-2)
    +
    1697
    +
    1698/* TODO */
    +
    1699# define retroflat_bitmap_locked( bmp ) (0)
    +
    1700# define retroflat_px_lock( bmp )
    +
    1701# define retroflat_px_release( bmp )
    +
    1702# ifdef RETROFLAT_VDP
    +
    1703# define retroflat_vdp_lock( bmp )
    +
    1704# define retroflat_vdp_release( bmp )
    +
    1705# endif /* RETROFLAT_VDP */
    +
    1706
    +
    1707# define retroflat_screen_w() (256)
    +
    1708# define retroflat_screen_h() (192)
    +
    1709# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1710# define retroflat_root_win() (NULL) /* TODO */
    +
    1711
    +
    1712# define END_OF_MAIN()
    +
    1713
    +
    1714/* TODO? */
    +
    1715# define retroflat_quit( retval_in )
    +
    1716# define retroflat_bitmap_w( bmp ) (0)
    +
    1717# define retroflat_bitmap_h( bmp ) (0)
    +
    1718# define retroflat_bitmap_ok( bitmap ) (0)
    +
    1719
    +
    1720#elif defined( RETROFLAT_API_GLUT )
    +
    1721
    +
    1722# ifndef RETROFLAT_OPENGL
    +
    1723# error "RETROFLAT_API_GLUT specified without RETROFLAT_OPENGL!"
    +
    1724# define RETROFLAT_OPENGL
    +
    1725# endif /* !RETROFLAT_OPENGL */
    +
    1726
    +
    1727# ifdef __WATCOMC__
    +
    1728# define GLUT_DISABLE_ATEXIT_HACK
    +
    1729# endif
    +
    1730
    +
    1731# include <GL/glut.h>
    +
    1732
    +
    1733# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    1734# define RETROFLAT_CONFIG_USE_FILE
    +
    1735# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    1736
    +
    1737typedef int16_t RETROFLAT_IN_KEY;
    +
    1738typedef uint32_t retroflat_ms_t;
    +
    1739
    +
    1740# define RETROFLAT_MS_FMT "%lu"
    +
    1741
    +
    1742typedef FILE* RETROFLAT_CONFIG;
    +
    1743
    +
    1744typedef float MAUG_CONST* RETROFLAT_COLOR_DEF;
    +
    1745
    +
    1746struct RETROFLAT_BITMAP {
    +
    1747 size_t sz;
    +
    1748 uint8_t flags;
    +
    1749 struct RETROFLAT_GLTEX tex;
    +
    1750 ssize_t w;
    +
    1751 ssize_t h;
    +
    1752};
    +
    1753
    +
    1754# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->b)
    +
    1755# define retroflat_bitmap_locked( bmp ) \
    +
    1756 (RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & (bmp)->flags))
    +
    1757/* TODO */
    +
    1758# define retroflat_bitmap_w( bmp ) (0)
    +
    1759# define retroflat_bitmap_h( bmp ) (0)
    +
    1760
    +
    1762# define retroflat_px_lock( bmp )
    +
    1763# define retroflat_px_release( bmp )
    +
    1764# ifdef RETROFLAT_VDP
    +
    1765# define retroflat_vdp_lock( bmp )
    +
    1766# define retroflat_vdp_release( bmp )
    +
    1767# endif /* RETROFLAT_VDP */
    +
    1768# define retroflat_screen_w() (g_retroflat_state->screen_v_w)
    +
    1769# define retroflat_screen_h() (g_retroflat_state->screen_v_h)
    +
    1770# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1771# define retroflat_root_win() (NULL) /* TODO */
    +
    1772# define retroflat_quit( retval_in ) glutDestroyWindow( glutGetWindow() )
    +
    1773# define END_OF_MAIN()
    +
    1774
    +
    1775# define GLUT_SPECIAL_KEY_OFFSET 0x80
    +
    1776
    +
    1777# define RETROFLAT_MOUSE_B_LEFT -1
    +
    1778# define RETROFLAT_MOUSE_B_RIGHT -2
    +
    1779
    +
    1780# define RETROFLAT_KEY_UP (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_UP)
    +
    1781# define RETROFLAT_KEY_DOWN (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_DOWN)
    +
    1782# define RETROFLAT_KEY_RIGHT (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_RIGHT)
    +
    1783# define RETROFLAT_KEY_LEFT (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_LEFT)
    +
    1784# define RETROFLAT_KEY_HOME (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_HOME)
    +
    1785# define RETROFLAT_KEY_END (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_END)
    +
    1786# define RETROFLAT_KEY_PGUP (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_PAGE_UP)
    +
    1787# define RETROFLAT_KEY_PGDN \
    +
    1788 (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_PAGE_DOWN)
    +
    1789# define RETROFLAT_KEY_DELETE 0x7f
    +
    1790# define RETROFLAT_KEY_ESC 0x1b
    +
    1791# define RETROFLAT_KEY_ENTER 0x0d
    +
    1792# define RETROFLAT_KEY_TAB '\t'
    +
    1793# define RETROFLAT_KEY_SPACE ' '
    +
    1794# define RETROFLAT_KEY_GRAVE '`'
    +
    1795# define RETROFLAT_KEY_SLASH '/'
    +
    1796# define RETROFLAT_KEY_BKSP 0x08
    +
    1797# define RETROFLAT_KEY_SEMICOLON ';'
    +
    1798# define RETROFLAT_KEY_PERIOD '.'
    +
    1799# define RETROFLAT_KEY_COMMA ','
    +
    1800# define RETROFLAT_KEY_EQUALS '='
    +
    1801# define RETROFLAT_KEY_DASH '-'
    +
    1802# define RETROFLAT_KEY_A 'a'
    +
    1803# define RETROFLAT_KEY_B 'b'
    +
    1804# define RETROFLAT_KEY_C 'c'
    +
    1805# define RETROFLAT_KEY_D 'd'
    +
    1806# define RETROFLAT_KEY_E 'e'
    +
    1807# define RETROFLAT_KEY_F 'f'
    +
    1808# define RETROFLAT_KEY_G 'g'
    +
    1809# define RETROFLAT_KEY_H 'h'
    +
    1810# define RETROFLAT_KEY_I 'i'
    +
    1811# define RETROFLAT_KEY_J 'j'
    +
    1812# define RETROFLAT_KEY_K 'k'
    +
    1813# define RETROFLAT_KEY_L 'l'
    +
    1814# define RETROFLAT_KEY_M 'm'
    +
    1815# define RETROFLAT_KEY_N 'n'
    +
    1816# define RETROFLAT_KEY_O 'o'
    +
    1817# define RETROFLAT_KEY_P 'p'
    +
    1818# define RETROFLAT_KEY_Q 'q'
    +
    1819# define RETROFLAT_KEY_R 'r'
    +
    1820# define RETROFLAT_KEY_S 's'
    +
    1821# define RETROFLAT_KEY_T 't'
    +
    1822# define RETROFLAT_KEY_U 'u'
    +
    1823# define RETROFLAT_KEY_V 'v'
    +
    1824# define RETROFLAT_KEY_W 'w'
    +
    1825# define RETROFLAT_KEY_X 'x'
    +
    1826# define RETROFLAT_KEY_Y 'y'
    +
    1827# define RETROFLAT_KEY_Z 'z'
    +
    1828# define RETROFLAT_KEY_0 '0'
    +
    1829# define RETROFLAT_KEY_1 '1'
    +
    1830# define RETROFLAT_KEY_2 '2'
    +
    1831# define RETROFLAT_KEY_3 '3'
    +
    1832# define RETROFLAT_KEY_4 '4'
    +
    1833# define RETROFLAT_KEY_5 '5'
    +
    1834# define RETROFLAT_KEY_6 '6'
    +
    1835# define RETROFLAT_KEY_7 '7'
    +
    1836# define RETROFLAT_KEY_8 '8'
    +
    1837# define RETROFLAT_KEY_9 '9'
    +
    1838
    +
    1839#elif defined( RETROFLAT_API_PC_BIOS )
    +
    1840
    +
    1841# include <time.h> /* For srand() */
    +
    1842
    +
    1843# if defined( MAUG_OS_DOS_REAL ) && \
    +
    1844 defined( MAUG_DOS_MEM_L ) && \
    +
    1845 defined( __WATCOMC__ )
    +
    1846# define SEG_RETROBMP __based( __segname( "RETROBMP" ) )
    +
    1847# else
    +
    1848# define SEG_RETROBMP
    +
    1849# endif /* __WATCOMC__ */
    +
    1850
    +
    1851typedef int16_t RETROFLAT_IN_KEY;
    +
    1852typedef uint16_t retroflat_ms_t;
    +
    1853
    +
    1854# define RETROFLAT_MS_FMT "%u"
    +
    1855
    +
    1856/* Explicity screen sizes aren't supported, only screen modes handled in
    +
    1857 * special cases during init.
    +
    1858 */
    +
    1859# define RETROFLAT_NO_CLI_SZ
    +
    1860
    +
    1861# define RETROFLAT_SCREEN_MODE_CGA 0x04
    +
    1862# define RETROFLAT_SCREEN_MODE_VGA 0x13
    +
    1863
    +
    1864# define RETROFLAT_CGA_COLOR_BLACK 0
    +
    1865# define RETROFLAT_CGA_COLOR_CYAN 1
    +
    1866# define RETROFLAT_CGA_COLOR_MAGENTA 2
    +
    1867# define RETROFLAT_CGA_COLOR_WHITE 3
    +
    1868
    +
    1869# ifndef RETROFLAT_SOFT_SHAPES
    +
    1870# define RETROFLAT_SOFT_SHAPES
    +
    1871# endif /* !RETROFLAT_SOFT_SHAPES */
    +
    1872
    +
    1873# ifndef RETROFLAT_DOS_TIMER_DIV
    +
    1874/* #define RETROFLAT_DOS_TIMER_DIV 1103 */
    +
    1875# define RETROFLAT_DOS_TIMER_DIV 100
    +
    1876# endif /* !RETROFLAT_DOS_TIMER_DIV */
    +
    1877
    +
    1878# define retroflat_bitmap_w( bmp ) ((bmp)->w)
    +
    1879# define retroflat_bitmap_h( bmp ) ((bmp)->h)
    +
    1880
    +
    1881# define retroflat_px_lock( bmp )
    +
    1882# define retroflat_px_release( bmp )
    +
    1883
    +
    1884# ifdef RETROFLAT_VDP
    +
    1885# define retroflat_vdp_lock( bmp )
    +
    1886# define retroflat_vdp_release( bmp )
    +
    1887# endif /* RETROFLAT_VDP */
    +
    1888
    +
    1889# ifndef NO_I86
    +
    1890# include <i86.h>
    +
    1891# endif /* NO_I86 */
    +
    1892# include <dos.h>
    +
    1893# include <conio.h>
    +
    1894# include <malloc.h>
    +
    1895
    +
    1896# define END_OF_MAIN()
    +
    1897
    +
    1898# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    1899# define RETROFLAT_CONFIG_USE_FILE
    +
    1900# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    1901
    +
    1902typedef FILE* RETROFLAT_CONFIG;
    +
    1903
    +
    1904# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->px)
    +
    1905
    +
    1906# define retroflat_quit( retval_in ) \
    +
    1907 g_retroflat_state->retroflat_flags &= ~RETROFLAT_FLAGS_RUNNING; \
    +
    1908 g_retroflat_state->retval = retval_in;
    +
    1909
    +
    1910typedef uint8_t RETROFLAT_COLOR_DEF;
    +
    1911
    +
    1912struct RETROFLAT_BITMAP {
    +
    1913 size_t sz;
    +
    1914 uint8_t flags;
    +
    1915 int16_t w;
    +
    1916 int16_t h;
    +
    1917 uint8_t SEG_FAR* px;
    +
    1918 uint8_t SEG_FAR* mask;
    +
    1919};
    +
    1920
    +
    1921# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1922
    +
    1923/* We only explicitly support screen modes with these dimensions anyway.
    +
    1924 */
    +
    1925# define retroflat_screen_w() (g_retroflat_state->buffer.w)
    +
    1926# define retroflat_screen_h() (g_retroflat_state->buffer.h)
    +
    1927
    +
    1928/* TODO: DOS Keycodes */
    +
    1929
    +
    1930# define RETROFLAT_KEY_BKSP 0x08
    +
    1931/* TODO */
    +
    1932# define RETROFLAT_KEY_GRAVE /* 0x60 */ '`'
    +
    1933# define RETROFLAT_KEY_DASH '-'
    +
    1934# define RETROFLAT_KEY_SLASH '/'
    +
    1935# define RETROFLAT_KEY_PERIOD '.'
    +
    1936# define RETROFLAT_KEY_COMMA ','
    +
    1937# define RETROFLAT_KEY_SEMICOLON ';'
    +
    1938# define RETROFLAT_KEY_A 0x41
    +
    1939# define RETROFLAT_KEY_B 0x42
    +
    1940# define RETROFLAT_KEY_C 0x43
    +
    1941# define RETROFLAT_KEY_D 0x44
    +
    1942# define RETROFLAT_KEY_E 0x45
    +
    1943# define RETROFLAT_KEY_F 0x46
    +
    1944# define RETROFLAT_KEY_G 0x47
    +
    1945# define RETROFLAT_KEY_H 0x48
    +
    1946# define RETROFLAT_KEY_I 0x49
    +
    1947# define RETROFLAT_KEY_J 0x4a
    +
    1948# define RETROFLAT_KEY_K 0x4b
    +
    1949# define RETROFLAT_KEY_L 0x4c
    +
    1950# define RETROFLAT_KEY_M 0x4d
    +
    1951# define RETROFLAT_KEY_N 0x4e
    +
    1952# define RETROFLAT_KEY_O 0x4f
    +
    1953# define RETROFLAT_KEY_P 0x50
    +
    1954# define RETROFLAT_KEY_Q 0x51
    +
    1955# define RETROFLAT_KEY_R 0x52
    +
    1956# define RETROFLAT_KEY_S 0x53
    +
    1957# define RETROFLAT_KEY_T 0x54
    +
    1958# define RETROFLAT_KEY_U 0x55
    +
    1959# define RETROFLAT_KEY_V 0x56
    +
    1960# define RETROFLAT_KEY_W 0x57
    +
    1961# define RETROFLAT_KEY_X 0x58
    +
    1962# define RETROFLAT_KEY_Y 0x59
    +
    1963# define RETROFLAT_KEY_Z 0x60
    +
    1964# define RETROFLAT_KEY_0 0x30
    +
    1965# define RETROFLAT_KEY_1 0x31
    +
    1966# define RETROFLAT_KEY_2 0x32
    +
    1967# define RETROFLAT_KEY_3 0x33
    +
    1968# define RETROFLAT_KEY_4 0x34
    +
    1969# define RETROFLAT_KEY_5 0x35
    +
    1970# define RETROFLAT_KEY_6 0x36
    +
    1971# define RETROFLAT_KEY_7 0x37
    +
    1972# define RETROFLAT_KEY_8 0x38
    +
    1973# define RETROFLAT_KEY_9 0x39
    +
    1974/* TODO */
    +
    1975# define RETROFLAT_KEY_TAB 0
    +
    1976# define RETROFLAT_KEY_SPACE 0x20
    +
    1977# define RETROFLAT_KEY_ESC 0x1b
    +
    1978# define RETROFLAT_KEY_ENTER 0x0d
    +
    1979/* TODO */
    +
    1980# define RETROFLAT_KEY_BRACKETL '['
    +
    1981/* TODO */
    +
    1982# define RETROFLAT_KEY_BRACKETR ']'
    +
    1983/* TODO */
    +
    1984# define RETROFLAT_KEY_BACKSLASH '\\'
    +
    1985/* TODO */
    +
    1986# define RETROFLAT_KEY_QUOTE '\''
    +
    1987/* TODO */
    +
    1988# define RETROFLAT_KEY_EQUALS '='
    +
    1989
    +
    1990/* Handle keys that send a double-code. */
    +
    1991# define RETROFLAT_KEY_UP -3
    +
    1992# define RETROFLAT_KEY_DOWN -4
    +
    1993# define RETROFLAT_KEY_RIGHT -5
    +
    1994# define RETROFLAT_KEY_LEFT -6
    +
    1995# define RETROFLAT_KEY_HOME -7
    +
    1996# define RETROFLAT_KEY_END -8
    +
    1997# define RETROFLAT_KEY_PGUP -9
    +
    1998# define RETROFLAT_KEY_PGDN -10
    +
    1999# define RETROFLAT_KEY_DELETE -11
    +
    2000
    +
    2001# define RETROFLAT_MOUSE_B_LEFT -100
    +
    2002# define RETROFLAT_MOUSE_B_RIGHT -200
    +
    2003
    +
    2004typedef void (__interrupt __far* retroflat_intfunc)( void );
    +
    2005
    +
    2006#else
    +
    2007# pragma message( "warning: not implemented" )
    +
    2008
    +
    2020typedef FILE* RETROFLAT_CONFIG;
    +
    2021
    +
    2022 /* maug_retroflt_config */
    +
    2023
    +
    + +
    2037 size_t sz;
    +
    2039 uint8_t flags;
    +
    2040 struct RETROFLAT_GLTEX tex;
    +
    2041};
    +
    +
    2042
    +
    2044# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->b)
    +
    2045
    +
    2046 /* maug_retroflt_bitmap */
    +
    2047
    +
    2049# define retroflat_screen_w()
    +
    2050
    +
    2052# define retroflat_screen_h()
    +
    2053
    +
    2055# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    2056
    +
    2061# define retroflat_quit( retval_in )
    +
    2062
    +
    2076typedef int RETROFLAT_COLOR_DEF;
    +
    2077
    +
    2078# define RETROFLAT_COLOR_BLACK 0
    +
    2079# define RETROFLAT_COLOR_DARKBLUE 1
    +
    2080# define RETROFLAT_COLOR_DARKGREEN 2
    +
    2081# define RETROFLAT_COLOR_TEAL 3
    +
    2082# define RETROFLAT_COLOR_DARKRED 4
    +
    2083# define RETROFLAT_COLOR_VIOLET 5
    +
    2084# define RETROFLAT_COLOR_BROWN 6
    +
    2085# define RETROFLAT_COLOR_GRAY 7
    +
    2086# define RETROFLAT_COLOR_DARKGRAY 8
    +
    2087# define RETROFLAT_COLOR_BLUE 9
    +
    2088# define RETROFLAT_COLOR_GREEN 10
    +
    2089# define RETROFLAT_COLOR_CYAN 11
    +
    2090# define RETROFLAT_COLOR_RED 12
    +
    2091# define RETROFLAT_COLOR_MAGENTA 13
    +
    2092# define RETROFLAT_COLOR_YELLOW 14
    +
    2093# define RETROFLAT_COLOR_WHITE 15
    +
    2094
    +
    2095 /* maug_retroflt_color */
    +
    2096
    +
    2097 /* maug_retroflt_drawing */
    +
    2098
    +
    2112# define RETROFLAT_KEY_UP 0
    +
    2113# define RETROFLAT_KEY_DOWN 0
    +
    2114# define RETROFLAT_KEY_RIGHT 0
    +
    2115# define RETROFLAT_KEY_LEFT 0
    +
    2116# define RETROFLAT_KEY_A 0x41
    +
    2117# define RETROFLAT_KEY_B 0x42
    +
    2118# define RETROFLAT_KEY_C 0x43
    +
    2119# define RETROFLAT_KEY_D 0x44
    +
    2120# define RETROFLAT_KEY_E 0x45
    +
    2121# define RETROFLAT_KEY_F 0x46
    +
    2122# define RETROFLAT_KEY_G 0x47
    +
    2123# define RETROFLAT_KEY_H 0x48
    +
    2124# define RETROFLAT_KEY_I 0x49
    +
    2125# define RETROFLAT_KEY_J 0x4a
    +
    2126# define RETROFLAT_KEY_K 0x4b
    +
    2127# define RETROFLAT_KEY_L 0x4c
    +
    2128# define RETROFLAT_KEY_M 0x4d
    +
    2129# define RETROFLAT_KEY_N 0x4e
    +
    2130# define RETROFLAT_KEY_O 0x4f
    +
    2131# define RETROFLAT_KEY_P 0x50
    +
    2132# define RETROFLAT_KEY_Q 0x51
    +
    2133# define RETROFLAT_KEY_R 0x52
    +
    2134# define RETROFLAT_KEY_S 0x53
    +
    2135# define RETROFLAT_KEY_T 0x54
    +
    2136# define RETROFLAT_KEY_U 0x55
    +
    2137# define RETROFLAT_KEY_V 0x56
    +
    2138# define RETROFLAT_KEY_W 0x57
    +
    2139# define RETROFLAT_KEY_X 0x58
    +
    2140# define RETROFLAT_KEY_Y 0x59
    +
    2141# define RETROFLAT_KEY_Z 0x60
    +
    2142# define RETROFLAT_KEY_0 0x30
    +
    2143# define RETROFLAT_KEY_1 0x31
    +
    2144# define RETROFLAT_KEY_2 0x32
    +
    2145# define RETROFLAT_KEY_3 0x33
    +
    2146# define RETROFLAT_KEY_4 0x34
    +
    2147# define RETROFLAT_KEY_5 0x35
    +
    2148# define RETROFLAT_KEY_6 0x36
    +
    2149# define RETROFLAT_KEY_7 0x37
    +
    2150# define RETROFLAT_KEY_8 0x38
    +
    2151# define RETROFLAT_KEY_9 0x39
    +
    2152# define RETROFLAT_KEY_TAB 0
    +
    2153# define RETROFLAT_KEY_SPACE 0
    +
    2154# define RETROFLAT_KEY_ESC 0
    +
    2155# define RETROFLAT_KEY_ENTER 0
    +
    2156# define RETROFLAT_KEY_HOME 0
    +
    2157# define RETROFLAT_KEY_END 0
    +
    2158
    +
    2159# define RETROFLAT_MOUSE_B_LEFT 0
    +
    2160# define RETROFLAT_MOUSE_B_RIGHT 0
    +
    2161
    +
    2162 /* maug_retroflt_keydefs */
    +
    2163
    +
    2164 /* maug_retroflt_input */
    +
    2165
    +
    2166#endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2167
    +
    2168/* OpenGL can be called from several different APIs. */
    +
    2169# if defined( RETROFLAT_OPENGL ) && !defined( RETROFLAT_API_LIBNDS )
    +
    2170# include <GL/gl.h>
    +
    2171# include <GL/glu.h>
    +
    2172# endif /* RETROFLAT_OPENGL */
    +
    2173
    +
    2174/* === Structures === */
    +
    2175
    +
    + +
    2182 char* title;
    + +
    2185 uint8_t flags;
    + +
    2188# ifdef RETROFLAT_API_PC_BIOS
    +
    2190 uint8_t screen_mode;
    +
    2191# elif !defined( RETROFLAT_NO_CLI_SZ )
    +
    2192 int screen_w;
    + + + +
    2199# endif /* RETROFLAT_API_PC_BIOS */
    +
    2200 uint8_t snd_flags;
    +
    2201# if defined( RETROSND_API_WINMM )
    +
    2202 UINT snd_dev_id;
    +
    2203# elif defined( RETROSND_API_PC_BIOS )
    +
    2204 uint16_t snd_io_base;
    +
    2205 uint8_t snd_driver;
    +
    2206# elif defined( RETROSND_API_ALSA )
    +
    2207 uint8_t snd_client;
    +
    2208 uint8_t snd_port;
    +
    2209# else
    +
    2210# pragma message( "warning: sound args not specified" )
    +
    2211# endif /* RETROSND_API_WINMM */
    +
    2212};
    +
    +
    2213
    +
    + +
    2216 void* loop_data;
    +
    2217 MERROR_RETVAL retval;
    + +
    2220 char config_path[RETROFLAT_PATH_MAX + 1];
    +
    2221 char assets_path[RETROFLAT_ASSETS_PATH_MAX + 1];
    +
    2223 RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ];
    + +
    2226
    +
    2227# if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION ) || \
    +
    2228defined( RETROVDP_C )
    + +
    2234# ifdef RETROFLAT_OS_WIN
    +
    2235 HMODULE vdp_exe;
    +
    2236# else
    +
    2238 void* vdp_exe;
    +
    2239# endif /* RETROFLAT_OS_WIN */
    + + +
    2248 uint8_t vdp_flags;
    +
    2249# endif /* RETROFLAT_VDP || DOCUMENTATION || RETROVDP_C */
    +
    2250
    +
    2251 /* These are used by VDP so should be standardized/not put in plat-spec! */
    +
    2252
    + + + + +
    2271
    +
    2272 /* WARNING: The VDP requires the state specifier to be the same size
    +
    2273 * as the one it was compiled for! Do not modify above here!
    +
    2274 */
    +
    2275
    +
    2276 /* TODO: Put these in a platform-specific struct of some kind to maintain
    +
    2277 * consistent state struct size for VDP?
    +
    2278 */
    +
    2279
    +
    2280 retroflat_proc_resize_t on_resize;
    +
    2281 void* on_resize_data;
    +
    2282
    +
    2283# if defined( RETROFLAT_OPENGL )
    +
    2284 uint8_t tex_palette[RETROFLAT_COLORS_SZ][3];
    +
    2285# endif /* RETROFLAT_OPENGL */
    +
    2286
    +
    2287#if defined( RETROFLAT_API_ALLEGRO )
    +
    2288
    +
    2289# ifdef RETROFLAT_OS_DOS
    +
    2290 unsigned int last_mouse;
    +
    2291 unsigned int last_mouse_x;
    +
    2292 unsigned int last_mouse_y;
    +
    2293# endif /* RETROFLAT_OS_DOS */
    +
    2294 unsigned int close_button;
    +
    2295
    +
    2296#elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    2297
    +
    2298# ifndef RETROFLAT_API_SDL1
    +
    2299 SDL_Window* window;
    +
    2300# endif /* !RETROFLAT_API_SDL1 */
    +
    2301 int mouse_state;
    +
    2302
    +
    2303#elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    2304
    +
    2305 HWND window;
    +
    2306 int16_t last_idc; /* Last clicked button. */
    +
    2307# ifdef RETROFLAT_SCREENSAVER
    +
    2308 HWND parent;
    +
    2309# endif /* RETROFLAT_SCREENSAVER */
    +
    2310 HDC hdc_win;
    +
    2311# ifdef RETROFLAT_OPENGL
    +
    2312 HGLRC hrc_win;
    +
    2313# endif /* RETROFLAT_OPENGL */
    +
    2314 int16_t last_key;
    +
    2315 uint8_t vk_mods;
    +
    2316 unsigned int last_mouse;
    +
    2317 unsigned int last_mouse_x;
    +
    2318 unsigned int last_mouse_y;
    +
    2319 retroflat_loop_iter loop_iter;
    +
    2320 retroflat_loop_iter frame_iter;
    +
    2321
    +
    2322# elif defined( RETROFLAT_API_LIBNDS )
    +
    2323
    +
    2324 uint16_t* sprite_frames[NDS_SPRITES_ACTIVE];
    +
    2325 int bg_id;
    +
    2326 uint8_t bg_bmp_changed;
    +
    2327 uint8_t window_bmp_changed;
    +
    2328 int window_id;
    +
    2329 int px_id;
    +
    2330 uint16_t bg_tiles[1024];
    +
    2331 uint16_t window_tiles[1024];
    +
    2332
    +
    2333# elif defined( RETROFLAT_API_GLUT )
    +
    2334
    +
    2335 size_t retroflat_next;
    +
    2336 retroflat_loop_iter loop_iter;
    +
    2337 retroflat_loop_iter frame_iter;
    +
    2338 int16_t retroflat_last_key;
    +
    2339
    +
    2340# elif defined( RETROFLAT_API_PC_BIOS )
    +
    2341
    +
    2342 retroflat_intfunc old_timer_interrupt;
    +
    2343 uint8_t old_video_mode;
    +
    2344 uint8_t cga_color_table[16];
    +
    2345 uint8_t cga_dither_table[16];
    +
    2346 uint8_t screen_mode;
    +
    2347
    +
    2348# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2349
    +
    2350};
    +
    +
    2351
    +
    2352/* === Translation Module === */
    +
    2353
    +
    2354/* Declare the prototypes so that internal functions can call each other. */
    +
    2355
    + +
    2362 retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void* data );
    +
    2363
    + +
    2371 uint8_t flags, const char* title, const char* format, ... );
    +
    2372
    +
    2380MERROR_RETVAL retroflat_init( int argc, char* argv[], struct RETROFLAT_ARGS* args );
    +
    2381
    +
    2388void retroflat_shutdown( int retval );
    +
    2389
    +
    2390# if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION )
    +
    2399MERROR_RETVAL retroflat_vdp_call( const char* proc_name );
    +
    2400
    +
    2401 /* maug_retroflt_vdp */
    +
    2402# endif /* RETROFLAT_VDP || DOCUMENTATION */
    +
    2403
    +
    2404void retroflat_set_title( const char* format, ... );
    +
    2405
    +
    2406retroflat_ms_t retroflat_get_ms();
    +
    2407
    +
    2408uint32_t retroflat_get_rand();
    +
    2409
    +
    2410# if !defined( RETROFLAT_NO_KEYBOARD )
    +
    2411char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags );
    +
    2412# endif /* !RETROFLAT_NO_KEYBOARD */
    +
    2413
    + +
    2430 const char* filename, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
    +
    2431
    +
    2432MERROR_RETVAL retroflat_create_bitmap(
    +
    2433 size_t w, size_t h, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
    +
    2434
    + +
    2441
    + +
    2456 struct RETROFLAT_BITMAP* target, struct RETROFLAT_BITMAP* src,
    +
    2457 int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h );
    +
    2458
    +
    2459 /* maug_retroflt_bitmap */
    +
    2460
    + +
    2476
    +
    2477MERROR_RETVAL retroflat_draw_release( struct RETROFLAT_BITMAP* bmp );
    +
    2478
    +
    2479void retroflat_px(
    +
    2480 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2481 int16_t x, int16_t y, uint8_t flags );
    +
    2482
    + +
    2494 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2495 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
    +
    2496
    + +
    2508 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2509 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
    +
    2510
    + +
    2523 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2524 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags );
    +
    2525
    +
    2526void retroflat_cursor( struct RETROFLAT_BITMAP* target, uint8_t flags );
    +
    2527
    + +
    2541 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    2542 const char* font_str, size_t* w_out, size_t* h_out, uint8_t flags );
    +
    2543
    + +
    2562 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2563 const char* str, int str_sz, const char* font_str, int16_t x_orig, int16_t y_orig,
    +
    2564 uint8_t flags );
    +
    2565
    +
    2566/* TODO: Documentation! */
    +
    2567void retroflat_get_palette( uint8_t idx, uint32_t* rgb );
    +
    2568
    +
    2569MERROR_RETVAL retroflat_set_palette( uint8_t idx, uint32_t rgb );
    +
    2570
    +
    2571 /* maug_retroflt_bitmap */
    +
    2572
    +
    2573void retroflat_set_proc_resize(
    +
    2574 retroflat_proc_resize_t on_resize_in, void* data_in );
    +
    2575
    +
    2576void retroflat_resize_v();
    +
    2577
    +
    2588RETROFLAT_IN_KEY retroflat_poll_input( struct RETROFLAT_INPUT* input );
    +
    2589
    +
    2590 /* maug_retroflt_input */
    +
    2591
    + +
    2603
    +
    2604void retroflat_config_close( RETROFLAT_CONFIG* config );
    +
    2605
    + +
    2614 RETROFLAT_CONFIG* config,
    +
    2615 const char* sect_name, const char* key_name, uint8_t buffer_type,
    +
    2616 void* buffer, size_t buffer_sz_max );
    +
    2617
    + +
    2626 RETROFLAT_CONFIG* config,
    +
    2627 const char* sect_name, const char* key_name, uint8_t buffer_type,
    +
    2628 void* buffer_out, size_t buffer_out_sz_max,
    +
    2629 const void* default_out, size_t default_out_sz );
    +
    2630
    +
    2631 /* maug_retroflt_config */
    +
    2632
    +
    2633#ifdef RETROFLT_C
    +
    2634
    +
    2635# if defined( RETROFLAT_API_ALLEGRO ) || defined( RETROFLAT_API_PC_BIOS )
    +
    2636static volatile retroflat_ms_t g_ms = 0;
    +
    2637# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_PC_BIOS */
    +
    2638MAUG_MHANDLE g_retroflat_state_h = (MAUG_MHANDLE)NULL;
    +
    2639struct RETROFLAT_STATE* g_retroflat_state = NULL;
    +
    2640
    +
    2641# define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    2642 MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u = idx;
    +
    2643
    +
    2644RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CONSTS )
    +
    2645
    +
    2646# define RETROFLAT_COLOR_TABLE_NAMES( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    2647 #name_u,
    +
    2648
    +
    2649MAUG_CONST char* SEG_MCONST gc_retroflat_color_names[] = {
    +
    2650 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_NAMES )
    +
    2651};
    +
    2652
    +
    2653# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    2654/* For now, these are set by WinMain(), so they need to be outside of the
    +
    2655 * state that's zeroed on init()!
    +
    2656 */
    +
    2657HINSTANCE g_retroflat_instance;
    +
    2658int g_retroflat_cmd_show;
    +
    2659
    +
    2660# ifdef RETROFLAT_WING
    +
    2661struct RETROFLAT_WING_MODULE g_w;
    +
    2662# endif /* RETROFLAT_WING */
    +
    2663# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2664
    +
    2665# include <stdio.h>
    +
    2666# include <stdlib.h>
    +
    2667# include <string.h>
    +
    2668
    +
    2669/* Callback table is down below, after the statically-defined callbacks. */
    +
    2670
    +
    2671/* === Function Definitions === */
    +
    2672
    +
    2673# if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES )) \
    +
    2674 && !defined( MAUG_NO_AUTO_C )
    +
    2675# define RETROFP_C
    +
    2676# include <retrofp.h>
    +
    2677# define RETROSFT_C
    +
    2678# include <retrosft.h>
    +
    2679# endif /* RETROFLAT_SOFT_SHAPES */
    +
    2680
    +
    2681# if defined( RETROFLAT_OPENGL ) && !defined( MAUG_NO_AUTO_C )
    +
    2682# define RETROGLU_C
    +
    2683# include <retroglu.h>
    +
    2684# define RETROFP_C
    +
    2685# include <retrofp.h>
    +
    2686# define RETROSFT_C
    +
    2687# include <retrosft.h>
    +
    2688# endif /* RETROFLAT_OPENGL */
    +
    2689
    +
    2690# if defined( RETROFLAT_VDP ) && defined( RETROFLAT_OS_UNIX )
    +
    2691# include <dlfcn.h>
    +
    2692# endif
    +
    2693
    +
    2694# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    2695
    +
    2696static LRESULT CALLBACK WndProc(
    +
    2697 HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
    +
    2698) {
    +
    2699# ifndef RETROFLAT_OPENGL
    +
    2700 PAINTSTRUCT ps;
    +
    2701 HDC hdc_paint = (HDC)NULL;
    +
    2702# endif /* !RETROFLAT_OPENGL */
    +
    2703# if defined( RETROFLAT_OPENGL )
    +
    2704 int pixel_fmt_int = 0;
    +
    2705 static PIXELFORMATDESCRIPTOR pixel_fmt = {
    +
    2706 sizeof( PIXELFORMATDESCRIPTOR ),
    +
    2707 1,
    +
    2708 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    +
    2709 PFD_TYPE_RGBA,
    +
    2710 RETROFLAT_OPENGL_BPP,
    +
    2711 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    2712 16,
    +
    2713 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
    +
    2714 };
    +
    2715# endif /* RETROFLAT_OPENGL */
    +
    2716
    +
    2717 switch( message ) {
    +
    2718 case WM_CREATE:
    +
    2719
    +
    2720 g_retroflat_state->hdc_win = GetDC( hWnd );
    +
    2721
    +
    2722# if defined( RETROFLAT_OPENGL )
    +
    2723
    +
    2724 pixel_fmt_int =
    +
    2725 ChoosePixelFormat( g_retroflat_state->hdc_win, &pixel_fmt );
    +
    2726 SetPixelFormat(
    +
    2727 g_retroflat_state->hdc_win, pixel_fmt_int, &pixel_fmt );
    +
    2728
    +
    2729 debug_printf( 1, "setting up OpenGL context..." );
    +
    2730
    +
    2731 g_retroflat_state->hrc_win =
    +
    2732 wglCreateContext( g_retroflat_state->hdc_win );
    +
    2733 if(
    +
    2734 FALSE == wglMakeCurrent( g_retroflat_state->hdc_win,
    +
    2735 g_retroflat_state->hrc_win )
    +
    2736 ) {
    + +
    2738 "Error", "Error creating OpenGL context: %d",
    +
    2739 GetLastError() );
    +
    2740 }
    +
    2741
    +
    2742# else
    +
    2743
    +
    2744 /* Setup the screen buffer. */
    +
    2745 if( !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    +
    2746 debug_printf( 1, "retroflat: creating window buffer (%d x %d)...",
    +
    2747 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    2748 /* Do this in its own function so a one-time setup isn't using stack
    +
    2749 * in our WndProc!
    +
    2750 */
    +
    2751 retroflat_create_bitmap(
    +
    2752 g_retroflat_state->screen_v_w,
    +
    2753 g_retroflat_state->screen_v_h,
    +
    2754 &(g_retroflat_state->buffer),
    + +
    2756 if( (HDC)NULL == g_retroflat_state->buffer.hdc_b ) {
    + +
    2758 "Error", "Could not determine buffer device context!" );
    +
    2759 g_retroflat_state->retval = RETROFLAT_ERROR_GRAPHICS;
    +
    2760 retroflat_quit( g_retroflat_state->retval );
    +
    2761 break;
    +
    2762 }
    +
    2763
    +
    2764 }
    +
    2765 if( !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    + +
    2767 "Error", "Could not create screen buffer!" );
    +
    2768 g_retroflat_state->retval = RETROFLAT_ERROR_GRAPHICS;
    +
    2769 retroflat_quit( g_retroflat_state->retval );
    +
    2770 break;
    +
    2771 }
    +
    2772
    +
    2773# endif /* RETROFLAT_OPENGL */
    +
    2774 break;
    +
    2775
    +
    2776 case WM_CLOSE:
    +
    2777# if defined( RETROFLAT_OPENGL )
    +
    2778 wglMakeCurrent( g_retroflat_state->hdc_win, NULL );
    +
    2779 wglDeleteContext( g_retroflat_state->hrc_win );
    +
    2780# endif /* RETROFLAT_OPENGL */
    +
    2781
    +
    2782 /* Quit on window close. */
    +
    2783 retroflat_quit( 0 );
    +
    2784 break;
    +
    2785
    +
    2786# if !defined( RETROFLAT_OPENGL )
    +
    2787 case WM_PAINT:
    +
    2788
    +
    2789 if( !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    +
    2790 error_printf( "screen buffer not ready!" );
    +
    2791 break;
    +
    2792 }
    +
    2793
    +
    2794 /* Create HDC for window to blit to. */
    +
    2795 /* maug_mzero( &ps, sizeof( PAINTSTRUCT ) ); */
    +
    2796 hdc_paint = BeginPaint( hWnd, &ps );
    +
    2797 if( (HDC)NULL == hdc_paint ) {
    + +
    2799 "Error", "Could not determine window device context!" );
    +
    2800 g_retroflat_state->retval = RETROFLAT_ERROR_GRAPHICS;
    +
    2801 retroflat_quit( g_retroflat_state->retval );
    +
    2802 break;
    +
    2803 }
    +
    2804
    +
    2805# if defined( RETROFLAT_VDP )
    +
    2806 retroflat_vdp_call( "retroflat_vdp_flip" );
    +
    2807# endif /* RETROFLAT_VDP */
    +
    2808
    +
    2809# ifdef RETROFLAT_WING
    +
    2810 if( (WinGStretchBlt_t)NULL != g_w.WinGStretchBlt ) {
    +
    2811 g_w.WinGStretchBlt(
    +
    2812 hdc_paint,
    +
    2813 0, 0,
    +
    2814 g_retroflat_state->screen_w, g_retroflat_state->screen_h,
    +
    2815 g_retroflat_state->buffer.hdc_b,
    +
    2816 0, 0,
    +
    2817 g_retroflat_state->screen_w,
    +
    2818 g_retroflat_state->screen_h
    +
    2819 );
    +
    2820# ifdef RETROFLAT_API_WIN32
    +
    2821 GdiFlush();
    +
    2822# endif /* RETROFLAT_API_WIN32 */
    +
    2823 } else {
    +
    2824# endif /* RETROFLAT_WING */
    +
    2825 StretchBlt(
    +
    2826 hdc_paint,
    +
    2827 0, 0,
    +
    2828 g_retroflat_state->screen_w, g_retroflat_state->screen_h,
    +
    2829 g_retroflat_state->buffer.hdc_b,
    +
    2830 0, 0,
    +
    2831 g_retroflat_state->screen_v_w,
    +
    2832 g_retroflat_state->screen_v_h,
    +
    2833 SRCCOPY
    +
    2834 );
    +
    2835# ifdef RETROFLAT_WING
    +
    2836 }
    +
    2837# endif /* RETROFLAT_WING */
    +
    2838
    +
    2839 DeleteDC( hdc_paint );
    +
    2840 EndPaint( hWnd, &ps );
    +
    2841 break;
    +
    2842
    +
    2843# endif /* !RETROFLAT_OPENGL */
    +
    2844
    +
    2845 case WM_ERASEBKGND:
    +
    2846 return 1;
    +
    2847
    +
    2848 case WM_KEYDOWN:
    +
    2849 switch( wParam ) {
    +
    2850 case VK_SHIFT:
    +
    2851 g_retroflat_state->vk_mods |= RETROFLAT_INPUT_MOD_SHIFT;
    +
    2852 break;
    +
    2853
    +
    2854 case VK_CONTROL:
    +
    2855 g_retroflat_state->vk_mods |= RETROFLAT_INPUT_MOD_CTRL;
    +
    2856 break;
    +
    2857
    +
    2858 /* TODO: Alt? */
    +
    2859
    +
    2860 default:
    +
    2861 debug_printf( RETROFLAT_KB_TRACE_LVL, "0x%x", lParam );
    +
    2862 g_retroflat_state->last_key = wParam | ((lParam & 0x800000) >> 8);
    +
    2863 break;
    +
    2864 }
    +
    2865 break;
    +
    2866
    +
    2867 case WM_KEYUP:
    +
    2868 switch( wParam ) {
    +
    2869 case VK_SHIFT:
    +
    2870 g_retroflat_state->vk_mods &= ~RETROFLAT_INPUT_MOD_SHIFT;
    +
    2871 break;
    +
    2872
    +
    2873 case VK_CONTROL:
    +
    2874 g_retroflat_state->vk_mods |= RETROFLAT_INPUT_MOD_CTRL;
    +
    2875 break;
    +
    2876
    +
    2877 /* TODO: Alt? */
    +
    2878
    +
    2879 }
    +
    2880 break;
    +
    2881
    +
    2882 case WM_LBUTTONDOWN:
    +
    2883 case WM_RBUTTONDOWN:
    +
    2884 g_retroflat_state->last_mouse = wParam;
    +
    2885 g_retroflat_state->last_mouse_x = GET_X_LPARAM( lParam );
    +
    2886 g_retroflat_state->last_mouse_y = GET_Y_LPARAM( lParam );
    +
    2887 break;
    +
    2888
    +
    2889 /* TODO: Handle resize message. */
    +
    2890
    +
    2891 case WM_DESTROY:
    +
    2892 if( retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    +
    2893 DeleteObject( g_retroflat_state->buffer.b );
    +
    2894 }
    +
    2895 PostQuitMessage( 0 );
    +
    2896 break;
    +
    2897
    +
    2898 case WM_SIZE:
    +
    2899 retroflat_on_resize( LOWORD( lParam ), HIWORD( lParam ) );
    +
    2900 if( NULL != g_retroflat_state->on_resize ) {
    +
    2901 g_retroflat_state->on_resize(
    +
    2902 LOWORD( lParam ), HIWORD( lParam ),
    +
    2903 g_retroflat_state->on_resize_data );
    +
    2904 }
    +
    2905 break;
    +
    2906
    +
    2907 case WM_TIMER:
    +
    2908 if(
    +
    2909# ifdef RETROFLAT_OPENGL
    +
    2910 (HGLRC)NULL == g_retroflat_state->hrc_win ||
    +
    2911# else
    +
    2912 !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ||
    +
    2913# endif /* !RETROFLAT_OPENGL */
    +
    2914 hWnd != g_retroflat_state->window
    +
    2915 ) {
    +
    2916 /* Timer message was called prematurely. */
    +
    2917 break;
    +
    2918 }
    +
    2919
    +
    2920 if( RETROFLAT_WIN_FRAME_TIMER_ID == wParam ) {
    +
    2921 /* Frame timer has expired. */
    +
    2922 assert( NULL != g_retroflat_state->frame_iter );
    +
    2923 g_retroflat_state->frame_iter( g_retroflat_state->loop_data );
    +
    2924 } else if( RETROFLAT_WIN_LOOP_TIMER_ID == wParam ) {
    +
    2925 /* Loop/tick timer has expired. */
    +
    2926 assert( NULL != g_retroflat_state->loop_iter );
    +
    2927 g_retroflat_state->loop_iter( g_retroflat_state->loop_data );
    +
    2928 }
    +
    2929 break;
    +
    2930
    +
    2931 case WM_COMMAND:
    +
    2932 g_retroflat_state->last_idc = LOWORD( wParam );
    +
    2933 break;
    +
    2934
    +
    2935 default:
    +
    2936 return DefWindowProc( hWnd, message, wParam, lParam );
    +
    2937 }
    +
    2938
    +
    2939 return 0;
    +
    2940}
    +
    2941
    +
    2942LPSTR* retroflat_win_cli( LPSTR cmd_line, int* argc_out ) {
    +
    2943 LPSTR* argv_out = NULL;
    +
    2944 int i = 0,
    +
    2945 arg_iter = 0,
    +
    2946 arg_start = 0,
    +
    2947 arg_idx = 0,
    +
    2948 arg_longest = 10; /* Program name. */
    +
    2949 MERROR_RETVAL retval = MERROR_OK;
    +
    2950
    +
    2951 /* This uses calloc() to simplify things, since this works on Windows, the
    +
    2952 * only platform where this routine is used, anyway. */
    +
    2953
    +
    2954 debug_printf( 1, "retroflat: win cli: %s", cmd_line );
    +
    2955
    +
    2956 /* Get the number of args. */
    +
    2957 *argc_out = 1; /* Program name. */
    +
    2958 for( i = 0 ; '\0' != cmd_line[i - 1] ; i++ ) {
    +
    2959 if( ' ' != cmd_line[i] && '\0' != cmd_line[i] ) {
    +
    2960 arg_iter++;
    +
    2961 } else if( 0 < i ) {
    +
    2962 (*argc_out)++;
    +
    2963 if( arg_iter > arg_longest ) {
    +
    2964 /* This is the new longest arg. */
    +
    2965 arg_longest = arg_iter;
    +
    2966 }
    +
    2967 arg_iter = 0;
    +
    2968 }
    +
    2969 }
    +
    2970
    +
    2971 argv_out = calloc( *argc_out, sizeof( char* ) );
    +
    2972 maug_cleanup_if_null_alloc( char**, argv_out );
    +
    2973
    +
    2974 /* NULL program name. */
    +
    2975 argv_out[0] = calloc( 1, sizeof( char ) );
    +
    2976 maug_cleanup_if_null_alloc( char*, argv_out[0] );
    +
    2977
    +
    2978 /* Copy args into array. */
    +
    2979 arg_idx = 1;
    +
    2980 for( i = 0 ; '\0' != cmd_line[i - 1] ; i++ ) {
    +
    2981 if( ' ' != cmd_line[i] && '\0' != cmd_line[i] ) {
    +
    2982 /* If this isn't a WS char, it's an arg. */
    +
    2983 if( 0 < i && ' ' == cmd_line[i - 1] ) {
    +
    2984 /* If this is first non-WS char, it's start of a new arg. */
    +
    2985 arg_start = i;
    +
    2986 arg_iter = 0;
    +
    2987 }
    +
    2988 arg_iter++;
    +
    2989 continue;
    +
    2990 }
    +
    2991
    +
    2992 if( 0 < i && ' ' != cmd_line[i - 1] ) {
    +
    2993 /* If this is first WS char, it's the end of an arg. */
    +
    2994 assert( NULL == argv_out[arg_idx] );
    +
    2995 argv_out[arg_idx] = calloc( arg_iter + 1, sizeof( char ) );
    +
    2996 maug_cleanup_if_null_alloc( char*, argv_out[arg_idx] );
    +
    2997 strncpy( argv_out[arg_idx], &(cmd_line[arg_start]), arg_iter );
    +
    2998 arg_idx++; /* Start next arg. */
    +
    2999 arg_iter = 0; /* New arg is 0 long. */
    +
    3000 arg_start = i; /* New arg starts here (maybe). */
    +
    3001 }
    +
    3002 }
    +
    3003
    +
    3004cleanup:
    +
    3005
    +
    3006 if( MERROR_OK != retval && NULL != argv_out ) {
    +
    3007 for( i = 0 ; *argc_out > i ; i++ ) {
    +
    3008 free( argv_out[i] );
    +
    3009 argv_out[i] = NULL;
    +
    3010 }
    +
    3011 free( argv_out );
    +
    3012 argv_out = NULL;
    +
    3013 }
    +
    3014
    +
    3015 return argv_out;
    +
    3016}
    +
    3017
    +
    3018# elif defined( RETROFLAT_API_GLUT )
    +
    3019
    +
    3020#ifdef RETROFLAT_OS_OS2
    +
    3021void APIENTRY
    +
    3022#else
    +
    3023void
    +
    3024#endif /* RETROFLAT_OS_OS2 */
    +
    3025retroflat_glut_display( void ) {
    +
    3026 /* TODO: Work in frame_iter if provided. */
    +
    3027 if( NULL != g_retroflat_state->loop_iter ) {
    +
    3028 g_retroflat_state->loop_iter( g_retroflat_state->loop_data );
    +
    3029 }
    +
    3030}
    +
    3031
    +
    3032#ifdef RETROFLAT_OS_OS2
    +
    3033void APIENTRY
    +
    3034#else
    +
    3035void
    +
    3036#endif /* RETROFLAT_OS_OS2 */
    +
    3037retroflat_glut_idle( void ) {
    +
    3038 uint32_t now = 0;
    +
    3039
    +
    3040 now = retroflat_get_ms();
    +
    3041 if(
    + +
    3043 (RETROFLAT_FLAGS_UNLOCK_FPS & g_retroflat_state->retroflat_flags) &&
    +
    3044 now < g_retroflat_state->retroflat_next
    +
    3045 ) {
    +
    3046 return;
    +
    3047 }
    +
    3048
    +
    3049 glutPostRedisplay();
    +
    3050
    +
    3051 if( now + retroflat_fps_next() > now ) {
    +
    3052 g_retroflat_state->retroflat_next = now + retroflat_fps_next();
    +
    3053 } else {
    +
    3054 /* Rollover protection. */
    +
    3055 g_retroflat_state->retroflat_next = 0;
    +
    3056 }
    +
    3057}
    +
    3058
    +
    3059# ifdef RETROFLAT_OS_OS2
    +
    3060void APIENTRY
    +
    3061# elif defined( RETROFLAT_OS_WIN )
    +
    3062void
    +
    3063# else
    +
    3064void
    +
    3065# endif /* RETROFLAT_OS_OS2 */
    +
    3066retroflat_glut_key( unsigned char key, int x, int y ) {
    +
    3067# ifdef RETROFLAT_OS_WIN
    +
    3068 /* key -= 109; */
    +
    3069# endif /* RETROFLAT_OS_WIN */
    +
    3070 debug_printf( 0, "key: %c (0x%02x)", key, key );
    +
    3071 g_retroflat_state->retroflat_last_key = key;
    +
    3072}
    +
    3073
    +
    3074# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3075
    +
    3076/* Still inside RETROFLT_C! */
    +
    3077
    +
    3078/* === */
    +
    3079
    +
    3080int retroflat_loop(
    +
    3081 retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void* data
    +
    3082) {
    +
    3083 int retval = 0;
    +
    3084
    +
    3085# if defined( RETROFLAT_OS_WASM )
    +
    3086
    +
    3087 /* TODO: Work in frame_iter if provided. */
    +
    3088 emscripten_cancel_main_loop();
    +
    3089 emscripten_set_main_loop_arg( frame_iter, data, 0, 0 );
    +
    3090
    +
    3091# elif defined( RETROFLAT_API_ALLEGRO ) || \
    +
    3092 defined( RETROFLAT_API_SDL1 ) || \
    +
    3093 defined( RETROFLAT_API_SDL2 ) || \
    +
    3094 defined( RETROFLAT_API_LIBNDS ) || \
    +
    3095 defined( RETROFLAT_API_PC_BIOS )
    +
    3096
    +
    3097 retroflat_ms_t next = 0,
    +
    3098 now = 0;
    +
    3099
    +
    3100 g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_RUNNING;
    +
    3101 do {
    +
    3102 if(
    + +
    3104 (RETROFLAT_FLAGS_UNLOCK_FPS & g_retroflat_state->retroflat_flags) &&
    +
    3105 retroflat_get_ms() < next
    +
    3106 ) {
    +
    3107 /* Sleep/low power for a bit. */
    +
    3108# ifdef RETROFLAT_API_LIBNDS
    +
    3109 swiWaitForVBlank();
    +
    3110# endif /* RETROFLAT_API_LIBNDS */
    +
    3111 if( NULL != loop_iter ) {
    +
    3112 /* Run the loop iter as many times as possible. */
    +
    3113 loop_iter( data );
    +
    3114 }
    +
    3115 continue;
    +
    3116 }
    +
    3117 if( NULL != frame_iter ) {
    +
    3118 /* Run the frame iterator once per FPS tick. */
    +
    3119 frame_iter( data );
    +
    3120 }
    +
    3121 now = retroflat_get_ms();
    +
    3122 if( now + retroflat_fps_next() > now ) {
    +
    3123 next = now + retroflat_fps_next();
    +
    3124 } else {
    +
    3125 /* Rollover protection. */
    +
    3126 /* TODO: Add difference from now/next to 0 here. */
    +
    3127 next = 0;
    +
    3128 }
    +
    3129 } while(
    + +
    3131 (RETROFLAT_FLAGS_RUNNING & g_retroflat_state->retroflat_flags)
    +
    3132 );
    +
    3133 retval = g_retroflat_state->retval;
    +
    3134
    +
    3135# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3136 int msg_retval = 0;
    +
    3137 MSG msg;
    +
    3138
    +
    3139 /* Set these to be called from WndProc later. */
    +
    3140 g_retroflat_state->loop_iter = (retroflat_loop_iter)loop_iter;
    +
    3141 g_retroflat_state->loop_data = (void*)data;
    +
    3142 g_retroflat_state->frame_iter = (retroflat_loop_iter)frame_iter;
    +
    3143
    +
    3144 if( NULL != frame_iter ) {
    +
    3145 debug_printf( 3, "setting up frame timer %u every %d ms...",
    + +
    3147 if( !SetTimer(
    +
    3148 g_retroflat_state->window, RETROFLAT_WIN_FRAME_TIMER_ID,
    +
    3149 (int)(1000 / RETROFLAT_FPS), NULL )
    +
    3150 ) {
    + +
    3152 "Error", "Could not create frame timer!" );
    +
    3153 retval = RETROFLAT_ERROR_TIMER;
    +
    3154 goto cleanup;
    +
    3155 }
    +
    3156 }
    +
    3157
    +
    3158 if( NULL != loop_iter ) {
    +
    3159 debug_printf( 3, "setting up loop timer %u every 1 ms...",
    + +
    3161 if( !SetTimer(
    +
    3162 g_retroflat_state->window, RETROFLAT_WIN_LOOP_TIMER_ID, 1, NULL )
    +
    3163 ) {
    + +
    3165 "Error", "Could not create loop timer!" );
    +
    3166 retval = RETROFLAT_ERROR_TIMER;
    +
    3167 goto cleanup;
    +
    3168 }
    +
    3169 }
    +
    3170
    +
    3171 /* TODO: loop_iter is artificially slow on Windows! */
    +
    3172
    +
    3173 /* Handle Windows messages until quit. */
    +
    3174 do {
    +
    3175 msg_retval = GetMessage( &msg, 0, 0, 0 );
    +
    3176 TranslateMessage( &msg );
    +
    3177 DispatchMessage( &msg );
    +
    3178 if( WM_QUIT == msg.message ) {
    +
    3179 /* Get retval from PostQuitMessage(). */
    +
    3180 retval = msg.wParam;
    +
    3181 }
    +
    3182 } while( WM_QUIT != msg.message && 0 < msg_retval );
    +
    3183
    +
    3184cleanup:
    +
    3185# elif defined( RETROFLAT_API_GLUT )
    +
    3186
    +
    3187 g_retroflat_state->loop_iter = (retroflat_loop_iter)loop_iter;
    +
    3188 g_retroflat_state->loop_data = (void*)data;
    +
    3189 g_retroflat_state->frame_iter = (retroflat_loop_iter)frame_iter;
    +
    3190 glutMainLoop();
    +
    3191 retval = g_retroflat_state->retval;
    +
    3192
    +
    3193# else
    +
    3194# pragma message( "warning: loop not implemented" )
    +
    3195# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3196
    +
    3197 /* This should be set by retroflat_quit(). */
    +
    3198 return retval;
    +
    3199}
    +
    3200
    +
    3201/* === */
    +
    3202
    +
    3203# if !defined( RETROFLAT_NO_KEYBOARD )
    +
    3204
    +
    3205char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags ) {
    +
    3206 char c = 0;
    +
    3207 char offset_lower = 0;
    +
    3208
    +
    3209 if( RETROFLAT_INPUT_MOD_SHIFT != (RETROFLAT_INPUT_MOD_SHIFT & flags) ) {
    +
    3210 /* Shift is *not* being held down. */
    +
    3211
    +
    3212 if( RETROFLAT_KEY_A <= k && RETROFLAT_KEY_Z >= k ) {
    +
    3213 if(
    +
    3214 RETROFLAT_INPUT_FORCE_UPPER !=
    +
    3215 (RETROFLAT_INPUT_FORCE_UPPER & flags)
    +
    3216 ) {
    +
    3217 /* Key is alphabetical and we're not forcing uppercase. */
    +
    3218 offset_lower = 0x20;
    +
    3219 }
    +
    3220 } else {
    +
    3221 offset_lower = 1;
    +
    3222 }
    +
    3223 }
    +
    3224
    +
    3225 switch( k ) {
    +
    3226 case RETROFLAT_KEY_A: c = 0x41 + offset_lower; break;
    +
    3227 case RETROFLAT_KEY_B: c = 0x42 + offset_lower; break;
    +
    3228 case RETROFLAT_KEY_C: c = 0x43 + offset_lower; break;
    +
    3229 case RETROFLAT_KEY_D: c = 0x44 + offset_lower; break;
    +
    3230 case RETROFLAT_KEY_E: c = 0x45 + offset_lower; break;
    +
    3231 case RETROFLAT_KEY_F: c = 0x46 + offset_lower; break;
    +
    3232 case RETROFLAT_KEY_G: c = 0x47 + offset_lower; break;
    +
    3233 case RETROFLAT_KEY_H: c = 0x48 + offset_lower; break;
    +
    3234 case RETROFLAT_KEY_I: c = 0x49 + offset_lower; break;
    +
    3235 case RETROFLAT_KEY_J: c = 0x4a + offset_lower; break;
    +
    3236 case RETROFLAT_KEY_K: c = 0x4b + offset_lower; break;
    +
    3237 case RETROFLAT_KEY_L: c = 0x4c + offset_lower; break;
    +
    3238 case RETROFLAT_KEY_M: c = 0x4d + offset_lower; break;
    +
    3239 case RETROFLAT_KEY_N: c = 0x4e + offset_lower; break;
    +
    3240 case RETROFLAT_KEY_O: c = 0x4f + offset_lower; break;
    +
    3241 case RETROFLAT_KEY_P: c = 0x50 + offset_lower; break;
    +
    3242 case RETROFLAT_KEY_Q: c = 0x51 + offset_lower; break;
    +
    3243 case RETROFLAT_KEY_R: c = 0x52 + offset_lower; break;
    +
    3244 case RETROFLAT_KEY_S: c = 0x53 + offset_lower; break;
    +
    3245 case RETROFLAT_KEY_T: c = 0x54 + offset_lower; break;
    +
    3246 case RETROFLAT_KEY_U: c = 0x55 + offset_lower; break;
    +
    3247 case RETROFLAT_KEY_V: c = 0x56 + offset_lower; break;
    +
    3248 case RETROFLAT_KEY_W: c = 0x57 + offset_lower; break;
    +
    3249 case RETROFLAT_KEY_X: c = 0x58 + offset_lower; break;
    +
    3250 case RETROFLAT_KEY_Y: c = 0x59 + offset_lower; break;
    +
    3251 case RETROFLAT_KEY_Z: c = 0x60 + offset_lower; break;
    +
    3252 case RETROFLAT_KEY_0: c = offset_lower ? 0x30 : ')'; break;
    +
    3253 case RETROFLAT_KEY_1: c = offset_lower ? 0x31 : '!'; break;
    +
    3254 case RETROFLAT_KEY_2: c = offset_lower ? 0x32 : '@'; break;
    +
    3255 case RETROFLAT_KEY_3: c = offset_lower ? 0x33 : '#'; break;
    +
    3256 case RETROFLAT_KEY_4: c = offset_lower ? 0x34 : '$'; break;
    +
    3257 case RETROFLAT_KEY_5: c = offset_lower ? 0x35 : '%'; break;
    +
    3258 case RETROFLAT_KEY_6: c = offset_lower ? 0x36 : '^'; break;
    +
    3259 case RETROFLAT_KEY_7: c = offset_lower ? 0x37 : '&'; break;
    +
    3260 case RETROFLAT_KEY_8: c = offset_lower ? 0x38 : '*'; break;
    +
    3261 case RETROFLAT_KEY_9: c = offset_lower ? 0x39 : '('; break;
    +
    3262 case RETROFLAT_KEY_SPACE: c = ' '; break;
    +
    3263 case RETROFLAT_KEY_BKSP: c = 0x08; break;
    +
    3264 case RETROFLAT_KEY_ENTER: c = '\n'; break;
    +
    3265 case RETROFLAT_KEY_SEMICOLON: c = offset_lower ? ';' : ':'; break;
    +
    3266 case RETROFLAT_KEY_DASH: c = offset_lower ? '-' : '_'; break;
    +
    3267 case RETROFLAT_KEY_SLASH: c = offset_lower ? '/' : '?'; break;
    +
    3268 case RETROFLAT_KEY_PERIOD: c = offset_lower ? '.' : '>'; break;
    +
    3269 case RETROFLAT_KEY_COMMA: c = offset_lower ? ',' : '<'; break;
    +
    3270 case RETROFLAT_KEY_QUOTE: c = offset_lower ? '\'' : '"'; break;
    +
    3271 case RETROFLAT_KEY_EQUALS: c = offset_lower ? '=' : '+'; break;
    +
    3272 case RETROFLAT_KEY_BACKSLASH: c = offset_lower ? '\\' : '|'; break;
    +
    3273 case RETROFLAT_KEY_BRACKETL: c = offset_lower ? '[' : '{'; break;
    +
    3274 case RETROFLAT_KEY_BRACKETR: c = offset_lower ? ']' : '}'; break;
    +
    3275#ifndef RETROFLAT_API_PC_BIOS
    +
    3276 /* TODO: FIXME in DOS! */
    +
    3277 case RETROFLAT_KEY_GRAVE: c = offset_lower ? '`' : '~'; break;
    +
    3278#endif /* !RETROFLAT_API_PC_BIOS */
    +
    3279 }
    +
    3280
    +
    3281 debug_printf( RETROFLAT_KB_TRACE_LVL, "0x%02x", c );
    +
    3282
    +
    3283 return c;
    +
    3284}
    +
    3285
    +
    3286#endif /* !RETROFLAT_NO_KEYBOARD */
    +
    3287
    +
    3288/* === */
    +
    3289
    + +
    3291 uint8_t flags, const char* title, const char* format, ...
    +
    3292) {
    +
    3293 char msg_out[RETROFLAT_MSG_MAX + 1];
    +
    3294 va_list vargs;
    +
    3295# ifdef RETROFLAT_API_SDL2
    +
    3296 uint32_t sdl_msg_flags = 0;
    +
    3297# elif (defined( RETROFLAT_API_SDL1 ) && defined( RETROFLAT_OS_WIN )) || \
    +
    3298 (defined( RETROFLAT_API_GLUT) && defined( RETROFLAT_OS_WIN )) || \
    +
    3299 defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3300 uint32_t win_msg_flags = 0;
    +
    3301# endif
    +
    3302
    +
    3303 memset( msg_out, '\0', RETROFLAT_MSG_MAX + 1 );
    +
    3304 va_start( vargs, format );
    +
    3305 maug_vsnprintf( msg_out, RETROFLAT_MSG_MAX, format, vargs );
    +
    3306
    +
    3307# if defined( RETROFLAT_API_ALLEGRO )
    +
    3308 allegro_message( "%s", msg_out );
    +
    3309# elif defined( RETROFLAT_API_SDL2 )
    +
    3310 switch( (flags & RETROFLAT_MSG_FLAG_TYPE_MASK) ) {
    + +
    3312 sdl_msg_flags = SDL_MESSAGEBOX_ERROR;
    +
    3313 break;
    +
    3314
    + +
    3316 sdl_msg_flags = SDL_MESSAGEBOX_INFORMATION;
    +
    3317 break;
    +
    3318
    + +
    3320 sdl_msg_flags = SDL_MESSAGEBOX_WARNING;
    +
    3321 break;
    +
    3322 }
    +
    3323
    +
    3324 SDL_ShowSimpleMessageBox(
    +
    3325 sdl_msg_flags, title, msg_out, g_retroflat_state->window );
    +
    3326# elif (defined( RETROFLAT_API_SDL1 ) && defined( RETROFLAT_OS_WIN )) || \
    +
    3327 (defined( RETROFLAT_API_GLUT) && defined( RETROFLAT_OS_WIN )) || \
    +
    3328 defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3329 switch( (flags & RETROFLAT_MSG_FLAG_TYPE_MASK) ) {
    + +
    3331 win_msg_flags |= MB_ICONSTOP;
    +
    3332 break;
    +
    3333
    + +
    3335 win_msg_flags |= MB_ICONINFORMATION;
    +
    3336 break;
    +
    3337
    + +
    3339 win_msg_flags |= MB_ICONEXCLAMATION;
    +
    3340 break;
    +
    3341 }
    +
    3342
    +
    3343 MessageBox( retroflat_root_win(), msg_out, title, win_msg_flags );
    +
    3344# elif (defined( RETROFLAT_API_SDL1 ) && defined( RETROFLAT_OS_UNIX )) || \
    +
    3345 (defined( RETROFLAT_API_GLUT) && defined( RETROFLAT_OS_UNIX ))
    +
    3346
    +
    3347 /* TODO */
    +
    3348 error_printf( "%s", msg_out );
    +
    3349
    +
    3350# elif defined( RETROFLAT_API_PC_BIOS )
    +
    3351
    +
    3352 /* TODO: Display error somehow. */
    +
    3353 error_printf( "%s", msg_out );
    +
    3354
    +
    3355# else
    +
    3356# pragma message( "warning: not implemented" )
    +
    3357# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3358
    +
    3359 va_end( vargs );
    +
    3360}
    +
    3361
    +
    3362# ifndef RETROFLAT_NO_CLI
    +
    3363
    +
    3364# ifdef RETROSND_ARGS
    +
    3365
    +
    3366static int retrosnd_cli_rsl( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3367 if( 0 == strncmp( MAUG_CLI_SIGIL "rsl", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3368 args->snd_flags |= RETROSND_ARGS_FLAG_LIST_DEVS;
    +
    3369 }
    +
    3370 return RETROFLAT_OK;
    +
    3371}
    +
    3372
    +
    3373static int retrosnd_cli_rsd( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3374 if( 0 == strncmp( MAUG_CLI_SIGIL "rsd", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3375 /* The next arg must be the new var. */
    +
    3376 } else {
    +
    3377# ifdef RETROSND_API_PC_BIOS
    +
    3378 /* TODO: Parse device. */
    +
    3379# elif defined( RETROSND_API_ALSA )
    +
    3380 /* TODO: Parse device. */
    +
    3381# elif defined( RETROSND_API_WINMM )
    +
    3382 debug_printf( 3, "setting MIDI device to rsd arg: %s", arg );
    +
    3383 args->snd_dev_id = atoi( arg );
    +
    3384# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    3385 }
    +
    3386 return RETROFLAT_OK;
    +
    3387}
    +
    3388
    +
    3389static int retrosnd_cli_rsd_def(
    +
    3390 const char* arg, struct RETROFLAT_ARGS* args
    +
    3391) {
    +
    3392 char* env_var = NULL;
    +
    3393 MERROR_RETVAL retval = MERROR_OK;
    +
    3394# if defined( RETROSND_API_PC_BIOS ) || defined( RETROSND_API_ALSA )
    +
    3395 size_t i = 0;
    +
    3396# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA */
    +
    3397
    +
    3398# ifdef RETROSND_API_PC_BIOS
    +
    3399 if( NULL != env_var ) {
    +
    3400 env_var = getenv( "MAUG_MIDI_DOS" );
    +
    3401
    +
    3402 /* Return MERROR_OK since this isn't fatal and will just cause sound
    +
    3403 * init to fail later.
    +
    3404 */
    +
    3405 maug_cleanup_if_null_msg(
    +
    3406 char*, env_var, MERROR_OK, "MAUG_MIDI_DOS variable not found!" );
    +
    3407
    +
    3408 debug_printf( 2, "env: MAUG_MIDI_DOS: %s", env_var );
    +
    3409
    +
    3410 /* Turn comma separator into NULL split. */
    +
    3411 for( i = 0 ; strlen( env_var ) > i ; i++ ) {
    +
    3412 if( ',' == env_var[i] ) {
    +
    3413 /* Split into two null-terminated strings. */
    +
    3414 env_var[i] = '\0';
    +
    3415 }
    +
    3416 }
    +
    3417
    +
    3418 if( 0 == strcmp( env_var, "mpu" ) ) {
    +
    3419 debug_printf( 3, "selecting MIDI driver: mpu" );
    +
    3420 args->snd_driver = 2;
    +
    3421 } else if( 0 == strcmp( env_var, "gus" ) ) {
    +
    3422 debug_printf( 3, "selecting MIDI driver: gus" );
    +
    3423 args->snd_driver = 4;
    +
    3424 } else if( 0 == strcmp( env_var, "adlib" ) ) {
    +
    3425 debug_printf( 3, "selecting MIDI driver: adlib" );
    +
    3426 args->snd_driver = 8;
    +
    3427 }
    +
    3428 /* TODO: Maug replacement for C99 crutch. */
    +
    3429 args->snd_io_base = strtoul( &(env_var[i]), NULL, 16 );
    +
    3430 debug_printf( 3, "setting MIDI I/O base: %u", args->snd_io_base );
    +
    3431 } else {
    +
    3432 /* default */
    +
    3433 debug_printf( 3, "default MIDI driver: adlib" );
    +
    3434 args->snd_driver = 8;
    +
    3435 args->snd_io_base = 0x388;
    +
    3436 }
    +
    3437# elif defined( RETROSND_API_ALSA )
    +
    3438 if( 0 == args->snd_client ) {
    +
    3439 env_var = getenv( "MAUG_MIDI_ALSA" );
    +
    3440
    +
    3441 /* Return MERROR_OK since this isn't fatal and will just cause sound
    +
    3442 * init to fail later.
    +
    3443 */
    +
    3444 maug_cleanup_if_null_msg(
    +
    3445 char*, env_var, MERROR_OK, "MAUG_MIDI_ALSA variable not found!" );
    +
    3446
    +
    3447 debug_printf( 2, "env: MAUG_MIDI_ALSA: %s", env_var );
    +
    3448
    +
    3449 for( i = 0 ; strlen( env_var ) > i ; i++ ) {
    +
    3450 if( ':' == env_var[i] ) {
    +
    3451 /* Split into two null-terminated strings. */
    +
    3452 env_var[i] = '\0';
    +
    3453 }
    +
    3454 }
    +
    3455
    +
    3456 args->snd_client = atoi( env_var );
    +
    3457 args->snd_port = atoi( &(env_var[i]) );
    +
    3458 debug_printf( 3, "setting MIDI device to: %u:%u",
    +
    3459 args->snd_client, args->snd_port );
    +
    3460 }
    +
    3461
    +
    3462# elif defined( RETROSND_API_WINMM )
    +
    3463 env_var = getenv( "MAUG_MIDI_WIN" );
    +
    3464
    +
    3465 /* Return MERROR_OK since this isn't fatal and will just cause sound
    +
    3466 * init to fail later.
    +
    3467 */
    +
    3468 maug_cleanup_if_null_msg(
    +
    3469 char*, env_var, MERROR_OK, "MAUG_MIDI_WIN variable not found!" );
    +
    3470
    +
    3471 debug_printf( 2, "env: MAUG_MIDI_WIN: %s", env_var );
    +
    3472
    +
    3473 if( NULL != env_var ) {
    +
    3474 args->snd_dev_id = atoi( env_var );
    +
    3475 } else {
    +
    3476 args->snd_dev_id = 0;
    +
    3477 }
    +
    3478 debug_printf( 3, "setting MIDI device to: %u", args->snd_dev_id );
    +
    3479# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    3480
    +
    3481cleanup:
    +
    3482 return retval;
    +
    3483}
    +
    3484
    +
    3485# endif /* RETROSND_ARGS */
    +
    3486
    +
    3487# ifdef RETROFLAT_SCREENSAVER
    +
    3488
    +
    3489/* Windows screensaver (.scr) command-line arguments. */
    +
    3490
    +
    3491static int retroflat_cli_p( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3492#ifdef __WIN64__
    +
    3493 /* 64-bit Windows has 64-bit pointers! */
    +
    3494 intptr_t hwnd_long = 0;
    +
    3495#else
    +
    3496 long hwnd_long = 0;
    +
    3497#endif /* __GNUC__ */
    +
    3498 if( 0 == strncmp( MAUG_CLI_SIGIL "p", arg, MAUG_CLI_SIGIL_SZ + 2 ) ) {
    +
    3499 /* The next arg must be the new var. */
    +
    3500 } else {
    +
    3501#ifdef __WIN64__
    +
    3502 hwnd_long = atoll( arg );
    +
    3503#else
    +
    3504 hwnd_long = atol( arg );
    +
    3505#endif /* __GNUC__ */
    +
    3506 g_retroflat_state->parent = (HWND)hwnd_long;
    +
    3507 }
    +
    3508 return RETROFLAT_OK;
    +
    3509}
    +
    3510
    +
    3511static int retroflat_cli_s( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3512 debug_printf( 3, "using screensaver mode..." );
    +
    3513 args->flags |= RETROFLAT_FLAGS_SCREENSAVER;
    +
    3514 return RETROFLAT_OK;
    +
    3515}
    +
    3516
    +
    3517# endif /* RETROFLAT_SCREENSAVER */
    +
    3518
    +
    3519# ifdef RETROFLAT_API_PC_BIOS
    +
    3520
    +
    3521static int retroflat_cli_rfm( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3522 if( 0 == strncmp( MAUG_CLI_SIGIL "rfm", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3523 /* The next arg must be the new var. */
    +
    3524 } else {
    +
    3525 args->screen_mode = atoi( arg );
    +
    3526 debug_printf( 3, "choosing screen mode: %u", args->screen_mode );
    +
    3527 }
    +
    3528 return RETROFLAT_OK;
    +
    3529}
    +
    3530
    +
    3531static int retroflat_cli_rfm_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3532 if( 0 == args->screen_mode ) {
    +
    3533 /* TODO: Autodetect best available? */
    +
    3534 args->screen_mode = RETROFLAT_SCREEN_MODE_VGA;
    +
    3535 }
    +
    3536 return RETROFLAT_OK;
    +
    3537}
    +
    3538
    +
    3539# elif !defined( RETROFLAT_NO_CLI_SZ )
    +
    3540
    +
    3541static int retroflat_cli_rfx( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3542 if( 0 == strncmp( MAUG_CLI_SIGIL "rfx", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3543 /* The next arg must be the new var. */
    +
    3544 } else {
    +
    3545 args->screen_x = atoi( arg );
    +
    3546 }
    +
    3547 return RETROFLAT_OK;
    +
    3548}
    +
    3549
    +
    3550static int retroflat_cli_rfx_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3551 if( 0 == args->screen_w ) {
    +
    3552 args->screen_x = 0;
    +
    3553 }
    +
    3554 return RETROFLAT_OK;
    +
    3555}
    +
    3556
    +
    3557static int retroflat_cli_rfy( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3558 if( 0 == strncmp( MAUG_CLI_SIGIL "rfy", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3559 /* The next arg must be the new var. */
    +
    3560 } else {
    +
    3561 args->screen_y = atoi( arg );
    +
    3562 }
    +
    3563 return RETROFLAT_OK;
    +
    3564}
    +
    3565
    +
    3566static int retroflat_cli_rfy_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3567 if( 0 == args->screen_h ) {
    +
    3568 args->screen_y = 0;
    +
    3569 }
    +
    3570 return RETROFLAT_OK;
    +
    3571}
    +
    3572
    +
    3573static void retroflat_cli_apply_scale( struct RETROFLAT_ARGS* args ) {
    +
    3574#if defined( RETROFLAT_API_SDL2 )
    +
    3575 /*
    +
    3576 if(
    +
    3577 RETROFLAT_FLAGS_SCALE2X == (RETROFLAT_FLAGS_SCALE2X & args->flags)
    +
    3578 ) {
    +
    3579 args->screen_w *= 2;
    +
    3580 debug_printf( 1, "doubling screen_w to: %d", args->screen_w );
    +
    3581 args->screen_h *= 2;
    +
    3582 debug_printf( 1, "doubling screen_h to: %d", args->screen_h );
    +
    3583 }
    +
    3584 */
    +
    3585#endif /* RETROFLAT_API_SDL2 */
    +
    3586}
    +
    3587
    +
    3588static int retroflat_cli_rfw( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3589 if( 0 == strncmp( MAUG_CLI_SIGIL "rfw", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3590 /* The next arg must be the new var. */
    +
    3591 } else {
    +
    3592 args->screen_w = atoi( arg );
    +
    3593 retroflat_cli_apply_scale( args );
    +
    3594 }
    +
    3595 return RETROFLAT_OK;
    +
    3596}
    +
    3597
    +
    3598static int retroflat_cli_rfw_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3599 if( 0 == args->screen_w ) {
    +
    3600 args->screen_w = RETROFLAT_DEFAULT_SCREEN_W;
    +
    3601 }
    +
    3602 retroflat_cli_apply_scale( args );
    +
    3603 return RETROFLAT_OK;
    +
    3604}
    +
    3605
    +
    3606static int retroflat_cli_rfh( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3607 if( 0 == strncmp( MAUG_CLI_SIGIL "rfh", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3608 /* The next arg must be the new var. */
    +
    3609 } else {
    +
    3610 args->screen_h = atoi( arg );
    +
    3611 retroflat_cli_apply_scale( args );
    +
    3612 }
    +
    3613 return RETROFLAT_OK;
    +
    3614}
    +
    3615
    +
    3616static int retroflat_cli_rfh_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3617 if( 0 == args->screen_h ) {
    +
    3618 args->screen_h = RETROFLAT_DEFAULT_SCREEN_H;
    +
    3619 }
    +
    3620 retroflat_cli_apply_scale( args );
    +
    3621 return RETROFLAT_OK;
    +
    3622}
    +
    3623
    +
    3624# endif /* RETROFLAT_API_PC_BIOS || !RETROFLAT_NO_CLI_SZ */
    +
    3625
    +
    3626# ifndef MAUG_NO_CONFIG
    +
    3627
    +
    3628static int retroflat_cli_c( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3629 if( 0 == strncmp( MAUG_CLI_SIGIL "rfc", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3630 /* The next arg must be the new var. */
    +
    3631 } else {
    +
    3632 debug_printf( 1, "setting config path to: %s", arg );
    +
    3633 strncpy( g_retroflat_state->config_path, arg, RETROFLAT_PATH_MAX );
    +
    3634 }
    +
    3635 return RETROFLAT_OK;
    +
    3636}
    +
    3637
    +
    3638static int retroflat_cli_c_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3639 memset( g_retroflat_state->config_path, '\0', RETROFLAT_PATH_MAX + 1 );
    +
    3640
    +
    3641 if( NULL != args->config_path ) {
    +
    3642 debug_printf( 1, "setting config path to: %s", args->config_path );
    +
    3643 strncpy(
    +
    3644 g_retroflat_state->config_path,
    + +
    3646 } else {
    +
    3647 debug_printf( 1, "setting config path to: %s%s",
    +
    3648 args->title, RETROFLAT_CONFIG_EXT );
    +
    3649 strncpy(
    +
    3650 g_retroflat_state->config_path, args->title, RETROFLAT_PATH_MAX );
    +
    3651 strncat(
    +
    3652 g_retroflat_state->config_path,
    +
    3653 RETROFLAT_CONFIG_EXT, RETROFLAT_PATH_MAX );
    +
    3654 }
    +
    3655
    +
    3656 return RETROFLAT_OK;
    +
    3657}
    +
    3658
    +
    3659# endif /* !MAUG_CLI_SIGIL_SZ */
    +
    3660
    +
    3661# ifdef RETROFLAT_VDP
    +
    3662static int retroflat_cli_vdp( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3663 if( 0 == strncmp( MAUG_CLI_SIGIL "vdp", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3664 /* Next arg is VDP args str. */
    +
    3665 } else {
    +
    3666 strncpy( g_retroflat_state->vdp_args, arg, RETROFLAT_VDP_ARGS_SZ_MAX );
    +
    3667 debug_printf( 1, "VDP args: %s", g_retroflat_state->vdp_args );
    +
    3668 }
    +
    3669 return RETROFLAT_OK;
    +
    3670}
    +
    3671# endif /* RETROFLAT_VDP */
    +
    3672
    +
    3673static int retroflat_cli_u( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3674 if( 0 == strncmp( MAUG_CLI_SIGIL "rfu", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3675 debug_printf( 1, "unlocking FPS..." );
    +
    3676 args->flags |= RETROFLAT_FLAGS_UNLOCK_FPS;
    +
    3677 }
    +
    3678 return RETROFLAT_OK;
    +
    3679}
    +
    3680
    +
    3681static int retroflat_cli_u_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3682 args->flags &= ~RETROFLAT_FLAGS_UNLOCK_FPS;
    +
    3683 return RETROFLAT_OK;
    +
    3684}
    +
    3685
    +
    3686#endif /* !RETROFLAT_NO_CLI */
    +
    3687
    +
    3688/* === */
    +
    3689
    +
    3690# ifdef RETROFLAT_API_ALLEGRO
    +
    3691
    +
    3692/* Allegro-specific callbacks for init, below. */
    +
    3693
    +
    3694void retroflat_on_ms_tick() {
    +
    3695 if( NULL == g_retroflat_state ) {
    +
    3696 debug_printf( 1, "no state!" );
    +
    3697 } else {
    +
    3698 g_ms++;
    +
    3699 }
    +
    3700}
    +
    3701
    +
    3702void retroflat_on_close_button() {
    +
    3703 g_retroflat_state->close_button = 1;
    +
    3704}
    +
    3705END_OF_FUNCTION( retroflat_on_close_button )
    +
    3706
    +
    3707# endif /* RETROFLAT_API_ALLEGRO */
    +
    3708
    +
    3709/* === */
    +
    3710
    +
    3711# ifdef RETROFLAT_API_PC_BIOS
    +
    3712
    +
    3713void __interrupt __far retroflat_timer_handler() {
    +
    3714 static unsigned long count = 0;
    +
    3715
    +
    3716 ++g_ms;
    +
    3717 count += RETROFLAT_DOS_TIMER_DIV; /* Original DOS timer in parallel. */
    +
    3718 if( 65536 <= count ) {
    +
    3719 /* Call the original handler. */
    +
    3720 count -= 65536;
    +
    3721 _chain_intr( g_retroflat_state->old_timer_interrupt );
    +
    3722 } else {
    +
    3723 /* Acknowledge interrupt */
    +
    3724 outp( 0x20, 0x20 );
    +
    3725 }
    +
    3726}
    +
    3727
    +
    3728# endif /* RETROFLAT_API_PC_BIOS */
    +
    3729
    +
    3730/* === */
    +
    3731
    +
    3732/* Still inside RETROFLT_C! */
    +
    3733
    +
    3734int retroflat_init( int argc, char* argv[], struct RETROFLAT_ARGS* args ) {
    +
    3735
    +
    3736 /* = Declare Init Vars = */
    +
    3737
    +
    3738 int retval = 0;
    +
    3739# if defined( RETROFLAT_API_ALLEGRO ) && defined( RETROFLAT_OS_DOS )
    +
    3740# if 0
    +
    3741 union REGS regs;
    +
    3742 struct SREGS sregs;
    +
    3743# endif
    +
    3744# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3745 WNDCLASS wc;
    +
    3746 RECT wr = { 0, 0, 0, 0 };
    +
    3747 DWORD window_style = RETROFLAT_WIN_STYLE;
    +
    3748 DWORD window_style_ex = 0;
    +
    3749 int ww = 0,
    +
    3750 wh = 0;
    +
    3751# elif defined( RETROFLAT_API_SDL1 )
    +
    3752 const SDL_VideoInfo* info = NULL;
    +
    3753 char sdl_video_parms[256] = "";
    +
    3754# if defined( RETROFLAT_OPENGL )
    +
    3755 int gl_retval = 0,
    +
    3756 gl_depth = 16;
    +
    3757# endif /* RETROFLAT_OPENGL */
    +
    3758# elif defined( RETROFLAT_API_LIBNDS )
    +
    3759 int i = 0;
    +
    3760# elif defined( RETROFLAT_API_GLUT )
    +
    3761 unsigned int glut_init_flags = 0;
    +
    3762# elif defined( RETROFLAT_API_PC_BIOS )
    +
    3763 union REGS r;
    +
    3764 struct SREGS s;
    +
    3765# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3766
    +
    3767 /* = Begin Init Procedure = */
    +
    3768
    +
    3769# if defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    3770# if defined( RETROFLAT_SDL_ICO )
    +
    3771 SDL_Surface* icon = NULL;
    +
    3772# endif /* RETROFLAT_SDL_ICO */
    +
    3773# endif /* RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 */
    +
    3774
    +
    3775# ifdef RETROFLAT_COMMIT_HASH
    +
    3776 debug_printf( 1, "retroflat commit: " RETROFLAT_COMMIT_HASH );
    +
    3777# endif /* RETROFLAT_COMMIT_HASH */
    +
    3778
    +
    3779 debug_printf( 1, "retroflat: initializing..." );
    +
    3780
    +
    3781 /* System sanity checks. */
    +
    3782 assert( 4 == sizeof( uint32_t ) );
    +
    3783 assert( 4 == sizeof( int32_t ) );
    +
    3784 assert( 2 == sizeof( uint16_t ) );
    +
    3785 assert( 2 == sizeof( int16_t ) );
    +
    3786 assert( 1 == sizeof( uint8_t ) );
    +
    3787 assert( 1 == sizeof( int8_t ) );
    +
    3788 assert( NULL != args );
    +
    3789
    +
    3790 debug_printf( 1, "retroflat: allocating state (" SIZE_T_FMT " bytes)...",
    +
    3791 sizeof( struct RETROFLAT_STATE ) );
    +
    3792
    +
    3793 debug_printf( 1, "retroflat: size_t is (" SIZE_T_FMT " bytes)...",
    +
    3794 sizeof( size_t ) );
    +
    3795
    +
    3796 debug_printf( 1, "retroflat: ssize_t is (" SIZE_T_FMT " bytes)...",
    +
    3797 sizeof( ssize_t ) );
    +
    3798
    +
    3799 debug_printf( 1, "retroflat: off_t is (" SIZE_T_FMT " bytes)...",
    +
    3800 sizeof( off_t ) );
    +
    3801
    +
    3802 g_retroflat_state_h = maug_malloc( 1, sizeof( struct RETROFLAT_STATE ) );
    +
    3803 if( (MAUG_MHANDLE)NULL == g_retroflat_state_h ) {
    + +
    3805 "Error", "Could not allocate global state!" );
    +
    3806 retval = MERROR_ALLOC;
    +
    3807 goto cleanup;
    +
    3808 }
    +
    3809
    +
    3810 maug_mlock( g_retroflat_state_h, g_retroflat_state );
    +
    3811 if( (MAUG_MHANDLE)NULL == g_retroflat_state ) {
    + +
    3813 "Error", "Could not lock global state!" );
    +
    3814 retval = MERROR_ALLOC;
    +
    3815 goto cleanup;
    +
    3816 }
    +
    3817 maug_mzero( g_retroflat_state, sizeof( struct RETROFLAT_STATE ) );
    +
    3818
    +
    3819# ifndef RETROFLAT_NO_CLI
    +
    3820
    +
    3821 debug_printf( 1, "retroflat: parsing args..." );
    +
    3822
    +
    3823 /* All platforms: add command-line args based on compile definitons. */
    +
    3824
    +
    3825# ifdef RETROSND_ARGS
    +
    3826 maug_add_arg( MAUG_CLI_SIGIL "rsd", MAUG_CLI_SIGIL_SZ + 4,
    +
    3827 "Select MIDI device", 0, (maug_cli_cb)retrosnd_cli_rsd,
    +
    3828 (maug_cli_cb)retrosnd_cli_rsd_def, args );
    +
    3829 maug_add_arg( MAUG_CLI_SIGIL "rsl", MAUG_CLI_SIGIL_SZ + 4,
    +
    3830 "List MIDI devices", 0, (maug_cli_cb)retrosnd_cli_rsl, NULL, args );
    +
    3831# endif /* RETROSND_ARGS */
    +
    3832
    +
    3833# ifdef RETROFLAT_SCREENSAVER
    +
    3834 maug_add_arg( MAUG_CLI_SIGIL "p", MAUG_CLI_SIGIL_SZ + 2,
    +
    3835 "Preview screensaver", 0, (maug_cli_cb)retroflat_cli_p, NULL, args );
    +
    3836 maug_add_arg( MAUG_CLI_SIGIL "s", MAUG_CLI_SIGIL_SZ + 2,
    +
    3837 "Launch screensaver", 0, (maug_cli_cb)retroflat_cli_s, NULL, args );
    +
    3838# endif /* RETROFLAT_SCREENSAVER */
    +
    3839
    +
    3840# ifdef RETROFLAT_API_PC_BIOS
    +
    3841 maug_add_arg( MAUG_CLI_SIGIL "rfm", MAUG_CLI_SIGIL_SZ + 4,
    +
    3842 "Set the screen mode.", 0,
    +
    3843 (maug_cli_cb)retroflat_cli_rfm,
    +
    3844 (maug_cli_cb)retroflat_cli_rfm_def, args );
    +
    3845# elif !defined( RETROFLAT_NO_CLI_SZ )
    +
    3846 maug_add_arg( MAUG_CLI_SIGIL "rfx", MAUG_CLI_SIGIL_SZ + 4,
    +
    3847 "Set the screen X position.", 0,
    +
    3848 (maug_cli_cb)retroflat_cli_rfx,
    +
    3849 (maug_cli_cb)retroflat_cli_rfx_def, args );
    +
    3850 maug_add_arg( MAUG_CLI_SIGIL "rfy", MAUG_CLI_SIGIL_SZ + 4,
    +
    3851 "Set the screen Y position.", 0,
    +
    3852 (maug_cli_cb)retroflat_cli_rfy,
    +
    3853 (maug_cli_cb)retroflat_cli_rfy_def, args );
    +
    3854 maug_add_arg( MAUG_CLI_SIGIL "rfw", MAUG_CLI_SIGIL_SZ + 4,
    +
    3855 "Set the screen width.", 0,
    +
    3856 (maug_cli_cb)retroflat_cli_rfw,
    +
    3857 (maug_cli_cb)retroflat_cli_rfw_def, args );
    +
    3858 maug_add_arg( MAUG_CLI_SIGIL "rfh", MAUG_CLI_SIGIL_SZ + 4,
    +
    3859 "Set the screen height.", 0,
    +
    3860 (maug_cli_cb)retroflat_cli_rfh,
    +
    3861 (maug_cli_cb)retroflat_cli_rfh_def, args );
    +
    3862# endif /* !RETROFLAT_NO_CLI_SZ */
    +
    3863
    +
    3864# ifdef RETROFLAT_VDP
    +
    3865 maug_add_arg( MAUG_CLI_SIGIL "vdp", MAUG_CLI_SIGIL_SZ + 4,
    +
    3866 "Pass a string of args to the VDP.", 0,
    +
    3867 (maug_cli_cb)retroflat_cli_vdp, NULL, args );
    +
    3868# endif /* RETROFLAT_VDP */
    +
    3869
    +
    3870# ifndef MAUG_NO_CONFIG
    +
    3871 maug_add_arg( MAUG_CLI_SIGIL "rfc", MAUG_CLI_SIGIL_SZ + 4,
    +
    3872 "Set the config path.", 0,
    +
    3873 (maug_cli_cb)retroflat_cli_c, (maug_cli_cb)retroflat_cli_c_def, args );
    +
    3874# endif /* !MAUG_NO_CONFIG */
    +
    3875
    +
    3876 maug_add_arg( MAUG_CLI_SIGIL "rfu", MAUG_CLI_SIGIL_SZ + 4,
    +
    3877 "Unlock FPS.", 0,
    +
    3878 (maug_cli_cb)retroflat_cli_u, (maug_cli_cb)retroflat_cli_u_def, args );
    +
    3879
    +
    3880 /* Parse command line args. */
    +
    3881 retval = maug_parse_args( argc, argv );
    +
    3882 if( RETROFLAT_OK != retval ) {
    +
    3883 goto cleanup;
    +
    3884 }
    +
    3885
    +
    3886# endif /* !RETROFLAT_NO_CLI */
    +
    3887
    +
    3888 if(
    + +
    3890 ) {
    +
    3891 g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_UNLOCK_FPS;
    +
    3892 }
    +
    3893
    +
    3894 debug_printf( 1, "retroflat: setting config..." );
    +
    3895
    +
    3896 /* Set the assets path. */
    +
    3897 memset( g_retroflat_state->assets_path, '\0', RETROFLAT_ASSETS_PATH_MAX );
    +
    3898 if( NULL != args->assets_path ) {
    +
    3899 strncpy( g_retroflat_state->assets_path,
    + +
    3901 }
    +
    3902
    +
    3903# if defined( RETROFLAT_SCREENSAVER )
    +
    3904 if(
    + +
    3906 (RETROFLAT_FLAGS_SCREENSAVER & args->flags)
    +
    3907 ) {
    +
    3908 g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_SCREENSAVER;
    +
    3909 }
    +
    3910# endif /* RETROFLAT_SCREENSAVER */
    +
    3911
    +
    3912# if !defined( RETROFLAT_NO_CLI_SZ )
    +
    3913 /* Setup intended screen size. */
    +
    3914 /* TODO: Handle window resizing someday! */
    +
    3915 g_retroflat_state->screen_v_w = args->screen_w;
    +
    3916 g_retroflat_state->screen_v_h = args->screen_h;
    +
    3917 if(
    + +
    3919 ) {
    +
    3920 debug_printf( 1, "setting SDL window scale to 2x..." );
    +
    3921 g_retroflat_state->screen_w = args->screen_w * 2;
    +
    3922 g_retroflat_state->screen_h = args->screen_h * 2;
    +
    3923 } else {
    +
    3924 g_retroflat_state->screen_w = args->screen_w;
    +
    3925 g_retroflat_state->screen_h = args->screen_h;
    +
    3926 }
    +
    3927# endif /* RETROFLAT_NO_CLI_SZ */
    +
    3928
    +
    3929# ifdef RETROFLAT_OPENGL
    +
    3930 debug_printf( 1, "setting up texture palette..." );
    +
    3931# define RETROFLAT_COLOR_TABLE_TEX( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    3932 g_retroflat_state->tex_palette[idx][0] = r; \
    +
    3933 g_retroflat_state->tex_palette[idx][1] = g; \
    +
    3934 g_retroflat_state->tex_palette[idx][2] = b;
    +
    3935 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_TEX )
    +
    3936# endif /* RETROFLAT_OPENGL */
    +
    3937
    +
    3938# ifdef RETROFLAT_API_ALLEGRO
    +
    3939
    +
    3940 /* == Allegro == */
    +
    3941
    +
    3942 srand( time( NULL ) );
    +
    3943
    +
    3944 if( allegro_init() ) {
    +
    3945 allegro_message( "could not setup allegro!" );
    +
    3946 retval = RETROFLAT_ERROR_ENGINE;
    +
    3947 goto cleanup;
    +
    3948 }
    +
    3949
    +
    3950 install_keyboard();
    +
    3951# if !defined( RETROFLAT_OS_DOS )
    +
    3952 /* XXX: Broken in DOS. */
    +
    3953 install_timer();
    +
    3954 install_int( retroflat_on_ms_tick, 1 );
    +
    3955# endif /* RETROFLAT_OS_DOS */
    +
    3956
    +
    3957# ifdef RETROFLAT_OS_DOS
    +
    3958 /* Don't try windowed mode in DOS. */
    +
    3959 if(
    +
    3960 set_gfx_mode( GFX_AUTODETECT, args->screen_w, args->screen_h, 0, 0 )
    +
    3961 ) {
    +
    3962# else
    +
    3963 if(
    +
    3964 /* TODO: Set window position. */
    +
    3965 set_gfx_mode(
    +
    3966 GFX_AUTODETECT_WINDOWED, args->screen_w, args->screen_h, 0, 0 )
    +
    3967 ) {
    +
    3968# endif /* RETROFLAT_OS_DOS */
    +
    3969
    +
    3970 allegro_message( "could not setup graphics!" );
    +
    3971 retval = RETROFLAT_ERROR_GRAPHICS;
    +
    3972 goto cleanup;
    +
    3973 }
    +
    3974
    +
    3975# define RETROFLAT_COLOR_TABLE_ALLEGRO_INIT( i, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    3976 g_retroflat_state->palette[i] = makecol( r, g, b );
    +
    3977
    +
    3978 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_ALLEGRO_INIT )
    +
    3979
    +
    3980 LOCK_FUNCTION( retroflat_on_close_button );
    +
    3981 set_close_button_callback( retroflat_on_close_button );
    +
    3982
    +
    3983# ifndef RETROFLAT_OS_DOS
    +
    3984 if( NULL != args->title ) {
    +
    3985 retroflat_set_title( args->title );
    +
    3986 }
    +
    3987
    +
    3988 /* XXX: Broken in DOS. */
    +
    3989 if( 0 > install_mouse() ) {
    +
    3990 allegro_message( "could not setup mouse!" );
    +
    3991 retval = RETROFLAT_ERROR_MOUSE;
    +
    3992 goto cleanup;
    +
    3993 }
    +
    3994# endif /* !RETROFLAT_OS_DOS */
    +
    3995
    +
    3996# ifdef RETROFLAT_OS_DOS
    +
    3997# if 0
    +
    3998 regs.w.ax = 0x9;
    +
    3999 regs.w.bx = 0x0;
    +
    4000 regs.w.cx = 0x0;
    +
    4001 regs.x.edx = FP_OFF( g_retroflat_state->mouse_cursor );
    +
    4002 sregs.es = FP_SEG( g_retroflat_state->mouse_cursor );
    +
    4003 int386x( 0x33, &regs, &regs, &sregs );
    +
    4004# endif
    +
    4005# endif /* RETROFLAT_OS_DOS */
    +
    4006
    +
    4007 g_retroflat_state->buffer.b =
    +
    4008 create_bitmap( args->screen_w, args->screen_h );
    +
    4009 maug_cleanup_if_null(
    +
    4010 BITMAP*, g_retroflat_state->buffer.b, RETROFLAT_ERROR_GRAPHICS );
    +
    4011
    +
    4012# elif defined( RETROFLAT_API_SDL1 )
    +
    4013
    +
    4014 /* == SDL1 == */
    +
    4015
    +
    4016 /* Random seed. */
    +
    4017 srand( time( NULL ) );
    +
    4018
    +
    4019 /* Startup SDL. */
    +
    4020 if( SDL_Init( SDL_INIT_VIDEO ) ) {
    + +
    4022 "Error", "Error initializing SDL: %s", SDL_GetError() );
    +
    4023 retval = RETROFLAT_ERROR_ENGINE;
    +
    4024 goto cleanup;
    +
    4025 }
    +
    4026
    +
    4027 /* Get info on best available video mode. */
    +
    4028 info = SDL_GetVideoInfo();
    +
    4029 maug_cleanup_if_null_alloc( SDL_VideoInfo*, info );
    +
    4030
    +
    4031 debug_printf( 3, "maximum window size: %ux%u",
    +
    4032 info->current_w, info->current_h );
    +
    4033
    +
    4034# ifndef RETROFLAT_OS_WIN
    +
    4035
    +
    4036 /* TODO: Maximum screen size detection returns bogus values in Windows! */
    +
    4037
    +
    4038 /* Setup default screen position. */
    +
    4039 if( 0 == args->screen_x ) {
    +
    4040 /* Get screen width so we can center! */
    +
    4041 args->screen_x = (info->current_w / 2) -
    +
    4042 (g_retroflat_state->screen_w / 2);
    +
    4043 }
    +
    4044
    +
    4045 if( 0 == args->screen_y ) {
    +
    4046 /* Get screen height so we can center! */
    +
    4047 args->screen_y = (info->current_h / 2) -
    +
    4048 (g_retroflat_state->screen_h / 2);
    +
    4049 }
    +
    4050
    +
    4051 maug_snprintf( sdl_video_parms, 255, "SDL_VIDEO_WINDOW_POS=%d,%d",
    +
    4052 args->screen_x, args->screen_y );
    +
    4053 putenv( sdl_video_parms );
    +
    4054
    +
    4055# endif /* !RETROFLAT_OS_WIN */
    +
    4056
    +
    4057 /* Setup color palettes. */
    +
    4058# ifdef RETROFLAT_OPENGL
    +
    4059# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4060 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    4061# else
    +
    4062# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, rd, gd, bd, cgac, cgad ) \
    +
    4063 g_retroflat_state->palette[idx].r = rd; \
    +
    4064 g_retroflat_state->palette[idx].g = gd; \
    +
    4065 g_retroflat_state->palette[idx].b = bd;
    +
    4066# endif /* RETROFLAT_OPENGL */
    +
    4067 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_SDL )
    +
    4068
    +
    4069# ifdef RETROFLAT_OPENGL
    +
    4070 if(
    + +
    4072 ) {
    +
    4073 SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 0 );
    +
    4074 }
    +
    4075 SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
    +
    4076 SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
    +
    4077 SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
    +
    4078 do {
    +
    4079 /* Retry with smaller depth buffers if this fails. */
    +
    4080 gl_retval = SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, gl_depth );
    +
    4081 if( gl_retval ) {
    +
    4082 error_printf( "unable to set depth buffer to %d!", gl_depth );
    +
    4083 gl_depth -= 4;
    +
    4084 }
    +
    4085 } while( gl_retval );
    +
    4086 SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    +
    4087# endif /* RETROFLAT_OPENGL */
    +
    4088
    +
    4089 if( NULL != args->title ) {
    +
    4090 retroflat_set_title( args->title );
    +
    4091 }
    +
    4092
    +
    4093# ifdef RETROFLAT_SDL_ICO
    +
    4094 debug_printf( 1, "setting SDL window icon..." );
    +
    4095 icon = SDL_LoadBMP_RW(
    +
    4096 SDL_RWFromConstMem( obj_ico_sdl_ico_bmp,
    +
    4097 obj_ico_sdl_ico_bmp_len ), 1 );
    +
    4098 maug_cleanup_if_null( SDL_Surface*, icon, RETROFLAT_ERROR_BITMAP );
    +
    4099 SDL_WM_SetIcon( icon, 0 ); /* TODO: Constant mask. */
    +
    4100# endif /* RETROFLAT_SDL_ICO */
    +
    4101
    +
    4102 g_retroflat_state->buffer.surface = SDL_SetVideoMode(
    +
    4103 g_retroflat_state->screen_w, g_retroflat_state->screen_h,
    +
    4104 info->vfmt->BitsPerPixel,
    +
    4105 SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_ANYFORMAT
    +
    4106# ifdef RETROFLAT_OPENGL
    +
    4107 | SDL_OPENGL
    +
    4108# endif /* RETROFLAT_OPENGL */
    +
    4109 );
    +
    4110 maug_cleanup_if_null(
    +
    4111 SDL_Surface*, g_retroflat_state->buffer.surface,
    +
    4112 RETROFLAT_ERROR_GRAPHICS );
    +
    4113
    +
    4114 /* Setup key repeat. */
    +
    4115 if(
    + +
    4117 ) {
    +
    4118 if( 0 != SDL_EnableKeyRepeat(
    +
    4119 1, SDL_DEFAULT_REPEAT_INTERVAL
    +
    4120 ) ) {
    +
    4121 error_printf( "could not enable key repeat!" );
    +
    4122 } else {
    +
    4123 debug_printf( 3, "key repeat enabled" );
    +
    4124 }
    +
    4125 }
    +
    4126
    +
    4127# elif defined( RETROFLAT_API_SDL2 )
    +
    4128
    +
    4129 /* == SDL2 == */
    +
    4130
    +
    4131 srand( time( NULL ) );
    +
    4132
    +
    4133 if( SDL_Init( SDL_INIT_VIDEO ) ) {
    + +
    4135 "Error", "Error initializing SDL: %s", SDL_GetError() );
    +
    4136 retval = RETROFLAT_ERROR_ENGINE;
    +
    4137 goto cleanup;
    +
    4138 }
    +
    4139
    +
    4140 /* Setup color palettes. */
    +
    4141# ifdef RETROFLAT_OPENGL
    +
    4142# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4143 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    4144# else
    +
    4145# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, rd, gd, bd, cgac, cgad ) \
    +
    4146 g_retroflat_state->palette[idx].r = rd; \
    +
    4147 g_retroflat_state->palette[idx].g = gd; \
    +
    4148 g_retroflat_state->palette[idx].b = bd;
    +
    4149# endif /* RETROFLAT_OPENGL */
    +
    4150 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_SDL )
    +
    4151
    +
    4152 /* Create the main window. */
    +
    4153 g_retroflat_state->window = SDL_CreateWindow( args->title,
    +
    4154 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
    +
    4155 args->screen_w, args->screen_h, RETROFLAT_WIN_FLAGS );
    +
    4156 maug_cleanup_if_null( SDL_Window*, g_retroflat_state->window, RETROFLAT_ERROR_GRAPHICS );
    +
    4157
    +
    4158 /* Create the main renderer. */
    +
    4159 g_retroflat_state->buffer.renderer = SDL_CreateRenderer(
    +
    4160 g_retroflat_state->window, -1,
    +
    4161 SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE );
    +
    4162 maug_cleanup_if_null(
    +
    4163 SDL_Renderer*, g_retroflat_state->buffer.renderer,
    +
    4164 RETROFLAT_ERROR_GRAPHICS );
    +
    4165
    +
    4166 /* Create the buffer texture. */
    +
    4167 g_retroflat_state->buffer.texture =
    +
    4168 SDL_CreateTexture( g_retroflat_state->buffer.renderer,
    +
    4169 SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,
    +
    4170 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    4171
    +
    4172 /* TODO: This doesn't seem to do anything. */
    +
    4173 if(
    + +
    4175 ) {
    +
    4176 debug_printf( 1, "setting SDL window scale to 2x..." );
    +
    4177 SDL_RenderSetScale( g_retroflat_state->buffer.renderer, 2.0f, 2.0f );
    +
    4178 }
    +
    4179
    +
    4180# ifdef RETROFLAT_SDL_ICO
    +
    4181 debug_printf( 1, "setting SDL window icon..." );
    +
    4182 icon = SDL_LoadBMP_RW(
    +
    4183 SDL_RWFromConstMem( obj_ico_sdl_ico_bmp,
    +
    4184 obj_ico_sdl_ico_bmp_len ), 1 );
    +
    4185 maug_cleanup_if_null( SDL_Surface*, icon, RETROFLAT_ERROR_BITMAP );
    +
    4186 SDL_SetWindowIcon( g_retroflat_state->window, icon );
    +
    4187# endif /* RETROFLAT_SDL_ICO */
    +
    4188
    +
    4189# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4190
    +
    4191 /* == Win16/Win32 == */
    +
    4192
    +
    4193# ifdef RETROFLAT_API_WINCE
    +
    4194 srand( GetTickCount() );
    +
    4195# else
    +
    4196 srand( time( NULL ) );
    +
    4197# endif /* RETROFLAT_API_WINCE */
    +
    4198
    +
    4199 /* Setup color palettes. */
    +
    4200 /* TODO: For WinG, try to make the indexes match system palette? */
    +
    4201# ifdef RETROFLAT_OPENGL
    +
    4202# define RETROFLAT_COLOR_TABLE_WIN( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4203 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    4204# else
    +
    4205# define RETROFLAT_COLOR_TABLE_WIN( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4206 g_retroflat_state->palette[idx] = RGB( r, g, b );
    +
    4207# endif /* RETROFLAT_OPENGL */
    +
    4208
    +
    4209 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN )
    +
    4210
    +
    4211# ifdef RETROFLAT_WING
    +
    4212 debug_printf( 3, "attempting to link WinG..." );
    +
    4213 /* Dynamically load the WinG procedures. */
    +
    4214# ifdef RETROFLAT_API_WIN32
    +
    4215 g_w.module = LoadLibrary( "wing32.dll" );
    +
    4216 if( (HMODULE)NULL == g_w.module ) {
    +
    4217# elif defined( RETROFLAT_API_WIN16 )
    +
    4218 g_w.module = LoadLibrary( "wing.dll" );
    +
    4219 if( HINSTANCE_ERROR == g_w.module ) {
    +
    4220# endif
    +
    4221 g_w.success = 0;
    +
    4222 } else {
    +
    4223 g_w.success = 1;
    +
    4224
    +
    4225# ifdef RETROFLAT_API_WIN32
    +
    4226# define RETROFLAT_WING_LLTABLE_LOAD_PROC( retval, proc, ord ) \
    +
    4227 g_w.proc = (proc ## _t)GetProcAddress( g_w.module, #proc ); \
    +
    4228 if( (proc ## _t)NULL == g_w.proc ) { \
    +
    4229 g_w.success = 0; \
    +
    4230 }
    +
    4231# elif defined( RETROFLAT_API_WIN16 )
    +
    4232# define RETROFLAT_WING_LLTABLE_LOAD_PROC( retval, proc, ord ) \
    +
    4233 g_w.proc = (proc ## _t)GetProcAddress( \
    +
    4234 g_w.module, MAKEINTRESOURCE( ord ) ); \
    +
    4235 if( (proc ## _t)NULL == g_w.proc ) { \
    +
    4236 retroflat_message( \
    +
    4237 RETROFLAT_MSG_FLAG_ERROR, "Error", \
    +
    4238 "Unable to link WinG proc: %s", #proc ); \
    +
    4239 g_w.success = 0; \
    +
    4240 }
    +
    4241# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    4242
    +
    4243 RETROFLAT_WING_LLTABLE( RETROFLAT_WING_LLTABLE_LOAD_PROC )
    +
    4244
    +
    4245 }
    +
    4246
    +
    4247 if( !g_w.success ) {
    + +
    4249 "Error", "Unable to link WinG!" );
    +
    4250 }
    +
    4251# endif /* RETROFLAT_WING */
    +
    4252
    +
    4253 /* Get the *real* size of the window, including titlebar. */
    +
    4254 wr.right = g_retroflat_state->screen_w;
    +
    4255 wr.bottom = g_retroflat_state->screen_h;
    +
    4256# ifndef RETROFLAT_API_WINCE
    +
    4257 AdjustWindowRect( &wr, RETROFLAT_WIN_STYLE, FALSE );
    +
    4258# endif /* !RETROFLAT_API_WINCE */
    +
    4259
    +
    4260 memset(
    +
    4261 &(g_retroflat_state->buffer), '\0', sizeof( struct RETROFLAT_BITMAP ) );
    +
    4262
    +
    4263 debug_printf( 1, "retroflat: creating window class..." );
    +
    4264
    +
    4265 memset( &wc, '\0', sizeof( WNDCLASS ) );
    +
    4266
    +
    4267 wc.lpfnWndProc = (WNDPROC)&WndProc;
    +
    4268 wc.hInstance = g_retroflat_instance;
    +
    4269# ifdef RETROFLAT_ICO_RES_ID
    +
    4270 wc.hIcon = LoadIcon(
    +
    4271 g_retroflat_instance, MAKEINTRESOURCE( RETROFLAT_ICO_RES_ID ) );
    +
    4272# endif /* RETROFLAT_ICO_RES_ID */
    +
    4273 wc.hCursor = LoadCursor( 0, IDC_ARROW );
    +
    4274 wc.hbrBackground = (HBRUSH)( COLOR_BTNFACE + 1 );
    +
    4275 /* wc.lpszMenuName = MAKEINTRESOURCE( IDR_MAINMENU ); */
    +
    4276 wc.lpszClassName = RETROFLAT_WINDOW_CLASS;
    +
    4277
    +
    4278 if( !RegisterClass( &wc ) ) {
    + +
    4280 "Error", "Could not register window class!" );
    +
    4281 goto cleanup;
    +
    4282 }
    +
    4283
    +
    4284 debug_printf( 1, "retroflat: creating window..." );
    +
    4285
    +
    4286# ifdef RETROFLAT_SCREENSAVER
    +
    4287 if( (HWND)0 != g_retroflat_state->parent ) {
    +
    4288 /* Shrink the child window into the parent. */
    +
    4289 debug_printf( 1, "retroflat: using window parent: %p",
    +
    4290 g_retroflat_state->parent );
    +
    4291 window_style = WS_CHILD;
    +
    4292 GetClientRect( g_retroflat_state->parent, &wr );
    +
    4293 } else if(
    + +
    4295 (RETROFLAT_FLAGS_SCREENSAVER & g_retroflat_state->retroflat_flags)
    +
    4296 ) {
    +
    4297 /* Make window fullscreen and on top. */
    +
    4298 window_style_ex = WS_EX_TOPMOST;
    +
    4299 window_style = WS_POPUP | WS_VISIBLE;
    +
    4300 /* X/Y are hardcoded to zero below, so just get desired window size. */
    +
    4301 wr.left = 0;
    +
    4302 wr.top = 0;
    +
    4303 wr.right = GetSystemMetrics( SM_CXSCREEN );
    +
    4304 wr.bottom = GetSystemMetrics( SM_CYSCREEN );
    +
    4305 } else {
    +
    4306# endif /* RETROFLAT_SCREENSAVER */
    +
    4307# ifndef RETROFLAT_API_WINCE
    +
    4308 /* Open in a centered window. */
    +
    4309 ww = wr.right - wr.left;
    +
    4310 wh = wr.bottom - wr.top;
    +
    4311 if( 0 == args->screen_x ) {
    +
    4312 args->screen_x = (GetSystemMetrics( SM_CXSCREEN ) / 2) - (ww / 2);
    +
    4313 }
    +
    4314 if( 0 == args->screen_y ) {
    +
    4315 args->screen_y = (GetSystemMetrics( SM_CYSCREEN ) / 2) - (wh / 2);
    +
    4316 }
    +
    4317# endif /* !RETROFLAT_API_WINCE */
    +
    4318# ifdef RETROFLAT_SCREENSAVER
    +
    4319 }
    +
    4320# endif /* RETROFLAT_SCREENSAVER */
    +
    4321
    +
    4322 g_retroflat_state->window = CreateWindowEx(
    +
    4323 window_style_ex, RETROFLAT_WINDOW_CLASS, args->title,
    +
    4324 window_style,
    +
    4325# ifdef RETROFLAT_API_WINCE
    +
    4326 0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
    +
    4327# else
    +
    4328 args->screen_x, args->screen_y, ww, wh,
    +
    4329# endif /* RETROFLAT_API_WINCE */
    +
    4330# ifdef RETROFLAT_SCREENSAVER
    +
    4331 g_retroflat_state->parent
    +
    4332# else
    +
    4333 0
    +
    4334# endif /* RETROFLAT_SCREENSAVER */
    +
    4335 , 0, g_retroflat_instance, 0
    +
    4336 );
    +
    4337
    +
    4338# ifdef RETROFLAT_API_WINCE
    +
    4339 /* Force screen size. */
    +
    4340 GetClientRect( g_retroflat_state->window, &wr );
    +
    4341 g_retroflat_state->screen_w = wr.right - wr.left;
    +
    4342 g_retroflat_state->screen_h = wr.bottom - wr.top;
    +
    4343# endif /* RETROFLAT_API_WINCE */
    +
    4344
    +
    4345 if( !g_retroflat_state->window ) {
    + +
    4347 "Error", "Could not create window!" );
    +
    4348 retval = RETROFLAT_ERROR_GRAPHICS;
    +
    4349 goto cleanup;
    +
    4350 }
    +
    4351
    +
    4352 maug_cleanup_if_null_alloc( HWND, g_retroflat_state->window );
    +
    4353
    +
    4354#ifndef RETROFLAT_OPENGL
    +
    4355 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_BRSET )
    +
    4356 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_PNSET )
    +
    4357#endif /* !RETROFLAT_OPENGL */
    +
    4358
    +
    4359 ShowWindow( g_retroflat_state->window, g_retroflat_cmd_show );
    +
    4360
    +
    4361# elif defined( RETROFLAT_API_LIBNDS )
    +
    4362
    +
    4363 /* == Nintendo DS == */
    +
    4364
    +
    4365 /* Setup color constants. */
    +
    4366# define RETROFLAT_COLOR_TABLE_NDS_RGBS_INIT( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4367 g_retroflat_state->palette[idx] = ARGB16( 1, r, g, b );
    +
    4368 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_NDS_RGBS_INIT )
    +
    4369
    +
    4370 /* Force screen size. */
    +
    4371 args->screen_w = 256;
    +
    4372 args->screen_h = 192;
    +
    4373
    +
    4374 powerOn( POWER_ALL );
    +
    4375
    +
    4376# ifdef RETROFLAT_OPENGL
    +
    4377
    +
    4378 debug_printf( 3, "setting up GL subsystem..." );
    +
    4379
    +
    4380 videoSetMode( MODE_0_3D );
    +
    4381
    +
    4382 vramSetBankA( VRAM_A_TEXTURE );
    +
    4383
    +
    4384 glInit();
    +
    4385
    +
    4386 /* TODO: Setup NDS 3D engine! */
    +
    4387
    +
    4388# else
    +
    4389 videoSetMode( MODE_5_2D );
    +
    4390 videoSetModeSub( MODE_0_2D );
    +
    4391
    +
    4392 /* Setup the upper screen for background and sprites. */
    +
    4393 vramSetBankA( VRAM_A_MAIN_BG );
    +
    4394 vramSetBankB( VRAM_B_MAIN_SPRITE );
    +
    4395
    +
    4396 /* Setup the lower screen for background and sprites. */
    +
    4397 vramSetBankC( VRAM_C_MAIN_BG );
    +
    4398 vramSetBankD( VRAM_D_SUB_SPRITE );
    +
    4399
    +
    4400 bgExtPaletteEnable();
    +
    4401
    +
    4402 /* Setup the background engine. */
    +
    4403
    +
    4404 /* Put map at base 2, but stow tiles up after the bitmap BG at base 7. */
    +
    4405 g_retroflat_state->bg_id =
    +
    4406 bgInit( 0, BgType_Text8bpp, BgSize_T_256x256, 2, 7 );
    +
    4407 dmaFillWords( 0, g_retroflat_state->bg_tiles,
    +
    4408 sizeof( g_retroflat_state->bg_tiles ) );
    +
    4409 bgSetPriority( g_retroflat_state->bg_id, 2 );
    +
    4410
    +
    4411 /* Put map at base 3, and tiles at base 0. */
    +
    4412 g_retroflat_state->window_id =
    +
    4413 bgInit( 1, BgType_Text8bpp, BgSize_T_256x256, 3, 0 );
    +
    4414 dmaFillWords( 0, g_retroflat_state->window_tiles,
    +
    4415 sizeof( g_retroflat_state->window_tiles ) );
    +
    4416 bgSetPriority( g_retroflat_state->window_id, 1 );
    +
    4417
    +
    4418 /* Put bitmap BG at base 1, leaving map-addressable space at base 0. */
    +
    4419 g_retroflat_state->px_id = bgInit( 2, BgType_Bmp16, BgSize_B16_256x256, 1, 0 );
    +
    4420 bgSetPriority( g_retroflat_state->px_id, 0 );
    +
    4421
    +
    4422 /* Setup the sprite engines. */
    +
    4423 oamInit( NDS_OAM_ACTIVE, SpriteMapping_1D_128, 0 );
    +
    4424
    +
    4425 /* Allocate sprite frame memory. */
    +
    4426 for( i = 0 ; NDS_SPRITES_ACTIVE > i ; i++ ) {
    +
    4427 g_retroflat_state->sprite_frames[i] = oamAllocateGfx(
    +
    4428 NDS_OAM_ACTIVE, SpriteSize_16x16, SpriteColorFormat_256Color );
    +
    4429 }
    +
    4430
    +
    4431# endif /* RETROFLAT_OPENGL */
    +
    4432
    +
    4433 /* Setup the timer. */
    +
    4434 TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1024;
    +
    4435 TIMER1_CR = TIMER_ENABLE | TIMER_CASCADE;
    +
    4436
    +
    4437# elif defined( RETROFLAT_API_GLUT )
    +
    4438
    +
    4439 /* == GLUT == */
    +
    4440
    +
    4441# define RETROFLAT_COLOR_TABLE_GLUT( idx, name_l, name_u, rd, gd, bd, cgac, cgad ) \
    +
    4442 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    4443 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_GLUT )
    +
    4444
    +
    4445 glutInit( &argc, argv );
    +
    4446 glut_init_flags = GLUT_DEPTH | GLUT_RGBA;
    +
    4447 if(
    + +
    4449 ) {
    +
    4450 glut_init_flags |= GLUT_DOUBLE;
    +
    4451 }
    +
    4452 glutInitDisplayMode( glut_init_flags );
    +
    4453 if( 0 < args->screen_x || 0 < args->screen_y ) {
    +
    4454 glutInitWindowPosition( args->screen_x, args->screen_y );
    +
    4455 }
    +
    4456 /* TODO: Handle screen scaling? */
    +
    4457 glutInitWindowSize(
    +
    4458 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    4459 glutCreateWindow( args->title );
    +
    4460 glutIdleFunc( retroflat_glut_idle );
    +
    4461 glutDisplayFunc( retroflat_glut_display );
    +
    4462 glutKeyboardFunc( retroflat_glut_key );
    +
    4463
    +
    4464# elif defined( RETROFLAT_API_PC_BIOS )
    +
    4465
    +
    4466 /* == DOS PC_BIOS == */
    +
    4467
    +
    4468 srand( time( NULL ) );
    +
    4469
    +
    4470 debug_printf( 3, "memory available before growth: %u", _memavl() );
    +
    4471# ifdef MAUG_DOS_MEM_L
    +
    4472 /* TODO: Should this check/init be in mmem.h instead? */
    +
    4473 _fheapgrow();
    +
    4474# else
    +
    4475 _nheapgrow();
    +
    4476# endif /* MAUG_DOS_MEM_L */
    +
    4477 debug_printf( 3, "memory available after growth: %u", _memavl() );
    +
    4478
    +
    4479 /* Setup timer handler. */
    +
    4480
    +
    4481 _disable();
    +
    4482
    +
    4483 /* Backup original handler for later. */
    +
    4484 segread( &s );
    +
    4485 r.h.al = 0x08;
    +
    4486 r.h.ah = 0x35;
    +
    4487 int86x( 0x21, &r, &r, &s );
    +
    4488 g_retroflat_state->old_timer_interrupt =
    +
    4489 (retroflat_intfunc)MK_FP( s.es, r.x.bx );
    +
    4490
    +
    4491 /* Install new interrupt handler. */
    +
    4492 g_ms = 0;
    +
    4493 r.h.al = 0x08;
    +
    4494 r.h.ah = 0x25;
    +
    4495 s.ds = FP_SEG( retroflat_timer_handler );
    +
    4496 r.x.dx = FP_OFF( retroflat_timer_handler );
    +
    4497 int86x( 0x21, &r, &r, &s );
    +
    4498
    +
    4499 /* Set resolution of timer chip to 1ms. */
    +
    4500 outp( 0x43, 0x36 );
    +
    4501 outp( 0x40, (uint8_t)(RETROFLAT_DOS_TIMER_DIV & 0xff) );
    +
    4502 outp( 0x40, (uint8_t)((RETROFLAT_DOS_TIMER_DIV >> 8) & 0xff) );
    +
    4503
    +
    4504 _enable();
    +
    4505
    +
    4506 debug_printf( 3, "timers initialized..." );
    +
    4507
    +
    4508 /* Setup graphics. */
    +
    4509
    +
    4510 memset( &r, 0, sizeof( r ) );
    +
    4511 r.x.ax = 0x0f00; /* Service: Get video mode. */
    +
    4512 int86( 0x10, &r, &r ); /* Call video interrupt. */
    +
    4513 g_retroflat_state->old_video_mode = r.h.al;
    +
    4514 debug_printf( 2, "saved old video mode: 0x%02x",
    +
    4515 g_retroflat_state->old_video_mode );
    +
    4516
    +
    4517 /* TODO: Put all screen mode dimensions in a LUT. */
    +
    4518 g_retroflat_state->screen_mode = args->screen_mode;
    +
    4519 switch( args->screen_mode ) {
    +
    4520 case RETROFLAT_SCREEN_MODE_CGA:
    +
    4521 debug_printf( 3, "using CGA 320x200x4 colors" );
    +
    4522 g_retroflat_state->screen_v_w = 320;
    +
    4523 g_retroflat_state->screen_v_h = 200;
    +
    4524 g_retroflat_state->screen_w = 320;
    +
    4525 g_retroflat_state->screen_h = 200;
    +
    4526 g_retroflat_state->buffer.px = (uint8_t SEG_FAR*)0xB8000000L;
    +
    4527 g_retroflat_state->buffer.w = 320;
    +
    4528 g_retroflat_state->buffer.h = 200;
    +
    4529 break;
    +
    4530
    +
    4531 case RETROFLAT_SCREEN_MODE_VGA:
    +
    4532 debug_printf( 3, "using VGA 320x200x16 colors" );
    +
    4533 g_retroflat_state->screen_v_w = 320;
    +
    4534 g_retroflat_state->screen_v_h = 200;
    +
    4535 g_retroflat_state->screen_w = 320;
    +
    4536 g_retroflat_state->screen_h = 200;
    +
    4537 g_retroflat_state->buffer.px = (uint8_t SEG_FAR*)0xA0000000L;
    +
    4538 g_retroflat_state->buffer.w = 320;
    +
    4539 g_retroflat_state->buffer.h = 200;
    +
    4540 g_retroflat_state->buffer.sz = 320 * 200;
    +
    4541 break;
    +
    4542
    +
    4543 default:
    +
    4544 error_printf( "unsupported video mode: %d", args->screen_mode );
    +
    4545 retval = MERROR_GUI;
    +
    4546 goto cleanup;
    +
    4547 }
    +
    4548
    +
    4549 memset( &r, 0, sizeof( r ) );
    +
    4550 r.h.al = args->screen_mode;
    +
    4551 int86( 0x10, &r, &r ); /* Call video interrupt. */
    +
    4552
    +
    4553 debug_printf(
    +
    4554 3, "graphics initialized (mode 0x%02x)...", args->screen_mode );
    +
    4555
    +
    4556 /* Initialize color table. */
    +
    4557# define RETROFLAT_COLOR_TABLE_CGA_COLORS_INIT( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4558 g_retroflat_state->cga_color_table[idx] = RETROFLAT_CGA_COLOR_ ## cgac;
    +
    4559 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CGA_COLORS_INIT )
    +
    4560
    +
    4561 /* Initialize dither table. */
    +
    4562# define RETROFLAT_COLOR_TABLE_CGA_DITHER_INIT( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4563 g_retroflat_state->cga_dither_table[idx] = RETROFLAT_CGA_COLOR_ ## cgad;
    +
    4564 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CGA_DITHER_INIT )
    +
    4565
    +
    4566# else
    +
    4567# pragma message( "warning: init not implemented" )
    +
    4568# endif /* RETROFLAT_API_ALLEGRO */
    +
    4569
    +
    4570# if defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES )
    +
    4571 retval = retrosoft_init();
    +
    4572 maug_cleanup_if_not_ok();
    +
    4573# endif /* RETROFLAT_SOFT_SHAPES || RETROFLAT_SOFT_LINES */
    +
    4574
    +
    4575# if defined( RETROFLAT_OPENGL )
    +
    4576 retval = retrosoft_init();
    +
    4577 maug_cleanup_if_not_ok();
    +
    4578 retval = retroglu_init_glyph_tex();
    +
    4579 maug_cleanup_if_not_ok();
    +
    4580# endif /* RETROFLAT_OPENGL */
    +
    4581
    +
    4582# ifdef RETROFLAT_VDP
    +
    4583# if defined( RETROFLAT_OS_UNIX )
    +
    4584 g_retroflat_state->vdp_exe = dlopen(
    +
    4585# ifdef RETROFLAT_API_SDL1
    +
    4586 "./rvdpsdl1.so",
    +
    4587# elif defined( RETROFLAT_API_SDL2 )
    +
    4588 "./rvdpsdl2.so",
    +
    4589# else
    +
    4590# error "rvdp .so undefined!"
    +
    4591# endif
    +
    4592 RTLD_LAZY );
    +
    4593# elif defined( RETROFLAT_OS_WIN )
    +
    4594 g_retroflat_state->vdp_exe = LoadLibrary(
    +
    4595# ifdef RETROFLAT_API_SDL1
    +
    4596 "./rvdpsdl1.dll"
    +
    4597# elif defined( RETROFLAT_API_SDL2 )
    +
    4598 "./rvdpsdl2.dll"
    +
    4599# elif defined( RETROFLAT_API_WIN32 )
    +
    4600 "./rvdpnt.dll"
    +
    4601# else
    +
    4602# error "rvdp .so undefined!"
    +
    4603# endif
    +
    4604 );
    +
    4605# else
    +
    4606# error "dlopen undefined!"
    +
    4607# endif /* RETROFLAT_OS_UNIX */
    +
    4608
    +
    4609 if( !(g_retroflat_state->vdp_exe) ) {
    +
    4610 error_printf( "not loading VDP" );
    +
    4611 /* Skip creating the buffer or trying to run the init proc. */
    +
    4612 goto skip_vdp;
    +
    4613 }
    +
    4614
    +
    4615 /* Create intermediary screen buffer. */
    +
    4616 debug_printf( 1, "creating VDP buffer, %d x %d",
    +
    4617 g_retroflat_state->screen_v_w, g_retroflat_state->screen_v_h );
    +
    4618 g_retroflat_state->vdp_buffer =
    +
    4619 calloc( 1, sizeof( struct RETROFLAT_BITMAP ) );
    +
    4620 maug_cleanup_if_null_alloc(
    +
    4621 struct RETROFLAT_BITMAP*, g_retroflat_state->vdp_buffer );
    +
    4622 retval = retroflat_create_bitmap(
    +
    4623 g_retroflat_state->screen_v_w, g_retroflat_state->screen_v_h,
    +
    4624 g_retroflat_state->vdp_buffer, RETROFLAT_FLAGS_OPAQUE );
    +
    4625 maug_cleanup_if_not_ok();
    +
    4626
    +
    4627 debug_printf( 1, "initializing VDP..." );
    +
    4628 retval = retroflat_vdp_call( "retroflat_vdp_init" );
    +
    4629
    +
    4630skip_vdp:
    +
    4631
    +
    4632# endif /* RETROFLAT_VDP */
    +
    4633
    +
    4634# ifndef RETROFLAT_NO_BLANK_INIT
    +
    4635 retroflat_draw_lock( NULL );
    + +
    4637 NULL, RETROFLAT_COLOR_BLACK, 0, 0,
    + + +
    4640 retroflat_draw_release( NULL );
    +
    4641# endif /* !RETROFLAT_NO_BLANK_INIT */
    +
    4642
    +
    4643cleanup:
    +
    4644
    +
    4645 return retval;
    +
    4646}
    +
    4647
    +
    4648/* === */
    +
    4649
    +
    4650void retroflat_shutdown( int retval ) {
    +
    4651
    +
    4652# if defined( RETROFLAT_API_PC_BIOS )
    +
    4653 union REGS r;
    +
    4654 struct SREGS s;
    +
    4655# endif /* RETROFLAT_API_PC_BIOS */
    +
    4656
    +
    4657 debug_printf( 1, "retroflat shutdown called..." );
    +
    4658
    +
    4659# if defined( RETROFLAT_VDP )
    +
    4660 if( NULL != g_retroflat_state->vdp_exe ) {
    +
    4661 retroflat_vdp_call( "retroflat_vdp_shutdown" );
    +
    4662# ifdef RETROFLAT_OS_UNIX
    +
    4663 dlclose( g_retroflat_state->vdp_exe );
    +
    4664# elif defined( RETROFLAT_OS_WIN )
    +
    4665 FreeLibrary( g_retroflat_state->vdp_exe );
    +
    4666# else
    +
    4667# error "dlclose undefined!"
    +
    4668# endif /* RETROFLAT_OS_UNIX || RETROFLAT_OS_WIN */
    +
    4669 }
    +
    4670
    +
    4671 if( NULL != g_retroflat_state->vdp_buffer ) {
    +
    4672 debug_printf( 1, "destroying VPD buffer..." );
    +
    4673 retroflat_destroy_bitmap( g_retroflat_state->vdp_buffer );
    +
    4674 free( g_retroflat_state->vdp_buffer );
    +
    4675 }
    +
    4676# endif /* RETROFLAT_VDP */
    +
    4677
    +
    4678# if defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES ) || \
    +
    4679defined( RETROFLAT_OPENGL )
    +
    4680 debug_printf( 1, "calling retrosoft shutdown..." );
    +
    4681 retrosoft_shutdown();
    +
    4682# endif /* RETROFLAT_SOFT_SHAPES */
    +
    4683
    +
    4684# ifdef RETROFLAT_OPENGL
    +
    4685 debug_printf( 1, "destroying GL glyphs..." );
    +
    4686 retroglu_destroy_glyph_tex();
    +
    4687# endif /* RETROFLAT_OPENGL */
    +
    4688
    +
    4689 /* === Platform-Specific Shutdown === */
    +
    4690
    +
    4691# if defined( RETROFLAT_OS_WASM )
    +
    4692 /* Do nothing, start the main loop later. */
    +
    4693 return;
    +
    4694
    +
    4695# elif defined( RETROFLAT_API_ALLEGRO )
    +
    4696
    +
    4697 /* == Allegro == */
    +
    4698
    +
    4699 if( RETROFLAT_ERROR_ENGINE != retval ) {
    +
    4700 clear_keybuf();
    +
    4701 }
    +
    4702
    +
    4703 retroflat_destroy_bitmap( &(g_retroflat_state->buffer) );
    +
    4704
    +
    4705# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    4706
    +
    4707 /* == SDL == */
    +
    4708
    +
    4709# ifndef RETROFLAT_API_SDL1
    +
    4710 SDL_DestroyWindow( g_retroflat_state->window );
    +
    4711# endif /* !RETROFLAT_API_SDL1 */
    +
    4712
    +
    4713 SDL_Quit();
    +
    4714
    +
    4715# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4716
    +
    4717 /* TODO: Windows shutdown? */
    +
    4718
    +
    4719 /* Stop frame timer if available. */
    +
    4720 if( NULL != g_retroflat_state->frame_iter ) {
    +
    4721 KillTimer( g_retroflat_state->window, RETROFLAT_WIN_FRAME_TIMER_ID );
    +
    4722 }
    +
    4723
    +
    4724 /* Stop loop timer if available. */
    +
    4725 if( NULL != g_retroflat_state->loop_iter ) {
    +
    4726 KillTimer( g_retroflat_state->window, RETROFLAT_WIN_LOOP_TIMER_ID );
    +
    4727 }
    +
    4728
    +
    4729 if( (HDC)NULL != g_retroflat_state->buffer.hdc_b ) {
    +
    4730 /* Return the default object into the HDC. */
    +
    4731 SelectObject(
    +
    4732 g_retroflat_state->buffer.hdc_b,
    +
    4733 g_retroflat_state->buffer.old_hbm_b );
    +
    4734 DeleteDC( g_retroflat_state->buffer.hdc_b );
    +
    4735 g_retroflat_state->buffer.hdc_b = (HDC)NULL;
    +
    4736
    +
    4737 /* Destroy buffer bitmap! */
    +
    4738 retroflat_destroy_bitmap( &(g_retroflat_state->buffer) );
    +
    4739 }
    +
    4740
    +
    4741# ifndef RETROFLAT_OPENGL
    +
    4742 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_BRRM )
    +
    4743 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_PENRM )
    +
    4744# endif /* !RETROFLAT_OPENGL */
    +
    4745
    +
    4746# ifdef RETROFLAT_WING
    +
    4747 if( (HMODULE)NULL != g_w.module ) {
    +
    4748 FreeLibrary( g_w.module );
    +
    4749 }
    +
    4750# endif /* RETROFLAT_WING */
    +
    4751
    +
    4752 if( (HDC)NULL != g_retroflat_state->hdc_win ) {
    +
    4753 ReleaseDC( g_retroflat_state->window, g_retroflat_state->hdc_win );
    +
    4754 }
    +
    4755
    +
    4756# elif defined( RETROFLAT_API_GLUT )
    +
    4757
    +
    4758 /* TODO */
    +
    4759
    +
    4760# elif defined( RETROFLAT_API_PC_BIOS )
    +
    4761
    +
    4762 if( 0 != g_retroflat_state->old_video_mode ) {
    +
    4763 /* Restore old video mode. */
    +
    4764 debug_printf( 3, "restoring video mode 0x%02x...",
    +
    4765 g_retroflat_state->old_video_mode );
    +
    4766
    +
    4767 memset( &r, 0, sizeof( r ) );
    +
    4768 r.x.ax = g_retroflat_state->old_video_mode;
    +
    4769 int86( 0x10, &r, &r ); /* Call video interrupt. */
    +
    4770 }
    +
    4771
    +
    4772 if( NULL != g_retroflat_state->old_timer_interrupt ) {
    +
    4773 /* Re-install original interrupt handler. */
    +
    4774 debug_printf( 3, "restoring timer interrupt..." );
    +
    4775 _disable();
    +
    4776 segread( &s );
    +
    4777 r.h.al = 0x08;
    +
    4778 r.h.ah = 0x25;
    +
    4779 s.ds = FP_SEG( g_retroflat_state->old_timer_interrupt );
    +
    4780 r.x.dx = FP_OFF( g_retroflat_state->old_timer_interrupt );
    +
    4781 int86x( 0x21, &r, &r, &s );
    +
    4782 }
    +
    4783
    +
    4784 /* Reset timer chip resolution to 18.2...ms. */
    +
    4785 outp( 0x43, 0x36 );
    +
    4786 outp( 0x40, 0x00 );
    +
    4787 outp( 0x40, 0x00 );
    +
    4788
    +
    4789 _enable();
    +
    4790
    +
    4791# else
    +
    4792# pragma message( "warning: shutdown not implemented" )
    +
    4793# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 */
    +
    4794
    +
    4795 maug_munlock( g_retroflat_state_h, g_retroflat_state );
    +
    4796 maug_mfree( g_retroflat_state );
    +
    4797
    +
    4798}
    +
    4799
    +
    4800/* === */
    +
    4801
    +
    4802# ifdef RETROFLAT_VDP
    +
    4803
    +
    4804MERROR_RETVAL retroflat_vdp_call( const char* proc_name ) {
    +
    4805 MERROR_RETVAL retval = MERROR_OK;
    + +
    4807# ifdef RETROFLAT_OS_WIN
    +
    4808 char proc_name_ex[256];
    +
    4809# endif /* RETROFLAT_OS_WIN */
    +
    4810
    +
    4811 if( NULL == g_retroflat_state->vdp_exe ) {
    +
    4812 goto cleanup;
    +
    4813 }
    +
    4814
    +
    4815# ifdef RETROFLAT_OS_UNIX
    +
    4816 vdp_proc = dlsym( g_retroflat_state->vdp_exe, proc_name );
    +
    4817# elif defined( RETROFLAT_OS_WIN )
    +
    4818 /* Append a _ to the proc_name because Watcom? Windows? */
    +
    4819 maug_snprintf( proc_name_ex, 255, "%s_", proc_name );
    +
    4820 vdp_proc = (retroflat_vdp_proc_t)GetProcAddress(
    +
    4821 g_retroflat_state->vdp_exe, proc_name_ex );
    +
    4822# else
    +
    4823# error "dlsym undefined!"
    +
    4824# endif
    +
    4825 if( (retroflat_vdp_proc_t)NULL == vdp_proc ) {
    +
    4826 goto cleanup;
    +
    4827 }
    +
    4828
    +
    4829# ifdef RETROFLAT_OS_WIN
    +
    4830 retroflat_draw_lock( g_retroflat_state->vdp_buffer );
    +
    4831# endif /* RETROFLAT_OS_WIN */
    +
    4832
    +
    4833 if(
    +
    4834 /* Don't pxlock before init can set the flag! */
    +
    4835 0 == strcmp( "retroflat_vdp_flip", proc_name ) &&
    + +
    4837 (RETROFLAT_VDP_FLAG_PXLOCK & g_retroflat_state->vdp_flags)
    +
    4838 ) {
    +
    4839 retroflat_vdp_lock( &(g_retroflat_state->buffer) );
    +
    4840 retroflat_vdp_lock( g_retroflat_state->vdp_buffer );
    +
    4841 }
    +
    4842
    +
    4843 retval = vdp_proc( g_retroflat_state );
    +
    4844
    +
    4845 if(
    +
    4846 0 == strcmp( "retroflat_vdp_flip", proc_name ) &&
    + +
    4848 (RETROFLAT_VDP_FLAG_PXLOCK & g_retroflat_state->vdp_flags)
    +
    4849 ) {
    +
    4850 retroflat_vdp_release( &(g_retroflat_state->buffer) );
    +
    4851 retroflat_vdp_release( g_retroflat_state->vdp_buffer );
    +
    4852 }
    +
    4853
    +
    4854# ifdef RETROFLAT_OS_WIN
    +
    4855 retroflat_draw_release( g_retroflat_state->vdp_buffer );
    +
    4856# endif /* RETROFLAT_OS_WIN */
    +
    4857
    +
    4858cleanup:
    +
    4859 return retval;
    +
    4860}
    +
    4861
    +
    4862# endif /* RETROFLAT_VDP */
    +
    4863
    +
    4864/* === */
    +
    4865
    +
    4866void retroflat_set_title( const char* format, ... ) {
    +
    4867 char title[RETROFLAT_TITLE_MAX + 1];
    +
    4868 va_list vargs;
    +
    4869
    +
    4870 /* Build the title. */
    +
    4871 va_start( vargs, format );
    +
    4872 memset( title, '\0', RETROFLAT_TITLE_MAX + 1 );
    +
    4873 maug_vsnprintf( title, RETROFLAT_TITLE_MAX, format, vargs );
    +
    4874
    +
    4875#if defined( RETROFLAT_API_ALLEGRO )
    +
    4876 set_window_title( title );
    +
    4877#elif defined( RETROFLAT_API_SDL1 )
    +
    4878 SDL_WM_SetCaption( title, NULL );
    +
    4879#elif defined( RETROFLAT_API_SDL2 )
    +
    4880 SDL_SetWindowTitle( g_retroflat_state->window, title );
    +
    4881#elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4882 SetWindowText( g_retroflat_state->window, title );
    +
    4883#elif defined( RETROFLAT_API_LIBNDS )
    +
    4884 /* Do nothing. */
    +
    4885#elif defined( RETROFLAT_API_GLUT )
    +
    4886 glutSetWindowTitle( title );
    +
    4887#else
    +
    4888# pragma message( "warning: set title implemented" )
    +
    4889# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL */
    +
    4890
    +
    4891 va_end( vargs );
    +
    4892}
    +
    4893
    +
    4894/* === */
    +
    4895
    +
    4896retroflat_ms_t retroflat_get_ms() {
    +
    4897# if defined( RETROFLAT_API_ALLEGRO )
    +
    4898
    +
    4899 /* == Allegro == */
    +
    4900
    +
    4901 return g_ms;
    +
    4902
    +
    4903# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    4904
    +
    4905 /* == SDL == */
    +
    4906
    +
    4907 return SDL_GetTicks();
    +
    4908
    +
    4909# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4910
    +
    4911 return timeGetTime();
    +
    4912
    +
    4913# elif defined( RETROFLAT_API_LIBNDS )
    +
    4914
    +
    4915 /* == libNDS == */
    +
    4916
    +
    4917 return ((TIMER1_DATA * (1 << 16)) + TIMER0_DATA) / 32;
    +
    4918
    +
    4919# elif defined( RETROFLAT_API_GLUT )
    +
    4920
    +
    4921 /* == GLUT == */
    +
    4922
    +
    4923 return glutGet( GLUT_ELAPSED_TIME );
    +
    4924
    +
    4925# elif defined( RETROFLAT_API_PC_BIOS )
    +
    4926
    +
    4927 return g_ms;
    +
    4928
    +
    4929# else
    +
    4930# pragma message( "warning: get_ms not implemented" )
    +
    4931# endif /* RETROFLAT_API_* */
    +
    4932}
    +
    4933
    +
    4934/* === */
    +
    4935
    +
    4936uint32_t retroflat_get_rand() {
    +
    4937 return rand();
    +
    4938}
    +
    4939
    +
    4940/* === */
    +
    4941
    +
    4942int retroflat_draw_lock( struct RETROFLAT_BITMAP* bmp ) {
    +
    4943 int retval = RETROFLAT_OK;
    +
    4944
    +
    4945# if defined( RETROFLAT_OPENGL )
    +
    4946
    +
    4947 if(
    +
    4948 NULL != bmp &&
    +
    4949 &(g_retroflat_state->buffer) != bmp &&
    +
    4950 (MAUG_MHANDLE)NULL != bmp->tex.bytes_h
    +
    4951 ) {
    +
    4952 bmp->flags |= RETROFLAT_FLAGS_LOCK;
    +
    4953 maug_mlock( bmp->tex.bytes_h, bmp->tex.bytes );
    +
    4954 }
    +
    4955
    +
    4956# elif defined( RETROFLAT_API_ALLEGRO )
    +
    4957
    +
    4958 /* == Allegro == */
    +
    4959
    +
    4960 if( NULL != bmp ) {
    +
    4961 /* Normal bitmaps don't need to be locked in allegro. */
    +
    4962 goto cleanup;
    +
    4963 }
    +
    4964
    +
    4965 /* Lock screen for drawing if bmp is NULL. */
    +
    4966
    +
    4967# ifdef RETROFLAT_MOUSE
    +
    4968 /* XXX: Broken in DOS. */
    +
    4969 show_mouse( NULL ); /* Disable mouse before drawing. */
    +
    4970# endif
    +
    4971 acquire_screen();
    +
    4972
    +
    4973cleanup:
    +
    4974
    +
    4975# elif defined( RETROFLAT_API_SDL1 )
    +
    4976
    +
    4977 /* == SDL1 == */
    +
    4978
    +
    4979 /* SDL locking semantics are the opposite of every other platform. See
    +
    4980 * retroflat_px_lock() for a proxy to SDL_LockSurface().
    +
    4981 */
    +
    4982
    +
    4983 if( NULL == bmp || &(g_retroflat_state->buffer) == bmp ) {
    +
    4984 /* Special case: Attempting to lock the screen. */
    +
    4985 bmp = &(g_retroflat_state->buffer);
    +
    4986
    +
    4987 if(
    +
    4988 RETROFLAT_FLAGS_SCREEN_LOCK !=
    +
    4989 (RETROFLAT_FLAGS_SCREEN_LOCK & bmp->flags)
    +
    4990 ) {
    +
    4991 /* Do a perfunctory "screen lock" since programs are supposed to
    +
    4992 * lock the screen before doing any drawing.
    +
    4993 */
    +
    4994 bmp->flags |= RETROFLAT_FLAGS_SCREEN_LOCK;
    +
    4995
    +
    4996 } else {
    +
    4997 /* We actually want to lock the buffer for pixel manipulation. */
    +
    4998 assert( 0 == (RETROFLAT_FLAGS_LOCK & bmp->flags) );
    +
    4999 bmp->flags |= RETROFLAT_FLAGS_LOCK;
    +
    5000 }
    +
    5001
    +
    5002 } else {
    +
    5003 /* Locking a bitmap for pixel drawing. */
    +
    5004 assert( 0 == (RETROFLAT_FLAGS_LOCK & bmp->flags) );
    +
    5005 bmp->flags |= RETROFLAT_FLAGS_LOCK;
    +
    5006 }
    +
    5007
    +
    5008# elif defined( RETROFLAT_API_SDL2 )
    +
    5009
    +
    5010 /* == SDL2 == */
    +
    5011
    +
    5012 if(
    +
    5013 NULL == bmp
    +
    5014# ifdef RETROFLAT_VDP
    +
    5015 && NULL == g_retroflat_state->vdp_buffer
    +
    5016# endif /* RETROFLAT_VDP */
    +
    5017 ) {
    +
    5018
    +
    5019 /* Target is the screen buffer. */
    +
    5020 SDL_SetRenderTarget(
    +
    5021 g_retroflat_state->buffer.renderer,
    +
    5022 g_retroflat_state->buffer.texture );
    +
    5023
    +
    5024 goto cleanup;
    +
    5025
    +
    5026# ifdef RETROFLAT_VDP
    +
    5027 } else if( NULL == bmp && NULL != g_retroflat_state->vdp_buffer ) {
    +
    5028 /* Lock the VDP buffer for drawing. */
    +
    5029 bmp = g_retroflat_state->vdp_buffer;
    +
    5030# endif /* RETROFLAT_VDP */
    +
    5031 }
    +
    5032
    +
    5033 assert( NULL == bmp->renderer );
    +
    5034 assert( NULL != bmp->surface );
    +
    5035 bmp->renderer = SDL_CreateSoftwareRenderer( bmp->surface );
    +
    5036
    +
    5037cleanup:
    +
    5038
    +
    5039# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5040
    +
    5041 /* == Win16/Win32 == */
    +
    5042
    +
    5043 if( NULL == bmp ) {
    +
    5044# ifdef RETROFLAT_VDP
    +
    5045 if( NULL != g_retroflat_state->vdp_buffer ) {
    +
    5046 bmp = g_retroflat_state->vdp_buffer;
    +
    5047 } else {
    +
    5048# endif
    +
    5049
    +
    5050 /* TODO: Reconcile with VDP! */
    +
    5051 /* The HDC should be created already by WndProc. */
    +
    5052 assert( (HDC)NULL != g_retroflat_state->buffer.hdc_b );
    +
    5053 goto cleanup;
    +
    5054
    +
    5055# ifdef RETROFLAT_VDP
    +
    5056 }
    +
    5057# endif /* RETROFLAT_VDP */
    +
    5058 }
    +
    5059
    +
    5060 /* Sanity check. */
    +
    5061 assert( (HBITMAP)NULL != bmp->b );
    +
    5062 assert( (HDC)NULL == bmp->hdc_b );
    +
    5063
    +
    5064 /* Create HDC for source bitmap compatible with the buffer. */
    +
    5065 bmp->hdc_b = CreateCompatibleDC( (HDC)NULL );
    +
    5066 maug_cleanup_if_null( HDC, bmp->hdc_b, RETROFLAT_ERROR_BITMAP );
    +
    5067
    +
    5068 if( (HBITMAP)NULL != bmp->mask ) {
    +
    5069 /* Create HDC for source mask compatible with the buffer. */
    +
    5070 bmp->hdc_mask = CreateCompatibleDC( (HDC)NULL );
    +
    5071 maug_cleanup_if_null( HDC, bmp->hdc_mask, RETROFLAT_ERROR_BITMAP );
    +
    5072 }
    +
    5073
    +
    5074 /* Select bitmaps into their HDCs. */
    +
    5075 bmp->old_hbm_b = SelectObject( bmp->hdc_b, bmp->b );
    +
    5076 if( (HBITMAP)NULL != bmp->mask ) {
    +
    5077 bmp->old_hbm_mask = SelectObject( bmp->hdc_mask, bmp->mask );
    +
    5078 }
    +
    5079
    +
    5080cleanup:
    +
    5081
    +
    5082# else
    +
    5083# pragma message( "warning: draw lock not implemented" )
    +
    5084# endif /* RETROFLAT_API_ALLEGRO */
    +
    5085
    +
    5086 return retval;
    +
    5087}
    +
    5088
    +
    5089/* === */
    +
    5090
    +
    5091MERROR_RETVAL retroflat_draw_release( struct RETROFLAT_BITMAP* bmp ) {
    +
    5092 MERROR_RETVAL retval = MERROR_OK;
    +
    5093
    +
    5094# ifdef RETROFLAT_OPENGL
    +
    5095 if( NULL == bmp || &(g_retroflat_state->buffer) == bmp ) {
    +
    5096 /* Flush GL buffer and swap screen buffers. */
    +
    5097 glFlush();
    +
    5098
    +
    5099# if defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    5100 SDL_GL_SwapBuffers();
    +
    5101# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5102 SwapBuffers( g_retroflat_state->hdc_win );
    +
    5103# elif defined( RETROFLAT_API_GLUT )
    +
    5104 glutSwapBuffers();
    +
    5105# endif
    +
    5106 } else if( retroflat_bitmap_locked( bmp ) ) {
    +
    5107 bmp->flags &= ~RETROFLAT_FLAGS_LOCK;
    +
    5108#ifndef RETROGLU_NO_TEXTURES
    +
    5109 assert( 0 < bmp->tex.id );
    +
    5110 assert( NULL != bmp->tex.bytes );
    +
    5111
    +
    5112 /* Update stored texture if it exists. */
    +
    5113 glBindTexture( GL_TEXTURE_2D, bmp->tex.id );
    +
    5114 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, bmp->tex.w, bmp->tex.h, 0,
    +
    5115 GL_RGBA, GL_UNSIGNED_BYTE, bmp->tex.bytes );
    +
    5116 glBindTexture( GL_TEXTURE_2D, 0 );
    +
    5117#endif /* !RETROGLU_NO_TEXTURES */
    +
    5118
    +
    5119 /* Unlock texture bitmap. */
    +
    5120 maug_munlock( bmp->tex.bytes_h, bmp->tex.bytes );
    +
    5121 }
    +
    5122
    +
    5123# elif defined( RETROFLAT_API_ALLEGRO )
    +
    5124
    +
    5125 /* == Allegro == */
    +
    5126
    +
    5127 if( NULL != bmp ) {
    +
    5128 /* Don't need to lock bitmaps in Allegro. */
    +
    5129 goto cleanup;
    +
    5130 }
    +
    5131
    +
    5132 /* Flip the buffer. */
    +
    5133 blit( g_retroflat_state->buffer.b, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H );
    +
    5134
    +
    5135 /* Release the screen. */
    +
    5136 release_screen();
    +
    5137# ifdef RETROFLAT_MOUSE
    +
    5138 /* XXX: Broken in DOS. */
    +
    5139 show_mouse( screen ); /* Enable mouse after drawing. */
    +
    5140# endif /* RETROFLAT_MOUSE */
    +
    5141 vsync();
    +
    5142
    +
    5143cleanup:
    +
    5144# elif defined( RETROFLAT_API_SDL1 )
    +
    5145
    +
    5146 /* == SDL1 == */
    +
    5147
    +
    5148 if( NULL == bmp || &(g_retroflat_state->buffer) == bmp ) {
    +
    5149 /* Special case: Attempting to release the (real, non-VDP) screen. */
    +
    5150 bmp = &(g_retroflat_state->buffer);
    +
    5151
    +
    5152 if(
    +
    5153 RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & bmp->flags)
    +
    5154 ) {
    +
    5155 /* The screen was locked for pixel manipulation. */
    +
    5156 bmp->flags &= ~RETROFLAT_FLAGS_LOCK;
    +
    5157 SDL_UnlockSurface( bmp->surface );
    +
    5158
    +
    5159 } else {
    +
    5160 assert(
    +
    5161 RETROFLAT_FLAGS_SCREEN_LOCK ==
    +
    5162 (RETROFLAT_FLAGS_SCREEN_LOCK & bmp->flags) );
    +
    5163 bmp->flags &= ~RETROFLAT_FLAGS_SCREEN_LOCK;
    +
    5164
    +
    5165# if defined( RETROFLAT_VDP )
    +
    5166 retroflat_vdp_call( "retroflat_vdp_flip" );
    +
    5167# endif /* RETROFLAT_VDP */
    +
    5168
    +
    5169 SDL_Flip( bmp->surface );
    +
    5170 }
    +
    5171
    +
    5172 } else {
    +
    5173 /* Releasing a bitmap. */
    +
    5174 assert( RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & bmp->flags) );
    +
    5175 bmp->flags &= ~RETROFLAT_FLAGS_LOCK;
    +
    5176 SDL_UnlockSurface( bmp->surface );
    +
    5177 }
    +
    5178
    +
    5179# elif defined( RETROFLAT_API_SDL2 )
    +
    5180
    +
    5181 /* == SDL2 == */
    +
    5182
    +
    5183 if(
    +
    5184 NULL == bmp
    +
    5185# ifdef RETROFLAT_VDP
    +
    5186 && NULL == g_retroflat_state->vdp_buffer
    +
    5187# endif /* RETROFLAT_VDP */
    +
    5188 ) {
    +
    5189 /* Flip the screen. */
    +
    5190 SDL_SetRenderTarget( g_retroflat_state->buffer.renderer, NULL );
    +
    5191 SDL_RenderCopyEx(
    +
    5192 g_retroflat_state->buffer.renderer,
    +
    5193 g_retroflat_state->buffer.texture, NULL, NULL, 0, NULL, 0 );
    +
    5194 SDL_RenderPresent( g_retroflat_state->buffer.renderer );
    +
    5195
    +
    5196 goto cleanup;
    +
    5197
    +
    5198# ifdef RETROFLAT_VDP
    +
    5199 } else if( NULL == bmp && NULL != g_retroflat_state->vdp_buffer ) {
    +
    5200 bmp = g_retroflat_state->vdp_buffer;
    +
    5201# endif /* RETROFLAT_VDP */
    +
    5202 }
    +
    5203
    +
    5204 /* It's a bitmap. */
    +
    5205
    +
    5206 /* Scrap the software renderer. */
    +
    5207 SDL_RenderPresent( bmp->renderer );
    +
    5208 SDL_DestroyRenderer( bmp->renderer );
    +
    5209 bmp->renderer = NULL;
    +
    5210
    +
    5211 /* Scrap the old texture and recreate it from the updated surface. */
    +
    5212 /* The renderer should be a software renderer pointing to the surface,
    +
    5213 * created in retroflat_lock() above.
    +
    5214 */
    +
    5215 assert( NULL != bmp->texture );
    +
    5216 SDL_DestroyTexture( bmp->texture );
    +
    5217 bmp->texture = SDL_CreateTextureFromSurface(
    +
    5218 g_retroflat_state->buffer.renderer, bmp->surface );
    +
    5219 maug_cleanup_if_null(
    +
    5220 SDL_Texture*, bmp->texture, RETROFLAT_ERROR_BITMAP );
    +
    5221
    +
    5222cleanup:
    +
    5223# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5224
    +
    5225 /* == Win16/Win32 == */
    +
    5226
    +
    5227 if( NULL == bmp ) {
    +
    5228 /* Trigger a screen refresh if this was a screen lock. */
    +
    5229 if( (HWND)NULL != g_retroflat_state->window ) {
    +
    5230 InvalidateRect( g_retroflat_state->window, 0, TRUE );
    +
    5231 }
    +
    5232
    +
    5233# ifdef RETROFLAT_VDP
    +
    5234 if( NULL != g_retroflat_state->vdp_buffer ) {
    +
    5235 bmp = g_retroflat_state->vdp_buffer;
    +
    5236 } else {
    +
    5237# endif
    +
    5238
    +
    5239 /* TODO: Reconcile with VDP! */
    +
    5240 goto cleanup;
    +
    5241
    +
    5242# ifdef RETROFLAT_VDP
    +
    5243 }
    +
    5244# endif
    +
    5245 }
    +
    5246
    +
    5247 /* Unlock the bitmap. */
    +
    5248 if( (HDC)NULL != bmp->hdc_b ) {
    +
    5249 SelectObject( bmp->hdc_b, bmp->old_hbm_b );
    +
    5250 DeleteDC( bmp->hdc_b );
    +
    5251 bmp->hdc_b = (HDC)NULL;
    +
    5252 bmp->old_hbm_b = (HBITMAP)NULL;
    +
    5253 }
    +
    5254
    +
    5255 /* Unlock the mask. */
    +
    5256 if( (HDC)NULL != bmp->hdc_mask ) {
    +
    5257 SelectObject( bmp->hdc_mask, bmp->old_hbm_mask );
    +
    5258 DeleteDC( bmp->hdc_mask );
    +
    5259 bmp->hdc_mask = (HDC)NULL;
    +
    5260 bmp->old_hbm_mask = (HBITMAP)NULL;
    +
    5261 }
    +
    5262
    +
    5263cleanup:
    +
    5264
    +
    5265# else
    +
    5266# pragma message( "warning: draw release not implemented" )
    +
    5267# endif /* RETROFLAT_API_ALLEGRO */
    +
    5268
    +
    5269 return retval;
    +
    5270}
    +
    5271
    +
    5272/* === */
    +
    5273
    +
    5274# if (defined( RETROFLAT_API_WIN16 ) || \
    +
    5275 defined (RETROFLAT_API_WIN32 )) && \
    +
    5276 !defined( RETROFLAT_OPENGL )
    +
    5277
    +
    5278static int retroflat_bitmap_win_transparency(
    +
    5279 struct RETROFLAT_BITMAP* bmp_out, int16_t w, int16_t h
    +
    5280) {
    +
    5281 int retval = RETROFLAT_OK;
    +
    5282 unsigned long txp_color = 0;
    +
    5283
    +
    5284 /* Setup bitmap transparency mask. */
    +
    5285 bmp_out->mask = CreateBitmap( w, h, 1, 1, NULL );
    +
    5286 maug_cleanup_if_null( HBITMAP, bmp_out->mask, RETROFLAT_ERROR_BITMAP );
    +
    5287
    +
    5288 retval = retroflat_draw_lock( bmp_out );
    +
    5289 maug_cleanup_if_not_ok();
    +
    5290
    +
    5291 /* Convert the color key into bitmap format. */
    +
    5292 txp_color |= (RETROFLAT_TXP_B & 0xff);
    +
    5293 txp_color <<= 8;
    +
    5294 txp_color |= (RETROFLAT_TXP_G & 0xff);
    +
    5295 txp_color <<= 8;
    +
    5296 txp_color |= (RETROFLAT_TXP_R & 0xff);
    +
    5297 SetBkColor( bmp_out->hdc_b, txp_color );
    +
    5298
    +
    5299 /* Create the mask from the color key. */
    +
    5300 BitBlt(
    +
    5301 bmp_out->hdc_mask, 0, 0, w, h, bmp_out->hdc_b, 0, 0, SRCCOPY );
    +
    5302 BitBlt(
    +
    5303 bmp_out->hdc_b, 0, 0, w, h, bmp_out->hdc_mask, 0, 0, SRCINVERT );
    +
    5304
    +
    5305cleanup:
    +
    5306
    +
    5307 if( RETROFLAT_OK == retval ) {
    +
    5308 retroflat_draw_release( bmp_out );
    +
    5309 }
    +
    5310
    +
    5311 return retval;
    +
    5312}
    +
    5313
    +
    5314# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5315
    +
    5316static MERROR_RETVAL retroflat_bitmap_dos_transparency(
    +
    5317 struct RETROFLAT_BITMAP* bmp_out
    +
    5318) {
    +
    5319 MERROR_RETVAL retval = MERROR_OK;
    +
    5320 size_t i = 0;
    +
    5321
    +
    5322 switch( g_retroflat_state->screen_mode ) {
    +
    5323 case RETROFLAT_SCREEN_MODE_VGA:
    +
    5324
    +
    5325 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5326 "creating transparency mask for bitmap..." );
    +
    5327
    +
    5328 /* Create a transparency mask based on palette 0. */
    +
    5329 bmp_out->mask = _fcalloc( bmp_out->w, bmp_out->h );
    +
    5330 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->mask );
    +
    5331 /* XXX: Wrong sz field! */
    +
    5332 for( i = 0 ; bmp_out->sz > i ; i++ ) {
    +
    5333 if( RETROFLAT_TXP_PAL_IDX == bmp_out->px[i] ) {
    +
    5334 bmp_out->mask[i] = 0xff;
    +
    5335 } else {
    +
    5336 bmp_out->mask[i] = 0x00;
    +
    5337 }
    +
    5338 }
    +
    5339 break;
    +
    5340 }
    +
    5341
    +
    5342cleanup:
    +
    5343 return retval;
    +
    5344}
    +
    5345
    +
    5346# endif /* RETROFLAT_API_WIN16 ||
    +
    5347 RETROFLAT_API_WIN32 ||
    +
    5348 RETROFLAT_API_PC_BIOS */
    +
    5349
    + +
    5351 const char* filename, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags
    +
    5352) {
    +
    5353 char filename_path[RETROFLAT_PATH_MAX + 1];
    +
    5354 int retval = MERROR_OK;
    +
    5355# if defined( RETROFLAT_OPENGL )
    +
    5356 mfile_t bmp_file;
    +
    5357 struct MFMT_STRUCT_BMPFILE header_bmp;
    +
    5358 MAUG_MHANDLE bmp_palette_h = (MAUG_MHANDLE)NULL;
    +
    5359 uint32_t bmp_color = 0;
    +
    5360 uint32_t* bmp_palette = NULL;
    +
    5361 MAUG_MHANDLE bmp_px_h = (MAUG_MHANDLE)NULL;
    +
    5362 uint8_t* bmp_px = NULL;
    +
    5363 off_t bmp_px_sz = 0;
    +
    5364 uint8_t bmp_r = 0,
    +
    5365 bmp_g = 0,
    +
    5366 bmp_b = 0,
    +
    5367 bmp_color_idx = 0,
    +
    5368 bmp_flags = 0;
    +
    5369 size_t i = 0;
    +
    5370# elif defined( RETROFLAT_API_SDL1 )
    +
    5371 SDL_Surface* tmp_surface = NULL;
    +
    5372# elif defined( RETROFLAT_API_WIN16 ) || defined (RETROFLAT_API_WIN32 )
    +
    5373# if defined( RETROFLAT_API_WIN16 )
    +
    5374 char* buf = NULL;
    +
    5375 mfile_t bmp_file;
    +
    5376 long int i, x, y, w, h, colors, offset, sz, read;
    +
    5377# elif defined( RETROFLAT_API_WIN32 )
    +
    5378 BITMAP bm;
    +
    5379# endif /* RETROFLAT_API_WIN32 */
    +
    5380# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5381 mfile_t bmp_file;
    +
    5382 struct MFMT_STRUCT_BMPFILE header_bmp;
    +
    5383 MAUG_MHANDLE bmp_palette_h = (MAUG_MHANDLE)NULL;
    +
    5384 uint32_t bmp_color = 0;
    +
    5385 uint8_t bmp_flags = 0;
    +
    5386 off_t bmp_px_sz = 0;
    +
    5387 size_t i = 0;
    +
    5388
    +
    5389# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5390
    +
    5391 assert( NULL != bmp_out );
    +
    5392
    +
    5393 maug_mzero( bmp_out, sizeof( struct RETROFLAT_BITMAP ) );
    +
    5394
    +
    5395 /* Build the path to the bitmap. */
    +
    5396 memset( filename_path, '\0', RETROFLAT_PATH_MAX + 1 );
    +
    5397 if(
    + + +
    5400 ) {
    +
    5401 maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s", filename );
    +
    5402 } else {
    +
    5403 maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s%c%s.%s",
    +
    5404 g_retroflat_state->assets_path, RETROFLAT_PATH_SEP,
    +
    5405 filename, RETROFLAT_BITMAP_EXT );
    +
    5406 }
    +
    5407
    +
    5408 debug_printf( 1, "retroflat: loading bitmap: %s", filename_path );
    +
    5409
    +
    5410# ifdef RETROFLAT_OPENGL
    +
    5411
    +
    5412 retval = mfile_open_read( filename_path, &bmp_file );
    +
    5413 maug_cleanup_if_not_ok();
    +
    5414
    +
    5415 /* TODO: mfmt file detection system. */
    +
    5416 header_bmp.magic[0] = 'B';
    +
    5417 header_bmp.magic[1] = 'M';
    +
    5418 header_bmp.info.sz = 40;
    +
    5419
    +
    5420 retval = mfmt_read_bmp_header(
    +
    5421 (struct MFMT_STRUCT*)&header_bmp,
    +
    5422 &bmp_file, 0, mfile_get_sz( &bmp_file ), &bmp_flags );
    +
    5423 maug_cleanup_if_not_ok();
    +
    5424
    +
    5425 assert( 0 < mfile_get_sz( &bmp_file ) );
    +
    5426
    +
    5427 /* Setup bitmap options from header. */
    +
    5428 bmp_out->tex.w = header_bmp.info.width;
    +
    5429 bmp_out->tex.h = header_bmp.info.height;
    +
    5430 bmp_out->tex.sz = bmp_out->tex.w * bmp_out->tex.h * 4;
    +
    5431 bmp_out->tex.bpp = 24;
    +
    5432
    +
    5433 /* Allocate a space for the bitmap palette. */
    +
    5434 bmp_palette_h = maug_malloc( 4, header_bmp.info.palette_ncolors );
    +
    5435 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_palette_h );
    +
    5436
    +
    5437 maug_mlock( bmp_palette_h, bmp_palette );
    +
    5438 maug_cleanup_if_null_alloc( uint32_t*, bmp_palette );
    +
    5439
    +
    5440 retval = mfmt_read_bmp_palette(
    +
    5441 (struct MFMT_STRUCT*)&header_bmp,
    +
    5442 bmp_palette, 4 * header_bmp.info.palette_ncolors,
    +
    5443 &bmp_file, 54 /* TODO */, mfile_get_sz( &bmp_file ) - 54, bmp_flags );
    +
    5444 maug_cleanup_if_not_ok();
    +
    5445
    +
    5446 /* Allocate a space for the bitmap pixels. */
    +
    5447 bmp_px_sz = header_bmp.info.width * header_bmp.info.height;
    +
    5448 bmp_px_h = maug_malloc( 1, bmp_px_sz );
    +
    5449 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_px_h );
    +
    5450
    +
    5451 maug_mlock( bmp_px_h, bmp_px );
    +
    5452 maug_cleanup_if_null_alloc( uint8_t*, bmp_px );
    +
    5453
    +
    5454 retval = mfmt_read_bmp_px(
    +
    5455 (struct MFMT_STRUCT*)&header_bmp,
    +
    5456 bmp_px, bmp_px_sz,
    +
    5457 &bmp_file, header_bmp.px_offset,
    +
    5458 mfile_get_sz( &bmp_file ) - header_bmp.px_offset, bmp_flags );
    +
    5459 maug_cleanup_if_not_ok();
    +
    5460
    +
    5461 /* Allocate buffer for unpacking. */
    +
    5462 debug_printf( 0, "creating bitmap: " SIZE_T_FMT " x " SIZE_T_FMT,
    +
    5463 bmp_out->tex.w, bmp_out->tex.h );
    +
    5464 bmp_out->tex.bytes_h = maug_malloc( bmp_out->tex.w * bmp_out->tex.h, 4 );
    +
    5465 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_out->tex.bytes_h );
    +
    5466
    +
    5467 maug_mlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5468 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->tex.bytes );
    +
    5469
    +
    5470 /* Unpack palletized bitmap into BGRA with color key. */
    +
    5471 for( i = 0 ; bmp_px_sz > i ; i++ ) {
    +
    5472 if( bmp_px_sz - i - 1 > bmp_px_sz ) {
    +
    5473 error_printf(
    +
    5474 "pixel overflow! (" SIZE_T_FMT " of " SIZE_T_FMT " bytes!)",
    +
    5475 bmp_px_sz - i - 1, bmp_px_sz );
    +
    5476 retval = MERROR_OVERFLOW;
    +
    5477 goto cleanup;
    +
    5478 }
    +
    5479
    +
    5480 /* Grab the color from the palette by index. */
    +
    5481 bmp_color_idx = bmp_px[bmp_px_sz - i - 1]; /* Reverse image. */
    +
    5482 if( bmp_color_idx >= header_bmp.info.palette_ncolors ) {
    +
    5483 error_printf(
    +
    5484 "invalid color at px " SIZE_T_FMT ": %02x",
    +
    5485 bmp_px_sz - i - 1, bmp_color_idx );
    +
    5486 continue;
    +
    5487 }
    +
    5488 bmp_color = bmp_palette[bmp_color_idx];
    +
    5489 bmp_r = (bmp_color >> 16) & 0xff;
    +
    5490 bmp_g = (bmp_color >> 8) & 0xff;
    +
    5491 bmp_b = bmp_color & 0xff;
    +
    5492
    +
    5493 bmp_out->tex.bytes[i * 4] = bmp_r;
    +
    5494 bmp_out->tex.bytes[(i * 4) + 1] = bmp_g;
    +
    5495 bmp_out->tex.bytes[(i * 4) + 2] = bmp_b;
    +
    5496 if(
    + +
    5498 RETROFLAT_TXP_R == bmp_r &&
    +
    5499 RETROFLAT_TXP_G == bmp_g &&
    +
    5500 RETROFLAT_TXP_B == bmp_b
    +
    5501 ) {
    +
    5502 /* Transparent pixel found. */
    +
    5503 bmp_out->tex.bytes[(i * 4) + 3] = 0x00;
    +
    5504 } else {
    +
    5505 bmp_out->tex.bytes[(i * 4) + 3] = 0xff;
    +
    5506 }
    +
    5507 }
    +
    5508
    +
    5509#ifndef RETROGLU_NO_TEXTURES
    +
    5510 glGenTextures( 1, (GLuint*)&(bmp_out->tex.id) );
    +
    5511 glBindTexture( GL_TEXTURE_2D, bmp_out->tex.id );
    +
    5512 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, bmp_out->tex.w, bmp_out->tex.h, 0,
    +
    5513 GL_RGBA, GL_UNSIGNED_BYTE, bmp_out->tex.bytes );
    +
    5514 glBindTexture( GL_TEXTURE_2D, 0 );
    +
    5515#endif /* !RETROGLU_NO_TEXTURES */
    +
    5516
    +
    5517cleanup:
    +
    5518
    +
    5519 if( NULL != bmp_out->tex.bytes ) {
    +
    5520 maug_munlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5521 }
    +
    5522
    +
    5523 if( NULL != bmp_px ) {
    +
    5524 maug_munlock( bmp_px_h, bmp_px );
    +
    5525 }
    +
    5526
    +
    5527 if( NULL != bmp_px_h ) {
    +
    5528 maug_mfree( bmp_px_h );
    +
    5529 }
    +
    5530
    +
    5531 if( NULL != bmp_palette ) {
    +
    5532 maug_munlock( bmp_palette_h, bmp_palette );
    +
    5533 }
    +
    5534
    +
    5535 if( NULL != bmp_palette_h ) {
    +
    5536 maug_mfree( bmp_palette_h );
    +
    5537 }
    +
    5538
    +
    5539 mfile_close( &bmp_file );
    +
    5540
    +
    5541# elif defined( RETROFLAT_API_ALLEGRO )
    +
    5542
    +
    5543 /* == Allegro == */
    +
    5544
    +
    5545 bmp_out->b = load_bitmap( filename_path, NULL );
    +
    5546 if( NULL == bmp_out->b ) {
    +
    5547 allegro_message( "unable to load %s", filename_path );
    +
    5548 retval = RETROFLAT_ERROR_BITMAP;
    +
    5549 }
    +
    5550
    +
    5551# elif defined( RETROFLAT_API_SDL1 )
    +
    5552
    +
    5553 /* == SDL1 == */
    +
    5554
    +
    5555 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5556 "loading bitmap: %s", filename_path );
    +
    5557
    +
    5558 tmp_surface = SDL_LoadBMP( filename_path ); /* Free stream on close. */
    +
    5559 if( NULL == tmp_surface ) {
    + +
    5561 "Error", "SDL unable to load bitmap: %s", SDL_GetError() );
    +
    5562 retval = 0;
    +
    5563 goto cleanup;
    +
    5564 }
    +
    5565
    +
    5566 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5567 "loaded bitmap: %d x %d", tmp_surface->w, tmp_surface->h );
    +
    5568
    +
    5569 bmp_out->surface = SDL_DisplayFormat( tmp_surface );
    +
    5570 if( NULL == bmp_out->surface ) {
    + +
    5572 "Error", "SDL unable to load bitmap: %s", SDL_GetError() );
    +
    5573 retval = RETROFLAT_ERROR_BITMAP;
    +
    5574 goto cleanup;
    +
    5575 }
    +
    5576
    +
    5577 debug_printf( RETROFLAT_BITMAP_TRACE_LVL, "converted bitmap: %d x %d",
    +
    5578 bmp_out->surface->w, bmp_out->surface->h );
    +
    5579
    +
    5580 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5581 SDL_MapRGB( bmp_out->surface->format,
    + +
    5583
    +
    5584cleanup:
    +
    5585
    +
    5586 if( NULL != tmp_surface ) {
    +
    5587 SDL_FreeSurface( tmp_surface );
    +
    5588 }
    +
    5589
    +
    5590# elif defined( RETROFLAT_API_SDL2 )
    +
    5591
    +
    5592 /* == SDL2 == */
    +
    5593
    +
    5594 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5595 "loading bitmap: %s", filename_path );
    +
    5596
    +
    5597 bmp_out->renderer = NULL;
    +
    5598
    +
    5599 bmp_out->surface = SDL_LoadBMP( filename_path );
    +
    5600 if( NULL == bmp_out->surface ) {
    + +
    5602 "Error", "SDL unable to load bitmap: %s", SDL_GetError() );
    +
    5603 retval = RETROFLAT_ERROR_BITMAP;
    +
    5604 goto cleanup;
    +
    5605 }
    +
    5606
    + +
    5608 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5609 SDL_MapRGB( bmp_out->surface->format,
    + +
    5611 }
    +
    5612
    +
    5613 bmp_out->texture = SDL_CreateTextureFromSurface(
    +
    5614 g_retroflat_state->buffer.renderer, bmp_out->surface );
    +
    5615 if( NULL == bmp_out->texture ) {
    + +
    5617 "Error", "SDL unable to create texture: %s", SDL_GetError() );
    +
    5618 retval = RETROFLAT_ERROR_BITMAP;
    +
    5619 if( NULL != bmp_out->surface ) {
    +
    5620 SDL_FreeSurface( bmp_out->surface );
    +
    5621 bmp_out->surface = NULL;
    +
    5622 }
    +
    5623 goto cleanup;
    +
    5624 }
    +
    5625
    +
    5626 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5627 "successfully loaded bitmap: %s", filename_path );
    +
    5628
    +
    5629cleanup:
    +
    5630
    +
    5631# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5632
    +
    5633# if defined( RETROFLAT_API_WIN16 )
    +
    5634
    +
    5635 /* Win16 has a bunch of extra involved steps for getting a bitmap from
    +
    5636 * disk. These cause a crash in Win32.
    +
    5637 */
    +
    5638
    +
    5639 /* == Win16 == */
    +
    5640
    +
    5641 /* Load the bitmap file from disk. */
    +
    5642 retval = mfile_open_read( filename_path, &bmp_file );
    +
    5643 maug_cleanup_if_not_ok();
    +
    5644
    +
    5645 buf = calloc( mfile_get_sz( &bmp_file ), 1 );
    +
    5646 maug_cleanup_if_null_alloc( char*, buf );
    +
    5647
    +
    5648 /*
    +
    5649 read = fread( buf, 1, sz, bmp_file );
    +
    5650 assert( read == sz );
    +
    5651 */
    +
    5652 retval = mfile_read_block( &bmp_file, buf, mfile_get_sz( &bmp_file ) );
    +
    5653 maug_cleanup_if_not_ok();
    +
    5654
    +
    5655 /* Read bitmap properties from header offsets. */
    +
    5656 mfile_u32read_lsbf_at( &bmp_file, &offset, 10 );
    +
    5657 mfile_u32read_lsbf_at( &bmp_file, &colors, 46 );
    +
    5658
    +
    5659 /* Avoid a color overflow. */
    +
    5660 if(
    +
    5661 sizeof( BITMAPFILEHEADER ) +
    +
    5662 sizeof( BITMAPINFOHEADER ) +
    +
    5663 (colors * sizeof( RGBQUAD )) > sz
    +
    5664 ) {
    + +
    5666 "Error",
    +
    5667 "Attempted to load bitmap with too many colors!" );
    +
    5668 retval = MERROR_FILE;
    +
    5669 goto cleanup;
    +
    5670 }
    +
    5671
    +
    5672 memcpy( &(bmp_out->bmi),
    +
    5673 &(buf[sizeof( BITMAPFILEHEADER )]),
    +
    5674 /* SetDIBits needs the color palette! */
    +
    5675 /* TODO: Sync with state palette? */
    +
    5676 sizeof( BITMAPINFOHEADER ) + (colors * sizeof( RGBQUAD )) );
    +
    5677
    +
    5678 /* This never gets the height right? */
    +
    5679 debug_printf( 1, "bitmap w: %08x, h: %08x, colors: %d",
    +
    5680 bmp_out->bmi.header.biWidth, bmp_out->bmi.header.biHeight, colors );
    +
    5681
    +
    5682 assert( 0 < bmp_out->bmi.header.biWidth );
    +
    5683 assert( 0 < bmp_out->bmi.header.biHeight );
    +
    5684 assert( 0 == bmp_out->bmi.header.biWidth % 8 );
    +
    5685 assert( 0 == bmp_out->bmi.header.biHeight % 8 );
    +
    5686
    +
    5687 bmp_out->b = CreateCompatibleBitmap( g_retroflat_state->hdc_win,
    +
    5688 bmp_out->bmi.header.biWidth, bmp_out->bmi.header.biHeight );
    +
    5689 maug_cleanup_if_null( HBITMAP, bmp_out->b, RETROFLAT_ERROR_BITMAP );
    +
    5690
    +
    5691 /* Turn the bits into a bitmap. */
    +
    5692 SetDIBits( g_retroflat_state->hdc_win, bmp_out->b, 0,
    +
    5693 bmp_out->bmi.header.biHeight, &(buf[offset]),
    +
    5694 (BITMAPINFO*)&(bmp_out->bmi),
    +
    5695 DIB_RGB_COLORS );
    +
    5696
    + +
    5698 retval = retroflat_bitmap_win_transparency( bmp_out,
    +
    5699 bmp_out->bmi.header.biWidth, bmp_out->bmi.header.biHeight );
    +
    5700 }
    +
    5701
    +
    5702# else
    +
    5703
    +
    5704 /* Win32 greatly simplifies the loading portion. */
    +
    5705
    +
    5706 /* == Win32 == */
    +
    5707
    +
    5708# ifdef RETROFLAT_API_WINCE
    +
    5709 bmp_out->b = SHLoadDIBitmap( filename_path );
    +
    5710# else
    +
    5711 bmp_out->b = LoadImage(
    +
    5712 NULL, filename_path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    +
    5713# endif /* RETROFLAT_API_WINCE */
    +
    5714 maug_cleanup_if_null_msg(
    +
    5715 HBITMAP, bmp_out->b, MERROR_FILE, "failed to open FILE!" )
    +
    5716
    +
    5717 GetObject( bmp_out->b, sizeof( BITMAP ), &bm );
    +
    5718
    +
    5719 bmp_out->bmi.header.biSize = sizeof( BITMAPINFOHEADER );
    +
    5720 bmp_out->bmi.header.biCompression = BI_RGB;
    +
    5721 bmp_out->bmi.header.biWidth = bm.bmWidth;
    +
    5722 bmp_out->bmi.header.biHeight = bm.bmHeight;
    +
    5723 bmp_out->bmi.header.biPlanes = bm.bmPlanes;
    +
    5724 bmp_out->bmi.header.biBitCount = bm.bmBitsPixel;
    +
    5725 bmp_out->bmi.header.biSizeImage =
    +
    5726 bmp_out->bmi.header.biWidth *
    +
    5727 bmp_out->bmi.header.biHeight *
    +
    5728 (bm.bmBitsPixel / sizeof( uint8_t ));
    +
    5729
    + +
    5731 retval = retroflat_bitmap_win_transparency(
    +
    5732 bmp_out, bm.bmWidth, bm.bmHeight );
    +
    5733 }
    +
    5734
    +
    5735# endif /* RETROFLAT_API_WIN16 */
    +
    5736
    +
    5737 /* The transparency portion is the same for Win32 and Win16. */
    +
    5738
    +
    5739cleanup:
    +
    5740
    +
    5741# ifdef RETROFLAT_API_WIN16
    +
    5742 if( NULL != buf ) {
    +
    5743 free( buf );
    +
    5744 }
    +
    5745
    +
    5746 mfile_close( &bmp_file );
    +
    5747
    +
    5748# endif /* RETROFLAT_API_WIN16 */
    +
    5749
    +
    5750# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5751
    +
    5752 /* TODO: Rework for CGA bitmaps. */
    +
    5753
    +
    5754 assert( NULL == bmp_out->px );
    +
    5755
    +
    5756 retval = mfile_open_read( filename_path, &bmp_file );
    +
    5757 maug_cleanup_if_not_ok();
    +
    5758
    +
    5759 /* TODO: mfmt file detection system. */
    +
    5760 header_bmp.magic[0] = 'B';
    +
    5761 header_bmp.magic[1] = 'M';
    +
    5762 header_bmp.info.sz = 40;
    +
    5763
    +
    5764 retval = mfmt_read_bmp_header(
    +
    5765 (struct MFMT_STRUCT*)&header_bmp,
    +
    5766 &bmp_file, 0, mfile_get_sz( &bmp_file ), &bmp_flags );
    +
    5767 maug_cleanup_if_not_ok();
    +
    5768
    +
    5769 /* Setup bitmap options from header. */
    +
    5770 bmp_out->w = header_bmp.info.width;
    +
    5771 bmp_out->h = header_bmp.info.height;
    +
    5772
    +
    5773#if 0
    +
    5774 retval = mfmt_read_bmp_palette(
    +
    5775 (struct MFMT_STRUCT*)&header_bmp,
    +
    5776 bmp_palette, 4 * header_bmp.info.palette_ncolors,
    +
    5777 &bmp_file, 54 /* TODO */, mfile_get_sz( &bmp_file ) - 54, bmp_flags );
    +
    5778 maug_cleanup_if_not_ok();
    +
    5779#endif
    +
    5780
    +
    5781 bmp_out->flags = flags;
    +
    5782
    +
    5783 /* Allocate a space for the bitmap pixels. */
    +
    5784 bmp_out->sz = header_bmp.info.width * header_bmp.info.height;
    +
    5785 /* We're on PC BIOS... we don't need to lock pointers in this
    +
    5786 * platform-specific code!
    +
    5787 */
    +
    5788 bmp_out->px = _fcalloc( header_bmp.info.height, header_bmp.info.width );
    +
    5789 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->px );
    +
    5790
    +
    5791 retval = mfmt_read_bmp_px(
    +
    5792 (struct MFMT_STRUCT*)&header_bmp,
    +
    5793 bmp_out->px, bmp_out->sz,
    +
    5794 &bmp_file, header_bmp.px_offset,
    +
    5795 mfile_get_sz( &bmp_file ) - header_bmp.px_offset, bmp_flags );
    +
    5796 maug_cleanup_if_not_ok();
    +
    5797
    + +
    5799 retval = retroflat_bitmap_dos_transparency( bmp_out );
    +
    5800 }
    +
    5801
    +
    5802cleanup:
    +
    5803
    +
    5804# else
    +
    5805# pragma message( "warning: load bitmap not implemented" )
    +
    5806# endif /* RETROFLAT_API_ALLEGRO */
    +
    5807
    +
    5808 return retval;
    +
    5809}
    +
    5810
    +
    5811/* === */
    +
    5812
    +
    5813MERROR_RETVAL retroflat_create_bitmap(
    +
    5814 size_t w, size_t h, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags
    +
    5815) {
    +
    5816 MERROR_RETVAL retval = MERROR_OK;
    +
    5817# if defined( RETROFLAT_OPENGL )
    +
    5818# ifndef RETROGLU_NO_TEXTURES
    +
    5819 GLenum error = GL_NO_ERROR;
    +
    5820# endif /* !RETROGLU_NO_TEXTURES */
    +
    5821# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5822 int i = 0;
    +
    5823 PALETTEENTRY palette[RETROFLAT_BMP_COLORS_SZ_MAX];
    +
    5824# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5825
    +
    5826 maug_mzero( bmp_out, sizeof( struct RETROFLAT_BITMAP ) );
    +
    5827
    +
    5828 bmp_out->sz = sizeof( struct RETROFLAT_BITMAP );
    +
    5829
    +
    5830# if defined( RETROFLAT_OPENGL )
    +
    5831
    +
    5832 if( w > 256 ) {
    +
    5833 error_printf( "warning! attempting to create texture with w > 256 ("
    +
    5834 SIZE_T_FMT "). This may not work on Win32!", w );
    +
    5835 }
    +
    5836
    +
    5837 if( h > 256 ) {
    +
    5838 error_printf( "warning! attempting to create texture with h > 256 ("
    +
    5839 SIZE_T_FMT "). This may not work on Win32!", h );
    +
    5840 }
    +
    5841
    +
    5842 bmp_out->tex.w = w;
    +
    5843 bmp_out->tex.h = h;
    +
    5844 /* TODO: Overflow checking. */
    +
    5845 debug_printf( 0, "creating bitmap: " SIZE_T_FMT " x " SIZE_T_FMT,
    +
    5846 bmp_out->tex.w, bmp_out->tex.h );
    +
    5847 bmp_out->tex.bytes_h =
    +
    5848 maug_malloc( bmp_out->tex.w * bmp_out->tex.h, 4 );
    +
    5849 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_out->tex.bytes_h );
    +
    5850
    +
    5851 maug_mlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5852 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->tex.bytes );
    +
    5853
    +
    5854 /* TODO: Overflow checking. */
    +
    5855 maug_mzero(
    +
    5856 bmp_out->tex.bytes,
    +
    5857 bmp_out->tex.w * bmp_out->tex.h * sizeof( uint32_t ) );
    +
    5858
    +
    5859# ifndef RETROGLU_NO_TEXTURES
    +
    5860 glGenTextures( 1, (GLuint*)&(bmp_out->tex.id) );
    +
    5861 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5862 "assigned bitmap texture: " UPRINTF_U32_FMT, bmp_out->tex.id );
    +
    5863 error = glGetError();
    +
    5864 if( GL_NO_ERROR != error ) {
    +
    5865 error_printf( "error generating texture: %u", error );
    +
    5866 }
    +
    5867# endif /* !RETROGLU_NO_TEXTURES */
    +
    5868
    +
    5869cleanup:
    +
    5870 if( NULL != bmp_out->tex.bytes ) {
    +
    5871 maug_munlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5872 }
    +
    5873# elif defined( RETROFLAT_API_ALLEGRO )
    +
    5874
    +
    5875 /* == Allegro == */
    +
    5876
    +
    5877 bmp_out->b = create_bitmap( w, h );
    +
    5878 maug_cleanup_if_null( BITMAP*, bmp_out->b, RETROFLAT_ERROR_BITMAP );
    +
    5879 clear_bitmap( bmp_out->b );
    +
    5880
    +
    5881cleanup:
    +
    5882# elif defined( RETROFLAT_API_SDL1 )
    +
    5883
    +
    5884 /* == SDL1 == */
    +
    5885
    +
    5886 bmp_out->surface = SDL_CreateRGBSurface( 0, w, h,
    +
    5887 32, 0, 0, 0, 0 );
    +
    5888 maug_cleanup_if_null(
    +
    5889 SDL_Surface*, bmp_out->surface, RETROFLAT_ERROR_BITMAP );
    + +
    5891 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5892 SDL_MapRGB( bmp_out->surface->format,
    + +
    5894 }
    +
    5895
    +
    5896cleanup:
    +
    5897# elif defined( RETROFLAT_API_SDL2 )
    +
    5898
    +
    5899 /* == SDL2 == */
    +
    5900
    +
    5901 /* Create surface. */
    +
    5902 bmp_out->surface = SDL_CreateRGBSurface( 0, w, h,
    +
    5903 /* TODO: Are these masks right? */
    +
    5904 32, 0, 0, 0, 0 );
    +
    5905 maug_cleanup_if_null(
    +
    5906 SDL_Surface*, bmp_out->surface, RETROFLAT_ERROR_BITMAP );
    + +
    5908 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5909 SDL_MapRGB( bmp_out->surface->format,
    + +
    5911 }
    +
    5912
    +
    5913 /* Convert new surface to texture. */
    +
    5914 bmp_out->texture = SDL_CreateTextureFromSurface(
    +
    5915 g_retroflat_state->buffer.renderer, bmp_out->surface );
    +
    5916 maug_cleanup_if_null(
    +
    5917 SDL_Texture*, bmp_out->texture, RETROFLAT_ERROR_BITMAP );
    +
    5918
    +
    5919cleanup:
    +
    5920# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5921
    +
    5922 /* == Win16 / Win32 == */
    +
    5923
    +
    5924 /* TODO: Handle opaque flag. */
    +
    5925 bmp_out->mask = (HBITMAP)NULL;
    +
    5926
    +
    5927# ifdef RETROFLAT_WING
    +
    5928 /* Put this first because WinGRecommendDIBFormat sets some header props. */
    +
    5929 if(
    + + +
    5932 (WinGCreateDC_t)NULL != g_w.WinGCreateDC &&
    +
    5933 (WinGRecommendDIBFormat_t)NULL != g_w.WinGRecommendDIBFormat
    +
    5934 ) {
    +
    5935 bmp_out->hdc_b = g_w.WinGCreateDC();
    +
    5936
    +
    5937 if(
    +
    5938 !g_w.WinGRecommendDIBFormat( (BITMAPINFO far*)&(bmp_out->bmi) )
    +
    5939 ) {
    + +
    5941 "Error", "Could not determine recommended format!" );
    +
    5942 retval = RETROFLAT_ERROR_GRAPHICS;
    +
    5943 goto cleanup;
    +
    5944 }
    +
    5945 }
    +
    5946# endif /* RETROFLAT_WING */
    +
    5947
    +
    5948 debug_printf( 0, "creating bitmap..." );
    +
    5949
    +
    5950 bmp_out->bmi.header.biSize = sizeof( BITMAPINFOHEADER );
    +
    5951 bmp_out->bmi.header.biPlanes = 1;
    +
    5952 bmp_out->bmi.header.biCompression = BI_RGB;
    +
    5953 bmp_out->bmi.header.biWidth = w;
    +
    5954# ifdef RETROFLAT_WING
    +
    5955 bmp_out->bmi.header.biHeight *= h;
    +
    5956# else
    +
    5957 bmp_out->bmi.header.biHeight = h;
    +
    5958# endif /* RETROFLAT_WING */
    +
    5959 bmp_out->bmi.header.biBitCount = 32;
    +
    5960 bmp_out->bmi.header.biSizeImage = w * h * 4;
    +
    5961
    +
    5962 GetSystemPaletteEntries(
    +
    5963 g_retroflat_state->hdc_win, 0, RETROFLAT_BMP_COLORS_SZ_MAX, palette );
    +
    5964 for( i = 0 ; RETROFLAT_BMP_COLORS_SZ_MAX > i ; i++ ) {
    +
    5965 bmp_out->bmi.colors[i].rgbRed = palette[i].peRed;
    +
    5966 bmp_out->bmi.colors[i].rgbGreen = palette[i].peGreen;
    +
    5967 bmp_out->bmi.colors[i].rgbBlue = palette[i].peBlue;
    +
    5968 bmp_out->bmi.colors[i].rgbReserved = 0;
    +
    5969 }
    +
    5970
    +
    5971# ifdef RETROFLAT_WING
    +
    5972 /* Now try to create the WinG bitmap using the header we've built. */
    +
    5973 if(
    + + +
    5976 (WinGCreateBitmap_t)NULL != g_w.WinGCreateBitmap
    +
    5977 ) {
    +
    5978 /* Setup an optimal WinG hardware screen buffer bitmap. */
    +
    5979 debug_printf( 1, "creating WinG-backed bitmap..." );
    +
    5980
    + +
    5982 bmp_out->b = g_w.WinGCreateBitmap(
    +
    5983 bmp_out->hdc_b,
    +
    5984 (BITMAPINFO far*)(&bmp_out->bmi),
    +
    5985 (void far*)&(bmp_out->bits) );
    +
    5986
    +
    5987 debug_printf( 1, "WinG bitmap bits: %p", bmp_out->bits );
    +
    5988
    +
    5989 } else {
    +
    5990# endif /* RETROFLAT_WING */
    +
    5991
    +
    5992 bmp_out->b = CreateCompatibleBitmap( g_retroflat_state->hdc_win, w, h );
    +
    5993 maug_cleanup_if_null( HBITMAP, bmp_out->b, RETROFLAT_ERROR_BITMAP );
    +
    5994
    +
    5995 if(
    + +
    5997 ) {
    +
    5998 debug_printf( 1, "creating screen device context..." );
    +
    5999 bmp_out->hdc_b = CreateCompatibleDC( g_retroflat_state->hdc_win );
    +
    6000 bmp_out->old_hbm_b = SelectObject( bmp_out->hdc_b, bmp_out->b );
    +
    6001 }
    +
    6002
    +
    6003# ifdef RETROFLAT_WING
    +
    6004 }
    +
    6005# endif /* RETROFLAT_WING */
    +
    6006
    +
    6007cleanup:
    +
    6008
    +
    6009# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6010
    +
    6011 assert( NULL == bmp_out->px );
    +
    6012
    +
    6013 bmp_out->w = w;
    +
    6014 bmp_out->h = h;
    +
    6015 bmp_out->flags = flags;
    +
    6016
    +
    6017 /* Allocate a space for the bitmap pixels. */
    +
    6018 bmp_out->sz = w * h;
    +
    6019 /* We're on PC BIOS... we don't need to lock pointers in this
    +
    6020 * platform-specific code!
    +
    6021 */
    +
    6022 bmp_out->px = _fcalloc( w, h );
    +
    6023 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->px );
    +
    6024
    +
    6025cleanup:
    +
    6026# else
    +
    6027# pragma message( "warning: create bitmap not implemented" )
    +
    6028# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6029
    +
    6030 return retval;
    +
    6031}
    +
    6032
    +
    6033/* === */
    +
    6034
    +
    6035void retroflat_destroy_bitmap( struct RETROFLAT_BITMAP* bmp ) {
    +
    6036
    +
    6037# if defined( RETROFLAT_OPENGL )
    +
    6038
    +
    6039 if( NULL != bmp->tex.bytes_h ) {
    +
    6040 if( NULL != bmp->tex.bytes ) {
    +
    6041 maug_munlock( bmp->tex.bytes_h, bmp->tex.bytes );
    +
    6042 }
    +
    6043
    +
    6044 maug_mfree( bmp->tex.bytes_h );
    +
    6045 }
    +
    6046
    +
    6047#ifndef RETROGLU_NO_TEXTURES
    +
    6048 if( 0 < bmp->tex.id ) {
    +
    6049 debug_printf( 0,
    +
    6050 "destroying bitmap texture: " UPRINTF_U32_FMT, bmp->tex.id );
    +
    6051 glDeleteTextures( 1, (GLuint*)&(bmp->tex.id) );
    +
    6052 }
    +
    6053#endif /* !RETROGLU_NO_TEXTURES */
    +
    6054
    +
    6055# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6056
    +
    6057 /* == Allegro == */
    +
    6058
    +
    6059 if( NULL == bmp->b ) {
    +
    6060 return;
    +
    6061 }
    +
    6062
    +
    6063 destroy_bitmap( bmp->b );
    +
    6064 bmp->b = NULL;
    +
    6065
    +
    6066# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    6067
    +
    6068 assert( NULL != bmp );
    +
    6069 assert( NULL != bmp->surface );
    +
    6070
    +
    6071# ifndef RETROFLAT_API_SDL1
    +
    6072 assert( NULL != bmp->texture );
    +
    6073
    +
    6074 SDL_DestroyTexture( bmp->texture );
    +
    6075 bmp->texture = NULL;
    +
    6076# endif /* !RETROFLAT_API_SDL1 */
    +
    6077
    +
    6078 SDL_FreeSurface( bmp->surface );
    +
    6079 bmp->surface = NULL;
    +
    6080
    +
    6081# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6082
    +
    6083 /* == Win16 == */
    +
    6084
    +
    6085 if( NULL != bmp->old_hbm_b ) {
    +
    6086 SelectObject( bmp->hdc_b, bmp->old_hbm_b );
    +
    6087 bmp->old_hbm_b = (HBITMAP)NULL;
    +
    6088 bmp->old_hbm_b = (HBITMAP)NULL;
    +
    6089 }
    +
    6090
    +
    6091 if( (HBITMAP)NULL != bmp->b ) {
    +
    6092 DeleteObject( bmp->b );
    +
    6093 bmp->b = (HBITMAP)NULL;
    +
    6094 }
    +
    6095
    +
    6096 if( (HBITMAP)NULL != bmp->mask ) {
    +
    6097 DeleteObject( bmp->mask );
    +
    6098 bmp->mask = (HBITMAP)NULL;
    +
    6099 }
    +
    6100
    +
    6101# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6102
    +
    6103 if( NULL != bmp->px ) {
    +
    6104 _ffree( bmp->px );
    +
    6105 bmp->px = NULL;
    +
    6106 }
    +
    6107
    +
    6108 if( NULL != bmp->mask ) {
    +
    6109 _ffree( bmp->mask );
    +
    6110 bmp->mask = NULL;
    +
    6111 }
    +
    6112
    +
    6113# else
    +
    6114# pragma message( "warning: destroy bitmap not implemented" )
    +
    6115# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6116}
    +
    6117
    +
    6118/* === */
    +
    6119
    + +
    6121 struct RETROFLAT_BITMAP* target, struct RETROFLAT_BITMAP* src,
    +
    6122 int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h
    +
    6123) {
    +
    6124# if defined( RETROFLAT_OPENGL )
    +
    6125 int y_iter = 0;
    +
    6126# elif defined( RETROFLAT_API_SDL1 ) && !defined( RETROFLAT_OPENGL )
    +
    6127 MERROR_RETVAL retval = MERROR_OK;
    +
    6128 SDL_Rect src_rect;
    +
    6129 SDL_Rect dest_rect;
    +
    6130# elif defined( RETROFLAT_API_SDL2 )
    +
    6131 MERROR_RETVAL retval = MERROR_OK;
    +
    6132 SDL_Rect src_rect = { s_x, s_y, w, h };
    +
    6133 SDL_Rect dest_rect = { d_x, d_y, w, h };
    +
    6134# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6135 MERROR_RETVAL retval = MERROR_OK;
    +
    6136 int locked_src_internal = 0;
    +
    6137# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6138 int16_t y_iter = 0,
    +
    6139 x_iter = 0;
    +
    6140 uint16_t target_line_offset = 0;
    +
    6141 int16_t src_line_offset = 0;
    +
    6142 MERROR_RETVAL retval = MERROR_OK;
    +
    6143# endif /* RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6144
    +
    6145# ifndef RETROFLAT_OPENGL
    +
    6146 if( NULL == target ) {
    +
    6147 target = retroflat_screen_buffer();
    +
    6148 }
    +
    6149# endif /* RETROFLAT_OPENGL */
    +
    6150
    +
    6151 assert( NULL != src );
    +
    6152
    +
    6153# if defined( RETROFLAT_OPENGL )
    +
    6154
    +
    6155 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6156 /* TODO: Create ortho sprite on screen. */
    +
    6157
    +
    6158 } else {
    +
    6159 /* Blit to texture. */
    +
    6160
    +
    6161 assert( NULL != target->tex.bytes );
    +
    6162
    +
    6163 /* TODO: Some kind of source-autolock? */
    +
    6164 assert( !retroflat_bitmap_locked( src ) );
    +
    6165 maug_mlock( src->tex.bytes_h, src->tex.bytes );
    +
    6166 for( y_iter = 0 ; h > y_iter ; y_iter++ ) {
    +
    6167 /* TODO: Handle transparency! */
    +
    6168 memcpy(
    +
    6169 &(target->tex.bytes[(((y_iter * target->tex.w) + d_x) * 4)]),
    +
    6170 &(src->tex.bytes[(((y_iter * src->tex.w) + s_x) * 4)]),
    +
    6171 w * 4 );
    +
    6172 }
    +
    6173 maug_munlock( src->tex.bytes_h, src->tex.bytes );
    +
    6174
    +
    6175 }
    +
    6176
    +
    6177# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6178
    +
    6179 /* == Allegro == */
    +
    6180
    +
    6181 assert( NULL != target->b );
    +
    6182 assert( NULL != src->b );
    +
    6183
    +
    6184 if(
    +
    6185 0 == s_x && 0 == s_y &&
    +
    6186 ((-1 == w && -1 == h ) || (src->b->w == w && src->b->h == h))
    +
    6187 ) {
    +
    6188 draw_sprite( target->b, src->b, d_x, d_y );
    +
    6189 } else {
    +
    6190 /* Handle partial blit. */
    +
    6191 blit( src->b, target->b, s_x, s_y, d_x, d_y, w, h );
    +
    6192 }
    +
    6193
    +
    6194# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    6195
    +
    6196 /* == SDL == */
    +
    6197
    +
    6198 src_rect.x = s_x;
    +
    6199 src_rect.y = s_y;
    +
    6200 src_rect.w = w;
    +
    6201 src_rect.h = h;
    +
    6202 dest_rect.x = d_x;
    +
    6203 dest_rect.y = d_y;
    +
    6204 dest_rect.w = w;
    +
    6205 dest_rect.h = h;
    +
    6206
    +
    6207# ifdef RETROFLAT_API_SDL1
    +
    6208 assert( 0 == src->autolock_refs );
    +
    6209 assert( 0 == target->autolock_refs );
    +
    6210 retval =
    +
    6211 SDL_BlitSurface( src->surface, &src_rect, target->surface, &dest_rect );
    +
    6212 if( 0 != retval ) {
    +
    6213 error_printf( "could not blit surface: %s", SDL_GetError() );
    +
    6214 }
    +
    6215# else
    +
    6216
    +
    6217 assert( retroflat_bitmap_locked( target ) );
    +
    6218 retval = SDL_RenderCopy(
    +
    6219 target->renderer, src->texture, &src_rect, &dest_rect );
    +
    6220 if( 0 != retval ) {
    +
    6221 error_printf( "could not blit surface: %s", SDL_GetError() );
    +
    6222 }
    +
    6223
    +
    6224# endif /* !RETROFLAT_API_SDL1 */
    +
    6225
    +
    6226# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6227
    +
    6228 /* == Win16/Win32 == */
    +
    6229
    +
    6230 assert( (HBITMAP)NULL != target->b );
    +
    6231 assert( (HBITMAP)NULL != src->b );
    +
    6232
    +
    6233 retroflat_internal_autolock_bitmap( src, locked_src_internal );
    +
    6234 assert( retroflat_bitmap_locked( target ) );
    +
    6235
    +
    6236 if( (HBITMAP)NULL != src->mask ) {
    +
    6237 /* Use mask to blit transparency. */
    +
    6238 BitBlt(
    +
    6239 target->hdc_b, d_x, d_y, w, h, src->hdc_mask, s_x, s_y, SRCAND );
    +
    6240
    +
    6241 /* Do actual blit. */
    +
    6242 BitBlt(
    +
    6243 target->hdc_b, d_x, d_y, w, h, src->hdc_b, s_x, s_y, SRCPAINT );
    +
    6244 } else {
    +
    6245 /* Just overwrite entire rect. */
    +
    6246 BitBlt(
    +
    6247 target->hdc_b, d_x, d_y, w, h, src->hdc_b, s_x, s_y, SRCCOPY );
    +
    6248 }
    +
    6249
    +
    6250cleanup:
    +
    6251
    +
    6252 if( locked_src_internal ) {
    +
    6253 retroflat_draw_release( src );
    +
    6254 }
    +
    6255
    +
    6256# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6257
    +
    6258 if( NULL == target ) {
    +
    6259 target = &(g_retroflat_state->buffer);
    +
    6260 }
    +
    6261
    +
    6262 switch( g_retroflat_state->screen_mode ) {
    +
    6263 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6264 for( y_iter = 0 ; h > y_iter ; y_iter++ ) {
    +
    6265 target_line_offset = ((d_y + y_iter) * (target->w)) + d_x;
    +
    6266 src_line_offset = ((s_y + y_iter) * src->w) + s_x;
    +
    6267 if( target->sz <= target_line_offset + w ) {
    +
    6268 continue;
    +
    6269 }
    +
    6270 /* Blit the line. */
    +
    6271 if(
    + + +
    6274 ) {
    +
    6275 /* Copy line-by-line for speed. */
    +
    6276 _fmemcpy(
    +
    6277 &(target->px[target_line_offset]),
    +
    6278 &(src->px[src_line_offset]), w );
    +
    6279 } else {
    +
    6280 for( x_iter = 0 ; w > x_iter ; x_iter++ ) {
    +
    6281 /* AND with mask for transparency cutout. */
    +
    6282 target->px[target_line_offset + x_iter] &=
    +
    6283 src->mask[src_line_offset + x_iter];
    +
    6284 /* Draw into cutout with OR. */
    +
    6285 target->px[target_line_offset + x_iter] |=
    +
    6286 src->px[src_line_offset + x_iter];
    +
    6287 }
    +
    6288 }
    +
    6289 }
    +
    6290 break;
    +
    6291
    +
    6292 default:
    +
    6293 error_printf( "bitmap blit unsupported in video mode: %d",
    +
    6294 g_retroflat_state->screen_mode );
    +
    6295 break;
    +
    6296 }
    +
    6297
    +
    6298# else
    +
    6299# pragma message( "warning: blit bitmap not implemented" )
    +
    6300# endif /* RETROFLAT_API_ALLEGRO */
    +
    6301 return;
    +
    6302}
    +
    6303
    +
    6304/* === */
    +
    6305
    +
    6306void retroflat_px(
    +
    6307 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    6308 int16_t x, int16_t y, uint8_t flags
    +
    6309) {
    +
    6310# if defined( RETROFLAT_OPENGL )
    +
    6311# elif defined( RETROFLAT_API_SDL1 )
    +
    6312 int offset = 0;
    +
    6313 uint8_t* px_1 = NULL;
    +
    6314 uint16_t* px_2 = NULL;
    +
    6315 uint32_t* px_4 = NULL;
    +
    6316 RETROFLAT_COLOR_DEF* color = &(g_retroflat_state->palette[color_idx]);
    +
    6317# elif defined( RETROFLAT_API_SDL2 )
    +
    6318 RETROFLAT_COLOR_DEF* color = &(g_retroflat_state->palette[color_idx]);
    +
    6319# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6320 uint16_t screen_byte_offset = 0,
    +
    6321 screen_bit_offset = 0;
    +
    6322 uint8_t color = 0;
    +
    6323# endif /* RETROFLAT_API_SDL1 */
    +
    6324
    +
    6325 if( RETROFLAT_COLOR_NULL == color_idx ) {
    +
    6326 return;
    +
    6327 }
    +
    6328
    +
    6329 if( NULL == target ) {
    +
    6330 target = retroflat_screen_buffer();
    +
    6331 }
    +
    6332
    +
    6333 if(
    +
    6334 x < 0 || x >= retroflat_screen_w() ||
    +
    6335 y < 0 || y >= retroflat_screen_h()
    +
    6336 ) {
    +
    6337 return;
    +
    6338 }
    +
    6339
    +
    6340# if defined( RETROFLAT_OPENGL )
    +
    6341
    +
    6342 assert( NULL != target->tex.bytes );
    +
    6343 assert( retroflat_bitmap_locked( target ) );
    +
    6344
    +
    6345# if !defined( RETROFLAT_NO_BOUNDSC )
    +
    6346 if( (size_t)x >= target->tex.w ) {
    +
    6347 return;
    +
    6348 }
    +
    6349
    +
    6350 if( (size_t)y >= target->tex.h ) {
    +
    6351 return;
    +
    6352 }
    +
    6353# endif /* !RETROFLAT_NO_BOUNDSC */
    +
    6354
    +
    6355 /* Draw pixel colors from texture palette. */
    +
    6356 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 0] =
    +
    6357 g_retroflat_state->tex_palette[color_idx][0];
    +
    6358 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 1] =
    +
    6359 g_retroflat_state->tex_palette[color_idx][1];
    +
    6360 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 2] =
    +
    6361 g_retroflat_state->tex_palette[color_idx][2];
    +
    6362
    +
    6363 /* Set pixel as opaque. */
    +
    6364 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 3] = 0xff;
    +
    6365
    +
    6366# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6367
    +
    6368 /* == Allegro == */
    +
    6369
    +
    6370 putpixel( target->b, x, y, g_retroflat_state->palette[color_idx] );
    +
    6371
    +
    6372# elif defined( RETROFLAT_API_SDL1 )
    +
    6373
    +
    6374 /* == SDL1 == */
    +
    6375
    +
    6376 retroflat_px_lock( target );
    +
    6377
    +
    6378 assert( 0 < target->autolock_refs );
    +
    6379
    +
    6380 offset = (y * target->surface->pitch) +
    +
    6381 (x * target->surface->format->BytesPerPixel);
    +
    6382
    +
    6383 switch( target->surface->format->BytesPerPixel ) {
    +
    6384 case 4:
    +
    6385 px_4 = (uint32_t*)&(((uint8_t*)(target->surface->pixels))[offset]);
    +
    6386 *px_4 =
    +
    6387 SDL_MapRGB( target->surface->format, color->r, color->g, color->b );
    +
    6388 break;
    +
    6389
    +
    6390 case 2:
    +
    6391 px_2 = (uint16_t*)&(((uint8_t*)(target->surface->pixels))[offset]);
    +
    6392 *px_2 =
    +
    6393 SDL_MapRGB( target->surface->format, color->r, color->g, color->b );
    +
    6394 break;
    +
    6395
    +
    6396 case 1:
    +
    6397 px_1 = (uint8_t*)&(((uint8_t*)(target->surface->pixels))[offset]);
    +
    6398 *px_1 =
    +
    6399 SDL_MapRGB( target->surface->format, color->r, color->g, color->b );
    +
    6400 break;
    +
    6401 }
    +
    6402
    +
    6403 retroflat_px_release( target );
    +
    6404
    +
    6405# elif defined( RETROFLAT_API_SDL2 )
    +
    6406
    +
    6407 /* == SDL2 == */
    +
    6408
    +
    6409 assert( retroflat_bitmap_locked( target ) );
    +
    6410
    +
    6411 SDL_SetRenderDrawColor(
    +
    6412 target->renderer, color->r, color->g, color->b, 255 );
    +
    6413 SDL_RenderDrawPoint( target->renderer, x, y );
    +
    6414
    +
    6415# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6416
    +
    6417 /* == Win16/Win32 == */
    +
    6418
    +
    6419 assert( retroflat_bitmap_locked( target ) );
    +
    6420
    +
    6421# ifdef RETROFLAT_WING
    +
    6422 if( NULL != target->bits ) {
    +
    6423 /* Modify target bits directly (faster) if available! */
    +
    6424 /* WinG bitmaps are 8-bit palettized, so use the index directly. */
    +
    6425 if( 0 > target->h ) {
    +
    6426 target->bits[((target->h - 1 - y) * target->tex.w) + x] =
    +
    6427 color_idx;
    +
    6428 } else {
    +
    6429 target->bits[(y * target->tex.w) + x] =
    +
    6430 color_idx;
    +
    6431 }
    +
    6432 } else {
    +
    6433 /* Use slow Windows GDI. */
    +
    6434 SetPixel( target->hdc_b, x, y,
    +
    6435 g_retroflat_state->palette[color_idx] );
    +
    6436 }
    +
    6437# else
    +
    6438 SetPixel( target->hdc_b, x, y,
    +
    6439 g_retroflat_state->palette[color_idx] );
    +
    6440# endif /* RETROFLAT_WING */
    +
    6441
    +
    6442# elif defined( RETROFLAT_API_LIBNDS )
    +
    6443
    +
    6444 /* == Nintendo DS == */
    +
    6445
    +
    6446 uint16_t* px_ptr = NULL;
    +
    6447
    +
    6448 px_ptr = bgGetGfxPtr( g_retroflat_state->px_id );
    +
    6449 px_ptr[(y * 256) + x] = g_retroflat_state->palette[color_idx];
    +
    6450
    +
    6451# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6452
    +
    6453 /* == DOS PC_BIOS == */
    +
    6454
    +
    6455 /* TODO: Determine if we're drawing on-screen or on a bitmap. */
    +
    6456 if( NULL == target ) {
    +
    6457 target = &(g_retroflat_state->buffer);
    +
    6458 }
    +
    6459
    +
    6460 switch( g_retroflat_state->screen_mode ) {
    +
    6461 case RETROFLAT_SCREEN_MODE_CGA:
    +
    6462 /* Divide y by 2 since both planes are SCREEN_H / 2 high. */
    +
    6463 /* Divide result by 4 since it's 2 bits per pixel. */
    +
    6464 screen_byte_offset = (((y >> 1) * target->w) + x) >> 2;
    +
    6465 /* Shift the bits over by the remainder. */
    +
    6466 /* TODO: Factor out this modulo to shift/and. */
    +
    6467 screen_bit_offset = 6 - (((((y >> 1) * target->w) + x) % 4) << 1);
    +
    6468
    +
    6469 /* Dither colors on odd/even squares. */
    +
    6470 if( (x & 0x01 && y & 0x01) || (!(x & 0x01) && !(y & 0x01)) ) {
    +
    6471 color = g_retroflat_state->cga_color_table[color_idx];
    +
    6472 } else {
    +
    6473 color = g_retroflat_state->cga_dither_table[color_idx];
    +
    6474 }
    +
    6475
    +
    6476 if( target != &(g_retroflat_state->buffer) ) {
    +
    6477 /* TODO: Memory bitmap. */
    +
    6478
    +
    6479 } else if( y & 0x01 ) {
    +
    6480 /* 0x2000 = difference between even/odd CGA planes. */
    +
    6481 g_retroflat_state->buffer.px[0x2000 + screen_byte_offset] &=
    +
    6482 /* 0x03 = 2-bit pixel mask. */
    +
    6483 ~(0x03 << screen_bit_offset);
    +
    6484 g_retroflat_state->buffer.px[0x2000 + screen_byte_offset] |=
    +
    6485 ((color & 0x03) << screen_bit_offset);
    +
    6486 } else {
    +
    6487 /* 0x03 = 2-bit pixel mask. */
    +
    6488 g_retroflat_state->buffer.px[screen_byte_offset] &=
    +
    6489 ~(0x03 << screen_bit_offset);
    +
    6490 g_retroflat_state->buffer.px[screen_byte_offset] |=
    +
    6491 /* 0x03 = 2-bit pixel mask. */
    +
    6492 ((color & 0x03) << screen_bit_offset);
    +
    6493 }
    +
    6494 break;
    +
    6495
    +
    6496 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6497 screen_byte_offset = ((y * target->w) + x);
    +
    6498 if( target->sz <= screen_byte_offset ) {
    +
    6499 break;
    +
    6500 }
    +
    6501 target->px[screen_byte_offset] = color_idx;
    +
    6502 break;
    +
    6503
    +
    6504 default:
    +
    6505 error_printf( "pixel blit unsupported in video mode: %d",
    +
    6506 g_retroflat_state->screen_mode );
    +
    6507 break;
    +
    6508 }
    +
    6509
    +
    6510# else
    +
    6511# pragma message( "warning: px not implemented" )
    +
    6512# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6513
    +
    6514}
    +
    6515
    +
    6516/* === */
    +
    6517
    +
    6518void retroflat_rect(
    +
    6519 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    6520 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags
    +
    6521) {
    +
    6522# if defined( RETROFLAT_OPENGL )
    +
    6523 float aspect_ratio = 0,
    +
    6524 screen_x = 0,
    +
    6525 screen_y = 0,
    +
    6526 screen_w = 0,
    +
    6527 screen_h = 0;
    +
    6528# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6529# elif defined( RETROFLAT_API_SDL2 )
    +
    6530# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6531 HBRUSH old_brush = (HBRUSH)NULL;
    +
    6532 HPEN old_pen = (HPEN)NULL;
    +
    6533# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6534
    +
    6535 if( RETROFLAT_COLOR_NULL == color_idx ) {
    +
    6536 return;
    +
    6537 }
    +
    6538
    +
    6539# ifndef RETROFLAT_OPENGL
    +
    6540 if( NULL == target ) {
    +
    6541 target = retroflat_screen_buffer();
    +
    6542 }
    +
    6543# endif /* !RETROFLAT_OPENGL */
    +
    6544
    +
    6545# if defined( RETROFLAT_OPENGL )
    +
    6546
    +
    6547 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6548
    +
    6549 /* Push new overlay projection parms before we create a new overlay. */
    +
    6550 retroglu_push_overlay( x, y, screen_x, screen_y, aspect_ratio );
    +
    6551 retroglu_whf( w, h, screen_w, screen_h, aspect_ratio );
    +
    6552
    +
    6553 /* Create the overlay poly with a solid color. */
    +
    6554 glBegin( GL_TRIANGLES );
    +
    6555 glColor3fv( g_retroflat_state->palette[color_idx] );
    +
    6556 glVertex3f( screen_x, screen_y, RETROFLAT_GL_Z );
    +
    6557 glVertex3f( screen_x, screen_y - screen_h, RETROFLAT_GL_Z );
    +
    6558 glVertex3f( screen_x + screen_w, screen_y - screen_h, RETROFLAT_GL_Z );
    +
    6559
    +
    6560 glVertex3f( screen_x + screen_w, screen_y - screen_h, RETROFLAT_GL_Z );
    +
    6561 glVertex3f( screen_x + screen_w, screen_y, RETROFLAT_GL_Z );
    +
    6562 glVertex3f( screen_x, screen_y, RETROFLAT_GL_Z );
    +
    6563 glEnd();
    +
    6564
    + +
    6566 } else {
    +
    6567 /* Draw the rect onto the given 2D texture. */
    +
    6568 retrosoft_rect( target, color_idx, x, y, w, h, flags );
    +
    6569 }
    +
    6570
    +
    6571# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6572
    +
    6573 retrosoft_rect( target, color_idx, x, y, w, h, flags );
    +
    6574
    +
    6575# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6576
    +
    6577 /* == Allegro == */
    +
    6578
    +
    6579 assert( NULL != target->b );
    + +
    6581 rectfill( target->b, x, y, x + w, y + h,
    +
    6582 g_retroflat_state->palette[color_idx] );
    +
    6583 } else {
    +
    6584 rect( target->b, x, y, x + w, y + h,
    +
    6585 g_retroflat_state->palette[color_idx] );
    +
    6586 }
    +
    6587
    +
    6588# elif defined( RETROFLAT_API_SDL2 )
    +
    6589
    +
    6590 assert( retroflat_bitmap_locked( target ) );
    +
    6591
    +
    6592 area.x = x;
    +
    6593 area.y = y;
    +
    6594 area.w = w;
    +
    6595 area.h = h;
    +
    6596
    +
    6597 SDL_SetRenderDrawColor(
    +
    6598 target->renderer, color->r, color->g, color->b, 255 );
    +
    6599
    + +
    6601 SDL_RenderFillRect( target->renderer, &area );
    +
    6602 } else {
    +
    6603 SDL_RenderDrawRect( target->renderer, &area );
    +
    6604 }
    +
    6605
    +
    6606# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6607
    +
    6608 /* == Win16/Win32 == */
    +
    6609
    +
    6610 assert( (HBITMAP)NULL != target->b );
    +
    6611
    +
    6612 assert( retroflat_bitmap_locked( target ) );
    +
    6613
    +
    6614 retroflat_win_setup_brush( old_brush, target, color_idx, flags );
    +
    6615 retroflat_win_setup_pen( old_pen, target, color_idx, flags );
    +
    6616
    +
    6617 Rectangle( target->hdc_b, x, y, x + w, y + h );
    +
    6618
    +
    6619/* cleanup: */
    +
    6620
    +
    6621 retroflat_win_cleanup_brush( old_brush, target )
    +
    6622 retroflat_win_cleanup_pen( old_pen, target )
    +
    6623
    +
    6624# else
    +
    6625# pragma message( "warning: rect not implemented" )
    +
    6626# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6627}
    +
    6628
    +
    6629/* === */
    +
    6630
    +
    6631void retroflat_line(
    +
    6632 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    6633 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags
    +
    6634) {
    +
    6635# if defined( RETROFLAT_OPENGL )
    +
    6636# elif defined( RETROFLAT_SOFT_LINES )
    +
    6637# elif defined( RETROFLAT_API_SDL2 )
    +
    6638 MERROR_RETVAL retval = MERROR_OK;
    +
    6639 RETROFLAT_COLOR_DEF color = g_retroflat_state->palette[color_idx];
    +
    6640# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6641 HPEN pen = (HPEN)NULL;
    +
    6642 HPEN old_pen = (HPEN)NULL;
    +
    6643 POINT points[2];
    +
    6644# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6645
    +
    6646 if( RETROFLAT_COLOR_NULL == color_idx ) {
    +
    6647 return;
    +
    6648 }
    +
    6649
    +
    6650# ifndef RETROFLAT_OPENGL
    +
    6651 if( NULL == target ) {
    +
    6652 target = retroflat_screen_buffer();
    +
    6653 }
    +
    6654# endif /* !RETROFLAT_OPENGL */
    +
    6655
    +
    6656# if defined( RETROFLAT_OPENGL )
    +
    6657
    +
    6658 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6659 /* TODO: Draw line in ortho. */
    +
    6660 } else {
    +
    6661 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6662 }
    +
    6663
    +
    6664# elif defined( RETROFLAT_SOFT_LINES )
    +
    6665
    +
    6666 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6667
    +
    6668# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6669
    +
    6670 /* == Allegro == */
    +
    6671
    +
    6672 assert( NULL != target->b );
    +
    6673 line( target->b, x1, y1, x2, y2, color_idx );
    +
    6674
    +
    6675# elif defined( RETROFLAT_API_SDL2 )
    +
    6676
    +
    6677 /* == SDL2 == */
    +
    6678
    +
    6679 assert( retroflat_bitmap_locked( target ) );
    +
    6680
    +
    6681 SDL_SetRenderDrawColor(
    +
    6682 target->renderer, color->r, color->g, color->b, 255 );
    +
    6683 SDL_RenderDrawLine( target->renderer, x1, y1, x2, y2 );
    +
    6684
    +
    6685# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6686
    +
    6687 /* == Win16/Win32 == */
    +
    6688
    +
    6689 assert( NULL != target->b );
    +
    6690
    +
    6691 assert( retroflat_bitmap_locked( target ) );
    +
    6692
    +
    6693 retroflat_win_setup_pen( old_pen, target, color_idx, flags );
    +
    6694
    +
    6695 /* Create the line points. */
    +
    6696 points[0].x = x1;
    +
    6697 points[0].y = y1;
    +
    6698 points[1].x = x2;
    +
    6699 points[1].y = y2;
    +
    6700
    +
    6701 Polyline( target->hdc_b, points, 2 );
    +
    6702
    +
    6703/* cleanup: */
    +
    6704
    +
    6705 if( (HPEN)NULL != pen ) {
    +
    6706 SelectObject( target->hdc_b, old_pen );
    +
    6707 DeleteObject( pen );
    +
    6708 }
    +
    6709
    +
    6710# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6711
    +
    6712 /* == DOS PC_BIOS == */
    +
    6713
    +
    6714 switch( g_retroflat_state->screen_mode ) {
    +
    6715 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6716 /* TODO: Try accelerated 2D. */
    +
    6717 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6718 break;
    +
    6719
    +
    6720 default:
    +
    6721 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6722 break;
    +
    6723 }
    +
    6724
    +
    6725# else
    +
    6726# pragma message( "warning: line not implemented" )
    +
    6727# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6728}
    +
    6729
    +
    6730/* === */
    +
    6731
    + +
    6733 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    6734 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags
    +
    6735) {
    +
    6736# if defined( RETROFLAT_OPENGL )
    +
    6737# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6738# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6739 HPEN old_pen = (HPEN)NULL;
    +
    6740 HBRUSH old_brush = (HBRUSH)NULL;
    +
    6741# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6742
    +
    6743 if( RETROFLAT_COLOR_NULL == color ) {
    +
    6744 return;
    +
    6745 }
    +
    6746
    +
    6747# ifndef RETROFLAT_OPENGL
    +
    6748 if( NULL == target ) {
    +
    6749 target = retroflat_screen_buffer();
    +
    6750 }
    +
    6751# endif /* !RETROFLAT_OPENGL */
    +
    6752
    +
    6753# if defined( RETROFLAT_OPENGL )
    +
    6754
    +
    6755 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6756 /* TODO: Draw ellipse in ortho. */
    +
    6757 } else {
    +
    6758 retrosoft_ellipse( target, color, x, y, w, h, flags );
    +
    6759 }
    +
    6760
    +
    6761# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6762
    +
    6763 retrosoft_ellipse( target, color, x, y, w, h, flags );
    +
    6764
    +
    6765# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6766
    +
    6767 /* == Allegro == */
    +
    6768
    +
    6769 assert( NULL != target->b );
    +
    6770
    + +
    6772 /* >> 1 performs better than / 2 on lousy old DOS compilers. */
    +
    6773 ellipsefill(
    +
    6774 target->b, x + (w >> 1), y + (h >> 1), w >> 1, h >> 1, color );
    +
    6775 } else {
    +
    6776 /* >> 1 performs better than / 2 on lousy old DOS compilers. */
    +
    6777 ellipse( target->b, x + (w >> 1), y + (h >> 1), w >> 1, h >> 1, color );
    +
    6778 }
    +
    6779
    +
    6780# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6781
    +
    6782 /* == Win16/Win32 == */
    +
    6783
    +
    6784 assert( NULL != target->b );
    +
    6785 assert( retroflat_bitmap_locked( target ) );
    +
    6786
    +
    6787 retroflat_win_setup_brush( old_brush, target, color, flags );
    +
    6788 retroflat_win_setup_pen( old_pen, target, color, flags );
    +
    6789
    +
    6790 Ellipse( target->hdc_b, x, y, x + w, y + h );
    +
    6791
    +
    6792/* cleanup: */
    +
    6793
    +
    6794 retroflat_win_cleanup_brush( old_brush, target )
    +
    6795 retroflat_win_cleanup_pen( old_pen, target )
    +
    6796
    +
    6797# else
    +
    6798# pragma message( "warning: ellipse not implemented" )
    +
    6799# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6800}
    +
    6801
    +
    6802/* === */
    +
    6803
    +
    6804void retroflat_cursor( struct RETROFLAT_BITMAP* target, uint8_t flags ) {
    +
    6805#if 0
    +
    6806 char mouse_str[11] = "";
    +
    6807
    +
    6808 maug_snprintf(
    +
    6809 mouse_str, 10, "%02d, %02d", g_retroflat_state->last_mouse_x, g_retroflat_state->last_mouse_y );
    +
    6810
    + +
    6812 target, RETROFLAT_COLOR_BLACK,
    +
    6813 mouse_str, 10, NULL, 0, 0, 0 );
    + +
    6815 target, RETROFLAT_COLOR_BLACK,
    +
    6816 g_retroflat_state->last_mouse_x - 5, g_retroflat_state->last_mouse_y - 5, 10, 10, 0 );
    +
    6817#endif
    +
    6818}
    +
    6819
    +
    6820/* === */
    +
    6821
    +
    6822# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6823
    +
    6824# define retroflat_win_create_font( flags, font_str ) \
    +
    6825 CreateFont( 10, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, \
    +
    6826 DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, \
    +
    6827 DEFAULT_QUALITY, DEFAULT_PITCH, \
    +
    6828 (NULL == font_str || '\0' == font_str[0] ? "Arial" : font_str) );
    +
    6829
    +
    6830# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6831
    + +
    6833 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    6834 const char* font_str, size_t* w_out, size_t* h_out, uint8_t flags
    +
    6835) {
    +
    6836# if defined( RETROFLAT_OPENGL )
    +
    6837# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6838# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6839 FONT* font_data = NULL;
    +
    6840 int font_loaded = 0;
    +
    6841# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6842 SIZE sz;
    +
    6843 HFONT font;
    +
    6844 HFONT old_font;
    +
    6845# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6846
    +
    6847 if( NULL == target ) {
    +
    6848 target = retroflat_screen_buffer();
    +
    6849 }
    +
    6850
    +
    6851# if defined( RETROFLAT_OPENGL )
    +
    6852
    +
    6853 retrosoft_string_sz( target, str, str_sz, font_str, w_out, h_out, flags );
    +
    6854
    +
    6855# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6856
    +
    6857 retrosoft_string_sz( target, str, str_sz, font_str, w_out, h_out, flags );
    +
    6858
    +
    6859# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6860
    +
    6861 /* == Allegro == */
    +
    6862
    +
    6863 if( NULL == font_str || '\0' == font_str[0] ) {
    +
    6864 font_data = font;
    +
    6865 } else {
    +
    6866 /* TODO: Cache loaded fonts for later use. */
    +
    6867 font_data = load_font( font_str, NULL, NULL );
    +
    6868 }
    +
    6869 if( NULL == font_data ) {
    + +
    6871 "Error", "Unable to load font: %s", font_str );
    +
    6872 goto cleanup;
    +
    6873 }
    +
    6874
    +
    6875 *w_out = text_length( font_data, str );
    +
    6876 *h_out = text_height( font_data );
    +
    6877
    +
    6878cleanup:
    +
    6879
    +
    6880 if( font_loaded && NULL != font_data ) {
    +
    6881 destroy_font( font_data );
    +
    6882 }
    +
    6883
    +
    6884# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6885
    +
    6886 /* == Win16/Win32 == */
    +
    6887
    +
    6888 assert( NULL != target->b );
    +
    6889 assert( retroflat_bitmap_locked( target ) );
    +
    6890
    +
    6891 font = retroflat_win_create_font( flags, font_str );
    +
    6892 old_font = SelectObject( target->hdc_b, font );
    +
    6893
    +
    6894 GetTextExtentPoint( target->hdc_b, str, str_sz, &sz );
    +
    6895 *w_out = sz.cx;
    +
    6896 *h_out = sz.cy;
    +
    6897
    +
    6898/* cleanup: */
    +
    6899
    +
    6900 SelectObject( target->hdc_b, old_font );
    +
    6901
    +
    6902# else
    +
    6903# pragma message( "warning: string sz not implemented" )
    +
    6904# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6905}
    +
    6906
    +
    6907/* === */
    +
    6908
    +
    6909void retroflat_string(
    +
    6910 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    6911 const char* str, int str_sz, const char* font_str, int16_t x_orig, int16_t y_orig,
    +
    6912 uint8_t flags
    +
    6913) {
    +
    6914# if defined( RETROFLAT_OPENGL )
    +
    6915 float aspect_ratio = 0,
    +
    6916 screen_x = 0,
    +
    6917 screen_y = 0;
    +
    6918# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6919# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6920 FONT* font_data = NULL;
    +
    6921 int font_loaded = 0;
    +
    6922# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6923 RECT rect;
    +
    6924 SIZE sz;
    +
    6925 HFONT font;
    +
    6926 HFONT old_font;
    +
    6927# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6928
    +
    6929 if( RETROFLAT_COLOR_NULL == color ) {
    +
    6930 return;
    +
    6931 }
    +
    6932
    +
    6933# if !defined( RETROFLAT_OPENGL )
    +
    6934 if( NULL == target ) {
    +
    6935 target = retroflat_screen_buffer();
    +
    6936 }
    +
    6937# endif /* !RETROFLAT_OPENGL */
    +
    6938
    +
    6939 if( 0 == str_sz ) {
    +
    6940 str_sz = strlen( str );
    +
    6941 }
    +
    6942
    +
    6943# if defined( RETROFLAT_OPENGL )
    +
    6944
    +
    6945 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6946 /* Push new overlay projection parms before we create a new overlay. */
    +
    6947 retroglu_push_overlay( x_orig, y_orig, screen_x, screen_y, aspect_ratio );
    +
    6948
    +
    6949 retroglu_string(
    +
    6950 screen_x, screen_y, 0,
    +
    6951 g_retroflat_state->palette[color], str, str_sz, font_str, flags );
    +
    6952
    + +
    6954 } else {
    +
    6955 /* Assume drawing surface is already configured inside a push_overlay()
    +
    6956 * call and draw to its texture. */
    +
    6957 retrosoft_string(
    +
    6958 target, color, str, str_sz, font_str, x_orig, y_orig, flags );
    +
    6959 }
    +
    6960
    +
    6961# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6962
    +
    6963 retrosoft_string(
    +
    6964 target, color, str, str_sz, font_str, x_orig, y_orig, flags );
    +
    6965
    +
    6966# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6967
    +
    6968 /* == Allegro == */
    +
    6969
    +
    6970 if( NULL == font_str || '\0' == font_str[0] ) {
    +
    6971 font_data = font;
    +
    6972 } else {
    +
    6973 /* TODO: Cache loaded fonts for later use. */
    +
    6974 font_data = load_font( font_str, NULL, NULL );
    +
    6975 }
    +
    6976 if( NULL == font_data ) {
    + +
    6978 "Error", "Unable to load font: %s", font_str );
    +
    6979 goto cleanup;
    +
    6980 }
    +
    6981
    +
    6982 textout_ex( target->b, font_data, str, x_orig, y_orig, color, -1 );
    +
    6983
    +
    6984cleanup:
    +
    6985 if( font_loaded && NULL != font_data ) {
    +
    6986 destroy_font( font_data );
    +
    6987 }
    +
    6988
    +
    6989# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6990
    +
    6991 /* == Win16/Win32 == */
    +
    6992
    +
    6993 assert( NULL != target->b );
    +
    6994
    +
    6995 assert( retroflat_bitmap_locked( target ) );
    +
    6996
    +
    6997 /* DrawText will draw gibberish even if the string is null-terminated! */
    +
    6998 str_sz = strlen( str );
    +
    6999
    +
    7000 memset( &sz, '\0', sizeof( SIZE ) );
    +
    7001
    +
    7002 font = retroflat_win_create_font( flags, font_str );
    +
    7003 old_font = SelectObject( target->hdc_b, font );
    +
    7004
    +
    7005 GetTextExtentPoint( target->hdc_b, str, str_sz, &sz );
    +
    7006 rect.left = x_orig;
    +
    7007 rect.top = y_orig;
    +
    7008 rect.right = (x_orig + sz.cx);
    +
    7009 rect.bottom = (y_orig + sz.cy);
    +
    7010
    +
    7011 SetTextColor( target->hdc_b, g_retroflat_state->palette[color] );
    +
    7012 SetBkMode( target->hdc_b, TRANSPARENT );
    +
    7013
    +
    7014 DrawText( target->hdc_b, str, str_sz, &rect, 0 );
    +
    7015
    +
    7016/* cleanup: */
    +
    7017
    +
    7018 SelectObject( target->hdc_b, old_font );
    +
    7019
    +
    7020 SetBkMode( target->hdc_b, OPAQUE );
    +
    7021 SetTextColor( target->hdc_b,
    +
    7022 g_retroflat_state->palette[RETROFLAT_COLOR_BLACK] );
    +
    7023
    +
    7024# else
    +
    7025# pragma message( "warning: string not implemented" )
    +
    7026# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    7027}
    +
    7028
    +
    7029/* === */
    +
    7030
    +
    7031void retroflat_get_palette( uint8_t idx, uint32_t* p_rgb ) {
    +
    7032
    +
    7033# ifdef RETROFLAT_OPENGL
    +
    7034
    +
    7035 *p_rgb = 0;
    +
    7036 *p_rgb |= g_retroflat_state->tex_palette[idx][0] & 0xff;
    +
    7037 *p_rgb |= (g_retroflat_state->tex_palette[idx][1] & 0xff) << 8;
    +
    7038 *p_rgb |= (g_retroflat_state->tex_palette[idx][2] & 0xff) << 16;
    +
    7039
    +
    7040# elif defined( RETROFLAT_API_SDL2 )
    +
    7041
    +
    7042 *p_rgb = 0;
    +
    7043 *p_rgb |= g_retroflat_state->palette[idx].b & 0xff;
    +
    7044 *p_rgb |= ((g_retroflat_state->palette[idx].g & 0xff) << 8);
    +
    7045 *p_rgb |= ((g_retroflat_state->palette[idx].r & 0xff) << 16);
    +
    7046
    +
    7047# elif defined( RETROFLAT_API_PC_BIOS )
    +
    7048
    +
    7049 /* Set VGA mask register. */
    +
    7050 switch( g_retroflat_state->screen_mode ) {
    +
    7051 case RETROFLAT_SCREEN_MODE_VGA:
    +
    7052 outp( 0x3c6, 0xff );
    +
    7053 outp( 0x3c7, idx );
    +
    7054 *p_rgb = 0;
    +
    7055 *p_rgb |= ((uint32_t)(inp( 0x3c9 ) & 0xff) << 16);
    +
    7056 *p_rgb |= ((uint32_t)(inp( 0x3c9 ) & 0xff) << 8);
    +
    7057 *p_rgb |= (inp( 0x3c9 ) & 0xff);
    +
    7058 break;
    +
    7059
    +
    7060 default:
    +
    7061 error_printf( "could not set palette index %d in screen mode %d!",
    +
    7062 idx, g_retroflat_state->screen_mode );
    +
    7063 break;
    +
    7064 }
    +
    7065
    +
    7066# else
    +
    7067# pragma message( "warning: get palette not implemented" )
    +
    7068# endif
    +
    7069
    +
    7070}
    +
    7071
    +
    7072/* === */
    +
    7073
    +
    7074MERROR_RETVAL retroflat_set_palette( uint8_t idx, uint32_t rgb ) {
    +
    7075 MERROR_RETVAL retval = MERROR_OK;
    +
    7076# if defined( RETROFLAT_API_PC_BIOS )
    +
    7077 uint8_t byte_buffer = 0;
    +
    7078# endif /* RETROFLAT_API_PC_BIOS */
    +
    7079
    +
    7080 debug_printf( 3,
    +
    7081 "setting texture palette #%u to " UPRINTF_X32_FMT "...",
    +
    7082 idx, rgb );
    +
    7083
    +
    7084# ifdef RETROFLAT_OPENGL
    +
    7085
    +
    7086 g_retroflat_state->tex_palette[idx][0] = rgb & 0xff;
    +
    7087 g_retroflat_state->tex_palette[idx][1] = (rgb & 0xff00) >> 8;
    +
    7088 g_retroflat_state->tex_palette[idx][2] = (rgb & 0xff0000) >> 16;
    +
    7089
    +
    7090# elif defined( RETROFLAT_API_SDL2 )
    +
    7091
    +
    7092 g_retroflat_state->palette[idx].b = rgb & 0xff;
    +
    7093 g_retroflat_state->palette[idx].g = (rgb & 0xff00) >> 8;
    +
    7094 g_retroflat_state->palette[idx].r = (rgb & 0xff0000) >> 16;
    +
    7095
    +
    7096# elif defined( RETROFLAT_API_PC_BIOS )
    +
    7097
    +
    7098 /* Set VGA mask register. */
    +
    7099 switch( g_retroflat_state->screen_mode ) {
    +
    7100 case RETROFLAT_SCREEN_MODE_VGA:
    +
    7101 /* TODO: This doesn't seem to be working in DOSBox? */
    +
    7102 outp( 0x3c6, 0xff );
    +
    7103 outp( 0x3c8, idx );
    +
    7104
    +
    7105 byte_buffer = (rgb >> 16) & 0x3f;
    +
    7106 debug_printf( 1, "r: %u", byte_buffer );
    +
    7107 outp( 0x3c9, byte_buffer );
    +
    7108
    +
    7109 byte_buffer = (rgb >> 8) & 0x3f;
    +
    7110 debug_printf( 1, "g: %u", byte_buffer );
    +
    7111 outp( 0x3c9, byte_buffer );
    +
    7112
    +
    7113 byte_buffer = rgb & 0x3f;
    +
    7114 debug_printf( 1, "b: %u", byte_buffer );
    +
    7115 outp( 0x3c9, byte_buffer );
    +
    7116 break;
    +
    7117
    +
    7118 default:
    +
    7119 error_printf( "could not set palette index %d in screen mode %d!",
    +
    7120 idx, g_retroflat_state->screen_mode );
    +
    7121 break;
    +
    7122 }
    +
    7123
    +
    7124# else
    +
    7125# pragma message( "warning: set palette not implemented" )
    +
    7126# endif
    +
    7127
    +
    7128 return retval;
    +
    7129}
    +
    7130
    +
    7131/* === */
    +
    7132
    +
    7133void retroflat_set_proc_resize(
    +
    7134 retroflat_proc_resize_t on_resize_in, void* data_in
    +
    7135) {
    +
    7136 g_retroflat_state->on_resize = on_resize_in;
    +
    7137 g_retroflat_state->on_resize_data = data_in;
    +
    7138}
    +
    7139
    +
    7140/* === */
    +
    7141
    +
    7142void retroflat_resize_v() {
    +
    7143# if defined( RETROFLAT_API_SDL2 )
    +
    7144
    +
    7145 g_retroflat_state->screen_v_w = g_retroflat_state->screen_w;
    +
    7146 g_retroflat_state->screen_v_h = g_retroflat_state->screen_h;
    +
    7147
    +
    7148 assert( NULL != g_retroflat_state->buffer.texture );
    +
    7149 SDL_DestroyTexture( g_retroflat_state->buffer.texture );
    +
    7150
    +
    7151 /* Create the buffer texture. */
    +
    7152 g_retroflat_state->buffer.texture =
    +
    7153 SDL_CreateTexture( g_retroflat_state->buffer.renderer,
    +
    7154 SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,
    +
    7155 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    7156
    +
    7157# endif /* RETROFLAT_API_SDL2 */
    +
    7158}
    +
    7159
    +
    7160/* === */
    +
    7161
    +
    7162RETROFLAT_IN_KEY retroflat_poll_input( struct RETROFLAT_INPUT* input ) {
    +
    7163# if defined( RETROFLAT_OS_DOS ) || defined( RETROFLAT_OS_DOS_REAL )
    +
    7164 union REGS inregs;
    +
    7165 union REGS outregs;
    +
    7166# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    7167 int eres = 0;
    +
    7168 SDL_Event event;
    +
    7169# endif /* RETROFLAT_API_ALLEGRO && RETROFLAT_OS_DOS */
    +
    7170 RETROFLAT_IN_KEY key_out = 0;
    +
    7171
    +
    7172 assert( NULL != input );
    +
    7173
    +
    7174 input->key_flags = 0;
    +
    7175
    +
    7176# if defined( RETROFLAT_API_ALLEGRO )
    +
    7177
    +
    7178 /* == Allegro == */
    +
    7179
    +
    7180 if( g_retroflat_state->close_button ) {
    +
    7181 retroflat_quit( 0 );
    +
    7182 return 0;
    +
    7183 }
    +
    7184
    +
    7185# ifdef RETROFLAT_OS_DOS
    +
    7186
    +
    7187 /* Poll the mouse. */
    +
    7188 inregs.w.ax = 3;
    +
    7189 int386( 0x33, &inregs, &outregs );
    +
    7190
    +
    7191 if(
    +
    7192 1 == outregs.x.ebx && /* Left button clicked. */
    +
    7193 outregs.w.cx != g_retroflat_state->last_mouse_x &&
    +
    7194 outregs.w.dx != g_retroflat_state->last_mouse_y
    +
    7195 ) {
    +
    7196 input->mouse_x = outregs.w.cx;
    +
    7197 input->mouse_y = outregs.w.dx;
    +
    7198
    +
    7199 /* Prevent repeated clicks. */
    +
    7200 g_retroflat_state->last_mouse_x = input->mouse_x;
    +
    7201 g_retroflat_state->last_mouse_y = input->mouse_y;
    +
    7202
    +
    7203 return RETROFLAT_MOUSE_B_LEFT;
    +
    7204 } else {
    +
    7205 g_retroflat_state->last_mouse_x = outregs.w.cx;
    +
    7206 g_retroflat_state->last_mouse_y = outregs.w.dx;
    +
    7207 }
    +
    7208
    +
    7209# else
    +
    7210 /* Allegro mouse is broken in DOS. */
    +
    7211 poll_mouse();
    +
    7212 if( mouse_b & 0x01 ) {
    +
    7213 input->mouse_x = mouse_x;
    +
    7214 input->mouse_y = mouse_y;
    +
    7215 return RETROFLAT_MOUSE_B_LEFT;
    +
    7216 } else if( mouse_b & 0x02 ) {
    +
    7217 input->mouse_x = mouse_x;
    +
    7218 input->mouse_y = mouse_y;
    +
    7219 return RETROFLAT_MOUSE_B_RIGHT;
    +
    7220 }
    +
    7221# endif /* RETROFLAT_OS_DOS */
    +
    7222
    +
    7223 poll_keyboard();
    +
    7224 if( keypressed() ) {
    +
    7225 /* TODO: ??? */
    +
    7226 if( KB_SHIFT_FLAG == (KB_SHIFT_FLAG & key_shifts) ) {
    +
    7227 input->key_flags |= RETROFLAT_INPUT_MOD_SHIFT;
    +
    7228 }
    +
    7229
    +
    7230 if( KB_CTRL_FLAG == (KB_CTRL_FLAG & key_shifts) ) {
    +
    7231 input->key_flags |= RETROFLAT_INPUT_MOD_CTRL;
    +
    7232 }
    +
    7233
    +
    7234 if( KB_ALT_FLAG == (KB_ALT_FLAG & key_shifts) ) {
    +
    7235 input->key_flags |= RETROFLAT_INPUT_MOD_ALT;
    +
    7236 }
    +
    7237
    +
    7238 return (readkey() >> 8);
    +
    7239 }
    +
    7240
    +
    7241# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    7242
    +
    7243 /* == SDL == */
    +
    7244
    +
    7245 SDL_PollEvent( &event );
    +
    7246
    +
    7247 switch( event.type ) {
    +
    7248 case SDL_QUIT:
    +
    7249 /* Handle SDL window close. */
    +
    7250 retroflat_quit( 0 );
    +
    7251 break;
    +
    7252
    +
    7253 case SDL_KEYDOWN:
    +
    7254 key_out = event.key.keysym.sym;
    +
    7255
    +
    7256 if(
    +
    7257 KMOD_RSHIFT == (KMOD_RSHIFT & event.key.keysym.mod) ||
    +
    7258 KMOD_LSHIFT == (KMOD_LSHIFT & event.key.keysym.mod)
    +
    7259 ) {
    +
    7260 input->key_flags |= RETROFLAT_INPUT_MOD_SHIFT;
    +
    7261 }
    +
    7262
    +
    7263 if( KMOD_CTRL == (KMOD_CTRL & event.key.keysym.mod) ) {
    +
    7264 input->key_flags |= RETROFLAT_INPUT_MOD_CTRL;
    +
    7265 }
    +
    7266
    +
    7267 if( KMOD_ALT == (KMOD_ALT & event.key.keysym.mod) ) {
    +
    7268 input->key_flags |= RETROFLAT_INPUT_MOD_ALT;
    +
    7269 }
    +
    7270
    +
    7271 /* Flush key buffer to improve responsiveness. */
    +
    7272 if(
    + +
    7274 (RETROFLAT_FLAGS_KEY_REPEAT & g_retroflat_state->retroflat_flags)
    +
    7275 ) {
    +
    7276 while( (eres = SDL_PollEvent( &event )) );
    +
    7277 }
    +
    7278 break;
    +
    7279
    +
    7280 case SDL_MOUSEBUTTONUP:
    +
    7281 /* Stop dragging. */
    +
    7282 g_retroflat_state->mouse_state = 0;
    +
    7283 break;
    +
    7284
    +
    7285 case SDL_MOUSEBUTTONDOWN:
    +
    7286
    +
    7287 /* Begin dragging. */
    +
    7288
    +
    7289 input->mouse_x = event.button.x;
    +
    7290 input->mouse_y = event.button.y;
    +
    7291
    +
    7292 /* Differentiate which button was clicked. */
    +
    7293 if( SDL_BUTTON_LEFT == event.button.button ) {
    +
    7294 key_out = RETROFLAT_MOUSE_B_LEFT;
    +
    7295 g_retroflat_state->mouse_state = RETROFLAT_MOUSE_B_LEFT;
    +
    7296 } else if( SDL_BUTTON_RIGHT == event.button.button ) {
    +
    7297 key_out = RETROFLAT_MOUSE_B_RIGHT;
    +
    7298 g_retroflat_state->mouse_state = RETROFLAT_MOUSE_B_RIGHT;
    +
    7299 }
    +
    7300
    +
    7301 /* Flush key buffer to improve responsiveness. */
    +
    7302 /*while( (eres = SDL_PollEvent( &event )) );*/
    +
    7303 break;
    +
    7304
    +
    7305# if !defined( RETROFLAT_API_SDL1 )
    +
    7306 case SDL_WINDOWEVENT:
    +
    7307 switch( event.window.event ) {
    +
    7308 case SDL_WINDOWEVENT_RESIZED:
    +
    7309 retroflat_on_resize( event.window.data1, event.window.data2 );
    +
    7310 if( NULL != g_retroflat_state->on_resize ) {
    +
    7311 g_retroflat_state->on_resize(
    +
    7312 event.window.data1, event.window.data2,
    +
    7313 g_retroflat_state->on_resize_data );
    +
    7314 }
    +
    7315 break;
    +
    7316 }
    +
    7317 break;
    +
    7318# endif /* !RETROFLAT_API_SDL1 */
    +
    7319
    +
    7320 default:
    +
    7321 /* Check for mouse dragging if mouse was previously held down. */
    +
    7322 if( 0 != g_retroflat_state->mouse_state ) {
    +
    7323 /* Update coordinates and keep dragging. */
    +
    7324 SDL_GetMouseState( &(input->mouse_x), &(input->mouse_y) );
    +
    7325 key_out = g_retroflat_state->mouse_state;
    +
    7326 }
    +
    7327 break;
    +
    7328 }
    +
    7329
    +
    7330# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    7331
    +
    7332 /* == Win16/Win32 == */
    +
    7333
    +
    7334 if( g_retroflat_state->last_key ) {
    +
    7335 /* Return g_retroflat_state->last_key, which is set in WndProc when a keypress msg is
    +
    7336 * received.
    +
    7337 */
    +
    7338 key_out = g_retroflat_state->last_key;
    +
    7339 input->key_flags = g_retroflat_state->vk_mods;
    +
    7340
    +
    7341 debug_printf( RETROFLAT_KB_TRACE_LVL, "raw key: 0x%04x", key_out );
    +
    7342
    +
    7343 /* Reset pressed key. */
    +
    7344 g_retroflat_state->last_key = 0;
    +
    7345
    +
    7346 } else if( g_retroflat_state->last_mouse ) {
    +
    7347 if( MK_LBUTTON == (MK_LBUTTON & g_retroflat_state->last_mouse) ) {
    +
    7348 input->mouse_x = g_retroflat_state->last_mouse_x;
    +
    7349 input->mouse_y = g_retroflat_state->last_mouse_y;
    +
    7350 key_out = RETROFLAT_MOUSE_B_LEFT;
    +
    7351 } else if( MK_RBUTTON == (MK_RBUTTON & g_retroflat_state->last_mouse) ) {
    +
    7352 input->mouse_x = g_retroflat_state->last_mouse_x;
    +
    7353 input->mouse_y = g_retroflat_state->last_mouse_y;
    +
    7354 key_out = RETROFLAT_MOUSE_B_RIGHT;
    +
    7355 }
    +
    7356 g_retroflat_state->last_mouse = 0;
    +
    7357 g_retroflat_state->last_mouse_x = 0;
    +
    7358 g_retroflat_state->last_mouse_y = 0;
    +
    7359 }
    +
    7360
    +
    7361# ifdef RETROFLAT_SCREENSAVER
    +
    7362 if(
    + +
    7364 (RETROFLAT_FLAGS_SCREENSAVER & g_retroflat_state->retroflat_flags))
    +
    7365 && 0 != key_out
    +
    7366 ) {
    +
    7367 /* retroflat_quit( 0 ); */
    +
    7368 }
    +
    7369# endif /* RETROFLAT_SCREENSAVER */
    +
    7370
    +
    7371# elif defined( RETROFLAT_API_GLUT )
    +
    7372
    +
    7373 /* TODO: Implement RETROFLAT_MOD_SHIFT. */
    +
    7374
    +
    7375 key_out = g_retroflat_state->retroflat_last_key;
    +
    7376 g_retroflat_state->retroflat_last_key = 0;
    +
    7377
    +
    7378 /* TODO: Handle mouse. */
    +
    7379
    +
    7380# elif defined( RETROFLAT_API_PC_BIOS )
    +
    7381
    +
    7382 /* TODO: Poll the mouse. */
    +
    7383
    +
    7384 /* TODO: Implement RETROFLAT_MOD_SHIFT. */
    +
    7385
    +
    7386 if( kbhit() ) {
    +
    7387 /* Poll the keyboard. */
    +
    7388 key_out = getch();
    +
    7389 debug_printf( 2, "key: 0x%02x", key_out );
    +
    7390 if( 0 == key_out ) {
    +
    7391 /* Special key was pressed that returns two scan codes. */
    +
    7392 key_out = getch();
    +
    7393 switch( key_out ) {
    +
    7394 case 0x48: key_out = RETROFLAT_KEY_UP; break;
    +
    7395 case 0x4b: key_out = RETROFLAT_KEY_LEFT; break;
    +
    7396 case 0x4d: key_out = RETROFLAT_KEY_RIGHT; break;
    +
    7397 case 0x50: key_out = RETROFLAT_KEY_DOWN; break;
    +
    7398 case 0x4f: key_out = RETROFLAT_KEY_HOME; break;
    +
    7399 case 0x47: key_out = RETROFLAT_KEY_END; break;
    +
    7400 case 0x51: key_out = RETROFLAT_KEY_PGDN; break;
    +
    7401 case 0x49: key_out = RETROFLAT_KEY_PGUP; break;
    +
    7402 case 0x53: key_out = RETROFLAT_KEY_DELETE; break;
    +
    7403 }
    +
    7404 }
    +
    7405 if(
    + +
    7407 (RETROFLAT_FLAGS_KEY_REPEAT & g_retroflat_state->retroflat_flags)
    +
    7408 ) {
    +
    7409 while( kbhit() ) {
    +
    7410 getch();
    +
    7411 }
    +
    7412 }
    +
    7413 }
    +
    7414
    +
    7415# else
    +
    7416# pragma message( "warning: poll input not implemented" )
    +
    7417# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    7418
    +
    7419 /* TODO: Handle NDS input! */
    +
    7420
    +
    7421 return key_out;
    +
    7422}
    +
    7423
    +
    7424/* === */
    +
    7425
    +
    7426MERROR_RETVAL retroflat_config_open( RETROFLAT_CONFIG* config, uint8_t flags ) {
    +
    7427 MERROR_RETVAL retval = MERROR_OK;
    +
    7428
    +
    7429# if defined( RETROFLAT_CONFIG_USE_FILE )
    +
    7430 char flag_buffer[3] = { '\0', '\0', '\0' };
    +
    7431
    + +
    7433 flag_buffer[0] = 'w';
    +
    7434 } else {
    +
    7435 flag_buffer[0] = 'r';
    +
    7436 }
    +
    7437
    + +
    7439 flag_buffer[1] = 'b';
    +
    7440 }
    +
    7441
    +
    7442 debug_printf( 1, "opening config file %s with mode [%s]...",
    +
    7443 g_retroflat_state->config_path, flag_buffer );
    +
    7444
    +
    7445 *config = fopen( g_retroflat_state->config_path, flag_buffer );
    +
    7446 maug_cleanup_if_null( RETROFLAT_CONFIG, *config, MERROR_FILE );
    +
    7447
    +
    7448cleanup:
    +
    7449# elif defined( RETROFLAT_API_WIN16 )
    +
    7450
    +
    7451 /* == Win16 (.ini file) == */
    +
    7452
    +
    7453 /* TODO */
    +
    7454
    +
    7455# elif defined( RETROFLAT_API_WIN32 )
    +
    7456
    +
    7457 /* == Win32 (Registry) == */
    +
    7458
    +
    7459 char key_path[RETROFLAT_PATH_MAX + 1] = "SOFTWARE\\";
    +
    7460
    +
    7461 /* TODO */
    +
    7462 strncat( key_path, "RetroFlat", RETROFLAT_PATH_MAX );
    +
    7463
    +
    7464 /* TODO */
    +
    7465 if( ERROR_SUCCESS != RegOpenKey(
    +
    7466 HKEY_CURRENT_USER,
    +
    7467 key_path,
    +
    7468 (HKEY*)config
    +
    7469 ) ) {
    +
    7470 retval = MERROR_FILE;
    +
    7471 }
    +
    7472
    +
    7473# else
    +
    7474# pragma message( "warning: config close not implemented" )
    +
    7475# endif
    +
    7476
    +
    7477 return retval;
    +
    7478}
    +
    7479
    +
    7480/* === */
    +
    7481
    +
    7482void retroflat_config_close( RETROFLAT_CONFIG* config ) {
    +
    7483
    +
    7484# if defined( RETROFLAT_CONFIG_USE_FILE )
    +
    7485
    +
    7486 debug_printf( 1, "closing config file..." );
    +
    7487 fclose( *config );
    +
    7488 *config = NULL;
    +
    7489
    +
    7490# elif defined( RETROFLAT_API_WIN16 )
    +
    7491
    +
    7492 /* TODO */
    +
    7493
    +
    7494# elif defined( RETROFLAT_API_WIN32 )
    +
    7495
    +
    7496 /* == Win32 (Registry) == */
    +
    7497
    +
    7498 /* TODO */
    +
    7499
    +
    7500# else
    +
    7501# pragma message( "warning: config close not implemented" )
    +
    7502# endif
    +
    7503
    +
    7504}
    +
    7505
    +
    7506/* === */
    +
    7507
    +
    7508#ifdef RETROFLAT_CONFIG_USE_FILE
    +
    7509
    +
    7515static char* retroflat_config_tok_sect(
    +
    7516 char* line, size_t line_sz, const char* sect_name, size_t* sect_match
    +
    7517) {
    +
    7518
    +
    7519 /* Section check. */
    +
    7520 if( '[' == line[0] ) {
    +
    7521 *sect_match = strncmp( sect_name, &(line[1]), line_sz - 2 );
    +
    7522 if( 0 == *sect_match ) {
    +
    7523 /* TODO: Tokenize at closing bracket. */
    +
    7524 line[line_sz - 1] = '\0';
    +
    7525 debug_printf( 1, "found section: %s", &(line[1]) );
    +
    7526 }
    +
    7527 return line;
    +
    7528 }
    +
    7529
    +
    7530 return NULL;
    +
    7531}
    +
    7532
    +
    7533#endif /* RETROFLAT_CONFIG_USE_FILE */
    +
    7534
    +
    7535/* === */
    +
    7536
    + +
    7538 RETROFLAT_CONFIG* config,
    +
    7539 const char* sect_name, const char* key_name, uint8_t buffer_type,
    +
    7540 void* buffer, size_t buffer_sz_max
    +
    7541) {
    +
    7542 size_t retval = 0;
    +
    7543
    +
    7544 /* TODO */
    +
    7545
    +
    7546 return retval;
    +
    7547}
    +
    7548
    +
    7549/* === */
    +
    7550
    + +
    7552 RETROFLAT_CONFIG* config,
    +
    7553 const char* sect_name, const char* key_name, uint8_t buffer_type,
    +
    7554 void* buffer_out, size_t buffer_out_sz_max,
    +
    7555 const void* default_out, size_t default_out_sz
    +
    7556) {
    +
    7557 size_t retval = 0;
    +
    7558# if defined( RETROFLAT_CONFIG_USE_FILE )
    +
    7559 char line[RETROFLAT_CONFIG_LN_SZ_MAX + 1];
    +
    7560 char* line_val = NULL;
    +
    7561 size_t line_sz = 0;
    +
    7562 size_t sect_match = 1;
    +
    7563# endif /* RETROFLAT_API_WIN32 */
    +
    7564
    +
    7565 /* TODO: Adjust this to use mfile! */
    +
    7566
    +
    7567# if defined( RETROFLAT_CONFIG_USE_FILE )
    +
    7568
    +
    7569 /* == SDL / Allegro == */
    +
    7570
    +
    7571 while( fgets( line, RETROFLAT_CONFIG_LN_SZ_MAX, *config ) ) {
    +
    7572 /* Size check. */
    +
    7573 line_sz = strlen( line );
    +
    7574 if( 1 >= line_sz || RETROFLAT_CONFIG_LN_SZ_MAX <= line_sz ) {
    +
    7575 error_printf( "invalid line sz: " SIZE_T_FMT, line_sz );
    +
    7576 continue;
    +
    7577 }
    +
    7578
    +
    7579 /* Strip off trailing newline. */
    +
    7580 if( '\n' == line[line_sz - 1] || '\r' == line[line_sz - 1] ) {
    +
    7581 debug_printf( 1, "stripping newline!" );
    +
    7582 line_sz--;
    +
    7583 line[line_sz] = '\0'; /* NULL goes after strlen() finishes! */
    +
    7584 }
    +
    7585
    +
    7586 /* Section check. */
    +
    7587 if(
    +
    7588 retroflat_config_tok_sect( line, line_sz, sect_name, &sect_match )
    +
    7589 ) {
    +
    7590 continue;
    +
    7591 }
    +
    7592
    +
    7593 /* Split up key/value pair. */
    +
    7594 line_val = strchr( line, '=' );
    +
    7595 if( NULL == line_val || line_val == line ) {
    +
    7596 error_printf( "invalid line: %s", line );
    +
    7597 continue;
    +
    7598 }
    +
    7599
    +
    7600 /* Terminate key. */
    +
    7601 line_val[0] = '\0';
    +
    7602 line_val++;
    +
    7603
    +
    7604 if( 0 == sect_match && 0 == strcmp( key_name, line ) ) {
    +
    7605 debug_printf( 1, "found %s: %s", line, line_val );
    +
    7606
    +
    7607 switch( buffer_type ) {
    +
    7608 case RETROFLAT_BUFFER_INT:
    +
    7609 *((int*)buffer_out) = atoi( line_val );
    +
    7610 goto cleanup;
    +
    7611
    +
    7612 case RETROFLAT_BUFFER_FLOAT:
    +
    7613 *((float*)buffer_out) = atof( line_val );
    +
    7614 goto cleanup;
    +
    7615
    +
    7616 case RETROFLAT_BUFFER_STRING:
    +
    7617 strncpy( (char*)buffer_out, line_val, buffer_out_sz_max );
    +
    7618 goto cleanup;
    +
    7619
    +
    7620 case RETROFLAT_BUFFER_BOOL:
    +
    7621 /* TODO */
    +
    7622 goto cleanup;
    +
    7623 }
    +
    7624 }
    +
    7625 }
    +
    7626
    +
    7627cleanup:
    +
    7628
    +
    7629 fseek( *config, 0, SEEK_SET );
    +
    7630
    +
    7631# elif defined( RETROFLAT_API_WIN16 )
    +
    7632
    +
    7633 /* == Win16 (.ini file) == */
    +
    7634
    +
    7635/* XXX
    +
    7636 retval = GetPrivateProfileString(
    +
    7637 sect_name, key_name, default_out, buffer_out, buffer_out_sz_max,
    +
    7638 g_retroflat_state->config_path ); */
    +
    7639
    +
    7640# elif defined( RETROFLAT_API_WIN32 )
    +
    7641
    +
    7642 /* == Win32 (Registry) == */
    +
    7643
    +
    7644 /* TODO */
    +
    7645
    +
    7646# else
    +
    7647# pragma message( "warning: config read not implemented" )
    +
    7648# endif
    +
    7649
    +
    7650 return retval;
    +
    7651}
    +
    7652
    +
    7653#elif !defined( RETROVDP_C ) /* End of RETROFLT_C */
    +
    7654
    +
    7655#define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    7656 extern MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u;
    +
    7657
    +
    7658RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CONSTS )
    +
    7659
    +
    7660extern MAUG_CONST char* SEG_MCONST gc_retroflat_color_names[];
    +
    7661
    +
    7662 extern struct RETROFLAT_STATE* g_retroflat_state;
    +
    7663# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    7664 extern HINSTANCE g_retroflat_instance;
    +
    7665 extern int g_retroflat_cmd_show;
    +
    7666# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    7667
    +
    7668# include <uprintf.h>
    +
    7669
    +
    7670# if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES)) \
    +
    7671 && !defined( MAUG_NO_AUTO_C )
    +
    7672# include <retrofp.h>
    +
    7673# include <retrosft.h>
    +
    7674# endif /* RETROFLAT_SOFT_SHAPES || RETROFLAT_SOFT_LINES */
    +
    7675
    +
    7676# if defined( RETROFLAT_OPENGL ) && !defined( MAUG_NO_AUTO_C )
    +
    7677# include <retroglu.h>
    +
    7678# include <retrofp.h>
    +
    7679# include <retrosft.h>
    +
    7680# endif /* RETROFLAT_OPENGL */
    +
    7681
    +
    7682#endif /* RETROFLT_C */
    +
    7683
    +
    7684#ifdef RETROFLAT_XPM
    +
    7685#include <retroxpm.h>
    +
    7686#endif /* RETROFLAT_XPM */
    +
    7687
    +
    7688#ifdef RETROVDP_C
    +
    7689
    +
    7690/* Declarations for VDP sources. */
    +
    7691
    +
    7692#endif /* RETROVDP_C */
    +
    7693
    +
    7694 /* maug_retroflt */
    +
    7695
    +
    7696#endif /* RETROFLT_H */
    +
    7697
    +
    MERROR_RETVAL maug_add_arg(const char *arg, int arg_sz, const char *help, int help_sz, maug_cli_cb arg_cb, maug_cli_cb def_cb, void *data)
    Add a command-line argument to the built-in parser.
    +
    #define MAUG_CLI_SIGIL
    Default flag to prepend to CLI arguments. Is "/" on Windows/DOS and "-" on other platforms....
    Definition marge.h:36
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    MERROR_RETVAL mfmt_read_bmp_px(struct MFMT_STRUCT *header, uint8_t SEG_FAR *px, off_t px_sz, mfile_t *p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags)
    Read mfmt_bitmap pixels into an 8-bit memory bitmap.
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
    Open a file and read it into memory or memory-map it.
    +
    void mfile_close(mfile_t *p_file)
    Close a file opened with mfile_open_read().
    +
    char retroflat_asset_path[RETROFLAT_PATH_MAX]
    Path/name used to load an asset from disk.
    Definition retroflt.h:816
    +
    #define RETROFLAT_BITMAP_EXT
    The filename suffix to be appended with a "." to filenames passed to retroflat_load_bitmap()....
    Definition retroflt.h:611
    +
    #define RETROFLAT_TXP_G
    Compiler-define-overridable constant indicating the Green value of the transparency color on platform...
    Definition retroflt.h:634
    +
    void retroflat_blit_bitmap(struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
    Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
    +
    void retroflat_destroy_bitmap(struct RETROFLAT_BITMAP *bitmap)
    Unload a bitmap from a RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on th...
    +
    MERROR_RETVAL retroflat_load_bitmap(const char *filename, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
    Load a bitmap into the given RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to th...
    +
    #define RETROFLAT_TXP_B
    Compiler-define-overridable constant indicating the Blue value of the transparency color on platforms...
    Definition retroflt.h:643
    +
    #define retroflat_bitmap_ok(bitmap)
    Check to see if a bitmap is loaded.
    Definition retroflt.h:2044
    +
    #define RETROFLAT_TXP_R
    Compiler-define-overridable constant indicating the Red value of the transparency color on platforms ...
    Definition retroflt.h:625
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    #define RETROFLAT_COLOR_TABLE(f)
    This macro defines all colors supported by RetroFlat for primative operations, particularly using ret...
    Definition retroflt.h:295
    +
    #define RETROFLAT_WIN_LOOP_TIMER_ID
    Unique ID for the timer that execute loop ticks in Win16/Win32. Is a RetroFlat Compiler Definitions.
    Definition retroflt.h:721
    +
    #define NDS_SPRITES_ACTIVE
    Maximum number of sprites active on-screen on Nintendo DS.
    Definition retroflt.h:789
    +
    #define RETROFLAT_WIN_FRAME_TIMER_ID
    Unique ID for the timer that execute frame draws in Win16/Win32. Is a RetroFlat Compiler Definitions.
    Definition retroflt.h:713
    +
    #define RETROFLAT_VDP_ARGS_SZ_MAX
    Definition retroflt.h:745
    +
    #define RETROFLAT_MSG_MAX
    Maximum number of characters possible in a message using retroflat_message(). Is a RetroFlat Compiler...
    Definition retroflt.h:729
    +
    #define RETROFLAT_WINDOW_CLASS
    Unique window class to use on some platforms (e.g. Win32). Is a RetroFlat Compiler Definitions.
    Definition retroflt.h:705
    +
    #define RETROFLAT_FPS
    Target Frames Per Second.
    Definition retroflt.h:695
    +
    #define RETROFLAT_ASSETS_PATH_MAX
    Maximum size of the assets path, to allow room for appending.
    Definition retroflt.h:780
    +
    #define NDS_OAM_ACTIVE
    Active sprite engine screen on Nintendo DS.
    Definition retroflt.h:784
    +
    #define RETROFLAT_PATH_MAX
    Maximum size allocated for asset paths.
    Definition retroflt.h:734
    +
    #define RETROFLAT_PATH_SEP
    The valid path separator on the target platform.
    Definition retroflt.h:776
    +
    #define RETROFLAT_CONFIG_FLAG_W
    Flag indicating config object should be opened for WRITING only.
    Definition retroflt.h:480
    +
    #define RETROFLAT_CONFIG_FLAG_BIN
    Flag indicating config object holds BINARY data.
    Definition retroflt.h:485
    +
    FILE * RETROFLAT_CONFIG
    A configuration object to use with the RetroFlat Config API.
    Definition retroflt.h:2020
    +
    size_t retroflat_config_write(RETROFLAT_CONFIG *config, const char *sect_name, const char *key_name, uint8_t buffer_type, void *buffer, size_t buffer_sz_max)
    Write the contents of a buffer to a config object.
    +
    size_t retroflat_config_read(RETROFLAT_CONFIG *config, const char *sect_name, const char *key_name, uint8_t buffer_type, void *buffer_out, size_t buffer_out_sz_max, const void *default_out, size_t default_out_sz)
    Write the contents of a buffer to a config object.
    +
    MERROR_RETVAL retroflat_config_open(RETROFLAT_CONFIG *config, uint8_t flags)
    Open a configuration file/registry/SRAM/etc handle.
    +
    #define RETROFLAT_FLAGS_LITERAL_PATH
    Flag for retroflat_load_bitmap() to not use assets path.
    Definition retroflt.h:388
    +
    void retroflat_ellipse(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
    Draw an ellipse onto the target RETROFLAT_BITMAP.
    +
    #define RETROFLAT_FLAGS_OPAQUE
    Flag for retroflat_create_bitmap() to create a bitmap without transparency.
    Definition retroflt.h:375
    +
    MERROR_RETVAL retroflat_draw_lock(struct RETROFLAT_BITMAP *bmp)
    Lock a bitmap for drawing. This will be done automatically if necessary and not called explicitly,...
    +
    void retroflat_string_sz(struct RETROFLAT_BITMAP *target, const char *str, size_t str_sz, const char *font_str, size_t *w_out, size_t *h_out, uint8_t flags)
    Get the size in pixels of a text string when drawn with a given font by retroflat_string().
    +
    void retroflat_rect(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
    Draw a rectangle onto the target RETROFLAT_BITMAP.
    +
    #define RETROFLAT_FLAGS_FILL
    Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
    Definition retroflt.h:369
    +
    #define RETROFLAT_FLAGS_SCREEN_BUFFER
    Flag for retroflat_create_bitmap() to create a WinG-backed bitmap.
    Definition retroflt.h:404
    +
    void retroflat_string(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, const char *str, int str_sz, const char *font_str, int16_t x_orig, int16_t y_orig, uint8_t flags)
    Draw a text string at the specified location in the specified font and color on the target RETROFLAT_...
    +
    void retroflat_line(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags)
    Draw a straight line onto the target RETROFLAT_BITMAP.
    +
    #define RETROFLAT_FLAGS_SCREENSAVER
    Flag indicating the current application is running as a screensaver.
    Definition retroflt.h:437
    +
    #define RETROFLAT_FLAGS_UNLOCK_FPS
    Flag indicating FPS should not be capped.
    Definition retroflt.h:425
    +
    #define RETROFLAT_FLAGS_SCALE2X
    Only supported on some platforms: Attempt to scale screen by 2X.
    Definition retroflt.h:442
    +
    #define RETROFLAT_FLAGS_RUNNING
    Flag indicating that retroflat_loop() should continue executing.
    Definition retroflt.h:419
    +
    #define RETROFLAT_FLAGS_KEY_REPEAT
    Flag indicating keyboard repeat is enabled.
    Definition retroflt.h:431
    +
    RETROFLAT_IN_KEY retroflat_poll_input(struct RETROFLAT_INPUT *input)
    Poll input devices (keyboard/mouse) and return the latest event.
    +
    #define RETROFLAT_MSG_FLAG_WARNING
    This icon/type flag indicates a condition the user should be aware of. It will try to display message...
    Definition retroflt.h:519
    +
    #define RETROFLAT_MSG_FLAG_TYPE_MASK
    This mask covers all possible icon/type flags.
    Definition retroflt.h:499
    +
    #define RETROFLAT_MSG_FLAG_INFO
    This icon/type flag indicates an informational notice. It will try to display messages in a definite ...
    Definition retroflt.h:512
    +
    #define RETROFLAT_MSG_FLAG_ERROR
    This icon/type flag indicates an error. It will try to display messages in an urgent way with a red i...
    Definition retroflt.h:505
    +
    #define RETROFLAT_OK
    Certain functions return this when there was no problem.
    Definition retroflt.h:334
    +
    #define RETROFLAT_ERROR_BITMAP
    Returned if there is a problem loading or locking a RETROFLAT_BITMAP struct.
    Definition retroflt.h:343
    +
    MERROR_RETVAL retroflat_vdp_call(const char *proc_name)
    Call a function from the retroflat VDP.
    +
    MERROR_RETVAL(* retroflat_vdp_proc_t)(struct RETROFLAT_STATE *)
    VDP function called from the VDP library.
    Definition retroflt.h:557
    +
    #define RETROFLAT_VDP_FLAG_PXLOCK
    Flag for RETROFLAT_STATE::vdp_flags indicating the VDP requires RetroFlat to pixel-lock the frame bef...
    Definition retroflt.h:544
    +
    void retroflat_shutdown(int retval)
    Deinitialize RetroFlat and its underlying layers. This should be called once at the end of the progra...
    +
    #define retroflat_screen_h()
    Get the current screen height in pixels.
    Definition retroflt.h:2052
    +
    #define retroflat_quit(retval_in)
    This should be called in order to quit a program using RetroFlat.
    Definition retroflt.h:2061
    +
    #define retroflat_screen_buffer()
    Get the direct screen buffer or the VDP buffer if a VDP is loaded.
    Definition retroflt.h:2055
    +
    void(* retroflat_loop_iter)(void *data)
    Prototype for the main loop function passed to retroflat_loop().
    Definition retroflt.h:828
    +
    MERROR_RETVAL retroflat_loop(retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void *data)
    This should be called once in the main body of the program in order to enter the main loop....
    +
    void retroflat_message(uint8_t flags, const char *title, const char *format,...)
    Display a message in a dialog box and/or on stderr.
    +
    #define retroflat_screen_w()
    Get the current screen width in pixels.
    Definition retroflt.h:2049
    +
    MERROR_RETVAL retroflat_init(int argc, char *argv[], struct RETROFLAT_ARGS *args)
    Initialize RetroFlat and its underlying layers. This should be called once at the beginning of the pr...
    +
    #define retroglu_whf(w, h, w_f, h_f, aspect_f)
    Convert width/height in pixels to proportional float values for OpenGL.
    Definition retroglu.h:278
    +
    #define retroglu_push_overlay(x, y, x_f, y_f, aspect_f)
    Push current projection modelview and prepare useful parameters for drawing a textured overlay.
    Definition retroglu.h:252
    +
    #define retroglu_pop_overlay()
    Restore projection modelview previously pushed using retroglu_push().
    Definition retroglu.h:285
    +
    Contains functions and macros for working with fixed-point numbers.
    +
    Library of tools for working with RetroFlat and OpenGL.
    +
    Definition mfile.h:45
    +
    Definition mfmt.h:105
    +
    Generic image description struct.
    Definition mfmt.h:56
    +
    uint32_t sz
    Size of this struct (use to tell apart).
    Definition mfmt.h:58
    +
    Struct containing configuration values for a RetroFlat program.
    Definition retroflt.h:2177
    +
    char * config_path
    Relative path of local config file (if not using registry).
    Definition retroflt.h:2187
    +
    char * assets_path
    Relative path under which bitmap assets are stored.
    Definition retroflt.h:2184
    +
    int screen_h
    Desired screen or window height in pixels.
    Definition retroflt.h:2194
    +
    char * title
    Title to set for the main program Window if applicable on the target platform.
    Definition retroflt.h:2182
    +
    int screen_y
    Desired window Y position in pixels.
    Definition retroflt.h:2198
    +
    int screen_x
    Desired window X position in pixels.
    Definition retroflt.h:2196
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    size_t sz
    Size of the bitmap structure, used to check VDP compatibility.
    Definition retroflt.h:2037
    +
    uint8_t flags
    Platform-specific bitmap flags.
    Definition retroflt.h:2039
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:878
    +
    int mouse_y
    Y-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:888
    +
    int mouse_x
    X-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:883
    +
    Global singleton containing state for the current platform.
    Definition retroflt.h:2215
    +
    int screen_w
    The screen width as seen by the system, after scaling.
    Definition retroflt.h:2268
    +
    char vdp_args[RETROFLAT_VDP_ARGS_SZ_MAX]
    CLI args passed with -vdp to the RetroFlat VDP API.
    Definition retroflt.h:2246
    +
    uint8_t vdp_flags
    Flags set by the RetroFlat VDP API.
    Definition retroflt.h:2248
    +
    int screen_h
    The screen height as seen by the system, after scaling.
    Definition retroflt.h:2270
    +
    uint8_t retroflat_flags
    Global Flags indicating current system status.
    Definition retroflt.h:2219
    +
    struct RETROFLAT_BITMAP * vdp_buffer
    A buffer assembled and passed to the RetroFlat VDP API for it to modify, or NULL if no VDP is loaded.
    Definition retroflt.h:2233
    +
    int screen_v_h
    The screen height as seen by our program, before scaling.
    Definition retroflt.h:2266
    +
    struct RETROFLAT_BITMAP buffer
    Off-screen buffer bitmap.
    Definition retroflt.h:2225
    +
    void * vdp_exe
    A handle for the loaded RetroFlat VDP API module.
    Definition retroflt.h:2238
    +
    RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ]
    Index of available colors, initialized on platform init.
    Definition retroflt.h:2223
    +
    void * vdp_data
    Pointer to data defined by the RetroFlat VDP API for its use.
    Definition retroflt.h:2244
    +
    int screen_v_w
    The screen width as seen by our program, before scaling.
    Definition retroflt.h:2259
    + +
    + + +
    + + diff --git a/retrofnt_8h.html b/retrofnt_8h.html new file mode 100644 index 00000000..de77ea4a --- /dev/null +++ b/retrofnt_8h.html @@ -0,0 +1,145 @@ + + + + + + + +maug: retrofnt.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retrofnt.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + +

    +Data Structures

    struct  RETROFONT
     
    + + + + + + + + + + +

    +Macros

    +#define RETROFONT_PRESENT   1
     
    +#define RETROFONT_LINE_SZ   80
     
    +#define RETROFONT_TRACE_LVL   0
     
    #define retrofont_glyph_at(p_font, idx)
     Get a pointer to the glyph with the given index in the given font.
     
    + + + + + + + + + +

    +Functions

    +MERROR_RETVAL retrofont_load (const char *font_name, MAUG_MHANDLE *p_font_h, uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count)
     
    +void retrofont_blit_glyph (struct RETROFLAT_BITMAP *target, RETROFLAT_COLOR color, char c, struct RETROFONT *font, size_t x, size_t y, uint8_t flags)
     
    +void retrofont_string (struct RETROFLAT_BITMAP *target, RETROFLAT_COLOR color, const char *str, size_t str_sz, MAUG_MHANDLE font_h, size_t x, size_t y, size_t max_w, size_t max_h, uint8_t flags)
     
    +MERROR_RETVAL retrofont_string_sz (struct RETROFLAT_BITMAP *target, const char *str, size_t str_sz, MAUG_MHANDLE font_h, size_t max_w, size_t max_h, size_t *out_w_p, size_t *out_h_p, uint8_t flags)
     
    +
    + + +
    + + diff --git a/retrofnt_8h_source.html b/retrofnt_8h_source.html new file mode 100644 index 00000000..19074fe0 --- /dev/null +++ b/retrofnt_8h_source.html @@ -0,0 +1,457 @@ + + + + + + + +maug: retrofnt.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrofnt.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROFNT_H
    +
    3#define RETROFNT_H
    +
    4
    +
    11#define RETROFONT_PRESENT 1
    +
    12
    +
    13#ifndef RETROFONT_LINE_SZ
    +
    14# define RETROFONT_LINE_SZ 80
    +
    15#endif /* !RETROFONT_LINE_SZ */
    +
    16
    +
    17#ifndef RETROFONT_TRACE_LVL
    +
    18# define RETROFONT_TRACE_LVL 0
    +
    19#endif /* !RETROFONT_TRACE_LVL */
    +
    20
    +
    +
    21struct RETROFONT {
    +
    22 uint16_t sz;
    +
    23 uint16_t first_glyph;
    +
    24 uint16_t glyphs_count;
    +
    25 uint8_t glyph_w;
    +
    26 uint8_t glyph_h;
    +
    27 uint8_t glyph_sz;
    +
    28};
    +
    +
    29
    +
    30MERROR_RETVAL retrofont_load(
    +
    31 const char* font_name, MAUG_MHANDLE* p_font_h,
    +
    32 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count );
    +
    33
    +
    34void retrofont_blit_glyph(
    +
    35 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    36 char c, struct RETROFONT* font, size_t x, size_t y, uint8_t flags );
    +
    37
    +
    38void retrofont_string(
    +
    39 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    40 const char* str, size_t str_sz,
    +
    41 MAUG_MHANDLE font_h, size_t x, size_t y,
    +
    42 size_t max_w, size_t max_h, uint8_t flags );
    +
    43
    +
    44MERROR_RETVAL retrofont_string_sz(
    +
    45 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    46 MAUG_MHANDLE font_h, size_t max_w, size_t max_h,
    +
    47 size_t* out_w_p, size_t* out_h_p, uint8_t flags );
    +
    48
    +
    +
    52#define retrofont_glyph_at( p_font, idx ) \
    +
    53 &(((uint8_t*)(p_font))[(p_font)->sz + \
    +
    54 ((p_font)->glyph_sz * (idx - (p_font)->first_glyph))])
    +
    +
    55
    +
    56#ifdef RETROFNT_C
    +
    57
    +
    58void retrofont_dump_glyph( uint8_t* glyph, uint8_t w, uint8_t h ) {
    +
    59 size_t x = 0, y = 0;
    +
    60 char glyph_bin[65];
    +
    61
    +
    62 for( y = 0 ; h > y ; y++ ) {
    +
    63 memset( glyph_bin, '\0', 65 );
    +
    64
    +
    65 for( x = 0 ; w > x ; x++ ) {
    +
    66 glyph_bin[x] = 1 << (w - x) == (glyph[y] & (1 << (w - x))) ? 'x' : '.';
    +
    67 }
    +
    68
    +
    69 debug_printf( RETROFONT_TRACE_LVL, "%s", glyph_bin );
    +
    70 }
    +
    71}
    +
    72
    +
    73MERROR_RETVAL retrofont_load(
    +
    74 const char* font_name, MAUG_MHANDLE* p_font_h,
    +
    75 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count
    +
    76) {
    +
    77 MERROR_RETVAL retval = MERROR_OK;
    +
    78 mfile_t font_file;
    +
    79 char line[RETROFONT_LINE_SZ];
    +
    80 struct RETROFONT* font = NULL;
    +
    81 char* line_bytes = NULL;
    +
    82 uint16_t glyph_idx = 0;
    +
    83 uint8_t* p_glyph = NULL;
    +
    84 size_t i = 0;
    +
    85 uint8_t glyph_w_bytes = 0;
    +
    86 uint8_t glyph_w = 0;
    +
    87
    +
    88 /* TODO: Font loading seems to be very slow on a 486. This needs
    +
    89 * investigation.
    +
    90 */
    +
    91
    +
    92 /* Try to separate the string into index:glyph bytes. */
    +
    93 #define retrofont_split_glyph_line( line, line_bytes ) \
    +
    94 line_bytes = strchr( line, ':' ); \
    +
    95 if( NULL == line_bytes ) { \
    +
    96 error_printf( "invalid line: %s", line ); \
    +
    97 retval = MERROR_PARSE; \
    +
    98 } \
    +
    99 line_bytes[0] = '\0'; \
    +
    100 line_bytes++;
    +
    101
    +
    102 retval = mfile_open_read( font_name, &font_file );
    +
    103 maug_cleanup_if_not_ok();
    +
    104
    +
    105 /* Figure out font width from file and alloc just enough. */
    +
    106 retval = mfile_read_line( &font_file, line, RETROFONT_LINE_SZ );
    +
    107 maug_cleanup_if_not_ok();
    +
    108 retrofont_split_glyph_line( line, line_bytes );
    +
    109 maug_cleanup_if_not_ok();
    +
    110 glyph_w_bytes = (strlen( line_bytes ) / glyph_h) >> 1; /* 2 hex per byte */
    +
    111 debug_printf( RETROFONT_TRACE_LVL, "glyph_w_bytes: %u", glyph_w_bytes );
    +
    112 glyph_w = glyph_w_bytes * 8;
    +
    113
    +
    114#if 0 < RETROFONT_TRACE_LVL
    +
    115 debug_printf( RETROFONT_TRACE_LVL, "glyph_w: %u, glyph_sz: %u",
    +
    116 glyph_w, glyph_h * glyph_w_bytes );
    +
    117#endif
    +
    118
    +
    119 /* Alloc enough for each glyph, plus the size of the font header. */
    +
    120 *p_font_h = maug_malloc( 1,
    +
    121 sizeof( struct RETROFONT ) +
    +
    122 (glyph_h * glyph_w_bytes * (1 + glyphs_count)) );
    +
    123 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_font_h );
    +
    124
    +
    125#if 0 < RETROFONT_TRACE_LVL
    +
    126 debug_printf( RETROFONT_TRACE_LVL, "allocated font %s: " SIZE_T_FMT " bytes",
    +
    127 font_name, (glyph_h * glyph_w_bytes * (1 + glyphs_count)) +
    +
    128 sizeof( struct RETROFONT ) );
    +
    129#endif
    +
    130
    +
    131 maug_mlock( *p_font_h, font );
    +
    132 maug_cleanup_if_null_alloc( struct RETROFONT*, font );
    +
    133
    +
    134 /* Set initial font parameters. */
    +
    135 font->sz = sizeof( struct RETROFONT );
    +
    136 font->first_glyph = first_glyph;
    +
    137 font->glyph_w = glyph_w;
    +
    138 font->glyph_h = glyph_h;
    +
    139 font->glyph_sz = glyph_h * glyph_w_bytes;
    +
    140
    +
    141 while( mfile_has_bytes( &font_file ) ) {
    +
    142 retval = mfile_read_line( &font_file, line, RETROFONT_LINE_SZ );
    +
    143
    +
    144 retrofont_split_glyph_line( line, line_bytes );
    +
    145 if( MERROR_PARSE == retval ) {
    +
    146 /* The line couldn't parse, so skip it, but don't give up entirely and
    +
    147 * keep going to the next line.
    +
    148 */
    +
    149 retval = MERROR_OK;
    +
    150 continue;
    +
    151 }
    +
    152
    +
    153 /* Figure out the index of this glyph. */
    +
    154 /* TODO: Maug replacement for C99 crutch. */
    +
    155 glyph_idx = strtoul( line, NULL, 16 );
    +
    156 if( glyph_idx < first_glyph || glyph_idx > first_glyph + glyphs_count ) {
    +
    157 /* Skip glyph out of range. */
    +
    158 continue;
    +
    159 }
    +
    160
    +
    161 /* Find where to put the decoded glyph. */
    +
    162 p_glyph = retrofont_glyph_at( font, glyph_idx );
    +
    163
    +
    164 for( i = 0 ; font->glyph_h > i ; i++ ) {
    +
    165 switch( font->glyph_w ) {
    +
    166 case 8:
    +
    167 p_glyph[i] = 0;
    +
    168 p_glyph[i] |= maug_hctoi( line_bytes[i << 1] ) << 4;
    +
    169 p_glyph[i] |= maug_hctoi( line_bytes[(i << 1) + 1] );
    +
    170 break;
    +
    171
    +
    172 case 16:
    +
    173 /* TODO */
    +
    174 break;
    +
    175
    +
    176 case 32:
    +
    177 /* TODO */
    +
    178 break;
    +
    179
    +
    180 default:
    +
    181 error_printf( "invalid font width: %u", font->glyph_w );
    +
    182 retval = MERROR_PARSE;
    +
    183 goto cleanup;
    +
    184 }
    +
    185 }
    +
    186
    +
    187#if 0 < RETROFONT_TRACE_LVL
    +
    188 /* Test dump to verify glyph integrity. */
    +
    189 if( glyph_idx == 'B' ) {
    +
    190 retrofont_dump_glyph( p_glyph, glyph_w, glyph_h );
    +
    191 }
    +
    192#endif
    +
    193
    +
    194 font->glyphs_count++;
    +
    195
    +
    196 /* If we're not tracing, try to omit printfs from the inner loop! */
    +
    197#if 0 < RETROFONT_TRACE_LVL
    +
    198 debug_printf( RETROFONT_TRACE_LVL,
    +
    199 "%u %s (" SIZE_T_FMT " hbytes)", glyph_idx - first_glyph, line_bytes,
    +
    200 strlen( line_bytes ) );
    +
    201#endif
    +
    202 }
    +
    203
    +
    204cleanup:
    +
    205
    +
    206 if( NULL != font ) {
    +
    207 maug_munlock( *p_font_h, font );
    +
    208 }
    +
    209
    +
    210 mfile_close( &font_file );
    +
    211
    +
    212 return retval;
    +
    213}
    +
    214
    +
    215void retrofont_blit_glyph(
    +
    216 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    217 char c, struct RETROFONT* font, size_t x, size_t y, uint8_t flags
    +
    218) {
    +
    219 uint8_t* glyph = retrofont_glyph_at( font, c );
    +
    220 int16_t x_iter, y_iter;
    +
    221
    +
    222 for( y_iter = 0 ; font->glyph_h > y_iter ; y_iter++ ) {
    +
    223 for( x_iter = 0 ; font->glyph_w > x_iter ; x_iter++ ) {
    +
    224 if(
    +
    225 1 << (font->glyph_w - x_iter) ==
    +
    226 (glyph[y_iter] & (1 << (font->glyph_w - x_iter)))
    +
    227 ) {
    +
    228 retroflat_px( target, color, x + x_iter, y + y_iter, 0 );
    +
    229 }
    +
    230 }
    +
    231 }
    +
    232}
    +
    233
    +
    234void retrofont_string(
    +
    235 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    236 const char* str, size_t str_sz,
    +
    237 MAUG_MHANDLE font_h, size_t x, size_t y,
    +
    238 size_t max_w, size_t max_h, uint8_t flags
    +
    239) {
    +
    240 size_t i = 0;
    +
    241 size_t x_iter = x;
    +
    242 size_t y_iter = y;
    +
    243 struct RETROFONT* font = NULL;
    +
    244
    +
    245 if( (MAUG_MHANDLE)NULL == font_h ) {
    +
    246 error_printf( "NULL font specified!" );
    +
    247 goto cleanup;
    +
    248 }
    +
    249
    +
    250 if( 0 == str_sz ) {
    +
    251 str_sz = strlen( str );
    +
    252 }
    +
    253
    +
    254 maug_mlock( font_h, font );
    +
    255 if( NULL == font ) {
    +
    256 error_printf( "could not lock font!" );
    +
    257 goto cleanup;
    +
    258 }
    +
    259
    +
    260 for( i = 0 ; str_sz > i ; i++ ) {
    +
    261 /* Terminate prematurely at null. */
    +
    262 if( '\0' == str[i] ) {
    +
    263 break;
    +
    264 }
    +
    265
    +
    266 /* TODO: More dynamic way to determine space character? */
    +
    267 if( 32 != str[i] ) {
    +
    268 retrofont_blit_glyph(
    +
    269 target, color, str[i], font, x_iter, y_iter, flags );
    +
    270 }
    +
    271
    +
    272 x_iter += font->glyph_w;
    +
    273 if( 0 < max_w && (x + max_w) <= x_iter + font->glyph_w ) {
    +
    274 x_iter = x;
    +
    275 y_iter += font->glyph_h;
    +
    276 }
    +
    277 }
    +
    278
    +
    279cleanup:
    +
    280
    +
    281 if( NULL != font ) {
    +
    282 maug_munlock( font_h, font );
    +
    283 }
    +
    284}
    +
    285
    +
    286MERROR_RETVAL retrofont_string_sz(
    +
    287 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    288 MAUG_MHANDLE font_h, size_t max_w, size_t max_h,
    +
    289 size_t* out_w_p, size_t* out_h_p, uint8_t flags
    +
    290) {
    +
    291 size_t x_iter = 0;
    +
    292 size_t i = 0;
    +
    293 MERROR_RETVAL retval = MERROR_OK;
    +
    294 struct RETROFONT* font = NULL;
    +
    295
    +
    296 if( (MAUG_MHANDLE)NULL == font_h ) {
    +
    297 error_printf( "NULL font specified!" );
    +
    298 retval = MERROR_GUI;
    +
    299 goto cleanup;
    +
    300 }
    +
    301
    +
    302 if( 0 == str_sz ) {
    +
    303 str_sz = strlen( str );
    +
    304 }
    +
    305
    +
    306 maug_mlock( font_h, font );
    +
    307 maug_cleanup_if_null_alloc( struct RETROFONT*, font );
    +
    308
    +
    309 for( i = 0 ; str_sz > i ; i++ ) {
    +
    310 /* Terminate prematurely at null. */
    +
    311 if( '\0' == str[i] ) {
    +
    312 break;
    +
    313 }
    +
    314
    +
    315 x_iter += font->glyph_w;
    +
    316
    +
    317 if( *out_w_p <= x_iter ) {
    +
    318 *out_w_p = x_iter;
    +
    319 }
    +
    320 if( 0 < max_w && max_w < x_iter + font->glyph_w ) {
    +
    321 x_iter = 0;
    +
    322 *out_h_p += font->glyph_h;
    +
    323 if( 0 < max_h && *out_h_p + font->glyph_h >= max_h && i < str_sz ) {
    +
    324 error_printf( "string will not fit!" );
    +
    325
    +
    326 /* Do not quit; just make a note and keep going. */
    +
    327 retval = MERROR_GUI;
    +
    328 }
    +
    329 }
    +
    330 }
    +
    331
    +
    332 /* Add the height of the last line. */
    +
    333 *out_h_p += font->glyph_h;
    +
    334 *out_w_p += 1;
    +
    335
    +
    336cleanup:
    +
    337
    +
    338 if( NULL != font ) {
    +
    339 maug_munlock( font_h, font );
    +
    340 }
    +
    341
    +
    342 return retval;
    +
    343}
    +
    344
    +
    345#endif /* RETROFNT_C */
    +
    346
    +
    347/* \} */ /* retrofnt */
    +
    348
    +
    349#endif /* !RETROFNT_H */
    +
    350
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
    Open a file and read it into memory or memory-map it.
    +
    void mfile_close(mfile_t *p_file)
    Close a file opened with mfile_open_read().
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    #define maug_hctoi(c)
    Convert a single char hex digit to the int it represents.
    Definition uprintf.h:280
    +
    #define retrofont_glyph_at(p_font, idx)
    Get a pointer to the glyph with the given index in the given font.
    Definition retrofnt.h:52
    +
    Definition mfile.h:45
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    Definition retrofnt.h:21
    +
    + + +
    + + diff --git a/retrofp_8h.html b/retrofp_8h.html new file mode 100644 index 00000000..9e8995db --- /dev/null +++ b/retrofp_8h.html @@ -0,0 +1,145 @@ + + + + + + + +maug: retrofp.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retrofp.h File Reference
    +
    +
    + +

    Contains functions and macros for working with fixed-point numbers. +More...

    + +

    Go to the source code of this file.

    + + + + + + + + + +

    +Macros

    +#define RETROFP_PI   (3141)
     Fixed-point representation of Pi (3.141).
     
    +#define retrofp_sin(num, mult)   retrofp_lut( g_retrofp_sin, num, mult )
     
    +#define retrofp_cos(num, mult)   retrofp_lut( g_retrofp_cos, num, mult )
     
    + + + + +

    +Functions

    +int16_t retrofp_lut (const int16_t *SEG_MCONST lut, int16_t num, int16_t mult)
     Given a lookup table, return the corresponding value after trimming precision and making sure number is valid.
     
    + + + + + +

    +Variables

    +MAUG_CONST int16_t SEG_MCONST g_retrofp_cos []
     
    +MAUG_CONST int16_t SEG_MCONST g_retrofp_sin []
     
    +

    Detailed Description

    +

    Contains functions and macros for working with fixed-point numbers.

    +

    Maug retro fixed point numbers are rounded to 3 decimal places (e.g. RETROFP_PI).

    +
    + + +
    + + diff --git a/retrofp_8h_source.html b/retrofp_8h_source.html new file mode 100644 index 00000000..f0978390 --- /dev/null +++ b/retrofp_8h_source.html @@ -0,0 +1,296 @@ + + + + + + + +maug: retrofp.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrofp.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROFP_H
    +
    3#define RETROFP_H
    +
    4
    +
    17#define RETROFP_PI (3141)
    +
    18
    + +
    24 const int16_t* SEG_MCONST lut, int16_t num, int16_t mult );
    +
    25
    +
    26#define retrofp_sin( num, mult ) retrofp_lut( g_retrofp_sin, num, mult )
    +
    27
    +
    28#define retrofp_cos( num, mult ) retrofp_lut( g_retrofp_cos, num, mult )
    +
    29
    +
    30#ifdef RETROFP_C
    +
    31
    +
    32MAUG_CONST int16_t SEG_MCONST g_retrofp_cos[] = {
    +
    33 1000,
    +
    34 995,
    +
    35 980,
    +
    36 955,
    +
    37 921,
    +
    38 877,
    +
    39 825,
    +
    40 764,
    +
    41 696,
    +
    42 621,
    +
    43 540,
    +
    44 453,
    +
    45 362,
    +
    46 267,
    +
    47 169,
    +
    48 70,
    +
    49 -29,
    +
    50 -128,
    +
    51 -227,
    +
    52 -323,
    +
    53 -416,
    +
    54 -504,
    +
    55 -588,
    +
    56 -666,
    +
    57 -737,
    +
    58 -801,
    +
    59 -856,
    +
    60 -904,
    +
    61 -942,
    +
    62 -970,
    +
    63 -989,
    +
    64 -999,
    +
    65 -998,
    +
    66 -987,
    +
    67 -966,
    +
    68 -936,
    +
    69 -896,
    +
    70 -848,
    +
    71 -790,
    +
    72 -725,
    +
    73 -653,
    +
    74 -574,
    +
    75 -490,
    +
    76 -400,
    +
    77 -307,
    +
    78 -210,
    +
    79 -112,
    +
    80 -12,
    +
    81 87,
    +
    82 186,
    +
    83 283,
    +
    84 377,
    +
    85 468,
    +
    86 554,
    +
    87 634,
    +
    88 708,
    +
    89 775,
    +
    90 834,
    +
    91 885,
    +
    92 927,
    +
    93 960,
    +
    94 983,
    +
    95 996,
    +
    96};
    +
    97
    +
    98MAUG_CONST int16_t SEG_MCONST g_retrofp_sin[] = {
    +
    99 0,
    +
    100 99,
    +
    101 198,
    +
    102 295,
    +
    103 389,
    +
    104 479,
    +
    105 564,
    +
    106 644,
    +
    107 717,
    +
    108 783,
    +
    109 841,
    +
    110 891,
    +
    111 932,
    +
    112 963,
    +
    113 985,
    +
    114 997,
    +
    115 999,
    +
    116 991,
    +
    117 973,
    +
    118 946,
    +
    119 909,
    +
    120 863,
    +
    121 808,
    +
    122 745,
    +
    123 675,
    +
    124 598,
    +
    125 515,
    +
    126 427,
    +
    127 334,
    +
    128 239,
    +
    129 141,
    +
    130 41,
    +
    131 -58,
    +
    132 -157,
    +
    133 -255,
    +
    134 -350,
    +
    135 -442,
    +
    136 -529,
    +
    137 -611,
    +
    138 -687,
    +
    139 -756,
    +
    140 -818,
    +
    141 -871,
    +
    142 -916,
    +
    143 -951,
    +
    144 -977,
    +
    145 -993,
    +
    146 -999,
    +
    147 -996,
    +
    148 -982,
    +
    149 -958,
    +
    150 -925,
    +
    151 -883,
    +
    152 -832,
    +
    153 -772,
    +
    154 -705,
    +
    155 -631,
    +
    156 -550,
    +
    157 -464,
    +
    158 -373,
    +
    159 -279,
    +
    160 -182,
    +
    161 -83,
    +
    162};
    +
    163
    +
    164int16_t retrofp_lut(
    +
    165 const int16_t* SEG_MCONST lut, int16_t num, int16_t mult
    +
    166) {
    +
    167 int16_t cos_out;
    +
    168 uint8_t neg = 0;
    +
    169
    +
    170 /* Can't take an index of a negative number, so hold on to neg for later. */
    +
    171 if( num < 0 ) {
    +
    172 neg = 1;
    +
    173 num *= -1;
    +
    174 }
    +
    175
    +
    176 /* cos/sin repeat after every 2PI. */
    +
    177 if( num >= (2 * RETROFP_PI) ) {
    +
    178 num -= (2 * RETROFP_PI);
    +
    179 }
    +
    180
    +
    181 /* Remove num precision to get index. */
    +
    182 num /= 100;
    +
    183 cos_out = lut[num];
    +
    184
    +
    185 /* Multiply by multiplier before removing precision. */
    +
    186 cos_out *= mult;
    +
    187 cos_out /= 1000;
    +
    188
    +
    189 /* Restore neg taken earlier. */
    +
    190 if( neg ) {
    +
    191 cos_out *= -1;
    +
    192 }
    +
    193
    +
    194 return (int16_t)cos_out;
    +
    195}
    +
    196
    +
    197#else
    +
    198
    +
    199extern MAUG_CONST int16_t SEG_MCONST g_retrofp_cos[];
    +
    200extern MAUG_CONST int16_t SEG_MCONST g_retrofp_sin[];
    +
    201
    +
    202#endif /* RETROFP_C */
    +
    203
    +
    204 /* maug_retrofp */
    +
    205
    +
    206#endif /* !RETROFP_H */
    +
    207
    +
    #define RETROFP_PI
    Fixed-point representation of Pi (3.141).
    Definition retrofp.h:17
    +
    int16_t retrofp_lut(const int16_t *SEG_MCONST lut, int16_t num, int16_t mult)
    Given a lookup table, return the corresponding value after trimming precision and making sure number ...
    +
    + + +
    + + diff --git a/retroglu_8h.html b/retroglu_8h.html new file mode 100644 index 00000000..475c68e1 --- /dev/null +++ b/retroglu_8h.html @@ -0,0 +1,408 @@ + + + + + + + +maug: retroglu.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retroglu.h File Reference
    +
    +
    + +

    Library of tools for working with RetroFlat and OpenGL. +More...

    + +

    Go to the source code of this file.

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

    +Data Structures

    struct  RETROGLU_VERTEX
     
    struct  RETROGLU_VTEXTURE
     
    struct  RETROGLU_MATERIAL
     
    struct  RETROGLU_FACE
     
    struct  RETROGLU_OBJ
     
    struct  RETROGLU_SPRITE_PARMS
     If draw lists are disabled, this struct holds a list of params for retroglu_set_sprite_clip() so that the sprite can be drawn without a list. More...
     
    struct  RETROGLU_SPRITE
     
    struct  RETROGLU_TILE
     
    struct  RETROGLU_PROJ_ARGS
     
    struct  RETROGLU_PARSER
     As retroglu_parse_obj_c() parses OBJ data, it populates this struct with object information. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define MAUG_CONST   const
     
    +#define RETROGLU_PARSER_ERROR   -1
     
    +#define RETROGLU_PARSER_TOKEN_SZ_MAX   32
     
    +#define RETROGLU_TRACE_LVL   0
     
    +#define RETROGLU_SPRITE_TEX_FRAMES_SZ   10
     
    +#define glShininessf(side, light, f)   glMaterialf( side, light, f )
     
    +#define RETROGLU_PARSER_STATE_NONE   0
     
    +#define RETROGLU_PARSER_STATE_VERTEX_X   1
     
    +#define RETROGLU_PARSER_STATE_VERTEX_Y   2
     
    +#define RETROGLU_PARSER_STATE_VERTEX_Z   3
     
    +#define RETROGLU_PARSER_STATE_COMMENT   4
     
    +#define RETROGLU_PARSER_STATE_FACE_TOKEN   5
     
    +#define RETROGLU_PARSER_STATE_FACE_VERTEX   6
     
    +#define RETROGLU_PARSER_STATE_FACE_TEXTURE   7
     
    +#define RETROGLU_PARSER_STATE_FACE_NORMAL   8
     
    +#define RETROGLU_PARSER_STATE_FACE_MATERIAL   9
     
    +#define RETROGLU_PARSER_STATE_MATERIAL_NAME   10
     
    +#define RETROGLU_PARSER_STATE_MATERIAL_AMB   11
     
    +#define RETROGLU_PARSER_STATE_MATERIAL_DIF   12
     
    +#define RETROGLU_PARSER_STATE_MATERIAL_SPEC   13
     
    +#define RETROGLU_PARSER_STATE_MATERIAL_LIB   14
     
    +#define RETROGLU_PARSER_STATE_MTL_KD_R   15
     
    +#define RETROGLU_PARSER_STATE_MTL_KD_G   16
     
    +#define RETROGLU_PARSER_STATE_MTL_KD_B   17
     
    +#define RETROGLU_PARSER_STATE_VNORMAL_X   18
     
    +#define RETROGLU_PARSER_STATE_VNORMAL_Y   19
     
    +#define RETROGLU_PARSER_STATE_VNORMAL_Z   20
     
    +#define RETROGLU_PARSER_STATE_VTEXTURE_X   21
     
    +#define RETROGLU_PARSER_STATE_VTEXTURE_Y   22
     
    +#define RETROGLU_PARSER_STATE_VTEXTURE_Z   23
     
    +#define RETROGLU_PARSER_STATE_MTL_KA_R   24
     
    +#define RETROGLU_PARSER_STATE_MTL_KA_G   25
     
    +#define RETROGLU_PARSER_STATE_MTL_KA_B   26
     
    +#define RETROGLU_PARSER_STATE_MTL_KS_R   27
     
    +#define RETROGLU_PARSER_STATE_MTL_KS_G   28
     
    +#define RETROGLU_PARSER_STATE_MTL_KS_B   29
     
    +#define RETROGLU_PARSER_STATE_MTL_KE_R   30
     
    +#define RETROGLU_PARSER_STATE_MTL_KE_G   31
     
    +#define RETROGLU_PARSER_STATE_MTL_KE_B   32
     
    +#define RETROGLU_PARSER_STATE_MTL_NS   33
     
    +#define RETROGLU_FACE_VERTICES_SZ_MAX   3
     
    +#define RETROGLU_MATERIAL_NAME_SZ_MAX   32
     
    +#define RETROGLU_MATERIAL_LIB_SZ_MAX   32
     
    +#define RETROGLU_VERTICES_SZ_MAX   1024
     
    +#define RETROGLU_FACES_SZ_MAX   1024
     
    +#define RETROGLU_MATERIALS_SZ_MAX   1024
     
    +#define RETROGLU_SPRITE_X   0
     
    +#define RETROGLU_SPRITE_Y   1
     
    +#define RETROGLU_SPRITE_LIST_SZ_MAX   10
     
    +#define RETROGLU_PROJ_ORTHO   0
     
    +#define RETROGLU_PROJ_FRUSTUM   1
     
    +#define retroglu_enable_lightning()   glEnable( GL_LIGHTING )
     
    +#define retroglu_disable_lightning()   glDisable( GL_LIGHTING )
     
    #define retroglu_push_overlay(x, y, x_f, y_f, aspect_f)
     Push current projection modelview and prepare useful parameters for drawing a textured overlay.
     
    #define retroglu_whf(w, h, w_f, h_f, aspect_f)
     Convert width/height in pixels to proportional float values for OpenGL.
     
    #define retroglu_pop_overlay()
     Restore projection modelview previously pushed using retroglu_push().
     
    +#define retroglu_tex_px_x_to_f(px, sprite)    ((px) * 1.0 / sprite->texture.tex.w)
     
    +#define retroglu_tex_px_y_to_f(px, sprite)    ((px) * 1.0 / sprite->texture.tex.h)
     
    +#define retroglu_scr_px_x_to_f(px)    (float)(((px) * 1.0 / (retroflat_screen_w() / 2)) - 1.0)
     
    +#define retroglu_scr_px_y_to_f(py)    (float)(((py) * 1.0 / (retroflat_screen_h() / 2)) - 1.0)
     
    #define retroglu_set_sprite_tex(sprite, texture_id, bmp_w, bmp_h)
     
    +#define retroglu_set_sprite_color(sprite, color_in)    memcpy( (sprite)->color, (color_in), 3 * sizeof( float ) )
     
    #define retroglu_parser_state(parser, new_state)
     Change the parser state.
     
    #define RETROGLU_OBJ_TOKENS(f)
     Table of OBJ file tokens understood by the parser.
     
    +#define RETROFLAT_COLOR_TABLE_GL(idx, name_l, name_u, r, g, b, cgac, cgad)    extern MAUG_CONST float RETROGLU_COLOR_ ## name_u[];
     
    + + + + + + + + +

    +Typedefs

    +typedef float RETROGLU_COLOR[4]
     
    +typedef int(* retroglu_mtl_cb) (const char *filename, struct RETROGLU_PARSER *parser, void *data)
     Callback to execute when its associate in RETROGLU_OBJ_TOKENS is found in an OBJ file.
     
    +typedef int(* retroglu_token_cb) (struct RETROGLU_PARSER *parser)
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    +void retroglu_init_scene (uint8_t flags)
     
    +void retroglu_init_projection (struct RETROGLU_PROJ_ARGS *args)
     
    +MERROR_RETVAL retroglu_parse_obj_file (const char *filename, struct RETROGLU_PARSER *parser, struct RETROGLU_OBJ *obj)
     
    +void retroglu_draw_poly (struct RETROGLU_OBJ *obj)
     
    +void retroglu_set_tile_clip (struct RETROGLU_TILE *tile, uint32_t px, uint32_t py, uint32_t pw, uint32_t ph, uint8_t flags)
     
    +void retroglu_set_sprite_clip (struct RETROGLU_SPRITE *sprite, uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py, uint32_t pw, uint32_t ph, uint8_t flags)
     
    +void retroglu_init_sprite_vertices (struct RETROGLU_SPRITE *sprite)
     Setup the sprite vertices for the poly the sprite will be drawn on. This should be called once when the sprite is initialized, but calling it again later shouldn't hurt.
     
    +void retroglu_init_sprite_vertices_scale (struct RETROGLU_SPRITE *sprite, float scale)
     
    +void retroglu_set_sprite_pos (struct RETROGLU_SPRITE *sprite, uint32_t px, uint32_t py)
     
    +void retroglu_tsrot_sprite (struct RETROGLU_SPRITE *sprite)
     
    +void retroglu_draw_sprite (struct RETROGLU_SPRITE *sprite)
     Draw the given sprite. This function never uses a list, and can therefore be used to create a draw list.
     
    void retroglu_prerender_sprite (struct RETROGLU_SPRITE *sprite, int list_idx, uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py, uint32_t pw, uint32_t ph, uint8_t flags)
     If lists are enabled, prerender the sprite to a list using the given params to retroglu_set_sprite_clip().
     
    +void retroglu_jitrender_sprite (struct RETROGLU_SPRITE *sprite, int list_idx)
     If lists are enabled, render the sprite list at list_idx. Otherwise, draw the sprite using retroglu_draw_sprite().
     
    +void retroglu_free_sprite (struct RETROGLU_SPRITE *sprite)
     
    +MERROR_RETVAL retroglu_init_glyph_tex ()
     
    +void retroglu_destroy_glyph_tex ()
     
    +void retroglu_string (float x, float y, float z, const RETROGLU_COLOR color, const char *str, size_t str_sz, const char *font_str, uint8_t flags)
     
    +

    Detailed Description

    +

    Library of tools for working with RetroFlat and OpenGL.

    +
    + + +
    + + diff --git a/retroglu_8h_source.html b/retroglu_8h_source.html new file mode 100644 index 00000000..73c53ef4 --- /dev/null +++ b/retroglu_8h_source.html @@ -0,0 +1,1642 @@ + + + + + + + +maug: retroglu.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retroglu.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROGLU_H
    +
    3#define RETROGLU_H
    +
    4
    +
    5/* TODO */
    +
    6#ifndef MAUG_CONST
    +
    7# define MAUG_CONST const
    +
    8#endif /* !MAUG_CONST */
    +
    9
    +
    19#define RETROGLU_PARSER_ERROR -1
    +
    20
    +
    21#ifndef RETROGLU_PARSER_TOKEN_SZ_MAX
    +
    22# define RETROGLU_PARSER_TOKEN_SZ_MAX 32
    +
    23#endif /* !RETROGLU_PARSER_TOKEN_SZ_MAX */
    +
    24
    +
    25#ifndef RETROGLU_TRACE_LVL
    +
    26# define RETROGLU_TRACE_LVL 0
    +
    27#endif /* !RETROGLU_TRACE_LVL */
    +
    28
    +
    29#ifndef RETROGLU_SPRITE_TEX_FRAMES_SZ
    +
    30# define RETROGLU_SPRITE_TEX_FRAMES_SZ 10
    +
    31#endif /* !RETROGLU_SPRITE_TEX_FRAMES_SZ */
    +
    32
    +
    33#ifdef MAUG_OS_NDS
    +
    34typedef int GLint;
    +
    35# define RETROGLU_NO_TEXTURES
    +
    36# define glPopMatrix() glPopMatrix( 1 )
    +
    37# define glFlush() glFlush( 0 )
    +
    38# define glPolygonMode( sides, mode )
    +
    39# define glClear( bits )
    +
    40# define glTexCoord2fv( arr )
    +
    41# define glMaterialfv( side, light, rgb ) \
    +
    42 glMaterialf( light, RGB15( (int)rgb[0], (int)rgb[1], (int)rgb[2] ) )
    +
    43# define glShininessf( side, light, f ) glMaterialf( light, f )
    +
    44# define glColor3fv( rgb ) glColor3f( rgb[0], rgb[1], rgb[2] )
    +
    45# define glVertex2fv( xy ) glVertex3f( xy[0], xy[1], 0 )
    +
    46#else
    +
    47# define glShininessf( side, light, f ) glMaterialf( side, light, f )
    +
    48#endif /* MAUG_OS_NDS */
    +
    49
    +
    60#define RETROGLU_PARSER_STATE_NONE 0
    +
    61#define RETROGLU_PARSER_STATE_VERTEX_X 1
    +
    62#define RETROGLU_PARSER_STATE_VERTEX_Y 2
    +
    63#define RETROGLU_PARSER_STATE_VERTEX_Z 3
    +
    64#define RETROGLU_PARSER_STATE_COMMENT 4
    +
    65#define RETROGLU_PARSER_STATE_FACE_TOKEN 5
    +
    66#define RETROGLU_PARSER_STATE_FACE_VERTEX 6
    +
    67#define RETROGLU_PARSER_STATE_FACE_TEXTURE 7
    +
    68#define RETROGLU_PARSER_STATE_FACE_NORMAL 8
    +
    69#define RETROGLU_PARSER_STATE_FACE_MATERIAL 9
    +
    70#define RETROGLU_PARSER_STATE_MATERIAL_NAME 10
    +
    71#define RETROGLU_PARSER_STATE_MATERIAL_AMB 11
    +
    72#define RETROGLU_PARSER_STATE_MATERIAL_DIF 12
    +
    73#define RETROGLU_PARSER_STATE_MATERIAL_SPEC 13
    +
    74#define RETROGLU_PARSER_STATE_MATERIAL_LIB 14
    +
    75#define RETROGLU_PARSER_STATE_MTL_KD_R 15
    +
    76#define RETROGLU_PARSER_STATE_MTL_KD_G 16
    +
    77#define RETROGLU_PARSER_STATE_MTL_KD_B 17
    +
    78#define RETROGLU_PARSER_STATE_VNORMAL_X 18
    +
    79#define RETROGLU_PARSER_STATE_VNORMAL_Y 19
    +
    80#define RETROGLU_PARSER_STATE_VNORMAL_Z 20
    +
    81#define RETROGLU_PARSER_STATE_VTEXTURE_X 21
    +
    82#define RETROGLU_PARSER_STATE_VTEXTURE_Y 22
    +
    83#define RETROGLU_PARSER_STATE_VTEXTURE_Z 23
    +
    84#define RETROGLU_PARSER_STATE_MTL_KA_R 24
    +
    85#define RETROGLU_PARSER_STATE_MTL_KA_G 25
    +
    86#define RETROGLU_PARSER_STATE_MTL_KA_B 26
    +
    87#define RETROGLU_PARSER_STATE_MTL_KS_R 27
    +
    88#define RETROGLU_PARSER_STATE_MTL_KS_G 28
    +
    89#define RETROGLU_PARSER_STATE_MTL_KS_B 29
    +
    90#define RETROGLU_PARSER_STATE_MTL_KE_R 30
    +
    91#define RETROGLU_PARSER_STATE_MTL_KE_G 31
    +
    92#define RETROGLU_PARSER_STATE_MTL_KE_B 32
    +
    93#define RETROGLU_PARSER_STATE_MTL_NS 33
    +
    94
    +
    95 /* maug_retroglu_obj_fsm_states */
    +
    96
    +
    97 /* maug_retroglu_obj_fsm */
    +
    98
    +
    99#ifndef RETROGLU_FACE_VERTICES_SZ_MAX
    +
    100# define RETROGLU_FACE_VERTICES_SZ_MAX 3
    +
    101#endif /* !RETROGLU_FACE_VERTICES_SZ_MAX */
    +
    102
    +
    103#ifndef RETROGLU_MATERIAL_NAME_SZ_MAX
    +
    104# define RETROGLU_MATERIAL_NAME_SZ_MAX 32
    +
    105#endif /* !RETROGLU_MATERIAL_NAME_SZ_MAX */
    +
    106
    +
    107#ifndef RETROGLU_MATERIAL_LIB_SZ_MAX
    +
    108# define RETROGLU_MATERIAL_LIB_SZ_MAX 32
    +
    109#endif /* !RETROGLU_MATERIAL_LIB_SZ_MAX */
    +
    110
    +
    111typedef float RETROGLU_COLOR[4];
    +
    112
    +
    + +
    114 float x;
    +
    115 float y;
    +
    116 float z;
    +
    117};
    +
    +
    118
    +
    + +
    120 float u;
    +
    121 float v;
    +
    122};
    +
    +
    123
    +
    + +
    125 float ambient[4];
    +
    126 float diffuse[4];
    +
    127 float specular[4];
    +
    128 float emissive[4];
    +
    129 float specular_exp;
    +
    130 char name[RETROGLU_MATERIAL_NAME_SZ_MAX];
    +
    131};
    +
    +
    132
    +
    + +
    140 uint16_t vertex_idxs[RETROGLU_FACE_VERTICES_SZ_MAX];
    +
    141 uint16_t vnormal_idxs[RETROGLU_FACE_VERTICES_SZ_MAX];
    +
    142 uint16_t vtexture_idxs[RETROGLU_FACE_VERTICES_SZ_MAX];
    +
    143 uint16_t vertex_idxs_sz;
    +
    144 uint16_t material_idx;
    +
    145};
    +
    +
    146
    +
    147#define RETROGLU_VERTICES_SZ_MAX 1024
    +
    148#define RETROGLU_FACES_SZ_MAX 1024
    +
    149#define RETROGLU_MATERIALS_SZ_MAX 1024
    +
    150
    +
    + +
    152 uint8_t flags;
    +
    153 struct RETROGLU_VERTEX vertices[RETROGLU_VERTICES_SZ_MAX];
    +
    154 uint16_t vertices_sz;
    +
    155 struct RETROGLU_VERTEX vnormals[RETROGLU_VERTICES_SZ_MAX];
    +
    156 uint16_t vnormals_sz;
    +
    157 struct RETROGLU_VTEXTURE vtextures[RETROGLU_VERTICES_SZ_MAX];
    +
    158 uint16_t vtextures_sz;
    +
    163 struct RETROGLU_FACE faces[RETROGLU_FACES_SZ_MAX];
    +
    164 uint16_t faces_sz;
    +
    165 struct RETROGLU_MATERIAL materials[RETROGLU_MATERIALS_SZ_MAX];
    +
    166 uint16_t materials_sz;
    +
    167};
    +
    +
    168
    +
    174#define RETROGLU_SPRITE_X 0
    +
    175#define RETROGLU_SPRITE_Y 1
    +
    176
    +
    177#ifndef RETROGLU_SPRITE_LIST_SZ_MAX
    +
    178# define RETROGLU_SPRITE_LIST_SZ_MAX 10
    +
    179#endif /* !RETROGLU_SPRITE_LIST_SZ_MAX */
    +
    180
    +
    + +
    187 uint32_t front_px;
    +
    188 uint32_t front_py;
    +
    189 uint32_t back_px;
    +
    190 uint32_t back_py;
    +
    191 uint32_t pw;
    +
    192 uint32_t ph;
    +
    193 uint8_t flags;
    +
    194};
    +
    +
    195
    +
    + +
    197 float vertices_front[6][2];
    +
    198 float vtexture_front[6][2];
    +
    199 float vertices_back[6][2];
    +
    200 float vtexture_back[6][2];
    +
    201 float translate_x;
    +
    202 float translate_y;
    +
    203 int rotate_y;
    +
    204 RETROGLU_COLOR color;
    +
    205 struct RETROFLAT_BITMAP texture;
    +
    206#ifdef RETROGLU_NO_LISTS
    +
    207 struct RETROGLU_SPRITE_PARMS parms[RETROGLU_SPRITE_LIST_SZ_MAX];
    +
    208#else
    +
    209 GLint lists[RETROGLU_SPRITE_LIST_SZ_MAX];
    +
    210#endif /* RETROGLU_NO_LISTS */
    +
    211};
    +
    +
    212
    +
    + +
    214 float vertices[6][2];
    +
    215 float vtexture[6][2];
    +
    216 int rotate_x;
    +
    217 struct RETROFLAT_BITMAP texture;
    +
    218};
    +
    +
    219
    +
    220
    +
    221 /* maug_retroglu_sprite */
    +
    222
    +
    223#define RETROGLU_PROJ_ORTHO 0
    +
    224#define RETROGLU_PROJ_FRUSTUM 1
    +
    225
    +
    + +
    227 uint8_t proj;
    +
    228 float rzoom;
    +
    229 float near_plane;
    +
    230 float far_plane;
    +
    231};
    +
    +
    232
    +
    233#ifdef RETROFLAT_API_LIBNDS
    +
    234# define retroglu_enable_lightning()
    +
    235# define retroglu_disable_lightning()
    +
    236#else
    +
    237# define retroglu_enable_lightning() glEnable( GL_LIGHTING )
    +
    238# define retroglu_disable_lightning() glDisable( GL_LIGHTING )
    +
    239#endif /* RETROFLAT_API_NDS */
    +
    240
    +
    +
    252#define retroglu_push_overlay( x, y, x_f, y_f, aspect_f ) \
    +
    253 /* Switch to projection setup. */ \
    +
    254 glMatrixMode( GL_PROJECTION ); \
    +
    255 glPushMatrix(); \
    +
    256 /* Lighting makes overlay text hard to see. */ \
    +
    257 retroglu_disable_lightning(); \
    +
    258 /* Use ortho for overlay. */ \
    +
    259 glLoadIdentity(); \
    +
    260 aspect_f = (float)retroflat_screen_w() / (float)retroflat_screen_h(); \
    +
    261 /* Switch to ortho projection proportional to screen size. */ \
    +
    262 glOrtho( -1.0f * aspect_f, aspect_f, -1.0f, 1.0f, 0, 10.0f ); \
    +
    263 /* -1 to 1 is 2! */ \
    +
    264 aspect_f *= 2.0f; \
    +
    265 /* Assuming width > height for aspect ratio. */ \
    +
    266 x_f = ((x) * aspect_f / retroflat_screen_w()) - (aspect_f / 2); \
    +
    267 /* Vertical coords also need to be inverted because OpenGL. */ \
    +
    268 y_f = 1.0f - ((y) * 2.0f / retroflat_screen_h()); \
    +
    269
    +
    +
    +
    278#define retroglu_whf( w, h, w_f, h_f, aspect_f ) \
    +
    279 w_f = ((w) * aspect_f / retroflat_screen_w()); \
    +
    280 h_f = ((h) * 2.0f / retroflat_screen_h());
    +
    +
    281
    +
    +
    285#define retroglu_pop_overlay() \
    +
    286 glPopMatrix(); \
    +
    287 glMatrixMode( GL_MODELVIEW );
    +
    +
    288
    +
    289 /* maug_retroglu_overlay */
    +
    290
    +
    291#define retroglu_tex_px_x_to_f( px, sprite ) \
    +
    292 ((px) * 1.0 / sprite->texture.tex.w)
    +
    293#define retroglu_tex_px_y_to_f( px, sprite ) \
    +
    294 ((px) * 1.0 / sprite->texture.tex.h)
    +
    295
    +
    296#define retroglu_scr_px_x_to_f( px ) \
    +
    297 (float)(((px) * 1.0 / (retroflat_screen_w() / 2)) - 1.0)
    +
    298#define retroglu_scr_px_y_to_f( py ) \
    +
    299 (float)(((py) * 1.0 / (retroflat_screen_h() / 2)) - 1.0)
    +
    300
    +
    301#define retroglu_set_sprite_tex( sprite, texture_id, bmp_w, bmp_h ) \
    +
    302 sprite->texture_id = texture_id; \
    +
    303 sprite->texture_w = bmp_w; \
    +
    304 sprite->texture_h = bmp_h;
    +
    305
    +
    306#define retroglu_set_sprite_color( sprite, color_in ) \
    +
    307 memcpy( (sprite)->color, (color_in), 3 * sizeof( float ) )
    +
    308
    +
    +
    319#define retroglu_parser_state( parser, new_state ) \
    +
    320 debug_printf( \
    +
    321 RETROGLU_TRACE_LVL, "changing parser to state: %d\n", new_state ); \
    +
    322 (parser)->state = new_state;
    +
    +
    323
    +
    +
    327#define RETROGLU_OBJ_TOKENS( f ) \
    +
    328 f( "v", retroglu_token_vertice ) \
    +
    329 f( "vn", retroglu_token_vnormal ) \
    +
    330 f( "f", retroglu_token_face ) \
    +
    331 f( "usemtl", retroglu_token_usemtl ) \
    +
    332 f( "newmtl", retroglu_token_newmtl ) \
    +
    333 f( "mtllib", retroglu_token_mtllib ) \
    +
    334 f( "Kd", retroglu_token_kd ) \
    +
    335 f( "Ka", retroglu_token_ka ) \
    +
    336 f( "Ks", retroglu_token_ks ) \
    +
    337 f( "Ke", retroglu_token_ks ) \
    +
    338 f( "Ns", retroglu_token_ns )
    +
    +
    339
    +
    340struct RETROGLU_PARSER;
    +
    341
    +
    346typedef int (*retroglu_mtl_cb)(
    +
    347 const char* filename, struct RETROGLU_PARSER* parser, void* data );
    +
    348
    +
    + +
    354 struct RETROGLU_OBJ* obj;
    +
    355 int state;
    +
    356 int material_idx;
    +
    357 char token[RETROGLU_PARSER_TOKEN_SZ_MAX];
    +
    358 size_t token_sz;
    +
    359 retroglu_mtl_cb load_mtl;
    +
    360 void* load_mtl_data;
    +
    361};
    +
    +
    362
    +
    363typedef int (*retroglu_token_cb)( struct RETROGLU_PARSER* parser );
    +
    364
    +
    365void retroglu_init_scene( uint8_t flags );
    +
    366void retroglu_init_projection( struct RETROGLU_PROJ_ARGS* args );
    +
    367
    + +
    375 struct RETROGLU_PARSER* parser, struct RETROGLU_OBJ* obj,
    +
    376 retroglu_mtl_cb load_mtl, void* load_mtl_data
    +
    377);
    +
    378
    + +
    386retroglu_parse_obj_c( struct RETROGLU_PARSER* parser, unsigned char c );
    +
    387
    +
    388MERROR_RETVAL retroglu_parse_obj_file(
    +
    389 const char* filename, struct RETROGLU_PARSER* parser,
    +
    390 struct RETROGLU_OBJ* obj );
    +
    391
    +
    392 /* maug_retroglu_obj_fsm */
    +
    393
    +
    394void retroglu_draw_poly( struct RETROGLU_OBJ* obj );
    +
    395
    +
    396void retroglu_set_tile_clip(
    +
    397 struct RETROGLU_TILE* tile,
    +
    398 uint32_t px, uint32_t py, uint32_t pw, uint32_t ph, uint8_t flags );
    +
    399
    +
    400void retroglu_set_sprite_clip(
    +
    401 struct RETROGLU_SPRITE* sprite,
    +
    402 uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py,
    +
    403 uint32_t pw, uint32_t ph, uint8_t flags );
    +
    404
    + +
    411
    +
    412void retroglu_init_sprite_vertices_scale(
    +
    413 struct RETROGLU_SPRITE* sprite, float scale );
    +
    414
    +
    415void retroglu_set_sprite_pos(
    +
    416 struct RETROGLU_SPRITE* sprite, uint32_t px, uint32_t py );
    +
    417
    +
    418void retroglu_tsrot_sprite( struct RETROGLU_SPRITE* sprite );
    +
    419
    + +
    425
    + +
    433 struct RETROGLU_SPRITE* sprite, int list_idx,
    +
    434 uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py,
    +
    435 uint32_t pw, uint32_t ph, uint8_t flags );
    +
    436
    +
    441void retroglu_jitrender_sprite( struct RETROGLU_SPRITE* sprite, int list_idx );
    +
    442
    +
    443void retroglu_free_sprite( struct RETROGLU_SPRITE* sprite );
    +
    444
    +
    445MERROR_RETVAL retroglu_init_glyph_tex();
    +
    446
    +
    447void retroglu_destroy_glyph_tex();
    +
    448
    +
    449void retroglu_string(
    +
    450 float x, float y, float z, const RETROGLU_COLOR color,
    +
    451 const char* str, size_t str_sz, const char* font_str, uint8_t flags );
    +
    452
    +
    453#ifdef RETROGLU_C
    +
    454
    +
    455# define RETROFLAT_COLOR_TABLE_GL( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    456 MAUG_CONST float RETROGLU_COLOR_ ## name_u[] = { \
    +
    457 (float)((float)r * 1.0f / 255.0f), \
    +
    458 (float)((float)g * 1.0f / 255.0f), \
    +
    459 (float)((float)b * 1.0f / 255.0f) };
    +
    460
    +
    461RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_GL )
    +
    462
    +
    463# define RETROGLU_OBJ_TOKEN_STRINGS( token, callback ) token,
    +
    464
    +
    465int retroglu_token_vertice( struct RETROGLU_PARSER* parser ) {
    +
    466 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_VERTEX_X );
    +
    467 return RETROFLAT_OK;
    +
    468}
    +
    469
    +
    470int retroglu_token_vnormal( struct RETROGLU_PARSER* parser ) {
    +
    471 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_VNORMAL_X );
    +
    472 return RETROFLAT_OK;
    +
    473}
    +
    474
    +
    475int retroglu_token_face( struct RETROGLU_PARSER* parser ) {
    +
    476 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_FACE_VERTEX );
    +
    477 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz = 0;
    +
    478 return RETROFLAT_OK;
    +
    479}
    +
    480
    +
    481int retroglu_token_usemtl( struct RETROGLU_PARSER* parser ) {
    +
    482 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_FACE_MATERIAL );
    +
    483 return RETROFLAT_OK;
    +
    484}
    +
    485
    +
    486int retroglu_token_newmtl( struct RETROGLU_PARSER* parser ) {
    +
    487 /* Set default lighting alpha to non-transparent. */
    +
    488 parser->obj->materials[parser->obj->materials_sz].ambient[3] = 1.0f;
    +
    489 parser->obj->materials[parser->obj->materials_sz].diffuse[3] = 1.0f;
    +
    490 parser->obj->materials[parser->obj->materials_sz].specular[3] = 1.0f;
    +
    491 parser->obj->materials[parser->obj->materials_sz].emissive[3] = 1.0f;
    +
    492 parser->obj->materials[parser->obj->materials_sz].specular_exp = 0;
    +
    493 parser->obj->materials_sz++;
    +
    494 assert( parser->obj->materials_sz <= RETROGLU_MATERIALS_SZ_MAX );
    +
    495 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MATERIAL_NAME );
    +
    496 return RETROFLAT_OK;
    +
    497}
    +
    498
    +
    499int retroglu_token_mtllib( struct RETROGLU_PARSER* parser ) {
    +
    500 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MATERIAL_LIB );
    +
    501 return RETROFLAT_OK;
    +
    502}
    +
    503
    +
    504int retroglu_token_kd( struct RETROGLU_PARSER* parser ) {
    +
    505 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MTL_KD_R );
    +
    506 return RETROFLAT_OK;
    +
    507}
    +
    508
    +
    509int retroglu_token_ka( struct RETROGLU_PARSER* parser ) {
    +
    510 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MTL_KA_R );
    +
    511 return RETROFLAT_OK;
    +
    512}
    +
    513
    +
    514int retroglu_token_ks( struct RETROGLU_PARSER* parser ) {
    +
    515 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MTL_KS_R );
    +
    516 return RETROFLAT_OK;
    +
    517}
    +
    518
    +
    519int retroglu_token_ke( struct RETROGLU_PARSER* parser ) {
    +
    520 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MTL_KE_R );
    +
    521 return RETROFLAT_OK;
    +
    522}
    +
    523
    +
    524int retroglu_token_ns( struct RETROGLU_PARSER* parser ) {
    +
    525 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_MTL_NS );
    +
    526 return RETROFLAT_OK;
    +
    527}
    +
    528
    +
    529char* g_retroglu_token_strings[] = {
    +
    530 RETROGLU_OBJ_TOKENS( RETROGLU_OBJ_TOKEN_STRINGS )
    +
    531 ""
    +
    532};
    +
    533
    +
    534# define RETROGLU_OBJ_TOKEN_CALLBACKS( token, callback ) callback,
    +
    535
    +
    536retroglu_token_cb g_retroglu_token_callbacks[] = {
    +
    537 RETROGLU_OBJ_TOKENS( RETROGLU_OBJ_TOKEN_CALLBACKS )
    +
    538 NULL
    +
    539};
    +
    540
    +
    541void retroglu_init_scene( uint8_t flags ) {
    +
    542 debug_printf( RETROGLU_TRACE_LVL, "initializing..." );
    +
    543
    +
    544#ifdef MAUG_OS_NDS
    +
    545 glMaterialShinyness();
    +
    546 glPolyFmt( POLY_ALPHA( 15 ) | POLY_CULL_BACK | POLY_FORMAT_LIGHT0 );
    +
    547#else
    +
    548 glEnable( GL_CULL_FACE );
    +
    549 glShadeModel( GL_SMOOTH );
    +
    550
    +
    551 /* Setup texture transparency. */
    +
    552 glEnable( GL_TEXTURE_2D );
    +
    553 glEnable( GL_BLEND );
    +
    554 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
    +
    555
    +
    556 /* Setup depth buffer so triangles in back are hidden. */
    +
    557 glEnable( GL_DEPTH_TEST );
    +
    558 glDepthMask( GL_TRUE );
    +
    559 glDepthFunc( GL_LESS );
    +
    560 glDepthRange( 0.0f, 1.0f );
    +
    561#endif /* !MAUG_OS_NDS */
    +
    562}
    +
    563
    +
    564void retroglu_init_projection( struct RETROGLU_PROJ_ARGS* args ) {
    +
    565 float aspect_ratio = 0;
    +
    566
    +
    567 /* Setup projection. */
    +
    568#ifdef MAUG_OS_NDS
    +
    569 glViewport( 0, 0, 255, 191 );
    +
    570#else
    +
    571 glViewport(
    +
    572 0, 0, (uint32_t)retroflat_screen_w(), (uint32_t)retroflat_screen_h() );
    +
    573#endif
    +
    574 aspect_ratio = (float)retroflat_screen_w() / (float)retroflat_screen_h();
    +
    575
    +
    576 /* Switch to projection matrix for setup. */
    +
    577 glMatrixMode( GL_PROJECTION );
    +
    578
    +
    579 /* Zero everything out. */
    +
    580 glLoadIdentity();
    +
    581
    +
    582 /* Near plane can't be zero for frustum! */
    +
    583 assert( 0 != args->near_plane );
    +
    584
    +
    585 switch( args->proj ) {
    +
    586 case RETROGLU_PROJ_FRUSTUM:
    +
    587 /* This is really tweaky, and when it breaks, polygons seem to get drawn
    +
    588 * out of order? Still experimenting/researching. */
    +
    589 debug_printf( RETROGLU_TRACE_LVL, "aspect ratio: %f", aspect_ratio );
    +
    590 glFrustum(
    +
    591 /* The smaller these are, the closer it lets us get to the camera? */
    +
    592 -1.0f * args->rzoom * aspect_ratio, args->rzoom * aspect_ratio,
    +
    593 -1.0f * args->rzoom, args->rzoom,
    +
    594 args->near_plane, args->far_plane );
    +
    595 break;
    +
    596
    +
    597 case RETROGLU_PROJ_ORTHO:
    +
    598 /* This is much simpler/more forgiving than frustum. */
    +
    599 glOrtho(
    +
    600 -1.0f * args->rzoom * aspect_ratio,
    +
    601 args->rzoom * aspect_ratio,
    +
    602 -1.0f * args->rzoom, args->rzoom,
    +
    603 args->near_plane, args->far_plane );
    +
    604 break;
    +
    605 }
    +
    606
    +
    607 /* Revert to model matrix for later instructions (out of this scope). */
    +
    608 glMatrixMode( GL_MODELVIEW );
    +
    609}
    +
    610
    + +
    612 struct RETROGLU_PARSER* parser, struct RETROGLU_OBJ* obj,
    +
    613 retroglu_mtl_cb load_mtl, void* load_mtl_data
    +
    614) {
    +
    615 parser->load_mtl = load_mtl;
    +
    616 parser->load_mtl_data = load_mtl_data;
    +
    617 parser->obj = obj;
    +
    618 assert( NULL != parser->obj );
    +
    619 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_NONE );
    +
    620 parser->token_sz = 0;
    +
    621}
    +
    622
    +
    623#define RETROGLU_TOKENS_VF( f ) \
    +
    624 f( "X", VERTEX_X, vertices, vertices_sz, x, VERTEX_Y ) \
    +
    625 f( "Y", VERTEX_Y, vertices, vertices_sz, y, VERTEX_Z ) \
    +
    626 f( "Z", VERTEX_Z, vertices, vertices_sz, z, NONE ) \
    +
    627 f( "normal X", VNORMAL_X, vnormals, vnormals_sz, x, VNORMAL_Y ) \
    +
    628 f( "normal Y", VNORMAL_Y, vnormals, vnormals_sz, y, VNORMAL_Z ) \
    +
    629 f( "normal Z", VNORMAL_Z, vnormals, vnormals_sz, z, NONE ) \
    +
    630 f( "mtl Kd R", MTL_KD_R, materials, materials_sz-1, diffuse[0], MTL_KD_G ) \
    +
    631 f( "mtl Kd G", MTL_KD_G, materials, materials_sz-1, diffuse[1], MTL_KD_B ) \
    +
    632 f( "mtl Kd B", MTL_KD_B, materials, materials_sz-1, diffuse[2], NONE ) \
    +
    633 f( "mtl Ka R", MTL_KA_R, materials, materials_sz-1, ambient[0], MTL_KA_G ) \
    +
    634 f( "mtl Ka G", MTL_KA_G, materials, materials_sz-1, ambient[1], MTL_KA_B ) \
    +
    635 f( "mtl Ka B", MTL_KA_B, materials, materials_sz-1, ambient[2], NONE ) \
    +
    636 f( "mtl Ks R", MTL_KS_R, materials, materials_sz-1, specular[0], MTL_KS_G ) \
    +
    637 f( "mtl Ks G", MTL_KS_G, materials, materials_sz-1, specular[1], MTL_KS_B ) \
    +
    638 f( "mtl Ks B", MTL_KS_B, materials, materials_sz-1, specular[2], NONE ) \
    +
    639 f( "mtl Ke R", MTL_KE_R, materials, materials_sz-1, emissive[0], MTL_KE_G ) \
    +
    640 f( "mtl Ke G", MTL_KE_G, materials, materials_sz-1, emissive[1], MTL_KE_B ) \
    +
    641 f( "mtl Ke B", MTL_KE_B, materials, materials_sz-1, emissive[2], NONE ) \
    +
    642 f( "mtl Ns", MTL_NS, materials, materials_sz-1, specular_exp, NONE )
    +
    643
    +
    644#define RETROGLU_TOKEN_PARSE_VF( desc, cond, array, sz, val, state_next ) \
    +
    645 } else if( RETROGLU_PARSER_STATE_ ## cond == parser->state ) { \
    +
    646 /* TODO: Maug replacement for C99 crutch. */ \
    +
    647 parser->obj->array[parser->obj->sz].val = strtod( parser->token, NULL ); \
    +
    648 debug_printf( RETROGLU_TRACE_LVL, "vertex %d " desc ": %f\n", \
    +
    649 parser->obj->sz, parser->obj->array[parser->obj->sz].val ); \
    +
    650 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_ ## state_next );
    +
    651
    + +
    653retroglu_parse_token( struct RETROGLU_PARSER* parser ) {
    +
    654 int i = 0;
    + +
    656
    +
    657 if( 0 == parser->token_sz ) {
    +
    658 /* Empty token. */
    +
    659 goto cleanup;
    +
    660 }
    +
    661
    +
    662 /* NULL-terminate token. */
    +
    663 parser->token[parser->token_sz] = '\0';
    +
    664
    +
    665 debug_printf( RETROGLU_TRACE_LVL, "token: %s\n", parser->token );
    +
    666
    +
    667 if( RETROGLU_PARSER_STATE_MATERIAL_LIB == parser->state ) {
    +
    668
    +
    669 debug_printf(
    +
    670 RETROGLU_TRACE_LVL, "parsing material lib: %s\n", parser->token );
    +
    671 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_NONE );
    +
    672 assert( NULL != parser->load_mtl );
    +
    673 return parser->load_mtl( parser->token, parser, parser->load_mtl_data );
    +
    674
    +
    675 RETROGLU_TOKENS_VF( RETROGLU_TOKEN_PARSE_VF )
    +
    676
    +
    677 /* TODO: Handle W. */
    +
    678
    +
    679 } else if( RETROGLU_PARSER_STATE_FACE_VERTEX == parser->state ) {
    +
    680 /* Parsing face vertex index. */
    +
    681 parser->obj->faces[parser->obj->faces_sz].vertex_idxs[
    +
    682 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz] =
    +
    683 atoi( parser->token );
    +
    684
    +
    685 debug_printf( RETROGLU_TRACE_LVL, "face %d, vertex %d: %d\n",
    +
    686 parser->obj->faces_sz, parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz,
    +
    687 parser->obj->faces[parser->obj->faces_sz].vertex_idxs[
    +
    688 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz] );
    +
    689
    +
    690 /* The new state is set in the parser below, as it could become
    +
    691 * RETROGLU_PARSER_STATE_FACE_NORMAL or RETROGLU_PARSER_STATE_NONE,
    +
    692 * depending on whether it's a whitespace/newline/slash after.
    +
    693 * Same for index incr.
    +
    694 */
    +
    695
    +
    696 } else if( RETROGLU_PARSER_STATE_FACE_NORMAL == parser->state ) {
    +
    697
    +
    698 /* Parsing face normal index. */
    +
    699 parser->obj->faces[parser->obj->faces_sz].vnormal_idxs[
    +
    700 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz] =
    +
    701 atoi( parser->token );
    +
    702
    +
    703 debug_printf( RETROGLU_TRACE_LVL, "face %d, normal %d: %d\n",
    +
    704 parser->obj->faces_sz, parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz,
    +
    705 parser->obj->faces[parser->obj->faces_sz].vnormal_idxs[
    +
    706 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz] );
    +
    707
    +
    708 /* The new state is set in the parser below, as it could become
    +
    709 * RETROGLU_PARSER_STATE_FACE_NORMAL or RETROGLU_PARSER_STATE_NONE,
    +
    710 * depending on whether it's a whitespace/newline/slash after.
    +
    711 * Same for index incr.
    +
    712 */
    +
    713
    +
    714 } else if( RETROGLU_PARSER_STATE_FACE_TEXTURE == parser->state ) {
    +
    715
    +
    716 /* Parsing face texture index. */
    +
    717 parser->obj->faces[parser->obj->faces_sz].vtexture_idxs[
    +
    718 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz] =
    +
    719 atoi( parser->token );
    +
    720
    +
    721 debug_printf( RETROGLU_TRACE_LVL, "face %d, texture %d: %d\n",
    +
    722 parser->obj->faces_sz, parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz,
    +
    723 parser->obj->faces[parser->obj->faces_sz].vtexture_idxs[
    +
    724 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz] );
    +
    725
    +
    726 /* The new state is set in the parser below, as it could become
    +
    727 * RETROGLU_PARSER_STATE_FACE_NORMAL or RETROGLU_PARSER_STATE_NONE,
    +
    728 * depending on whether it's a whitespace/newline/slash after.
    +
    729 * Same for index incr.
    +
    730 */
    +
    731
    +
    732
    +
    733 } else if( RETROGLU_PARSER_STATE_FACE_MATERIAL == parser->state ) {
    +
    734
    +
    735 /* Find the material index and assign it to the parser. */
    +
    736 for( i = 0 ; parser->obj->materials_sz > i ; i++ ) {
    +
    737 debug_printf(
    +
    738 RETROGLU_TRACE_LVL,
    +
    739 "%s vs %s\n", parser->obj->materials[i].name, parser->token );
    +
    740 if( 0 == strncmp(
    +
    741 parser->obj->materials[i].name, parser->token,
    +
    742 RETROGLU_MATERIAL_NAME_SZ_MAX
    +
    743 ) ) {
    +
    744 debug_printf( RETROGLU_TRACE_LVL, "using material: \"%s\" (%d)\n",
    +
    745 parser->obj->materials[i].name, i );
    +
    746 parser->material_idx = i;
    +
    747 break;
    +
    748 }
    +
    749 }
    +
    750 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_NONE );
    +
    751
    +
    752 } else if( RETROGLU_PARSER_STATE_MATERIAL_NAME == parser->state ) {
    +
    753
    +
    754 debug_printf(
    +
    755 RETROGLU_TRACE_LVL, "adding material: \"%s\" at idx: %d\n",
    +
    756 parser->token, parser->obj->materials_sz - 1 );
    +
    757 strncpy(
    +
    758 parser->obj->materials[parser->obj->materials_sz - 1].name,
    +
    759 parser->token,
    +
    760 RETROGLU_MATERIAL_NAME_SZ_MAX );
    +
    761 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_NONE );
    +
    762
    +
    763 } else {
    +
    764 /* Check against generic tokens. */
    +
    765 while( '\0' != g_retroglu_token_strings[i][0] ) {
    +
    766 if(
    +
    767 parser->token_sz == strlen( g_retroglu_token_strings[i] ) &&
    +
    768 0 == strncmp(
    +
    769 parser->token, g_retroglu_token_strings[i],
    +
    770 parser->token_sz )
    +
    771 ) {
    +
    772 retval = g_retroglu_token_callbacks[i]( parser );
    +
    773 goto cleanup;
    +
    774 }
    +
    775 i++;
    +
    776 }
    +
    777 }
    +
    778
    +
    779cleanup:
    +
    780
    +
    781 /* Reset token. */
    +
    782 parser->token_sz = 0;
    +
    783
    +
    784 return retval;
    +
    785}
    +
    786
    + +
    788retroglu_append_token( struct RETROGLU_PARSER* parser, unsigned char c ) {
    +
    789 parser->token[parser->token_sz++] = c;
    +
    790
    +
    791 /* Protect against token overflow. */
    +
    792 if( parser->token_sz >= RETROGLU_PARSER_TOKEN_SZ_MAX ) {
    +
    793 debug_printf( RETROGLU_TRACE_LVL, "token out of bounds!\n" );
    +
    794 return RETROGLU_PARSER_ERROR;
    +
    795 }
    +
    796
    +
    797 return RETROFLAT_OK;
    +
    798}
    +
    799
    + +
    801retroglu_parse_obj_c( struct RETROGLU_PARSER* parser, unsigned char c ) {
    + +
    803
    +
    804 if(
    +
    805 RETROGLU_PARSER_STATE_COMMENT == parser->state && '\r' != c && '\n' != c
    +
    806 ) {
    +
    807 /* We're inside of a comment. */
    +
    808 return RETROFLAT_OK;
    +
    809 }
    +
    810
    +
    811 switch( c ) {
    +
    812 case '#':
    +
    813 /* Start of a comment. */
    +
    814 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_COMMENT );
    +
    815 break;
    +
    816
    +
    817 case '\r':
    +
    818 case '\n':
    +
    819 /* New line! End of a comment or token. */
    +
    820 if( RETROGLU_PARSER_STATE_COMMENT == parser->state ) {
    +
    821 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_NONE );
    +
    822 return RETROFLAT_OK;
    +
    823
    +
    824 } else if(
    +
    825 RETROGLU_PARSER_STATE_FACE_VERTEX == parser->state ||
    +
    826 RETROGLU_PARSER_STATE_FACE_TEXTURE == parser->state ||
    +
    827 RETROGLU_PARSER_STATE_FACE_NORMAL == parser->state
    +
    828 ) {
    +
    829 /* End of face. */
    +
    830 retval = retroglu_parse_token( parser );
    +
    831 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_NONE );
    +
    832
    +
    833 /* Use current parser material. */
    +
    834 parser->obj->faces[parser->obj->faces_sz].material_idx =
    +
    835 parser->material_idx;
    +
    836
    +
    837 /* Move to next face. */
    +
    838 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz++;
    +
    839 parser->obj->faces_sz++; /* Newline means this face is done. */
    +
    840 assert( parser->obj->faces_sz <= RETROGLU_FACES_SZ_MAX );
    +
    841 return retval;
    +
    842
    +
    843 } else if( RETROGLU_PARSER_STATE_VNORMAL_Z == parser->state ) {
    +
    844
    +
    845 retval = retroglu_parse_token( parser );
    +
    846 /* End of vertex. */
    +
    847 parser->obj->vnormals_sz++;
    +
    848 assert( parser->obj->vnormals_sz <= RETROGLU_VERTICES_SZ_MAX );
    +
    849 return retval;
    +
    850
    +
    851 } else if( RETROGLU_PARSER_STATE_VERTEX_Z == parser->state ) {
    +
    852
    +
    853 retval = retroglu_parse_token( parser );
    +
    854 /* End of vertex. */
    +
    855 parser->obj->vertices_sz++;
    +
    856 assert( parser->obj->vertices_sz <= RETROGLU_VERTICES_SZ_MAX );
    +
    857 return retval;
    +
    858
    +
    859 } else {
    +
    860 return retroglu_parse_token( parser );
    +
    861 }
    +
    862
    +
    863 case '\t':
    +
    864 case ' ':
    +
    865 /* Whitespace. Inside of a comment or time for a new token. */
    +
    866 if( RETROGLU_PARSER_STATE_COMMENT == parser->state ) {
    +
    867 /* Do nothing on spaces in comments. */
    +
    868 return RETROFLAT_OK;
    +
    869
    +
    870 } else if(
    +
    871 RETROGLU_PARSER_STATE_FACE_VERTEX == parser->state ||
    +
    872 RETROGLU_PARSER_STATE_FACE_TEXTURE == parser->state ||
    +
    873 RETROGLU_PARSER_STATE_FACE_NORMAL == parser->state
    +
    874 ) {
    +
    875 /* A space means we're moving on to the next vertex! */
    +
    876 retval = retroglu_parse_token( parser );
    +
    877 parser->obj->faces[parser->obj->faces_sz].vertex_idxs_sz++;
    +
    878 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_FACE_VERTEX );
    +
    879 return retval;
    +
    880
    +
    881 } else if( RETROGLU_PARSER_STATE_VNORMAL_Z == parser->state ) {
    +
    882
    +
    883 retval = retroglu_parse_token( parser );
    +
    884 /* End of vertex. */
    +
    885 parser->obj->vnormals_sz++;
    +
    886 assert( parser->obj->vnormals_sz <= RETROGLU_VERTICES_SZ_MAX );
    +
    887 return retval;
    +
    888
    +
    889 } else if( RETROGLU_PARSER_STATE_VERTEX_Z == parser->state ) {
    +
    890
    +
    891 retval = retroglu_parse_token( parser );
    +
    892 /* End of vertex. */
    +
    893 parser->obj->vertices_sz++;
    +
    894 assert( parser->obj->vertices_sz <= RETROGLU_VERTICES_SZ_MAX );
    +
    895 return retval;
    +
    896
    +
    897 } else if( RETROGLU_PARSER_STATE_MTL_KD_B == parser->state ) {
    +
    898 retval = retroglu_parse_token( parser );
    +
    899 /* This tuple has a space after blue, so maybe alpha? */
    +
    900 /* TODO: Set alpha state. */
    +
    901 return retval;
    +
    902
    +
    903 } else {
    +
    904 return retroglu_parse_token( parser );
    +
    905 }
    +
    906
    +
    907 case '/':
    +
    908 if( RETROGLU_PARSER_STATE_FACE_VERTEX == parser->state ) {
    +
    909 retval = retroglu_parse_token( parser );
    +
    910 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_FACE_TEXTURE );
    +
    911 return retval;
    +
    912
    +
    913 } else if( RETROGLU_PARSER_STATE_FACE_TEXTURE == parser->state ) {
    +
    914 retval = retroglu_parse_token( parser );
    +
    915 retroglu_parser_state( parser, RETROGLU_PARSER_STATE_FACE_NORMAL );
    +
    916 return retval;
    +
    917 }
    +
    918
    +
    919 /* v/vt/vn/??? */
    +
    920 assert( RETROGLU_PARSER_STATE_FACE_NORMAL != parser->state );
    +
    921
    +
    922 /* If not part of a face, fall through to default append. */
    +
    923 return retroglu_append_token( parser, c );
    +
    924
    +
    925 default:
    +
    926 return retroglu_append_token( parser, c );
    +
    927 }
    +
    928
    +
    929 return RETROFLAT_OK;
    +
    930}
    +
    931
    +
    932MERROR_RETVAL retroglu_parse_obj_file(
    +
    933 const char* filename, struct RETROGLU_PARSER* parser,
    +
    934 struct RETROGLU_OBJ* obj
    +
    935) {
    +
    936 FILE* obj_file = NULL;
    +
    937 uint32_t i = 0; /* Index in file buffer, so long. */
    +
    938 size_t obj_read = 0;
    +
    939 int auto_parser = 0; /* Did we provision parser? */
    +
    940 uint8_t* obj_buf = NULL;
    +
    941 size_t obj_buf_sz = 0;
    +
    942 char filename_path[RETROFLAT_PATH_MAX + 1];
    +
    943 MERROR_RETVAL retval = MERROR_OK;
    +
    944
    +
    945 if( NULL == parser ) {
    +
    946 parser = calloc( 1, sizeof( struct RETROGLU_PARSER ) );
    +
    947 assert( NULL != parser );
    +
    948 auto_parser = 1;
    +
    949 }
    +
    950
    +
    951 /* Build the path to the obj. */
    +
    952 memset( filename_path, '\0', RETROFLAT_PATH_MAX + 1 );
    +
    953 maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s%c%s",
    +
    954 g_retroflat_state->assets_path, RETROFLAT_PATH_SEP, filename );
    +
    955
    +
    956 /* Open the file and allocate the buffer. */
    +
    957 debug_printf( RETROGLU_TRACE_LVL, "opening %s...", filename_path );
    +
    958 obj_file = fopen( filename_path, "r" );
    +
    959 assert( NULL != obj_file );
    +
    960 fseek( obj_file, 0, SEEK_END );
    +
    961 obj_buf_sz = ftell( obj_file );
    +
    962 fseek( obj_file, 0, SEEK_SET );
    +
    963 debug_printf(
    +
    964 RETROGLU_TRACE_LVL,
    +
    965 "opened %s, " SIZE_T_FMT " bytes", filename_path, obj_buf_sz );
    +
    966 obj_buf = calloc( 1, obj_buf_sz );
    +
    967 assert( NULL != obj_buf );
    +
    968 obj_read = fread( obj_buf, 1, obj_buf_sz, obj_file );
    +
    969 debug_printf( RETROGLU_TRACE_LVL, "read " SIZE_T_FMT " bytes", obj_read );
    +
    970 assert( obj_read == obj_buf_sz );
    +
    971 fclose( obj_file );
    +
    972
    + +
    974 parser, obj, (retroglu_mtl_cb)retroglu_parse_obj_file, obj );
    +
    975
    +
    976 /* Parse the obj, byte by byte. */
    +
    977 for( i = 0 ; obj_buf_sz > i ; i++ ) {
    +
    978 retval = retroglu_parse_obj_c( parser, obj_buf[i] );
    +
    979 assert( 0 <= retval );
    +
    980 }
    +
    981 free( obj_buf );
    +
    982 obj_buf = NULL;
    +
    983 obj_buf_sz = 0;
    +
    984
    +
    985 if( auto_parser ) {
    +
    986 free( parser );
    +
    987 parser = NULL;
    +
    988 }
    +
    989
    +
    990 debug_printf(
    +
    991 RETROGLU_TRACE_LVL,
    +
    992 "parsed %s, %u vertices, %u materials",
    +
    993 filename_path, obj->vertices_sz, obj->materials_sz );
    +
    994
    +
    995 return retval;
    +
    996}
    +
    997
    +
    998void retroglu_draw_poly( struct RETROGLU_OBJ* obj ) {
    +
    999 int i = 0;
    +
    1000 int j = 0;
    +
    1001
    +
    1002 glBegin( GL_TRIANGLES );
    +
    1003 for( i = 0 ; obj->faces_sz > i ; i++ ) {
    +
    1004
    +
    1005 /* TODO: Handle material on NDS. */
    +
    1006 glMaterialfv( GL_FRONT, GL_DIFFUSE,
    +
    1007 obj->materials[obj->faces[i].material_idx].diffuse );
    +
    1008 /*
    +
    1009 glMaterialfv( GL_FRONT, GL_AMBIENT,
    +
    1010 obj->materials[faces[i].material_idx].ambient );
    +
    1011 */
    +
    1012 glMaterialfv( GL_FRONT, GL_SPECULAR,
    +
    1013 obj->materials[obj->faces[i].material_idx].specular );
    +
    1014 glMaterialfv( GL_FRONT, GL_EMISSION,
    +
    1015 obj->materials[obj->faces[i].material_idx].emissive );
    +
    1016
    +
    1017 glColor3fv( obj->materials[obj->faces[i].material_idx].diffuse );
    +
    1018
    +
    1019 /* Use a specific macro here that can be overridden for e.g. the NDS. */
    +
    1020 glShininessf( GL_FRONT, GL_SHININESS,
    +
    1021 obj->materials[obj->faces[i].material_idx].specular_exp );
    +
    1022
    +
    1023 for( j = 0 ; obj->faces[i].vertex_idxs_sz > j ; j++ ) {
    +
    1024 assert( 0 < obj->faces[i].vertex_idxs[j] );
    +
    1025 assert( 3 == obj->faces[i].vertex_idxs_sz );
    +
    1026
    +
    1027 glNormal3f(
    +
    1028 obj->vnormals[obj->faces[i].vnormal_idxs[j] - 1].x,
    +
    1029 obj->vnormals[obj->faces[i].vnormal_idxs[j] - 1].y,
    +
    1030 obj->vnormals[obj->faces[i].vnormal_idxs[j] - 1].z );
    +
    1031
    +
    1032 glVertex3f(
    +
    1033 obj->vertices[obj->faces[i].vertex_idxs[j] - 1].x,
    +
    1034 obj->vertices[obj->faces[i].vertex_idxs[j] - 1].y,
    +
    1035 obj->vertices[obj->faces[i].vertex_idxs[j] - 1].z );
    +
    1036 }
    +
    1037
    +
    1038 }
    +
    1039 glEnd();
    +
    1040}
    +
    1041
    +
    1042void retroglu_set_tile_clip(
    +
    1043 struct RETROGLU_TILE* tile,
    +
    1044 uint32_t px, uint32_t py, uint32_t pw, uint32_t ph, uint8_t flags
    +
    1045) {
    +
    1046 /* Set vertices in terms of half the clip size so that rotation is around
    +
    1047 * the midpoint of the sprite, not the side!
    +
    1048 */
    +
    1049 float clip_tex_x = 0, /* Front tex X */
    +
    1050 clip_tex_y = 0, /* Front tex Y */
    +
    1051 clip_tex_w = 0,
    +
    1052 clip_tex_h = 0;
    +
    1053
    +
    1054 /* Setup texture tilesheet. */
    +
    1055
    +
    1056 clip_tex_x = retroglu_tex_px_x_to_f( px, tile );
    +
    1057 clip_tex_y = retroglu_tex_px_y_to_f( py, tile );
    +
    1058 clip_tex_w = retroglu_tex_px_x_to_f( pw, tile );
    +
    1059 clip_tex_h = retroglu_tex_px_y_to_f( ph, tile );
    +
    1060
    +
    1061 /* == Front Face Textures == */
    +
    1062
    +
    1063 /* Lower Left */
    +
    1064 tile->vtexture[0][RETROGLU_SPRITE_X] = clip_tex_x;
    +
    1065 tile->vtexture[0][RETROGLU_SPRITE_Y] = clip_tex_y;
    +
    1066
    +
    1067 /* Lower Right */
    +
    1068 tile->vtexture[1][RETROGLU_SPRITE_X] = clip_tex_x + clip_tex_w;
    +
    1069 tile->vtexture[1][RETROGLU_SPRITE_Y] = clip_tex_y;
    +
    1070
    +
    1071 /* Upper Right */
    +
    1072 tile->vtexture[2][RETROGLU_SPRITE_X] = clip_tex_x + clip_tex_w;
    +
    1073 tile->vtexture[2][RETROGLU_SPRITE_Y] = clip_tex_y + clip_tex_h;
    +
    1074
    +
    1075 /* Upper Right */
    +
    1076 tile->vtexture[3][RETROGLU_SPRITE_X] = clip_tex_x + clip_tex_w;
    +
    1077 tile->vtexture[3][RETROGLU_SPRITE_Y] = clip_tex_y + clip_tex_h;
    +
    1078
    +
    1079 /* Upper Left */
    +
    1080 tile->vtexture[4][RETROGLU_SPRITE_X] = clip_tex_x;
    +
    1081 tile->vtexture[4][RETROGLU_SPRITE_Y] = clip_tex_y + clip_tex_h;
    +
    1082
    +
    1083 /* Lower Left */
    +
    1084 tile->vtexture[5][RETROGLU_SPRITE_X] = clip_tex_x;
    +
    1085 tile->vtexture[5][RETROGLU_SPRITE_Y] = clip_tex_y;
    +
    1086}
    +
    1087
    +
    1088void retroglu_init_tile_vertices( struct RETROGLU_TILE* tile ) {
    +
    1089
    +
    1090 /* == Front Face Vertices == */
    +
    1091
    +
    1092 /* Lower-Left */
    +
    1093 tile->vertices[0][RETROGLU_SPRITE_X] = -1;
    +
    1094 tile->vertices[0][RETROGLU_SPRITE_Y] = -1;
    +
    1095
    +
    1096 /* Lower-Right */
    +
    1097 tile->vertices[1][RETROGLU_SPRITE_X] = 1;
    +
    1098 tile->vertices[1][RETROGLU_SPRITE_Y] = -1;
    +
    1099
    +
    1100 /* Upper-Right */
    +
    1101 tile->vertices[2][RETROGLU_SPRITE_X] = 1;
    +
    1102 tile->vertices[2][RETROGLU_SPRITE_Y] = 1;
    +
    1103
    +
    1104 /* Upper-Right */
    +
    1105 tile->vertices[3][RETROGLU_SPRITE_X] = 1;
    +
    1106 tile->vertices[3][RETROGLU_SPRITE_Y] = 1;
    +
    1107
    +
    1108 /* Upper-Left */
    +
    1109 tile->vertices[4][RETROGLU_SPRITE_X] = -1;
    +
    1110 tile->vertices[4][RETROGLU_SPRITE_Y] = 1;
    +
    1111
    +
    1112 /* Lower-Left */
    +
    1113 tile->vertices[5][RETROGLU_SPRITE_X] = -1;
    +
    1114 tile->vertices[5][RETROGLU_SPRITE_Y] = -1;
    +
    1115}
    +
    1116
    +
    1117void retroglu_set_sprite_clip(
    +
    1118 struct RETROGLU_SPRITE* sprite,
    +
    1119 uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py,
    +
    1120 uint32_t pw, uint32_t ph, uint8_t flags
    +
    1121) {
    +
    1122 /* Set vertices in terms of half the clip size so that rotation is around
    +
    1123 * the midpoint of the sprite, not the side!
    +
    1124 */
    +
    1125 float clip_tex_fx = 0, /* Front tex X */
    +
    1126 clip_tex_fy = 0, /* Front tex Y */
    +
    1127 clip_tex_bx = 0, /* Back tex X */
    +
    1128 clip_tex_by = 0, /* Back tex Y */
    +
    1129 clip_tex_w = 0,
    +
    1130 clip_tex_h = 0;
    +
    1131
    +
    1132 /* Setup texture spritesheet. */
    +
    1133
    +
    1134 clip_tex_fx = retroglu_tex_px_x_to_f( front_px, sprite );
    +
    1135 clip_tex_fy = retroglu_tex_px_y_to_f( front_py, sprite );
    +
    1136 clip_tex_bx = retroglu_tex_px_x_to_f( back_px, sprite );
    +
    1137 clip_tex_by = retroglu_tex_px_y_to_f( back_py, sprite );
    +
    1138 clip_tex_w = retroglu_tex_px_x_to_f( pw, sprite );
    +
    1139 clip_tex_h = retroglu_tex_px_y_to_f( ph, sprite );
    +
    1140
    +
    1141 /* == Front Face Textures == */
    +
    1142
    +
    1143 /* Lower Left */
    +
    1144 sprite->vtexture_front[0][RETROGLU_SPRITE_X] = clip_tex_fx;
    +
    1145 sprite->vtexture_front[0][RETROGLU_SPRITE_Y] = clip_tex_fy;
    +
    1146
    +
    1147 /* Lower Right */
    +
    1148 sprite->vtexture_front[1][RETROGLU_SPRITE_X] = clip_tex_fx + clip_tex_w;
    +
    1149 sprite->vtexture_front[1][RETROGLU_SPRITE_Y] = clip_tex_fy;
    +
    1150
    +
    1151 /* Upper Right */
    +
    1152 sprite->vtexture_front[2][RETROGLU_SPRITE_X] = clip_tex_fx + clip_tex_w;
    +
    1153 sprite->vtexture_front[2][RETROGLU_SPRITE_Y] = clip_tex_fy + clip_tex_h;
    +
    1154
    +
    1155 /* Upper Right */
    +
    1156 sprite->vtexture_front[3][RETROGLU_SPRITE_X] = clip_tex_fx + clip_tex_w;
    +
    1157 sprite->vtexture_front[3][RETROGLU_SPRITE_Y] = clip_tex_fy + clip_tex_h;
    +
    1158
    +
    1159 /* Upper Left */
    +
    1160 sprite->vtexture_front[4][RETROGLU_SPRITE_X] = clip_tex_fx;
    +
    1161 sprite->vtexture_front[4][RETROGLU_SPRITE_Y] = clip_tex_fy + clip_tex_h;
    +
    1162
    +
    1163 /* Lower Left */
    +
    1164 sprite->vtexture_front[5][RETROGLU_SPRITE_X] = clip_tex_fx;
    +
    1165 sprite->vtexture_front[5][RETROGLU_SPRITE_Y] = clip_tex_fy;
    +
    1166
    +
    1167 /* == Back face Textures == */
    +
    1168
    +
    1169 /* Lower Left */
    +
    1170 sprite->vtexture_back[0][RETROGLU_SPRITE_X] = clip_tex_bx;
    +
    1171 sprite->vtexture_back[0][RETROGLU_SPRITE_Y] = clip_tex_by;
    +
    1172
    +
    1173 /* Lower Right */
    +
    1174 sprite->vtexture_back[1][RETROGLU_SPRITE_X] = clip_tex_bx + clip_tex_w;
    +
    1175 sprite->vtexture_back[1][RETROGLU_SPRITE_Y] = clip_tex_by;
    +
    1176
    +
    1177 /* Upper Right */
    +
    1178 sprite->vtexture_back[2][RETROGLU_SPRITE_X] = clip_tex_bx + clip_tex_w;
    +
    1179 sprite->vtexture_back[2][RETROGLU_SPRITE_Y] = clip_tex_by + clip_tex_h;
    +
    1180
    +
    1181 /* Upper Right */
    +
    1182 sprite->vtexture_back[3][RETROGLU_SPRITE_X] = clip_tex_bx + clip_tex_w;
    +
    1183 sprite->vtexture_back[3][RETROGLU_SPRITE_Y] = clip_tex_by + clip_tex_h;
    +
    1184
    +
    1185 /* Upper Left */
    +
    1186 sprite->vtexture_back[4][RETROGLU_SPRITE_X] = clip_tex_bx;
    +
    1187 sprite->vtexture_back[4][RETROGLU_SPRITE_Y] = clip_tex_by + clip_tex_h;
    +
    1188
    +
    1189 /* Lower Left */
    +
    1190 sprite->vtexture_back[5][RETROGLU_SPRITE_X] = clip_tex_bx;
    +
    1191 sprite->vtexture_back[5][RETROGLU_SPRITE_Y] = clip_tex_by;
    +
    1192}
    +
    1193
    +
    1194/* === */
    +
    1195
    +
    1196void retroglu_init_sprite_vertices( struct RETROGLU_SPRITE* sprite ) {
    +
    1197 retroglu_init_sprite_vertices_scale( sprite, 1.0f );
    +
    1198}
    +
    1199
    +
    1200/* === */
    +
    1201
    +
    1202void retroglu_init_sprite_vertices_scale(
    +
    1203 struct RETROGLU_SPRITE* sprite, float scale
    +
    1204) {
    +
    1205
    +
    1206 /* == Front Face Vertices == */
    +
    1207
    +
    1208 /* Lower-Left */
    +
    1209 sprite->vertices_front[0][RETROGLU_SPRITE_X] = -1.0f * scale;
    +
    1210 sprite->vertices_front[0][RETROGLU_SPRITE_Y] = -1.0f * scale;
    +
    1211
    +
    1212 /* Lower-Right */
    +
    1213 sprite->vertices_front[1][RETROGLU_SPRITE_X] = scale;
    +
    1214 sprite->vertices_front[1][RETROGLU_SPRITE_Y] = -1.0f * scale;
    +
    1215
    +
    1216 /* Upper-Right */
    +
    1217 sprite->vertices_front[2][RETROGLU_SPRITE_X] = scale;
    +
    1218 sprite->vertices_front[2][RETROGLU_SPRITE_Y] = scale;
    +
    1219
    +
    1220 /* Upper-Right */
    +
    1221 sprite->vertices_front[3][RETROGLU_SPRITE_X] = scale;
    +
    1222 sprite->vertices_front[3][RETROGLU_SPRITE_Y] = scale;
    +
    1223
    +
    1224 /* Upper-Left */
    +
    1225 sprite->vertices_front[4][RETROGLU_SPRITE_X] = -1.0f * scale;
    +
    1226 sprite->vertices_front[4][RETROGLU_SPRITE_Y] = scale;
    +
    1227
    +
    1228 /* Lower-Left */
    +
    1229 sprite->vertices_front[5][RETROGLU_SPRITE_X] = -1.0f * scale;
    +
    1230 sprite->vertices_front[5][RETROGLU_SPRITE_Y] = -1.0f * scale;
    +
    1231
    +
    1232 /* == Back Face Vertices == */
    +
    1233
    +
    1234 /* Lower-Right */
    +
    1235 sprite->vertices_back[0][RETROGLU_SPRITE_X] = scale;
    +
    1236 sprite->vertices_back[0][RETROGLU_SPRITE_Y] = -1.0f * scale;
    +
    1237
    +
    1238 /* Lower-Left */
    +
    1239 sprite->vertices_back[1][RETROGLU_SPRITE_X] = -1.0f * scale;
    +
    1240 sprite->vertices_back[1][RETROGLU_SPRITE_Y] = -1.0f * scale;
    +
    1241
    +
    1242 /* Upper-Left */
    +
    1243 sprite->vertices_back[2][RETROGLU_SPRITE_X] = -1.0f * scale;
    +
    1244 sprite->vertices_back[2][RETROGLU_SPRITE_Y] = scale;
    +
    1245
    +
    1246 /* Upper-Left */
    +
    1247 sprite->vertices_back[3][RETROGLU_SPRITE_X] = -1.0f * scale;
    +
    1248 sprite->vertices_back[3][RETROGLU_SPRITE_Y] = scale;
    +
    1249
    +
    1250 /* Upper-Right */
    +
    1251 sprite->vertices_back[4][RETROGLU_SPRITE_X] = scale;
    +
    1252 sprite->vertices_back[4][RETROGLU_SPRITE_Y] = scale;
    +
    1253
    +
    1254 /* Lower-Right */
    +
    1255 sprite->vertices_back[5][RETROGLU_SPRITE_X] = scale;
    +
    1256 sprite->vertices_back[5][RETROGLU_SPRITE_Y] = -1.0f * scale;
    +
    1257}
    +
    1258
    +
    1259/* === */
    +
    1260
    +
    1261void retroglu_set_sprite_pos(
    +
    1262 struct RETROGLU_SPRITE* sprite, uint32_t px, uint32_t py
    +
    1263) {
    +
    1264 sprite->translate_x = retroglu_scr_px_x_to_f( px );
    +
    1265 sprite->translate_y = retroglu_scr_px_y_to_f( py );
    +
    1266}
    +
    1267
    +
    1268/* === */
    +
    1269
    +
    1270void retroglu_tsrot_sprite( struct RETROGLU_SPRITE* sprite ) {
    +
    1271 /* Set the matrix to translate/rotate/scale based on sprite props. */
    +
    1272 glTranslatef( sprite->translate_x, sprite->translate_y, 0 );
    +
    1273 glRotatef( sprite->rotate_y, 0.0f, 1.0f, 0.0f );
    +
    1274}
    +
    1275
    +
    1276/* === */
    +
    1277
    +
    1278void retroglu_draw_sprite( struct RETROGLU_SPRITE* sprite ) {
    +
    1279 int i = 0;
    +
    1280#ifdef RETROGLU_NO_TEXTURES
    +
    1281 MERROR_RETVAL retval = MERROR_OK;
    +
    1282#endif /* RETROGLU_NO_TEXTURES */
    +
    1283
    +
    1284 glColor3fv( sprite->color );
    +
    1285
    +
    1286#ifndef RETROGLU_NO_TEXTURES
    +
    1287 glBindTexture( GL_TEXTURE_2D, sprite->texture.tex.id );
    +
    1288#else
    +
    1289 maug_mlock( sprite->texture.tex.bytes_h, sprite->texture.tex.bytes );
    +
    1290 maug_cleanup_if_null_alloc( uint8_t*, sprite->texture.tex.bytes );
    +
    1291 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
    +
    1292 sprite->texture.tex.w, sprite->texture.tex.h, 0,
    +
    1293 GL_RGBA, GL_UNSIGNED_BYTE,
    +
    1294 sprite->texture.tex.bytes );
    +
    1295#endif /* !RETROGLU_NO_TEXTURES */
    +
    1296#ifndef MAUG_OS_NDS
    +
    1297 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    +
    1298 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
    +
    1299 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
    +
    1300#endif /* !MAUG_OS_NDS */
    +
    1301
    +
    1302 glBegin( GL_TRIANGLES );
    +
    1303
    +
    1304 for( i = 0 ; 6 > i ; i++ ) {
    +
    1305 glTexCoord2fv( sprite->vtexture_front[i] );
    +
    1306 glVertex2fv( sprite->vertices_front[i] );
    +
    1307 }
    +
    1308
    +
    1309 for( i = 0 ; 6 > i ; i++ ) {
    +
    1310 glTexCoord2fv( sprite->vtexture_back[i] );
    +
    1311 glVertex2fv( sprite->vertices_back[i] );
    +
    1312 }
    +
    1313
    +
    1314 glEnd();
    +
    1315
    +
    1316#ifndef RETROGLU_NO_TEXTURES
    +
    1317 glBindTexture( GL_TEXTURE_2D, 0 );
    +
    1318#else
    +
    1319cleanup:
    +
    1320 if( NULL != sprite->texture.tex.bytes ) {
    +
    1321 maug_munlock( sprite->texture.tex.bytes_h, sprite->texture.tex.bytes );
    +
    1322 }
    +
    1323#endif /* !RETROGLU_NO_TEXTURES */
    +
    1324}
    +
    1325
    +
    1326/* === */
    +
    1327
    + +
    1329 struct RETROGLU_SPRITE* sprite, int list_idx,
    +
    1330 uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py,
    +
    1331 uint32_t pw, uint32_t ph, uint8_t flags
    +
    1332) {
    +
    1333#ifdef RETROGLU_NO_LISTS
    +
    1334 sprite->parms[list_idx].front_px = front_px;
    +
    1335 sprite->parms[list_idx].front_py = front_py;
    +
    1336 sprite->parms[list_idx].back_px = back_px;
    +
    1337 sprite->parms[list_idx].back_py = back_py;
    +
    1338 sprite->parms[list_idx].pw = pw;
    +
    1339 sprite->parms[list_idx].ph = ph;
    +
    1340 sprite->parms[list_idx].flags = flags;
    +
    1341#else
    +
    1342 /* Prerender the sprite to a GL list to call later. */
    +
    1343 sprite->lists[list_idx] = glGenLists( 1 );
    +
    1344 retroglu_set_sprite_clip(
    +
    1345 sprite, front_px, front_py, back_px, back_py, pw, ph, flags );
    +
    1346 glNewList( sprite->lists[list_idx], GL_COMPILE );
    +
    1347 retroglu_draw_sprite( sprite );
    +
    1348 glEndList();
    +
    1349#endif /* RETROGLU_NO_LISTS */
    +
    1350}
    +
    1351
    +
    1352/* === */
    +
    1353
    +
    1354void retroglu_jitrender_sprite( struct RETROGLU_SPRITE* sprite, int list_idx ) {
    +
    1355#ifdef RETROGLU_NO_LISTS
    +
    1356 /* Prerender the sprite to a GL list to call later. */
    +
    1357 retroglu_set_sprite_clip(
    +
    1358 sprite,
    +
    1359 sprite->parms[list_idx].front_px,
    +
    1360 sprite->parms[list_idx].front_py,
    +
    1361 sprite->parms[list_idx].back_px,
    +
    1362 sprite->parms[list_idx].back_py,
    +
    1363 sprite->parms[list_idx].pw,
    +
    1364 sprite->parms[list_idx].ph,
    +
    1365 sprite->parms[list_idx].flags );
    +
    1366 retroglu_draw_sprite( sprite );
    +
    1367#else
    +
    1368 glCallList( sprite->lists[list_idx] );
    +
    1369#endif /* RETROGLU_NO_LISTS */
    +
    1370}
    +
    1371
    +
    1372/* === */
    +
    1373
    +
    1374void retroglu_free_sprite( struct RETROGLU_SPRITE* sprite ) {
    +
    1375 if( NULL != sprite->texture.tex.bytes_h ) {
    +
    1376 if( NULL != sprite->texture.tex.bytes ) {
    +
    1377 maug_munlock( sprite->texture.tex.bytes_h, sprite->texture.tex.bytes );
    +
    1378 }
    +
    1379
    +
    1380 maug_mfree( sprite->texture.tex.bytes_h );
    +
    1381 }
    +
    1382
    +
    1383#ifndef RETROGLU_NO_TEXTURES
    +
    1384 if( 0 < sprite->texture.tex.id ) {
    +
    1385 glDeleteTextures( 1, (GLuint*)&(sprite->texture.tex.id) );
    +
    1386 }
    +
    1387#endif /* !RETROGLU_NO_TEXTURES */
    +
    1388}
    +
    1389
    +
    1390/* === */
    +
    1391
    +
    1392# include "mfont8x8.h"
    +
    1393
    +
    1394static
    +
    1395uint32_t g_retroglu_font_tex[RETROSOFT_SETS_COUNT][RETROSOFT_GLYPHS_COUNT];
    +
    1396
    +
    1397MERROR_RETVAL retroglu_load_glyph( size_t set_idx, size_t glyph_idx ) {
    +
    1398 MERROR_RETVAL retval = MERROR_OK;
    +
    1399
    +
    1400 uint8_t* bmp_px = NULL;
    +
    1401 int16_t i = 0,
    +
    1402 x = 0,
    +
    1403 y = 0;
    +
    1404 const char* glyph_dots = gc_font8x8[set_idx][glyph_idx];
    +
    1405
    +
    1406 /* Allocate temporary buffer for drawing. */
    +
    1407 bmp_px = calloc( RETROSOFT_GLYPH_W_SZ * RETROSOFT_GLYPH_H_SZ, 4 );
    +
    1408 maug_cleanup_if_null_alloc( uint8_t*, bmp_px );
    +
    1409 assert( NULL != bmp_px );
    +
    1410
    +
    1411 /* Draw font to texture. */
    +
    1412 for( y = 0 ; RETROSOFT_GLYPH_H_SZ > y ; y++ ) {
    +
    1413 for( x = 0 ; RETROSOFT_GLYPH_W_SZ > x ; x++ ) {
    +
    1414 i = ((RETROSOFT_GLYPH_H_SZ - y - 1) * RETROSOFT_GLYPH_W_SZ) + x;
    +
    1415 assert( i < RETROSOFT_GLYPH_W_SZ * RETROSOFT_GLYPH_H_SZ * 4 );
    +
    1416
    +
    1417 if( 1 == ((glyph_dots[y] >> x) & 0x01) ) {
    +
    1418 bmp_px[i * 4] = 0xff;
    +
    1419 bmp_px[(i * 4) + 1] = 0xff;
    +
    1420 bmp_px[(i * 4) + 2] = 0xff;
    +
    1421 bmp_px[(i * 4) + 3] = 0xff;
    +
    1422 }
    +
    1423 }
    +
    1424 }
    +
    1425
    +
    1426#ifndef RETROGLU_NO_TEXTURES
    +
    1427 assert( 0 == g_retroglu_font_tex[set_idx][glyph_idx] );
    +
    1428 glGenTextures( 1, (GLuint*)&(g_retroglu_font_tex[set_idx][glyph_idx]) );
    +
    1429 assert( 0 < g_retroglu_font_tex[set_idx][glyph_idx] );
    +
    1430 glBindTexture( GL_TEXTURE_2D, g_retroglu_font_tex[set_idx][glyph_idx] );
    +
    1431#endif /* !RETROGLU_NO_TEXTURES */
    +
    1432 /* glPixelStorei( GL_UNPACK_ALIGNMENT, 4 ); */
    +
    1433 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
    +
    1434 RETROSOFT_GLYPH_W_SZ, RETROSOFT_GLYPH_H_SZ, 0,
    +
    1435 GL_RGBA, GL_UNSIGNED_BYTE, bmp_px );
    +
    1436
    +
    1437cleanup:
    +
    1438
    +
    1439 if( NULL != bmp_px ) {
    +
    1440 free( bmp_px );
    +
    1441 }
    +
    1442
    +
    1443 return retval;
    +
    1444}
    +
    1445
    +
    1446/* === */
    +
    1447
    +
    1448MERROR_RETVAL retroglu_init_glyph_tex() {
    +
    1449 MERROR_RETVAL retval = MERROR_OK;
    +
    1450
    +
    1451#ifndef RETROGLU_NO_TEXTURES
    +
    1452 size_t i = 0,
    +
    1453 j = 0;
    +
    1454
    +
    1455 /* Only precache textures we we support glBindTexture(). Otherwise, we'll
    +
    1456 * have to forcibly load them as we use them later on. */
    +
    1457
    +
    1458 debug_printf( RETROGLU_TRACE_LVL, "loading glyph textures..." );
    +
    1459
    +
    1460 for( i = 0 ; RETROSOFT_SETS_COUNT > i ; i++ ) {
    +
    1461 for( j = 0 ; RETROSOFT_GLYPHS_COUNT > j ; j++ ) {
    +
    1462 retval = retroglu_load_glyph( i, j );
    +
    1463 maug_cleanup_if_not_ok();
    +
    1464 }
    +
    1465 }
    +
    1466#endif /* !RETROGLU_NO_TEXTURES */
    +
    1467
    +
    1468cleanup:
    +
    1469
    +
    1470 /* TODO: Destroy loaded textures if failure. */
    +
    1471
    +
    1472 return retval;
    +
    1473}
    +
    1474
    +
    1475/* === */
    +
    1476
    +
    1477void retroglu_destroy_glyph_tex() {
    +
    1478
    +
    1479#ifndef RETROGLU_NO_TEXTURES
    +
    1480 size_t i = 0,
    +
    1481 j = 0;
    +
    1482
    +
    1483 debug_printf( RETROGLU_TRACE_LVL, "destroying glyph textures..." );
    +
    1484
    +
    1485 for( i = 0 ; RETROSOFT_SETS_COUNT > i ; i++ ) {
    +
    1486 for( j = 0 ; RETROSOFT_GLYPHS_COUNT > j ; j++ ) {
    +
    1487 glDeleteTextures( 1, (GLuint*)&(g_retroglu_font_tex[i][j]) );
    +
    1488 }
    +
    1489 }
    +
    1490#endif /* !RETROGLU_NO_TEXTURES */
    +
    1491
    +
    1492}
    +
    1493
    +
    1494/* === */
    +
    1495
    +
    1496#define RETROGLU_FONT_W 0.05f
    +
    1497
    +
    1498void retroglu_string(
    +
    1499 float x, float y, float z, const RETROGLU_COLOR color,
    +
    1500 const char* str, size_t str_sz, const char* font_str, uint8_t flags
    +
    1501) {
    +
    1502 size_t i = 0;
    +
    1503#ifdef RETROGLU_NO_TEXTURES
    +
    1504 MERROR_RETVAL retval = MERROR_OK;
    +
    1505#endif /* RETROGLU_NO_TEXTURES */
    +
    1506
    +
    1507 if( str_sz == 0 ) {
    +
    1508 str_sz = strlen( str );
    +
    1509 }
    +
    1510
    +
    1511 for( i = 0 ; str_sz > i ; i++ ) {
    +
    1512 /* Stop drawing on NULL. */
    +
    1513 if( '\0' == str[i] ) {
    +
    1514 break;
    +
    1515 }
    +
    1516
    +
    1517 glColor3fv( color );
    +
    1518
    +
    1519#ifdef RETROGLU_NO_TEXTURES
    +
    1520 retval = retroglu_load_glyph( 0, str[i] - ' ' );
    +
    1521 maug_cleanup_if_not_ok();
    +
    1522#else
    +
    1523 glBindTexture( GL_TEXTURE_2D, g_retroglu_font_tex[0][str[i] - ' '] );
    +
    1524#endif /* RETROGLU_NO_TEXTURES */
    +
    1525 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
    +
    1526 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    +
    1527 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    +
    1528
    +
    1529 glBegin( GL_TRIANGLES );
    +
    1530
    +
    1531 glTexCoord2f( 0, 0 );
    +
    1532 glVertex3f( x + (RETROGLU_FONT_W * i), y, z );
    +
    1533 glTexCoord2f( 1, 0 );
    +
    1534 glVertex3f( x + (RETROGLU_FONT_W * i) + RETROGLU_FONT_W, y, z );
    +
    1535 glTexCoord2f( 1, 1 );
    +
    1536 glVertex3f(
    +
    1537 x + (RETROGLU_FONT_W * i) + RETROGLU_FONT_W,
    +
    1538 y + RETROGLU_FONT_W, z );
    +
    1539
    +
    1540 glTexCoord2f( 1, 1 );
    +
    1541 glVertex3f(
    +
    1542 x + (RETROGLU_FONT_W * i) + RETROGLU_FONT_W,
    +
    1543 y + RETROGLU_FONT_W, z );
    +
    1544 glTexCoord2f( 0, 1 );
    +
    1545 glVertex3f( x + (RETROGLU_FONT_W * i), y + RETROGLU_FONT_W, z );
    +
    1546 glTexCoord2f( 0, 0 );
    +
    1547 glVertex3f( x + (RETROGLU_FONT_W * i), y, z );
    +
    1548
    +
    1549 glEnd();
    +
    1550
    +
    1551#ifdef RETROGLU_NO_TEXTURES
    +
    1552 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA,
    +
    1553 0, 0, 0,
    +
    1554 GL_RGBA, GL_UNSIGNED_BYTE, NULL );
    +
    1555#else
    +
    1556 glBindTexture( GL_TEXTURE_2D, 0 );
    +
    1557#endif /* !RETROGLU_NO_TEXTURES */
    +
    1558 }
    +
    1559
    +
    1560#ifdef RETROGLU_NO_TEXTURES
    +
    1561cleanup:
    +
    1562 return;
    +
    1563#endif /* RETROGLU_NO_TEXTURES */
    +
    1564}
    +
    1565
    +
    1566MERROR_RETVAL retroglu_check_errors( const char* desc ) {
    +
    1567 GLenum gl_retval;
    +
    1568 MERROR_RETVAL retval = MERROR_OK;
    +
    1569
    +
    1570 do {
    +
    1571 gl_retval = glGetError();
    +
    1572 if( GL_NO_ERROR != gl_retval ) {
    +
    1573 error_printf( "GL error on %s: 0x%x", desc, gl_retval );
    +
    1574 retval = MERROR_GUI;
    +
    1575 }
    +
    1576 } while( GL_NO_ERROR != gl_retval );
    +
    1577
    +
    1578 return retval;
    +
    1579}
    +
    1580
    +
    1581#else
    +
    1582
    +
    1583# define RETROFLAT_COLOR_TABLE_GL( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1584 extern MAUG_CONST float RETROGLU_COLOR_ ## name_u[];
    +
    1585
    +
    1586RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_GL )
    +
    1587
    +
    1588#endif /* RETROGLU_C */
    +
    1589
    +
    1590 /* maug_retroglu */
    +
    1591
    +
    1592#endif /* !RETROGLU_H */
    +
    1593
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define RETROFLAT_COLOR_TABLE(f)
    This macro defines all colors supported by RetroFlat for primative operations, particularly using ret...
    Definition retroflt.h:295
    +
    #define RETROFLAT_PATH_MAX
    Maximum size allocated for asset paths.
    Definition retroflt.h:734
    +
    #define RETROFLAT_PATH_SEP
    The valid path separator on the target platform.
    Definition retroflt.h:776
    +
    #define RETROFLAT_OK
    Certain functions return this when there was no problem.
    Definition retroflt.h:334
    +
    #define retroflat_screen_h()
    Get the current screen height in pixels.
    Definition retroflt.h:2052
    +
    #define retroflat_screen_w()
    Get the current screen width in pixels.
    Definition retroflt.h:2049
    +
    void retroglu_parse_init(struct RETROGLU_PARSER *parser, struct RETROGLU_OBJ *obj, retroglu_mtl_cb load_mtl, void *load_mtl_data)
    Initialize a RETROGLU_PARSER.
    +
    #define retroglu_parser_state(parser, new_state)
    Change the parser state.
    Definition retroglu.h:319
    +
    MERROR_RETVAL retroglu_parse_obj_c(struct RETROGLU_PARSER *parser, unsigned char c)
    Parse OBJ data into a parser, one character at a time.
    +
    int(* retroglu_mtl_cb)(const char *filename, struct RETROGLU_PARSER *parser, void *data)
    Callback to execute when its associate in RETROGLU_OBJ_TOKENS is found in an OBJ file.
    Definition retroglu.h:346
    +
    #define RETROGLU_OBJ_TOKENS(f)
    Table of OBJ file tokens understood by the parser.
    Definition retroglu.h:327
    +
    void retroglu_prerender_sprite(struct RETROGLU_SPRITE *sprite, int list_idx, uint32_t front_px, uint32_t front_py, uint32_t back_px, uint32_t back_py, uint32_t pw, uint32_t ph, uint8_t flags)
    If lists are enabled, prerender the sprite to a list using the given params to retroglu_set_sprite_cl...
    +
    void retroglu_draw_sprite(struct RETROGLU_SPRITE *sprite)
    Draw the given sprite. This function never uses a list, and can therefore be used to create a draw li...
    +
    void retroglu_init_sprite_vertices(struct RETROGLU_SPRITE *sprite)
    Setup the sprite vertices for the poly the sprite will be drawn on. This should be called once when t...
    +
    void retroglu_jitrender_sprite(struct RETROGLU_SPRITE *sprite, int list_idx)
    If lists are enabled, render the sprite list at list_idx. Otherwise, draw the sprite using retroglu_d...
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    Definition retroglu.h:133
    +
    uint16_t vertex_idxs[RETROGLU_FACE_VERTICES_SZ_MAX]
    List of vertex indices from the associated RETROGLU_PARSER::vertices.
    Definition retroglu.h:140
    +
    Definition retroglu.h:124
    +
    Definition retroglu.h:151
    +
    struct RETROGLU_FACE faces[RETROGLU_FACES_SZ_MAX]
    List of faces from an OBJ file. Faces comprise a list of polygons denoted by index of the vertices in...
    Definition retroglu.h:163
    +
    As retroglu_parse_obj_c() parses OBJ data, it populates this struct with object information.
    Definition retroglu.h:353
    +
    Definition retroglu.h:226
    +
    If draw lists are disabled, this struct holds a list of params for retroglu_set_sprite_clip() so that...
    Definition retroglu.h:186
    +
    Definition retroglu.h:196
    +
    Definition retroglu.h:213
    +
    Definition retroglu.h:113
    +
    Definition retroglu.h:119
    +
    + + +
    + + diff --git a/retrogui_8h.html b/retrogui_8h.html new file mode 100644 index 00000000..8c53b351 --- /dev/null +++ b/retrogui_8h.html @@ -0,0 +1,219 @@ + + + + + + + +maug: retrogui.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retrogui.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + + + + +

    +Data Structures

    struct  RETROGUI_CTL_BASE
     Fields common to ALL RETROGUI_CTL types. More...
     
    union  RETROGUI_CTL
     
    struct  RETROGUI
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define RETROGUI_FLAGS_DIRTY   0x01
     RETROGUI::flags indicating controls should be redrawn.
     
    +#define RETROGUI_TRACE_LVL   0
     
    +#define RETROGUI_CTL_TEXT_SZ_MAX   128
     
    +#define RETROGUI_CTL_SZ_MAX_INIT   10
     
    +#define RETROGUI_PADDING   5
     
    +#define RETROGUI_BTN_LBL_SZ_MAX   64
     
    +#define RETROGUI_CTL_TEXT_BLINK_FRAMES   15
     
    #define retrogui_lock(gui)
     
    #define retrogui_unlock(gui)
     
    +#define retrogui_is_locked(gui)   (NULL != (gui)->ctls)
     
    +#define RETROGUI_IDC_NONE   0
     
    #define RETROGUI_CTL_TABLE(f)
     Table defining all control types and their specific fields in RETROGUI_CTL.
     
    #define RETROGUI_CTL_TABLE_FIELDS(idx, c_name, c_fields)
     Creates the corresponding RETROGUI_* structs from RETROGUI_CTL_TABLE that populate union RETROGUI_CTL.
     
    +#define RETROGUI_CTL_TABLE_TYPES(idx, c_name, c_fields)    struct RETROGUI_CTL_ ## c_name c_name;
     Adds the structs created by RETROGUI_CTL_TABLE_FIELDS to union RETROGUI_CTL.
     
    +#define RETROGUI_CTL_TABLE_CONSTS(idx, c_name, c_fields)    extern MAUG_CONST uint8_t RETROGUI_CTL_TYPE_ ## c_name;
     
    + + + + + + +

    +Typedefs

    +typedef size_t RETROGUI_IDC
     Unique identifying constant number for controls.
     
    +typedef void(* retrogui_xy_cb) (size_t *x, size_t *y, void *data)
     
    + + + + + + + + + + + + + + + + + + + + + + +

    +Functions

    +MERROR_RETVAL retrogui_push_listbox_item (struct RETROGUI *gui, RETROGUI_IDC idc, const char *item, size_t item_sz)
     
    +union RETROGUI_CTLretrogui_get_ctl_by_idc (struct RETROGUI *gui, size_t idc)
     
    RETROGUI_IDC retrogui_poll_ctls (struct RETROGUI *gui, RETROFLAT_IN_KEY *p_input, struct RETROFLAT_INPUT *input_evt)
     Poll for the last clicked control and maintain listboxes and menus.
     
    +void retrogui_redraw_ctls (struct RETROGUI *gui)
     
    +MERROR_RETVAL retrogui_push_ctl (struct RETROGUI *gui, union RETROGUI_CTL *ctl)
     
    +MERROR_RETVAL retrogui_get_ctl_text (struct RETROGUI *gui, RETROGUI_IDC idc, char *buffer, size_t buffer_sz)
     
    +size_t retrogui_get_ctl_sel_idx (struct RETROGUI *gui, size_t idc)
     
    +MERROR_RETVAL retrogui_init_ctl (union RETROGUI_CTL *ctl, uint8_t type, size_t idc)
     
    +MERROR_RETVAL retrogui_init (struct RETROGUI *gui)
     
    +void retrogui_free (struct RETROGUI *gui)
     
    + + + +

    +Variables

    +MAUG_CONST char * gc_retrogui_ctl_names []
     
    +
    + + +
    + + diff --git a/retrogui_8h_source.html b/retrogui_8h_source.html new file mode 100644 index 00000000..c9c2ce3d --- /dev/null +++ b/retrogui_8h_source.html @@ -0,0 +1,1345 @@ + + + + + + + +maug: retrogui.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrogui.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROGUI_H
    +
    3#define RETROGUI_H
    +
    4
    +
    11#ifndef RETROFONT_PRESENT
    +
    12# error "retrofont not present!"
    +
    13#endif /* !RETROFONT_PRESENT */
    +
    14
    +
    16#define RETROGUI_FLAGS_DIRTY 0x01
    +
    17
    +
    18#ifndef RETROGUI_TRACE_LVL
    +
    19# define RETROGUI_TRACE_LVL 0
    +
    20#endif /* !RETROGUI_TRACE_LVL */
    +
    21
    +
    22#ifndef RETROGUI_CTL_TEXT_SZ_MAX
    +
    23# define RETROGUI_CTL_TEXT_SZ_MAX 128
    +
    24#endif /* !RETROGUI_CTL_TEXT_SZ_MAX */
    +
    25
    +
    26#ifndef RETROGUI_CTL_SZ_MAX_INIT
    +
    27# define RETROGUI_CTL_SZ_MAX_INIT 10
    +
    28#endif /* !RETROGUI_CTL_SZ_MAX_INIT */
    +
    29
    +
    30#ifndef RETROGUI_PADDING
    +
    31# define RETROGUI_PADDING 5
    +
    32#endif /* !RETROGUI_PADDING */
    +
    33
    +
    34#ifndef RETROGUI_BTN_LBL_SZ_MAX
    +
    35# define RETROGUI_BTN_LBL_SZ_MAX 64
    +
    36#endif /* !RETROGUI_BTN_LBL_SZ_MAX */
    +
    37
    +
    38#ifndef RETROGUI_CTL_TEXT_BLINK_FRAMES
    +
    39# define RETROGUI_CTL_TEXT_BLINK_FRAMES 15
    +
    40#endif /* !RETROGUI_CTL_TEXT_BLINK_FRAMES */
    +
    41
    +
    42#define retrogui_lock( gui ) \
    +
    43 if( NULL == (gui)->ctls ) { \
    +
    44 maug_mlock( (gui)->ctls_h, (gui)->ctls ); \
    +
    45 maug_cleanup_if_null_alloc( union RETROGUI_CTL*, (gui)->ctls ); \
    +
    46 }
    +
    47
    +
    48#define retrogui_unlock( gui ) \
    +
    49 if( NULL != (gui)->ctls ) { \
    +
    50 maug_munlock( (gui)->ctls_h, (gui)->ctls ); \
    +
    51 }
    +
    52
    +
    53#define retrogui_is_locked( gui ) (NULL != (gui)->ctls)
    +
    54
    +
    56typedef size_t RETROGUI_IDC;
    +
    57
    +
    58#define RETROGUI_IDC_NONE 0
    +
    59
    +
    +
    74#define RETROGUI_CTL_TABLE( f ) \
    +
    75 f( 0, NONE, void* none; ) \
    +
    76 f( 1, LISTBOX, MAUG_MHANDLE list_h; char* list; size_t list_sz; size_t list_sz_max; size_t sel_idx; ) \
    +
    77 f( 2, BUTTON, char label[RETROGUI_BTN_LBL_SZ_MAX + 1]; int16_t push_frames; ) \
    +
    78 f( 3, TEXTBOX, MAUG_MHANDLE text_h; char* text; size_t text_sz; size_t text_sz_max; size_t text_cur; int16_t blink_frames; )
    +
    +
    79
    +
    80#if 0
    +
    81 f( 4, SCROLLBAR, size_t min; size_t max; size_t value; )
    +
    82#endif
    +
    83
    +
    + +
    86 uint8_t type;
    +
    87 RETROGUI_IDC idc;
    +
    88 size_t x;
    +
    89 size_t y;
    +
    90 size_t w;
    +
    91 size_t h;
    +
    92 RETROFLAT_COLOR bg_color;
    +
    93 RETROFLAT_COLOR fg_color;
    +
    94#if defined( RETROGUI_NATIVE_WIN )
    +
    95 HWND hwnd;
    +
    96#endif
    +
    97};
    +
    +
    98
    +
    +
    103#define RETROGUI_CTL_TABLE_FIELDS( idx, c_name, c_fields ) \
    +
    104 struct RETROGUI_CTL_ ## c_name { \
    +
    105 struct RETROGUI_CTL_BASE base; \
    +
    106 c_fields \
    +
    107 };
    +
    +
    108
    + +
    110
    +
    111
    +
    +
    115#define RETROGUI_CTL_TABLE_TYPES( idx, c_name, c_fields ) \
    +
    116 struct RETROGUI_CTL_ ## c_name c_name;
    +
    +
    117
    +
    + +
    119 struct RETROGUI_CTL_BASE base;
    + +
    121};
    +
    +
    122
    +
    123 /* maug_retrogui_ctl */
    +
    124
    +
    125typedef void (*retrogui_xy_cb)( size_t* x, size_t* y, void* data );
    +
    126
    +
    +
    127struct RETROGUI {
    +
    128 uint8_t flags;
    +
    129 RETROGUI_IDC idc_prev;
    +
    130 MAUG_MHANDLE ctls_h;
    +
    131 union RETROGUI_CTL* ctls;
    +
    132 size_t ctls_sz;
    +
    133 size_t ctls_sz_max;
    +
    134 RETROGUI_IDC focus;
    +
    135 struct RETROFLAT_BITMAP* draw_bmp;
    +
    136 retrogui_xy_cb draw_xy;
    +
    137 void* draw_xy_data;
    +
    138#ifdef RETROGXC_PRESENT
    +
    139 ssize_t font_idx;
    +
    140#else
    +
    141 MAUG_MHANDLE font_h;
    +
    142#endif /* RETROGXC_PRESENT */
    +
    143};
    +
    +
    144
    +
    145MERROR_RETVAL retrogui_push_listbox_item(
    +
    146 struct RETROGUI* gui, RETROGUI_IDC idc, const char* item, size_t item_sz );
    +
    147
    +
    148union RETROGUI_CTL* retrogui_get_ctl_by_idc( struct RETROGUI* gui, size_t idc );
    +
    149
    + +
    159 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
    +
    160 struct RETROFLAT_INPUT* input_evt );
    +
    161
    +
    162void retrogui_redraw_ctls( struct RETROGUI* gui );
    +
    163
    +
    164MERROR_RETVAL retrogui_push_ctl(
    +
    165 struct RETROGUI* gui, union RETROGUI_CTL* ctl );
    +
    166
    +
    167MERROR_RETVAL retrogui_get_ctl_text(
    +
    168 struct RETROGUI* gui, RETROGUI_IDC idc, char* buffer, size_t buffer_sz );
    +
    169
    +
    170size_t retrogui_get_ctl_sel_idx( struct RETROGUI* gui, size_t idc );
    +
    171
    +
    172MERROR_RETVAL retrogui_init_ctl(
    +
    173 union RETROGUI_CTL* ctl, uint8_t type, size_t idc );
    +
    174
    +
    175MERROR_RETVAL retrogui_init( struct RETROGUI* gui );
    +
    176
    +
    177void retrogui_free( struct RETROGUI* gui );
    +
    178
    +
    179#ifdef RETROGUI_C
    +
    180
    +
    181#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
    +
    182 MAUG_CONST uint8_t RETROGUI_CTL_TYPE_ ## c_name = idx;
    +
    183
    +
    184RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
    +
    185
    +
    186#define RETROGUI_CTL_TABLE_NAMES( idx, c_name, f_fields ) \
    +
    187 #c_name,
    +
    188
    +
    189MAUG_CONST char* gc_retrogui_ctl_names[] = {
    +
    190 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_NAMES )
    +
    191 ""
    +
    192};
    +
    193
    +
    194/* === Control: NONE === */
    +
    195
    +
    196static RETROGUI_IDC retrogui_click_NONE(
    +
    197 struct RETROGUI* gui,
    +
    198 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    199 struct RETROFLAT_INPUT* input_evt
    +
    200) {
    +
    201 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    202
    +
    203 return idc_out;
    +
    204}
    +
    205
    +
    206static RETROGUI_IDC retrogui_key_NONE(
    +
    207 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    208 struct RETROFLAT_INPUT* input_evt
    +
    209) {
    +
    210 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    211
    +
    212 return idc_out;
    +
    213}
    +
    214
    +
    215void retrogui_redraw_NONE( struct RETROGUI* gui, union RETROGUI_CTL* ctl ) {
    +
    216}
    +
    217
    +
    218static MERROR_RETVAL retrogui_push_NONE( union RETROGUI_CTL* ctl ) {
    +
    219 MERROR_RETVAL retval = MERROR_GUI;
    +
    220
    +
    221 return retval;
    +
    222}
    +
    223
    +
    224static void retrogui_free_NONE( union RETROGUI_CTL* ctl ) {
    +
    225}
    +
    226
    +
    227static MERROR_RETVAL retrogui_init_NONE( union RETROGUI_CTL* ctl ) {
    +
    228 MERROR_RETVAL retval = MERROR_GUI;
    +
    229
    +
    230 return retval;
    +
    231}
    +
    232
    +
    233/* === Control: LISTBOX === */
    +
    234
    +
    235static RETROGUI_IDC retrogui_click_LISTBOX(
    +
    236 struct RETROGUI* gui,
    +
    237 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    238 struct RETROFLAT_INPUT* input_evt
    +
    239) {
    +
    240 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    241 size_t i = 0,
    +
    242 j = 0,
    +
    243 w = 0,
    +
    244 h = 0;
    +
    245
    +
    246# if defined( RETROGUI_NATIVE_WIN )
    +
    247 /* Do nothing. */
    +
    248# else
    +
    249
    +
    250 assert( NULL == ctl->LISTBOX.list );
    +
    251 maug_mlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    252
    +
    253 /* Figure out the item clicked. */
    +
    254 while( i < ctl->LISTBOX.list_sz ) {
    +
    255#ifdef RETROGXC_PRESENT
    +
    256 retrogxc_string_sz(
    +
    257 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_idx,
    +
    258 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    259#else
    +
    260 retrofont_string_sz(
    +
    261 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_h,
    +
    262 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    263#endif /* RETROGXC_PRESENT */
    +
    264
    +
    265 if(
    +
    266 (size_t)(input_evt->mouse_y) <
    +
    267 ctl->base.y + ((j + 1) * (h + RETROGUI_PADDING))
    +
    268 ) {
    +
    269 ctl->LISTBOX.sel_idx = j;
    +
    270 break;
    +
    271 }
    +
    272
    +
    273 /* Try next variable-length string. */
    +
    274 i += strlen( &(ctl->LISTBOX.list[i]) ) + 1;
    +
    275 assert( i <= ctl->LISTBOX.list_sz );
    +
    276 j++;
    +
    277 }
    +
    278
    +
    279 if( NULL != ctl->LISTBOX.list ) {
    +
    280 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    281 }
    +
    282
    +
    283#endif
    +
    284
    +
    285 return idc_out;
    +
    286}
    +
    287
    +
    288static RETROGUI_IDC retrogui_key_LISTBOX(
    +
    289 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    290 struct RETROFLAT_INPUT* input_evt
    +
    291) {
    +
    292 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    293
    +
    294 /* TODO: Move up or down to next/prev item. */
    +
    295
    +
    296 return idc_out;
    +
    297}
    +
    298
    +
    299static void retrogui_redraw_LISTBOX(
    +
    300 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    301) {
    +
    302 size_t i = 0,
    +
    303 j = 0,
    +
    304 w = 0,
    +
    305 h = 0;
    +
    306
    +
    307 assert( NULL == ctl->LISTBOX.list );
    +
    308
    +
    309# if defined( RETROGUI_NATIVE_WIN )
    +
    310 /* TODO: InvalidateRect()? */
    +
    311# else
    +
    312
    +
    313 maug_mlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    314 if( NULL == ctl->LISTBOX.list ) {
    +
    315 goto cleanup;
    +
    316 }
    +
    317
    +
    318 retroflat_rect( NULL, ctl->base.bg_color, ctl->base.x, ctl->base.y,
    +
    319 ctl->base.w, ctl->base.h, RETROFLAT_FLAGS_FILL );
    +
    320
    +
    321 /* Parse out variable-length strings. */
    +
    322 while( i < ctl->LISTBOX.list_sz ) {
    +
    323#ifdef RETROGXC_PRESENT
    +
    324 retrogxc_string_sz(
    +
    325 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_idx,
    +
    326 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    327#else
    +
    328 retrofont_string_sz(
    +
    329 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_h,
    +
    330 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    331#endif /* RETROGXC_PRESENT */
    +
    332 if( j == ctl->LISTBOX.sel_idx ) {
    +
    333 /* TODO: Configurable selection colors. */
    +
    334 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLUE,
    +
    335 ctl->base.x, ctl->base.y + (j * (h + RETROGUI_PADDING)),
    +
    336 ctl->base.w, h, RETROFLAT_FLAGS_FILL );
    +
    337
    +
    338 }
    +
    339#ifdef RETROGXC_PRESENT
    +
    340 retrogxc_string(
    +
    341 gui->draw_bmp, ctl->base.fg_color, &(ctl->LISTBOX.list[i]), 0,
    +
    342 gui->font_idx, ctl->base.x, ctl->base.y + (j * (h + RETROGUI_PADDING)),
    +
    343 0, 0, 0 );
    +
    344#else
    +
    345 retrofont_string(
    +
    346 gui->draw_bmp, ctl->base.fg_color, &(ctl->LISTBOX.list[i]), 0,
    +
    347 gui->font_h, ctl->base.x, ctl->base.y + (j * (h + RETROGUI_PADDING)),
    +
    348 0, 0, 0 );
    +
    349#endif /* RETROGXC_PRESENT */
    +
    350
    +
    351 /* Move to next variable-length string. */
    +
    352 i += strlen( &(ctl->LISTBOX.list[i]) ) + 1;
    +
    353 assert( i <= ctl->LISTBOX.list_sz );
    +
    354 j++;
    +
    355 }
    +
    356
    +
    357cleanup:
    +
    358
    +
    359 if( NULL != ctl->LISTBOX.list ) {
    +
    360 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    361 }
    +
    362
    +
    363# endif
    +
    364
    +
    365}
    +
    366
    +
    367MERROR_RETVAL retrogui_select_listbox_item(
    +
    368 union RETROGUI_CTL* ctl, size_t item_idx
    +
    369) {
    +
    370 MERROR_RETVAL retval = MERROR_OK;
    +
    371
    +
    372# if defined( RETROGUI_NATIVE_WIN )
    +
    373
    +
    374 /* Select sel_idx. */
    +
    375 SendMessage( ctl->base.hwnd, LB_SETCURSEL, item_idx, 0 );
    +
    376
    +
    377# else
    +
    378
    +
    379 ctl->LISTBOX.sel_idx = item_idx;
    +
    380
    +
    381# endif
    +
    382
    +
    383 return retval;
    +
    384}
    +
    385
    +
    386MERROR_RETVAL retrogui_push_listbox_item(
    +
    387 struct RETROGUI* gui, RETROGUI_IDC idc, const char* item, size_t item_sz
    +
    388) {
    +
    389 MERROR_RETVAL retval = MERROR_OK;
    +
    390 union RETROGUI_CTL* ctl = NULL;
    +
    391 MAUG_MHANDLE listbox_h_new = (MAUG_MHANDLE)NULL;
    +
    392
    +
    393 retrogui_lock( gui );
    +
    394
    +
    395 debug_printf( RETROGUI_TRACE_LVL,
    +
    396 "pushing item \"%s\" to listbox " SIZE_T_FMT "...", item, idc );
    +
    397
    +
    398 ctl = retrogui_get_ctl_by_idc( gui, idc );
    +
    399 if( NULL == ctl ) {
    + +
    401 "Adding item \"%s\" failed: Control missing!", item );
    +
    402 retval = MERROR_GUI;
    +
    403 goto cleanup;
    +
    404 }
    +
    405
    +
    406# if defined( RETROGUI_NATIVE_WIN )
    +
    407
    +
    408 SendMessage( ctl->LISTBOX.base.hwnd, LB_ADDSTRING, 0, (LPARAM)item );
    +
    409
    +
    410# else
    +
    411
    +
    412 if( 0 == ctl->LISTBOX.list_sz ) {
    +
    413 ctl->LISTBOX.list_h = maug_malloc( 255, sizeof( char ) );
    +
    414 maug_cleanup_if_null_alloc( MAUG_MHANDLE, ctl->LISTBOX.list_h );
    +
    415 ctl->LISTBOX.list_sz_max = 255;
    +
    416 }
    +
    417
    +
    418 if( NULL != ctl->LISTBOX.list ) {
    +
    419 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    420 }
    +
    421
    +
    422 while( ctl->LISTBOX.list_sz + item_sz + 1 >= ctl->LISTBOX.list_sz_max ) {
    +
    423 debug_printf( RETROGUI_TRACE_LVL,
    +
    424 "resizing listbox items to " SIZE_T_FMT "...",
    +
    425 ctl->LISTBOX.list_sz );
    +
    426 maug_mrealloc_test(
    +
    427 listbox_h_new, ctl->LISTBOX.list_h,
    +
    428 ctl->LISTBOX.list_sz_max * 2, sizeof( char ) );
    +
    429 ctl->LISTBOX.list_sz_max *= 2;
    +
    430 }
    +
    431
    +
    432 maug_mlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    433 maug_cleanup_if_null_alloc( char*, ctl->LISTBOX.list );
    +
    434
    +
    435 strncpy( &(ctl->LISTBOX.list[ctl->LISTBOX.list_sz]), item, item_sz );
    +
    436 ctl->LISTBOX.list[ctl->LISTBOX.list_sz + item_sz] = '\0';
    +
    437 ctl->LISTBOX.list_sz += item_sz + 1;
    +
    438
    +
    439#endif
    +
    440
    +
    441cleanup:
    +
    442
    +
    443 if( NULL != ctl->LISTBOX.list ) {
    +
    444 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    445 }
    +
    446
    +
    447 return retval;
    +
    448}
    +
    449
    +
    450static MERROR_RETVAL retrogui_push_LISTBOX( union RETROGUI_CTL* ctl ) {
    +
    451 MERROR_RETVAL retval = MERROR_OK;
    +
    452
    +
    453# if defined( RETROGUI_NATIVE_WIN )
    +
    454
    +
    455 ctl->base.hwnd = CreateWindow(
    +
    456 "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD,
    +
    457 ctl->base.x, ctl->base.y, ctl->base.w, ctl->base.h,
    +
    458 g_retroflat_state->window, (HMENU)(ctl->base.idc),
    +
    459 g_retroflat_instance, NULL );
    +
    460 debug_printf( RETROGUI_TRACE_LVL,
    +
    461 "listbox hwnd: %p", ctl->LISTBOX.base.hwnd );
    +
    462 if( (HWND)NULL == ctl->base.hwnd ) {
    +
    463 error_printf( "could not create listbox" );
    +
    464 retval = MERROR_GUI;
    +
    465 goto cleanup;
    +
    466 }
    +
    467
    +
    468cleanup:
    +
    469
    +
    470# else
    +
    471
    +
    472 /* TODO? */
    +
    473
    +
    474# endif
    +
    475
    +
    476 return retval;
    +
    477}
    +
    478
    +
    479static void retrogui_free_LISTBOX( union RETROGUI_CTL* ctl ) {
    +
    480 assert( NULL == ctl->LISTBOX.list );
    +
    481 maug_mfree( ctl->LISTBOX.list_h );
    +
    482}
    +
    483
    +
    484static MERROR_RETVAL retrogui_init_LISTBOX( union RETROGUI_CTL* ctl ) {
    +
    485 MERROR_RETVAL retval = MERROR_OK;
    +
    486
    +
    487 debug_printf( RETROGUI_TRACE_LVL,
    +
    488 "initializing listbox " SIZE_T_FMT "...", ctl->base.idc );
    +
    489
    +
    490 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    491 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
    +
    492
    +
    493 return retval;
    +
    494}
    +
    495
    +
    496/* === Control: BUTTON === */
    +
    497
    +
    498static RETROGUI_IDC retrogui_click_BUTTON(
    +
    499 struct RETROGUI* gui,
    +
    500 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    501 struct RETROFLAT_INPUT* input_evt
    +
    502) {
    +
    503 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    504
    +
    505 if( 0 < ctl->BUTTON.push_frames ) {
    +
    506 goto cleanup;
    +
    507 }
    +
    508
    +
    509 /* Set the last button clicked. */
    +
    510 idc_out = ctl->base.idc;
    +
    511
    +
    512 /* Set the frames to show the pushed-in view. */
    +
    513 /* TODO: Use a constant, here. */
    +
    514 ctl->BUTTON.push_frames = 3;
    +
    515
    +
    516cleanup:
    +
    517
    +
    518 return idc_out;
    +
    519}
    +
    520
    +
    521static RETROGUI_IDC retrogui_key_BUTTON(
    +
    522 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    523 struct RETROFLAT_INPUT* input_evt
    +
    524) {
    +
    525 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    526
    +
    527 /* Set the last button clicked. */
    +
    528 /* TODO: Only set out on ENTER/SPACE. */
    +
    529 /* idc_out = ctl->base.idc; */
    +
    530
    +
    531 return idc_out;
    +
    532}
    +
    533
    +
    534static void retrogui_redraw_BUTTON(
    +
    535 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    536) {
    +
    537 size_t w = 0,
    +
    538 h = 0,
    +
    539 text_offset = 0;
    +
    540
    +
    541 retroflat_rect( gui->draw_bmp, ctl->base.bg_color, ctl->base.x, ctl->base.y,
    +
    542 ctl->base.w, ctl->base.h, RETROFLAT_FLAGS_FILL );
    +
    543
    +
    544 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLACK,
    +
    545 ctl->base.x, ctl->base.y,
    +
    546 ctl->base.w, ctl->base.h, 0 );
    +
    547
    +
    548 if( 0 < ctl->BUTTON.push_frames ) {
    + +
    550 gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    551 ctl->base.x + 1, ctl->base.y + 1,
    +
    552 ctl->base.x + ctl->base.w - 2, ctl->base.y + 1, 0 );
    + +
    554 gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    555 ctl->base.x + 1, ctl->base.y + 2,
    +
    556 ctl->base.x + 1, ctl->base.y + ctl->base.h - 3, 0 );
    +
    557
    +
    558 gui->flags |= RETROGUI_FLAGS_DIRTY; /* Mark dirty for push animation. */
    +
    559 ctl->BUTTON.push_frames--;
    +
    560 text_offset = 1;
    +
    561 } else {
    +
    562 /* Button is not pushed. */
    + +
    564 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
    +
    565 ctl->base.x + 1, ctl->base.y + 1,
    +
    566 ctl->base.x + ctl->base.w - 2, ctl->base.y + 1, 0 );
    + +
    568 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
    +
    569 ctl->base.x + 1, ctl->base.y + 2,
    +
    570 ctl->base.x + 1, ctl->base.y + ctl->base.h - 3, 0 );
    +
    571 }
    +
    572
    +
    573#ifdef RETROGXC_PRESENT
    +
    574 retrogxc_string_sz(
    +
    575 gui->draw_bmp, ctl->BUTTON.label, 0, gui->font_idx,
    +
    576 /* TODO: Pad max client area. */
    +
    577 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    578
    +
    579 retrogxc_string(
    +
    580 gui->draw_bmp, ctl->base.fg_color, ctl->BUTTON.label, 0, gui->font_idx,
    +
    581 ctl->base.x + ((ctl->base.w / 2) - (w / 2)) + text_offset,
    +
    582 ctl->base.y + ((ctl->base.h / 2) - (h / 2)) + text_offset,
    +
    583 /* TODO: Pad max client area. */
    +
    584 ctl->base.w, ctl->base.h, 0 );
    +
    585#else
    +
    586 retrofont_string_sz(
    +
    587 gui->draw_bmp, ctl->BUTTON.label, 0, gui->font_h,
    +
    588 /* TODO: Pad max client area. */
    +
    589 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    590
    +
    591 retrofont_string(
    +
    592 gui->draw_bmp, ctl->base.fg_color, ctl->BUTTON.label, 0, gui->font_h,
    +
    593 ctl->base.x + ((ctl->base.w / 2) - (w / 2)) + text_offset,
    +
    594 ctl->base.y + ((ctl->base.h / 2) - (h / 2)) + text_offset,
    +
    595 /* TODO: Pad max client area. */
    +
    596 ctl->base.w, ctl->base.h, 0 );
    +
    597#endif /* RETROGXC_PRESENT */
    +
    598
    +
    599
    +
    600}
    +
    601
    +
    602static MERROR_RETVAL retrogui_push_BUTTON( union RETROGUI_CTL* ctl ) {
    +
    603 MERROR_RETVAL retval = MERROR_OK;
    +
    604
    +
    605# if defined( RETROGUI_NATIVE_WIN )
    +
    606
    +
    607 ctl->base.hwnd = CreateWindow(
    +
    608 "BUTTON", ctl->BUTTON.label, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
    +
    609 ctl->base.x, ctl->base.y, ctl->base.w, ctl->base.h,
    +
    610 g_retroflat_state->window, (HMENU)(ctl->base.idc),
    +
    611 g_retroflat_instance, NULL );
    +
    612 if( (HWND)NULL == ctl->base.hwnd ) {
    + +
    614 "Could not create button " SIZE_T_FMT ": %s",
    +
    615 ctl->base.idc, ctl->BUTTON.label );
    +
    616 retval = MERROR_GUI;
    +
    617 goto cleanup;
    +
    618 }
    +
    619
    +
    620cleanup:
    +
    621
    +
    622# endif
    +
    623
    +
    624 return retval;
    +
    625}
    +
    626
    +
    627static void retrogui_free_BUTTON( union RETROGUI_CTL* ctl ) {
    +
    628}
    +
    629
    +
    630static MERROR_RETVAL retrogui_init_BUTTON( union RETROGUI_CTL* ctl ) {
    +
    631 MERROR_RETVAL retval = MERROR_OK;
    +
    632
    +
    633 debug_printf( RETROGUI_TRACE_LVL,
    +
    634 "initializing button " SIZE_T_FMT "...", ctl->base.idc );
    +
    635
    +
    636 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    637 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
    +
    638
    +
    639 return retval;
    +
    640}
    +
    641
    +
    642/* === Control: TEXTBOX === */
    +
    643
    +
    644static RETROGUI_IDC retrogui_click_TEXTBOX(
    +
    645 struct RETROGUI* gui,
    +
    646 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    647 struct RETROFLAT_INPUT* input_evt
    +
    648) {
    +
    649 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    650
    +
    651 return idc_out;
    +
    652}
    +
    653
    +
    654static RETROGUI_IDC retrogui_key_TEXTBOX(
    +
    655 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    656 struct RETROFLAT_INPUT* input_evt
    +
    657) {
    +
    658 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    659 char c = '\0';
    +
    660
    +
    661# if defined( RETROGUI_NATIVE_WIN )
    +
    662 /* Do nothing. */
    +
    663# else
    +
    664
    +
    665 c = retroflat_vk_to_ascii( *p_input, input_evt->key_flags );
    +
    666
    +
    667 /* Ignore non-printable characters. */
    +
    668 if(
    +
    669 0 == c &&
    +
    670 RETROFLAT_KEY_RIGHT != *p_input &&
    +
    671 RETROFLAT_KEY_LEFT != *p_input
    +
    672 ) {
    +
    673 goto cleanup;
    +
    674 }
    +
    675
    +
    676 /* Lock text field. */
    +
    677 assert( NULL == ctl->TEXTBOX.text );
    +
    678 assert( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h );
    +
    679 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    680 if( NULL == ctl->TEXTBOX.text ) {
    +
    681 error_printf( "could not lock TEXTBOX text handle!" );
    +
    682 goto cleanup;
    +
    683 }
    +
    684
    +
    685 switch( *p_input ) {
    +
    686 case RETROFLAT_KEY_BKSP:
    + +
    688 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz )
    +
    689 break;
    +
    690
    +
    691 case RETROFLAT_KEY_ENTER:
    +
    692 idc_out = ctl->base.idc;
    +
    693 break;
    +
    694
    +
    695 case RETROFLAT_KEY_LEFT:
    +
    696 if( 0 < ctl->TEXTBOX.text_cur ) {
    +
    697 ctl->TEXTBOX.text_cur--;
    +
    698 }
    +
    699 break;
    +
    700
    +
    701 case RETROFLAT_KEY_RIGHT:
    +
    702 if( ctl->TEXTBOX.text_sz > ctl->TEXTBOX.text_cur ) {
    +
    703 ctl->TEXTBOX.text_cur++;
    +
    704 }
    +
    705 break;
    +
    706
    +
    707 default:
    +
    708 assert( ctl->TEXTBOX.text_sz < ctl->TEXTBOX.text_sz_max );
    + +
    710 ctl->TEXTBOX.text,
    +
    711 ctl->TEXTBOX.text_cur,
    +
    712 ctl->TEXTBOX.text_sz,
    +
    713 ctl->TEXTBOX.text_sz_max );
    +
    714 break;
    +
    715 }
    +
    716
    +
    717 /* TODO: Remove input from queue? */
    +
    718
    +
    719cleanup:
    +
    720
    +
    721 if( NULL != ctl->TEXTBOX.text ) {
    +
    722 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    723 }
    +
    724
    +
    725# endif
    +
    726
    +
    727 return idc_out;
    +
    728}
    +
    729
    +
    730static void retrogui_redraw_TEXTBOX(
    +
    731 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    732) {
    +
    733
    +
    734# if defined( RETROGUI_NATIVE_WIN )
    +
    735 /* Do nothing. */
    +
    736# else
    +
    737
    +
    738 retroflat_rect( gui->draw_bmp, ctl->base.bg_color, ctl->base.x, ctl->base.y,
    +
    739 ctl->base.w, ctl->base.h, RETROFLAT_FLAGS_FILL );
    +
    740
    +
    741 /* Draw chiselled inset border. */
    +
    742
    +
    743 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLACK,
    +
    744 ctl->base.x, ctl->base.y, ctl->base.w, 2,
    + +
    746
    +
    747 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLACK,
    +
    748 ctl->base.x, ctl->base.y, 2, ctl->base.h,
    + +
    750
    +
    751 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    752 ctl->base.x, ctl->base.y + ctl->base.h - 1,
    +
    753 ctl->base.w, 2,
    + +
    755
    +
    756 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    757 ctl->base.x + ctl->base.w - 1, ctl->base.y, 2, ctl->base.h,
    + +
    759
    +
    760 /* Draw text. */
    +
    761
    +
    762 assert( NULL == ctl->TEXTBOX.text );
    +
    763 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    764 if( NULL == ctl->TEXTBOX.text ) {
    +
    765 goto cleanup;
    +
    766 }
    +
    767
    +
    768#ifdef RETROGXC_PRESENT
    +
    769 retrogxc_string(
    +
    770 gui->draw_bmp, ctl->base.fg_color, ctl->TEXTBOX.text, 0, gui->font_idx,
    +
    771 ctl->base.x + RETROGUI_PADDING,
    +
    772 ctl->base.y + RETROGUI_PADDING, ctl->base.w, ctl->base.h, 0 );
    +
    773#else
    +
    774 retrofont_string(
    +
    775 gui->draw_bmp, ctl->base.fg_color, ctl->TEXTBOX.text, 0, gui->font_h,
    +
    776 ctl->base.x + RETROGUI_PADDING,
    +
    777 ctl->base.y + RETROGUI_PADDING, ctl->base.w, ctl->base.h, 0 );
    +
    778#endif /* RETROGXC_PRESENT */
    +
    779
    +
    780cleanup:
    +
    781
    +
    782 if( NULL != ctl->TEXTBOX.text ) {
    +
    783 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    784 }
    +
    785
    +
    786 /* TODO: Get cursor color from GUI. */
    +
    787 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLUE,
    +
    788 ctl->base.x + RETROGUI_PADDING + (8 * ctl->TEXTBOX.text_cur),
    +
    789 ctl->base.y + RETROGUI_PADDING,
    +
    790 8, 8,
    +
    791 /* Draw blinking cursor. */
    +
    792 /* TODO: Use a global timer to mark this field dirty. */
    +
    793 gui->focus == ctl->base.idc &&
    +
    794 0 < ctl->TEXTBOX.blink_frames ? RETROFLAT_FLAGS_FILL : 0 );
    +
    795
    +
    796 if( (-1 * RETROGUI_CTL_TEXT_BLINK_FRAMES) > --(ctl->TEXTBOX.blink_frames) ) {
    +
    797 ctl->TEXTBOX.blink_frames = RETROGUI_CTL_TEXT_BLINK_FRAMES;
    +
    798 }
    +
    799
    +
    800 gui->flags |= RETROGUI_FLAGS_DIRTY; /* Mark dirty for blink animation. */
    +
    801
    +
    802# endif
    +
    803
    +
    804 return;
    +
    805}
    +
    806
    +
    807static MERROR_RETVAL retrogui_push_TEXTBOX( union RETROGUI_CTL* ctl ) {
    +
    808 MERROR_RETVAL retval = MERROR_OK;
    +
    809
    +
    810# if defined( RETROGUI_NATIVE_WIN )
    +
    811
    +
    812 ctl->base.hwnd = CreateWindow(
    +
    813 "EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
    +
    814 ctl->base.x, ctl->base.y, ctl->base.w, ctl->base.h,
    +
    815 g_retroflat_state->window, (HMENU)(ctl->base.idc),
    +
    816 g_retroflat_instance, NULL );
    +
    817 if( (HWND)NULL == ctl->base.hwnd ) {
    + +
    819 "Could not create textbox: " SIZE_T_FMT, ctl->base.idc );
    +
    820 retval = MERROR_GUI;
    +
    821 goto cleanup;
    +
    822 }
    +
    823
    +
    824# else
    +
    825
    +
    826 debug_printf( RETROGUI_TRACE_LVL,
    +
    827 "clearing textbox " SIZE_T_FMT " buffer...", ctl->base.idc );
    +
    828 assert( NULL == ctl->TEXTBOX.text_h );
    +
    829 ctl->TEXTBOX.text_h = maug_malloc( RETROGUI_CTL_TEXT_SZ_MAX, 1 );
    +
    830 maug_cleanup_if_null_alloc( MAUG_MHANDLE, ctl->TEXTBOX.text_h );
    +
    831 ctl->TEXTBOX.text_sz_max = RETROGUI_CTL_TEXT_SZ_MAX;
    +
    832
    +
    833 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    834 maug_cleanup_if_null_alloc( char*, ctl->TEXTBOX.text );
    +
    835 debug_printf( RETROGUI_TRACE_LVL,
    +
    836 "clearing textbox " SIZE_T_FMT " buffer...", ctl->base.idc );
    +
    837 maug_mzero( ctl->TEXTBOX.text, RETROGUI_CTL_TEXT_SZ_MAX );
    +
    838 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    839
    +
    840# endif
    +
    841
    +
    842cleanup:
    +
    843
    +
    844 return retval;
    +
    845}
    +
    846
    +
    847static void retrogui_free_TEXTBOX( union RETROGUI_CTL* ctl ) {
    +
    848 if( NULL != ctl->TEXTBOX.text_h ) {
    +
    849 maug_mfree( ctl->TEXTBOX.text_h );
    +
    850 }
    +
    851}
    +
    852
    +
    853static MERROR_RETVAL retrogui_init_TEXTBOX( union RETROGUI_CTL* ctl ) {
    +
    854 MERROR_RETVAL retval = MERROR_OK;
    +
    855
    +
    856 debug_printf( RETROGUI_TRACE_LVL,
    +
    857 "initializing textbox " SIZE_T_FMT "...", ctl->base.idc );
    +
    858
    +
    859 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    860 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
    +
    861
    +
    862 return retval;
    +
    863}
    +
    864
    +
    865/* === Generic Functions === */
    +
    866
    +
    867union RETROGUI_CTL* retrogui_get_ctl_by_idc(
    +
    868 struct RETROGUI* gui, size_t idc
    +
    869) {
    +
    870 size_t i = 0;
    +
    871 union RETROGUI_CTL* ctl = NULL;
    +
    872
    +
    873 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    874 if( idc == gui->ctls[i].base.idc ) {
    +
    875 ctl = &(gui->ctls[i]);
    +
    876 break;
    +
    877 }
    +
    878 }
    +
    879
    +
    880 if( NULL == ctl ) {
    + +
    882 "Could not find GUI item: " SIZE_T_FMT, idc );
    +
    883 }
    +
    884
    +
    885 return ctl;
    +
    886}
    +
    887
    + +
    889 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
    +
    890 struct RETROFLAT_INPUT* input_evt
    +
    891) {
    +
    892 size_t i = 0,
    +
    893 mouse_x = 0,
    +
    894 mouse_y = 0;
    +
    895 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    896 union RETROGUI_CTL* ctl = NULL;
    +
    897
    +
    898 assert( NULL != gui->ctls );
    +
    899
    +
    900# if defined( RETROGUI_NATIVE_WIN )
    +
    901
    +
    902 if( 0 == g_retroflat_state->last_idc ) {
    +
    903 /* No WM_COMMAND to process. */
    +
    904 goto cleanup;
    +
    905 }
    +
    906
    +
    907 ctl = retrogui_get_ctl_by_idc( gui, g_retroflat_state->last_idc );
    +
    908 g_retroflat_state->last_idc = 0;
    +
    909 if( NULL == ctl ) {
    +
    910 debug_printf( RETROGUI_TRACE_LVL,
    +
    911 "invalid IDC: " SIZE_T_FMT, gui->focus );
    +
    912 }
    +
    913
    +
    914 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
    +
    915 if( SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) ) {
    +
    916 SendMessage( ctl->base.hwnd, EM_SETMODIFY, 0, 0 );
    +
    917 debug_printf( RETROGUI_TRACE_LVL, "mod: %d",
    +
    918 SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) );
    +
    919 }
    +
    920 }
    +
    921
    +
    922# else
    +
    923
    +
    924 /* Use our cross-platform controls. */
    +
    925
    +
    926 #define RETROGUI_CTL_TABLE_CLICK( idx, c_name, c_fields ) \
    +
    927 } else if( RETROGUI_CTL_TYPE_ ## c_name == gui->ctls[i].base.type ) { \
    +
    928 gui->flags |= RETROGUI_FLAGS_DIRTY; \
    +
    929 idc_out = \
    +
    930 retrogui_click_ ## c_name( \
    +
    931 gui, &(gui->ctls[i]), p_input, input_evt );
    +
    932
    +
    933 #define RETROGUI_CTL_TABLE_KEY( idx, c_name, c_fields ) \
    +
    934 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    935 gui->flags |= RETROGUI_FLAGS_DIRTY; \
    +
    936 idc_out = retrogui_key_ ## c_name( ctl, p_input, input_evt );
    +
    937
    +
    938 if( 0 == *p_input ) {
    +
    939 goto reset_debounce;
    +
    940
    +
    941# ifndef RETROGUI_NO_MOUSE
    +
    942 } else if(
    +
    943 RETROFLAT_MOUSE_B_LEFT == *p_input ||
    +
    944 RETROFLAT_MOUSE_B_RIGHT == *p_input
    +
    945 ) {
    +
    946 /* Remove all focus before testing if a new control has focus. */
    +
    947 gui->focus = RETROGUI_IDC_NONE;
    +
    948
    +
    949 mouse_x = input_evt->mouse_x;
    +
    950 mouse_y = input_evt->mouse_y;
    +
    951
    +
    952 if( NULL != gui->draw_xy ) {
    +
    953 gui->draw_xy( &mouse_x, &mouse_y, gui->draw_xy_data );
    +
    954 }
    +
    955
    +
    956 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    957 if(
    +
    958 mouse_x < gui->ctls[i].base.x ||
    +
    959 mouse_y < gui->ctls[i].base.y ||
    +
    960 mouse_x > gui->ctls[i].base.x + gui->ctls[i].base.w ||
    +
    961 mouse_y > gui->ctls[i].base.y + gui->ctls[i].base.h
    +
    962 ) {
    +
    963 continue;
    +
    964 }
    +
    965
    +
    966 if( gui->idc_prev == gui->ctls[i].base.idc ) {
    +
    967 /* No repeated clicks! */
    +
    968 /* TODO: Allow exceptions for e.g. scrollbars. */
    +
    969 idc_out = RETROGUI_IDC_NONE;
    +
    970 goto cleanup;
    +
    971 }
    +
    972
    +
    973 gui->idc_prev = gui->ctls[i].base.idc;
    +
    974
    +
    975 gui->focus = gui->ctls[i].base.idc;
    +
    976
    +
    977 if( 0 ) {
    +
    978 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CLICK )
    +
    979 }
    +
    980 break;
    +
    981 }
    +
    982# endif /* !RETROGUI_NO_MOUSE */
    +
    983
    +
    984 } else {
    +
    985
    +
    986 if( RETROGUI_IDC_NONE == gui->focus ) {
    +
    987 goto reset_debounce;
    +
    988 }
    +
    989
    +
    990 /* Send keystrokes to control that has focus. */
    +
    991
    +
    992 ctl = retrogui_get_ctl_by_idc( gui, gui->focus );
    +
    993 if( NULL == ctl ) {
    +
    994 debug_printf( RETROGUI_TRACE_LVL,
    +
    995 "invalid IDC: " SIZE_T_FMT, gui->focus );
    +
    996 goto reset_debounce;
    +
    997 }
    +
    998
    +
    999 if( 0 ) {
    +
    1000 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_KEY )
    +
    1001 }
    +
    1002 }
    +
    1003
    +
    1004reset_debounce:
    +
    1005
    +
    1006 /* Reset repeat detector. */
    +
    1007 gui->idc_prev = RETROGUI_IDC_NONE;
    +
    1008
    +
    1009# endif
    +
    1010
    +
    1011cleanup:
    +
    1012
    +
    1013 return idc_out;
    +
    1014}
    +
    1015
    +
    1016void retrogui_redraw_ctls( struct RETROGUI* gui ) {
    +
    1017 size_t i = 0;
    +
    1018
    +
    1019 assert( NULL != gui->ctls );
    +
    1020
    +
    1021 if(
    + +
    1023 (RETROGUI_FLAGS_DIRTY & gui->flags)
    +
    1024 ) {
    +
    1025 return;
    +
    1026 }
    +
    1027
    +
    1028 #define RETROGUI_CTL_TABLE_REDRAW( idx, c_name, c_fields ) \
    +
    1029 } else if( RETROGUI_CTL_TYPE_ ## c_name == gui->ctls[i].base.type ) { \
    +
    1030 /* Mark dirty first so redraw can unmark it for animation! */ \
    +
    1031 gui->flags &= ~RETROGUI_FLAGS_DIRTY; \
    +
    1032 retrogui_redraw_ ## c_name( gui, &(gui->ctls[i]) );
    +
    1033
    +
    1034 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    1035 if( 0 ) {
    +
    1036 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_REDRAW )
    +
    1037 }
    +
    1038 }
    +
    1039}
    +
    1040
    +
    1041MERROR_RETVAL retrogui_push_ctl(
    +
    1042 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    1043) {
    +
    1044 MERROR_RETVAL retval = MERROR_OK;
    +
    1045
    +
    1046#ifdef RETROGXC_PRESENT
    +
    1047 if( 0 > gui->font_idx ) {
    +
    1048#else
    +
    1049 if( (MAUG_MHANDLE)NULL == gui->font_h ) {
    +
    1050#endif /* RETROGXC_PRESENT */
    + +
    1052 RETROFLAT_MSG_FLAG_ERROR, "Error", "GUI font not loaded!" );
    +
    1053 retval = MERROR_GUI;
    +
    1054 goto cleanup;
    +
    1055 }
    +
    1056
    +
    1057 assert( NULL != gui->ctls );
    +
    1058
    +
    1059 /* TODO: Hunt for control IDC and fail if duplicate found! */
    +
    1060
    +
    1061 /* TODO: Grow controls if needed. */
    +
    1062 assert( gui->ctls_sz + 1 < gui->ctls_sz_max );
    +
    1063
    +
    1064 if( RETROFLAT_COLOR_NULL == ctl->base.bg_color ) {
    + +
    1066 "Invalid background color specified for control " SIZE_T_FMT "!",
    +
    1067 ctl->base.idc );
    +
    1068 retval = MERROR_GUI;
    +
    1069 goto cleanup;
    +
    1070
    +
    1071 }
    +
    1072
    +
    1073 if( RETROFLAT_COLOR_NULL == ctl->base.fg_color ) {
    + +
    1075 "Invalid foreground color specified for control " SIZE_T_FMT "!",
    +
    1076 ctl->base.idc );
    +
    1077 retval = MERROR_GUI;
    +
    1078 goto cleanup;
    +
    1079 }
    +
    1080
    +
    1081 debug_printf( RETROGUI_TRACE_LVL,
    +
    1082 "pushing %s " SIZE_T_FMT " to slot " SIZE_T_FMT "...",
    +
    1083 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc, gui->ctls_sz );
    +
    1084
    +
    1085 memcpy(
    +
    1086 &(gui->ctls[gui->ctls_sz]),
    +
    1087 ctl,
    +
    1088 sizeof( union RETROGUI_CTL ) );
    +
    1089 gui->ctls_sz++;
    +
    1090
    +
    1091 gui->flags |= RETROGUI_FLAGS_DIRTY;
    +
    1092
    +
    1093 #define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
    +
    1094 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1095 retval = retrogui_push_ ## c_name( &(gui->ctls[gui->ctls_sz - 1]) ); \
    +
    1096 maug_cleanup_if_not_ok();
    +
    1097
    +
    1098 if( 0 ) {
    +
    1099 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_PUSH )
    +
    1100 }
    +
    1101
    +
    1102cleanup:
    +
    1103
    +
    1104 return retval;
    +
    1105}
    +
    1106
    +
    1107MERROR_RETVAL retrogui_get_ctl_text(
    +
    1108 struct RETROGUI* gui, RETROGUI_IDC idc, char* buffer, size_t buffer_sz
    +
    1109) {
    +
    1110 MERROR_RETVAL retval = MERROR_OK;
    +
    1111 union RETROGUI_CTL* ctl = NULL;
    +
    1112
    +
    1113 ctl = retrogui_get_ctl_by_idc( gui, idc );
    +
    1114 if( NULL == ctl ) {
    +
    1115 goto cleanup;
    +
    1116 }
    +
    1117
    +
    1118 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
    +
    1119# if defined( RETROGUI_NATIVE_WIN )
    +
    1120 /* TODO */
    +
    1121#else
    +
    1122 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    1123 maug_cleanup_if_null_alloc( char*, ctl->TEXTBOX.text );
    +
    1124
    +
    1125 strncpy( buffer, ctl->TEXTBOX.text, buffer_sz );
    +
    1126# endif
    +
    1127 }
    +
    1128
    +
    1129cleanup:
    +
    1130
    +
    1131 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
    +
    1132 if( NULL != ctl->TEXTBOX.text ) {
    +
    1133 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    1134 }
    +
    1135 }
    +
    1136
    +
    1137 return retval;
    +
    1138}
    +
    1139
    +
    1140size_t retrogui_get_ctl_sel_idx( struct RETROGUI* gui, RETROGUI_IDC idc ) {
    +
    1141 size_t idx = -1;
    +
    1142 union RETROGUI_CTL* ctl = NULL;
    +
    1143
    +
    1144 ctl = retrogui_get_ctl_by_idc( gui, idc );
    +
    1145 if( NULL == ctl ) {
    +
    1146 goto cleanup;
    +
    1147 }
    +
    1148
    +
    1149 assert( RETROGUI_CTL_TYPE_LISTBOX == ctl->base.type );
    +
    1150
    +
    1151# if defined( RETROGUI_NATIVE_WIN )
    +
    1152 idx = SendMessage( ctl->base.hwnd, LB_GETCARETINDEX, 0, 0 );
    +
    1153# else
    +
    1154 idx = ctl->LISTBOX.sel_idx;
    +
    1155# endif
    +
    1156
    +
    1157cleanup:
    +
    1158
    +
    1159 return idx;
    +
    1160}
    +
    1161
    +
    1162MERROR_RETVAL retrogui_init_ctl(
    +
    1163 union RETROGUI_CTL* ctl, uint8_t type, size_t idc
    +
    1164) {
    +
    1165 MERROR_RETVAL retval = MERROR_OK;
    +
    1166
    +
    1167 debug_printf( RETROGUI_TRACE_LVL,
    +
    1168 "initializing control base " SIZE_T_FMT "...", idc );
    +
    1169
    +
    1170 maug_mzero( ctl, sizeof( union RETROGUI_CTL ) );
    +
    1171
    +
    1172 ctl->base.type = type;
    +
    1173 ctl->base.idc = idc;
    +
    1174 ctl->base.fg_color = RETROFLAT_COLOR_NULL;
    +
    1175 ctl->base.bg_color = RETROFLAT_COLOR_NULL;
    +
    1176
    +
    1177 #define RETROGUI_CTL_TABLE_INITS( idx, c_name, c_fields ) \
    +
    1178 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1179 retrogui_init_ ## c_name( ctl );
    +
    1180
    +
    1181 if( 0 ) {
    +
    1182 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_INITS )
    +
    1183 }
    +
    1184
    +
    1185 return retval;
    +
    1186}
    +
    1187
    +
    1188void retrogui_free( struct RETROGUI* gui ) {
    +
    1189 size_t i = 0;
    +
    1190
    +
    1191 if( NULL == gui->ctls && (MAUG_MHANDLE)NULL != gui->ctls_h ) {
    +
    1192 maug_mlock( gui->ctls_h, gui->ctls );
    +
    1193 if( NULL == gui->ctls ) {
    +
    1194 goto cleanup;
    +
    1195 }
    +
    1196 }
    +
    1197
    +
    1198 #define RETROGUI_CTL_TABLE_FREE( idx, c_name, c_fields ) \
    +
    1199 } else if( RETROGUI_CTL_TYPE_ ## c_name == gui->ctls[i].base.type ) { \
    +
    1200 retrogui_free_ ## c_name( &(gui->ctls[i]) );
    +
    1201
    +
    1202 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    1203 if( 0 ) {
    +
    1204 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE )
    +
    1205 }
    +
    1206 }
    +
    1207
    +
    1208 maug_munlock( gui->ctls_h, gui->ctls );
    +
    1209
    +
    1210cleanup:
    +
    1211
    +
    1212 maug_mfree( gui->ctls_h );
    +
    1213
    +
    1214}
    +
    1215
    +
    1216MERROR_RETVAL retrogui_init( struct RETROGUI* gui ) {
    +
    1217 MERROR_RETVAL retval = MERROR_OK;
    +
    1218
    +
    1219 maug_mzero( gui, sizeof( struct RETROGUI ) );
    +
    1220
    +
    1221 gui->ctls_h = maug_malloc(
    +
    1222 RETROGUI_CTL_SZ_MAX_INIT, sizeof( struct RETROGUI ) );
    +
    1223 maug_cleanup_if_null_alloc( MAUG_MHANDLE, gui );
    +
    1224 gui->ctls_sz_max = RETROGUI_CTL_SZ_MAX_INIT;
    +
    1225
    +
    1226cleanup:
    +
    1227
    +
    1228 return retval;
    +
    1229}
    +
    1230
    +
    1231#else
    +
    1232
    +
    1233#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
    +
    1234 extern MAUG_CONST uint8_t RETROGUI_CTL_TYPE_ ## c_name;
    +
    1235
    +
    1236RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
    +
    1237
    +
    1238extern MAUG_CONST char* gc_retrogui_ctl_names[];
    +
    1239
    +
    1240#endif /* RETROGUI_C */
    +
    1241
    +
    1242 /* maug_retrogui */
    +
    1243
    +
    1244#endif /* !RETROGUI_H */
    +
    1245
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    void retroflat_rect(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
    Draw a rectangle onto the target RETROFLAT_BITMAP.
    +
    #define RETROFLAT_FLAGS_FILL
    Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
    Definition retroflt.h:369
    +
    void retroflat_line(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags)
    Draw a straight line onto the target RETROFLAT_BITMAP.
    +
    #define retroflat_buffer_insert(c, buffer, buffer_cur, buffer_sz, buffer_mx)
    Insert a character into a text buffer at cursor position.
    Definition retroflt.h:855
    +
    #define retroflat_buffer_bksp(buffer, buffer_cur, buffer_sz)
    Remove a character from a text buffer before cursor position.
    Definition retroflt.h:839
    +
    #define RETROFLAT_MSG_FLAG_ERROR
    This icon/type flag indicates an error. It will try to display messages in an urgent way with a red i...
    Definition retroflt.h:505
    +
    void retroflat_message(uint8_t flags, const char *title, const char *format,...)
    Display a message in a dialog box and/or on stderr.
    +
    #define RETROGUI_CTL_TABLE_FIELDS(idx, c_name, c_fields)
    Creates the corresponding RETROGUI_* structs from RETROGUI_CTL_TABLE that populate union RETROGUI_CTL...
    Definition retrogui.h:103
    +
    #define RETROGUI_CTL_TABLE(f)
    Table defining all control types and their specific fields in RETROGUI_CTL.
    Definition retrogui.h:74
    +
    #define RETROGUI_CTL_TABLE_TYPES(idx, c_name, c_fields)
    Adds the structs created by RETROGUI_CTL_TABLE_FIELDS to union RETROGUI_CTL.
    Definition retrogui.h:115
    +
    #define RETROGUI_FLAGS_DIRTY
    RETROGUI::flags indicating controls should be redrawn.
    Definition retrogui.h:16
    +
    RETROGUI_IDC retrogui_poll_ctls(struct RETROGUI *gui, RETROFLAT_IN_KEY *p_input, struct RETROFLAT_INPUT *input_evt)
    Poll for the last clicked control and maintain listboxes and menus.
    +
    size_t RETROGUI_IDC
    Unique identifying constant number for controls.
    Definition retrogui.h:56
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:878
    +
    int mouse_y
    Y-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:888
    +
    int mouse_x
    X-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:883
    +
    Fields common to ALL RETROGUI_CTL types.
    Definition retrogui.h:85
    +
    Definition retrogui.h:127
    +
    Definition retrogui.h:118
    +
    + + +
    + + diff --git a/retrogxc_8h_source.html b/retrogxc_8h_source.html new file mode 100644 index 00000000..86eee2a4 --- /dev/null +++ b/retrogxc_8h_source.html @@ -0,0 +1,638 @@ + + + + + + + +maug: retrogxc.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrogxc.h
    +
    +
    +
    1
    +
    2#ifndef RETROGXC_H
    +
    3#define RETROGXC_H
    +
    4
    +
    5#include <maug.h>
    +
    6
    +
    7#define RETROGXC_PRESENT 1
    +
    8
    +
    9#ifndef RETROGXC_INITIAL_SZ
    +
    10# define RETROGXC_INITIAL_SZ 16
    +
    11#endif /* !RETROGXC_INITIAL_SZ */
    +
    12
    +
    13#ifndef RETROGXC_TRACE_LVL
    +
    14# define RETROGXC_TRACE_LVL 0
    +
    15#endif /* !RETROGXC_TRACE_LVL */
    +
    16
    +
    17#define RETROGXC_ERROR_CACHE_MISS (-1)
    +
    18
    +
    19#define RETROGXC_ASSET_TYPE_NONE 0
    +
    20#define RETROGXC_ASSET_TYPE_BITMAP 1
    +
    21#define RETROGXC_ASSET_TYPE_FONT 2
    +
    22
    +
    23#define retrogxc_load_bitmap( res_p, flags ) \
    +
    24 retrogxc_load_asset( res_p, retrogxc_loader_bitmap, NULL, flags )
    +
    25
    +
    26#define retrogxc_load_xpm( res_p, flags ) \
    +
    27 retrogxc_load_asset( res_p, retrogxc_loader_xpm, NULL, flags )
    +
    28
    +
    29typedef int8_t RETROGXC_ASSET_TYPE;
    +
    30
    +
    31typedef RETROGXC_ASSET_TYPE (*retrogxc_loader)(
    +
    32 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p,
    +
    33 void* data, uint8_t flags );
    +
    34
    +
    + +
    36 uint8_t type;
    +
    37 MAUG_MHANDLE handle;
    + +
    39};
    +
    +
    40
    +
    + +
    42 uint8_t glyph_h;
    +
    43 uint16_t first_glyph;
    +
    44 uint16_t glyphs_count;
    +
    45};
    +
    +
    46
    +
    47MERROR_RETVAL retrogxc_init();
    +
    48
    +
    49void retrogxc_clear_cache();
    +
    50
    +
    51void retrogxc_shutdown();
    +
    52
    +
    53RETROGXC_ASSET_TYPE retrogxc_loader_bitmap(
    +
    54 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p,
    +
    55 void* data, uint8_t flags );
    +
    56
    +
    57RETROGXC_ASSET_TYPE retrogxc_loader_xpm(
    +
    58 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p,
    +
    59 void* data, uint8_t flags );
    +
    60
    +
    61RETROGXC_ASSET_TYPE retrogxc_loader_font(
    +
    62 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p,
    +
    63 void* data, uint8_t flags );
    +
    64
    +
    65int16_t retrogxc_load_font(
    +
    66 const retroflat_asset_path font_name,
    +
    67 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count );
    +
    68
    +
    69int16_t retrogxc_load_asset(
    +
    70 const retroflat_asset_path res_p, retrogxc_loader l, void* data,
    +
    71 uint8_t flags );
    +
    72
    +
    73MERROR_RETVAL retrogxc_blit_bitmap(
    +
    74 struct RETROFLAT_BITMAP* target, size_t bitmap_idx,
    +
    75 uint16_t s_x, uint16_t s_y, uint16_t d_x, uint16_t d_y,
    +
    76 uint16_t w, uint16_t h );
    +
    77
    +
    78MERROR_RETVAL retrogxc_string(
    +
    79 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    80 const char* str, size_t str_sz,
    +
    81 size_t font_idx, size_t x, size_t y,
    +
    82 size_t max_w, size_t max_h, uint8_t flags );
    +
    83
    +
    84MERROR_RETVAL retrogxc_string_sz(
    +
    85 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    86 size_t font_idx, size_t max_w, size_t max_h,
    +
    87 size_t* out_w_p, size_t* out_h_p, uint8_t flags );
    +
    88
    +
    89#ifdef RETROGXC_C
    +
    90
    +
    91static MAUG_MHANDLE gs_retrogxc_handle = (MAUG_MHANDLE)NULL;
    +
    92static size_t gs_retrogxc_sz = 0;
    +
    93
    +
    94/* === */
    +
    95
    +
    96MERROR_RETVAL retrogxc_init() {
    +
    97 MERROR_RETVAL retval = MERROR_OK;
    +
    98 struct RETROFLAT_CACHE_ASSET* assets = NULL;
    +
    99
    +
    100 gs_retrogxc_handle = maug_malloc(
    +
    101 RETROGXC_INITIAL_SZ, sizeof( struct RETROFLAT_CACHE_ASSET ) );
    +
    102 maug_cleanup_if_null_alloc( MAUG_MHANDLE, gs_retrogxc_handle );
    +
    103 gs_retrogxc_sz = RETROGXC_INITIAL_SZ;
    +
    104
    +
    105 size_printf( RETROGXC_TRACE_LVL,
    +
    106 "asset struct", sizeof( struct RETROFLAT_CACHE_ASSET ) );
    +
    107 size_printf( RETROGXC_TRACE_LVL, "initial graphics cache",
    +
    108 sizeof( struct RETROFLAT_CACHE_ASSET ) * gs_retrogxc_sz );
    +
    109
    +
    110 maug_mlock( gs_retrogxc_handle, assets );
    +
    111 maug_cleanup_if_null_alloc( struct RETROFLAT_CACHE_ASSET*, assets );
    + +
    113 assets,
    +
    114 RETROGXC_INITIAL_SZ * sizeof( struct RETROFLAT_CACHE_ASSET ) );
    +
    115
    +
    116cleanup:
    +
    117
    +
    118 if( NULL != assets ) {
    +
    119 maug_munlock( gs_retrogxc_handle, assets );
    +
    120 }
    +
    121
    +
    122 return retval;
    +
    123}
    +
    124
    +
    125/* === */
    +
    126
    +
    127void retrogxc_clear_cache() {
    +
    128 size_t i = 0,
    +
    129 dropped_count = 0;
    +
    130 struct RETROFLAT_CACHE_ASSET* assets = NULL;
    +
    131 struct RETROFLAT_BITMAP* bitmap = NULL;
    +
    132
    +
    133 maug_mlock( gs_retrogxc_handle, assets );
    +
    134 for( i = 0 ; gs_retrogxc_sz > i ; i++ ) {
    +
    135
    +
    136 /* Basic node sanity checking. */
    +
    137 if( RETROGXC_ASSET_TYPE_NONE == assets[i].type ) {
    +
    138 continue;
    +
    139 } else if( NULL == assets[i].handle ) {
    +
    140 error_printf( "invalid asset handle in asset #" SIZE_T_FMT, i );
    +
    141 continue;
    +
    142 }
    +
    143
    +
    144 /* Asset-type-specific cleanup. */
    +
    145 if( RETROGXC_ASSET_TYPE_BITMAP == assets[i].type ) {
    +
    146 maug_mlock( assets[i].handle, bitmap );
    +
    147 if( NULL != bitmap ) {
    +
    148 retroflat_destroy_bitmap( bitmap );
    +
    149 }
    +
    150 maug_munlock( assets[i].handle, bitmap );
    +
    151 maug_mfree( assets[i].handle );
    +
    152 dropped_count++;
    +
    153
    +
    154 } else if( RETROGXC_ASSET_TYPE_FONT == assets[i].type ) {
    +
    155 /* Fonts are just a blob of data after a struct, so just free it! */
    +
    156 maug_mfree( assets[i].handle );
    +
    157 dropped_count++;
    +
    158 }
    +
    159
    +
    160 }
    +
    161 maug_mzero( assets,
    +
    162 sizeof( struct RETROFLAT_CACHE_ASSET ) * gs_retrogxc_sz );
    +
    163 maug_munlock( gs_retrogxc_handle, assets );
    +
    164
    +
    165 debug_printf( RETROGXC_TRACE_LVL,
    +
    166 "graphics cache cleared (" SIZE_T_FMT " of " SIZE_T_FMT " assets)",
    +
    167 dropped_count, gs_retrogxc_sz );
    +
    168
    +
    169# ifndef NO_GUI
    +
    170 /* window_reload_frames(); */
    +
    171# endif /* !NO_GUI */
    +
    172}
    +
    173
    +
    174/* === */
    +
    175
    +
    176void retrogxc_shutdown() {
    +
    177 retrogxc_clear_cache();
    +
    178 maug_mfree( gs_retrogxc_handle );
    +
    179}
    +
    180
    +
    181/* === */
    +
    182
    +
    183RETROGXC_ASSET_TYPE retrogxc_loader_bitmap(
    +
    184 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p, void* data,
    +
    185 uint8_t flags
    +
    186) {
    +
    187 MERROR_RETVAL retval = MERROR_OK;
    +
    188 struct RETROFLAT_BITMAP* bitmap = NULL;
    +
    189
    +
    190 assert( (MAUG_MHANDLE)NULL == *handle_p );
    +
    191
    +
    192 *handle_p = maug_malloc( 1, sizeof( struct RETROFLAT_BITMAP ) );
    +
    193 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *handle_p );
    +
    194
    +
    195 maug_mlock( *handle_p, bitmap );
    +
    196 maug_cleanup_if_null_alloc( struct RETROFLAT_BITMAP*, bitmap );
    +
    197
    +
    198 /* Load requested bitmap into the cache. */
    +
    199 retval = retroflat_load_bitmap( res_p, bitmap, flags );
    +
    200 maug_cleanup_if_not_ok();
    +
    201
    +
    202cleanup:
    +
    203
    +
    204 if( NULL != bitmap ) {
    +
    205 maug_munlock( *handle_p, bitmap );
    +
    206 }
    +
    207
    +
    208 if( MERROR_OK == retval ) {
    +
    209 return RETROGXC_ASSET_TYPE_BITMAP;
    +
    210 } else {
    +
    211 if( NULL != *handle_p ) {
    +
    212 maug_mfree( *handle_p );
    +
    213 }
    +
    214 return RETROGXC_ASSET_TYPE_NONE;
    +
    215 }
    +
    216}
    +
    217
    +
    218/* === */
    +
    219
    +
    220#ifdef RETROFLAT_XPM
    +
    221
    +
    222RETROGXC_ASSET_TYPE retrogxc_loader_xpm(
    +
    223 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p, void* data,
    +
    224 uint8_t flags
    +
    225) {
    +
    226 MERROR_RETVAL retval = MERROR_OK;
    +
    227 struct RETROFLAT_BITMAP* bitmap = NULL;
    +
    228
    +
    229 assert( (MAUG_MHANDLE)NULL == *handle_p );
    +
    230
    +
    231 *handle_p = maug_malloc( 1, sizeof( struct RETROFLAT_BITMAP ) );
    +
    232 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *handle_p );
    +
    233
    +
    234 maug_mlock( *handle_p, bitmap );
    +
    235 maug_cleanup_if_null_alloc( struct RETROFLAT_BITMAP*, bitmap );
    +
    236
    +
    237 /* Load requested bitmap into the cache. */
    +
    238 retval = retroflat_load_xpm( res_p, bitmap, flags );
    +
    239 maug_cleanup_if_not_ok();
    +
    240
    +
    241cleanup:
    +
    242
    +
    243 if( NULL != bitmap ) {
    +
    244 maug_munlock( *handle_p, bitmap );
    +
    245 }
    +
    246
    +
    247 if( MERROR_OK == retval ) {
    +
    248 return RETROGXC_ASSET_TYPE_BITMAP;
    +
    249 } else {
    +
    250 if( NULL != *handle_p ) {
    +
    251 maug_mfree( *handle_p );
    +
    252 }
    +
    253 return RETROGXC_ASSET_TYPE_NONE;
    +
    254 }
    +
    255}
    +
    256
    +
    257#endif /* RETROFLAT_XPM */
    +
    258
    +
    259/* === */
    +
    260
    +
    261#ifdef RETROFONT_PRESENT
    +
    262
    +
    263RETROGXC_ASSET_TYPE retrogxc_loader_font(
    +
    264 const retroflat_asset_path res_p, MAUG_MHANDLE* handle_p, void* data,
    +
    265 uint8_t flags
    +
    266) {
    +
    267 MERROR_RETVAL retval = MERROR_OK;
    +
    268 struct RETROGXC_FONT_PARMS* parms = (struct RETROGXC_FONT_PARMS*)data;
    +
    269
    +
    270 assert( (MAUG_MHANDLE)NULL == *handle_p );
    +
    271
    +
    272 debug_printf( 1, "loading font into cache: %s (%d, %d, %d)",
    +
    273 res_p, parms->glyph_h, parms->first_glyph, parms->glyphs_count );
    +
    274
    +
    275 retval = retrofont_load( res_p, handle_p,
    +
    276 parms->glyph_h, parms->first_glyph, parms->glyphs_count );
    +
    277 maug_cleanup_if_not_ok();
    +
    278
    +
    279cleanup:
    +
    280
    +
    281 if( MERROR_OK == retval ) {
    +
    282 return RETROGXC_ASSET_TYPE_FONT;
    +
    283 } else {
    +
    284 return RETROGXC_ASSET_TYPE_NONE;
    +
    285 }
    +
    286}
    +
    287
    +
    288#endif /* RETROFONT_PRESENT */
    +
    289
    +
    290/* === */
    +
    291
    +
    292int16_t retrogxc_load_asset(
    +
    293 const retroflat_asset_path res_p, retrogxc_loader l, void* data,
    +
    294 uint8_t flags
    +
    295) {
    +
    296 int16_t idx = RETROGXC_ERROR_CACHE_MISS,
    +
    297 i = 0;
    +
    298 struct RETROFLAT_CACHE_ASSET* assets = NULL;
    +
    299 RETROGXC_ASSET_TYPE asset_type = RETROGXC_ASSET_TYPE_NONE;
    +
    300
    +
    301 maug_mlock( gs_retrogxc_handle, assets );
    +
    302
    +
    303 /* Try to find the bitmap already in the cache. */
    +
    304 for( i = 0 ; gs_retrogxc_sz > i ; i++ ) {
    +
    305 debug_printf( RETROGXC_TRACE_LVL, "\"%s\" vs \"%s\"",
    +
    306 assets[i].id, res_p );
    +
    307 if( 0 == retroflat_cmp_asset_path( assets[i].id, res_p ) ) {
    +
    308 debug_printf( RETROGXC_TRACE_LVL,
    +
    309 "found asset \"%s\" at index %d with type %d!",
    +
    310 res_p, i, assets[i].type );
    +
    311 idx = i;
    +
    312 goto cleanup;
    +
    313 }
    +
    314 }
    +
    315
    +
    316 /* Bitmap not found. */
    +
    317 debug_printf( RETROGXC_TRACE_LVL,
    +
    318 "asset %s not found in cache; loading...", res_p );
    +
    319 for( i = 0 ; gs_retrogxc_sz > i ; i++ ) {
    +
    320 /* Find a new empty slot. */
    +
    321 debug_printf( RETROGXC_TRACE_LVL, "trying cache slot: %d", i );
    +
    322 if( RETROGXC_ASSET_TYPE_NONE != assets[i].type ) {
    +
    323 continue;
    +
    324 }
    +
    325
    +
    326 debug_printf( RETROGXC_TRACE_LVL,
    +
    327 "found free cache slot: %d (%p)", i, &(assets[i]) );
    +
    328
    +
    329 /* Call the format-specific loader. */
    +
    330 assert( (MAUG_MHANDLE)NULL == assets[i].handle );
    +
    331 asset_type = l( res_p, &(assets[i].handle), data, flags );
    +
    332 if( RETROGXC_ASSET_TYPE_NONE != asset_type ) {
    +
    333 assets[i].type = asset_type;
    +
    334 idx = i;
    +
    335 strncpy( assets[i].id, res_p, RETROFLAT_ASSETS_PATH_MAX );
    +
    336 debug_printf( RETROGXC_TRACE_LVL,
    +
    337 "asset type %d, \"%s\" assigned cache ID: %d",
    +
    338 asset_type, res_p, idx );
    +
    339 goto cleanup;
    +
    340 }
    +
    341 }
    +
    342
    +
    343 /* Still not found! */
    +
    344 error_printf( "unable to load asset; cache full or not initialized?" );
    +
    345
    +
    346cleanup:
    +
    347
    +
    348 if( NULL != assets ) {
    +
    349 maug_munlock( gs_retrogxc_handle, assets );
    +
    350 }
    +
    351
    +
    352 return idx;
    +
    353}
    +
    354
    +
    355/* === */
    +
    356
    +
    357MERROR_RETVAL retrogxc_blit_bitmap(
    +
    358 struct RETROFLAT_BITMAP* target, size_t bitmap_idx,
    +
    359 uint16_t s_x, uint16_t s_y, uint16_t d_x, uint16_t d_y,
    +
    360 uint16_t w, uint16_t h
    +
    361) {
    +
    362 MERROR_RETVAL retval = MERROR_OK;
    +
    363 struct RETROFLAT_CACHE_ASSET* assets = NULL;
    +
    364 struct RETROFLAT_BITMAP* bitmap = NULL;
    +
    365
    +
    366 if( gs_retrogxc_sz <= bitmap_idx ) {
    +
    367 error_printf( "invalid bitmap index: " SIZE_T_FMT, bitmap_idx );
    +
    368 retval = MERROR_OVERFLOW;
    +
    369 goto cleanup;
    +
    370 }
    +
    371
    +
    372 maug_mlock( gs_retrogxc_handle, assets );
    +
    373 if( NULL == assets ) {
    +
    374 error_printf( "could not lock cache!" );
    +
    375 retval = MERROR_ALLOC;
    +
    376 goto cleanup;
    +
    377 }
    +
    378
    +
    379 if( RETROGXC_ASSET_TYPE_BITMAP != assets[bitmap_idx].type ) {
    +
    380 error_printf(
    +
    381 "index " SIZE_T_FMT " not present in cache or not bitmap (%d)!",
    +
    382 bitmap_idx, assets[bitmap_idx].type );
    +
    383 retval = MERROR_FILE;
    +
    384 goto cleanup;
    +
    385 }
    +
    386
    +
    387 maug_mlock( assets[bitmap_idx].handle, bitmap );
    +
    388
    +
    389 retroflat_blit_bitmap( target, bitmap, s_x, s_y, d_x, d_y, w, h );
    +
    390
    +
    391cleanup:
    +
    392
    +
    393 if( NULL != bitmap ) {
    +
    394 maug_munlock( assets[bitmap_idx].handle, bitmap );
    +
    395 }
    +
    396
    +
    397 if( NULL != assets ) {
    +
    398 maug_munlock( gs_retrogxc_handle, assets );
    +
    399 }
    +
    400
    +
    401 return retval;
    +
    402}
    +
    403
    +
    404/* === */
    +
    405
    +
    406#ifdef RETROFONT_PRESENT
    +
    407
    +
    408int16_t retrogxc_load_font(
    +
    409 const retroflat_asset_path font_name,
    +
    410 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count
    +
    411) {
    +
    412 int16_t idx = -1;
    +
    413 struct RETROGXC_FONT_PARMS parms;
    +
    414
    +
    415 parms.glyph_h = glyph_h;
    +
    416 parms.first_glyph = first_glyph;
    +
    417 parms.glyphs_count = glyphs_count;
    +
    418
    +
    419 idx = retrogxc_load_asset( font_name, retrogxc_loader_font, &parms, 0 );
    +
    420
    +
    421 return idx;
    +
    422}
    +
    423
    +
    424/* === */
    +
    425
    +
    426MERROR_RETVAL retrogxc_string(
    +
    427 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    428 const char* str, size_t str_sz,
    +
    429 size_t font_idx, size_t x, size_t y,
    +
    430 size_t max_w, size_t max_h, uint8_t flags
    +
    431) {
    +
    432 MERROR_RETVAL retval = MERROR_OK;
    +
    433 struct RETROFLAT_CACHE_ASSET* assets = NULL;
    +
    434
    +
    435 if( gs_retrogxc_sz <= font_idx ) {
    +
    436 error_printf( "invalid font index: " SIZE_T_FMT, font_idx );
    +
    437 retval = MERROR_OVERFLOW;
    +
    438 goto cleanup;
    +
    439 }
    +
    440
    +
    441 maug_mlock( gs_retrogxc_handle, assets );
    +
    442 if( NULL == assets ) {
    +
    443 error_printf( "could not lock cache!" );
    +
    444 retval = MERROR_ALLOC;
    +
    445 goto cleanup;
    +
    446 }
    +
    447
    +
    448 if( RETROGXC_ASSET_TYPE_FONT != assets[font_idx].type ) {
    +
    449 error_printf(
    +
    450 "index " SIZE_T_FMT " not present in cache or not font (%d)!",
    +
    451 font_idx, assets[font_idx].type );
    +
    452 retval = MERROR_FILE;
    +
    453 goto cleanup;
    +
    454 }
    +
    455
    +
    456 retrofont_string(
    +
    457 target, color, str, str_sz, assets[font_idx].handle,
    +
    458 x, y, max_w, max_h, flags );
    +
    459
    +
    460cleanup:
    +
    461
    +
    462 if( NULL != assets ) {
    +
    463 maug_munlock( gs_retrogxc_handle, assets );
    +
    464 }
    +
    465
    +
    466 return retval;
    +
    467}
    +
    468
    +
    469/* === */
    +
    470
    +
    471MERROR_RETVAL retrogxc_string_sz(
    +
    472 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    473 size_t font_idx, size_t max_w, size_t max_h,
    +
    474 size_t* out_w_p, size_t* out_h_p, uint8_t flags
    +
    475) {
    +
    476 MERROR_RETVAL retval = MERROR_OK;
    +
    477 struct RETROFLAT_CACHE_ASSET* assets = NULL;
    +
    478
    +
    479 if( gs_retrogxc_sz <= font_idx ) {
    +
    480 error_printf( "invalid font index: " SIZE_T_FMT, font_idx );
    +
    481 retval = MERROR_OVERFLOW;
    +
    482 goto cleanup;
    +
    483 }
    +
    484
    +
    485 maug_mlock( gs_retrogxc_handle, assets );
    +
    486 if( NULL == assets ) {
    +
    487 error_printf( "could not lock cache!" );
    +
    488 retval = MERROR_ALLOC;
    +
    489 goto cleanup;
    +
    490 }
    +
    491
    +
    492 if( RETROGXC_ASSET_TYPE_FONT != assets[font_idx].type ) {
    +
    493 error_printf(
    +
    494 "index " SIZE_T_FMT " not present in cache or not font (%d)!",
    +
    495 font_idx, assets[font_idx].type );
    +
    496 retval = MERROR_FILE;
    +
    497 goto cleanup;
    +
    498 }
    +
    499
    +
    500 retrofont_string_sz(
    +
    501 target, str, str_sz, assets[font_idx].handle,
    +
    502 max_w, max_h, out_w_p, out_h_p, flags );
    +
    503
    +
    504cleanup:
    +
    505
    +
    506 if( NULL != assets ) {
    +
    507 maug_munlock( gs_retrogxc_handle, assets );
    +
    508 }
    +
    509
    +
    510 return retval;
    +
    511}
    +
    512
    +
    513#endif /* RETROFONT_PRESENT */
    +
    514
    +
    515#endif /* RETROGXC_C */
    +
    516
    +
    517#endif /* !RETROGXC_H */
    +
    518
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    #define retroflat_cmp_asset_path(a, b)
    Compare two asset paths. Return 0 if they're the same.
    Definition retroflt.h:821
    +
    char retroflat_asset_path[RETROFLAT_PATH_MAX]
    Path/name used to load an asset from disk.
    Definition retroflt.h:816
    +
    void retroflat_blit_bitmap(struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
    Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
    +
    void retroflat_destroy_bitmap(struct RETROFLAT_BITMAP *bitmap)
    Unload a bitmap from a RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on th...
    +
    MERROR_RETVAL retroflat_load_bitmap(const char *filename, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
    Load a bitmap into the given RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to th...
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    #define RETROFLAT_ASSETS_PATH_MAX
    Maximum size of the assets path, to allow room for appending.
    Definition retroflt.h:780
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    uint8_t flags
    Platform-specific bitmap flags.
    Definition retroflt.h:2039
    +
    Definition retrogxc.h:35
    +
    Definition retrogxc.h:41
    +
    + + +
    + + diff --git a/retrohtr_8h.html b/retrohtr_8h.html new file mode 100644 index 00000000..4f370554 --- /dev/null +++ b/retrohtr_8h.html @@ -0,0 +1,183 @@ + + + + + + + +maug: retrohtr.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retrohtr.h File Reference
    +
    +
    + +

    Go to the source code of this file.

    + + + + + + +

    +Data Structures

    struct  RETROHTR_RENDER_NODE
     
    struct  RETROHTR_RENDER_TREE
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define RETROHTR_RENDER_NODES_INIT_SZ   10
     
    +#define RETROHTR_TRACE_LVL   0
     
    +#define RETROHTR_EDGE_UNKNOWN   0
     
    +#define RETROHTR_EDGE_LEFT   1
     
    +#define RETROHTR_EDGE_TOP   2
     
    +#define RETROHTR_EDGE_INSIDE   4
     
    +#define retrohtr_node(tree, idx)   (0 <= idx ? &((tree)->nodes[idx]) : NULL)
     
    #define retrohtr_node_parent(tree, idx)
     
    #define retrohtr_tree_lock(tree)
     
    #define retrohtr_tree_unlock(tree)
     
    +#define retrohtr_tree_is_locked(tree)   (NULL != (tree)->nodes)
     
    +#define retrohtr_node_screen_x(tree, node_idx)    ((tree)->nodes[node_idx].x)
     
    +#define retrohtr_node_screen_y(tree, node_idx)    ((tree)->nodes[node_idx].y)
     
    + + + + + + + + + + + + + + + + + + +

    +Functions

    +MERROR_RETVAL retrohtr_tree_create (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, size_t x, size_t y, size_t w, size_t h, ssize_t tag_idx, ssize_t node_idx, size_t d)
     
    MERROR_RETVAL retrohtr_apply_styles (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *parent_style, struct MCSS_STYLE *effect_style, ssize_t tag_idx)
     Create a style node that is a composite of a parent style and the styles applicable to the classes/IDs of a tag and its immediate styles.
     
    +MERROR_RETVAL retrohtr_tree_size (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *prev_sibling_style, struct MCSS_STYLE *parent_style, ssize_t node_idx, size_t d)
     
    +MERROR_RETVAL retrohtr_tree_pos (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *prev_sibling_style, struct MCSS_STYLE *parent_style, ssize_t node_idx, size_t d)
     
    +void retrohtr_tree_draw (struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, ssize_t node_idx, size_t d)
     
    +void retrohtr_tree_dump (struct RETROHTR_RENDER_TREE *tree, struct MHTML_PARSER *parser, ssize_t iter, size_t d)
     
    +void retrohtr_tree_free (struct RETROHTR_RENDER_TREE *tree)
     
    +MERROR_RETVAL retrohtr_tree_init (struct RETROHTR_RENDER_TREE *tree)
     
    +
    + + +
    + + diff --git a/retrohtr_8h_source.html b/retrohtr_8h_source.html new file mode 100644 index 00000000..1d18884a --- /dev/null +++ b/retrohtr_8h_source.html @@ -0,0 +1,1413 @@ + + + + + + + +maug: retrohtr.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrohtr.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROHTR_H
    +
    3#define RETROHTR_H
    +
    4
    +
    11#ifndef RETROHTR_RENDER_NODES_INIT_SZ
    +
    12# define RETROHTR_RENDER_NODES_INIT_SZ 10
    +
    13#endif /* !RETROHTR_RENDER_NODES_INIT_SZ */
    +
    14
    +
    15#ifndef RETROHTR_TRACE_LVL
    +
    16# define RETROHTR_TRACE_LVL 0
    +
    17#endif /* !RETROHTR_TRACE_LVL */
    +
    18
    +
    19#define RETROHTR_EDGE_UNKNOWN 0
    +
    20#define RETROHTR_EDGE_LEFT 1
    +
    21#define RETROHTR_EDGE_TOP 2
    +
    22#define RETROHTR_EDGE_INSIDE 4
    +
    23
    +
    + +
    25 /* TODO: Maybe get rid of these and replace them with MCSS_STYLE node? */
    +
    26 ssize_t x;
    +
    27 ssize_t y;
    +
    28 size_t w;
    +
    29 size_t h;
    +
    30 size_t m_l;
    +
    31 size_t m_r;
    +
    32 size_t m_t;
    +
    33 size_t m_b;
    +
    34 uint8_t pos;
    +
    35 uint8_t pos_flags;
    +
    36 uint8_t edge;
    + + +
    39 ssize_t tag;
    +
    41 ssize_t parent;
    +
    43 ssize_t first_child;
    +
    45 ssize_t next_sibling;
    +
    46 struct RETROFLAT_BITMAP bitmap;
    +
    47};
    +
    +
    48
    +
    + +
    50 MAUG_MHANDLE nodes_h;
    + +
    54 size_t nodes_sz;
    + +
    57 /* TODO: Make this per-node. */
    +
    58 ssize_t font_idx;
    +
    59 struct RETROGUI gui;
    +
    60};
    +
    +
    61
    +
    62/* TODO: Function names should be verb_noun! */
    +
    63
    +
    64#define retrohtr_node( tree, idx ) (0 <= idx ? &((tree)->nodes[idx]) : NULL)
    +
    65
    +
    66#define retrohtr_node_parent( tree, idx ) \
    +
    67 (0 <= idx && 0 <= (tree)->nodes[idx].parent ? \
    +
    68 &((tree)->nodes[(tree)->nodes[idx].parent]) : NULL)
    +
    69
    +
    70#define retrohtr_tree_lock( tree ) \
    +
    71 if( NULL == (tree)->nodes ) { \
    +
    72 maug_mlock( (tree)->nodes_h, (tree)->nodes ); \
    +
    73 maug_cleanup_if_null_alloc( struct RETROHTR_RENDER_NODE*, (tree)->nodes ); \
    +
    74 }
    +
    75
    +
    76#define retrohtr_tree_unlock( tree ) \
    +
    77 if( NULL != (tree)->nodes ) { \
    +
    78 maug_munlock( (tree)->nodes_h, (tree)->nodes ); \
    +
    79 }
    +
    80
    +
    81#define retrohtr_tree_is_locked( tree ) (NULL != (tree)->nodes)
    +
    82
    +
    83/* TODO: Make these offset by element scroll on screen. */
    +
    84
    +
    85#define retrohtr_node_screen_x( tree, node_idx ) \
    +
    86 ((tree)->nodes[node_idx].x)
    +
    87
    +
    88#define retrohtr_node_screen_y( tree, node_idx ) \
    +
    89 ((tree)->nodes[node_idx].y)
    +
    90
    +
    91MERROR_RETVAL retrohtr_tree_create(
    +
    92 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    93 size_t x, size_t y, size_t w, size_t h,
    +
    94 ssize_t tag_idx, ssize_t node_idx, size_t d );
    +
    95
    + +
    108 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    109 struct MCSS_STYLE* parent_style, struct MCSS_STYLE* effect_style,
    +
    110 ssize_t tag_idx );
    +
    111
    +
    112MERROR_RETVAL retrohtr_tree_size(
    +
    113 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    114 struct MCSS_STYLE* prev_sibling_style,
    +
    115 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d );
    +
    116
    +
    117MERROR_RETVAL retrohtr_tree_pos(
    +
    118 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    119 struct MCSS_STYLE* prev_sibling_style,
    +
    120 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d );
    +
    121
    +
    122void retrohtr_tree_draw(
    +
    123 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    124 ssize_t node_idx, size_t d );
    +
    125
    +
    126void retrohtr_tree_dump(
    +
    127 struct RETROHTR_RENDER_TREE* tree, struct MHTML_PARSER* parser,
    +
    128 ssize_t iter, size_t d );
    +
    129
    +
    130void retrohtr_tree_free( struct RETROHTR_RENDER_TREE* tree );
    +
    131
    +
    132MERROR_RETVAL retrohtr_tree_init( struct RETROHTR_RENDER_TREE* tree );
    +
    133
    +
    134#ifdef RETROHTR_C
    +
    135
    +
    136static void mhtml_merge_styles(
    +
    137 struct MCSS_STYLE* effect_style,
    +
    138 struct MCSS_STYLE* parent_style,
    +
    139 struct MCSS_STYLE* tag_style,
    +
    140 size_t tag_type
    +
    141) {
    +
    142
    +
    143 if(
    +
    144 MCSS_STYLE_FLAG_ACTIVE !=
    +
    145 (MCSS_STYLE_FLAG_ACTIVE & effect_style->flags)
    +
    146 ) {
    +
    147 mcss_style_init( effect_style );
    +
    148 }
    +
    149
    +
    150 /* Perform inheritence of special cases. */
    +
    151
    +
    152 #define MCSS_PROP_TABLE_MERGE( p_id, prop_n, prop_t, prop_p, def ) \
    +
    153 if( \
    +
    154 ( \
    +
    155 /* Only do inheritence for some special cases.
    +
    156 * e.g. We don't want to inherit width/height/X/etc! */ \
    +
    157 mcss_prop_is_heritable( p_id ) \
    +
    158 ) && (NULL != parent_style && ( \
    +
    159 ( \
    +
    160 NULL != tag_style && \
    +
    161 /* Parent is important and new property isn't. */ \
    +
    162 mcss_prop_is_active_flag( parent_style->prop_n, IMPORTANT ) && \
    +
    163 /* TODO: Is not active OR important? */ \
    +
    164 !mcss_prop_is_important( tag_style->prop_n ) && \
    +
    165 !mcss_prop_is_important( effect_style->prop_n ) \
    +
    166 ) || ( \
    +
    167 NULL != tag_style && \
    +
    168 /* New property is not active. */ \
    +
    169 !mcss_prop_is_active( tag_style->prop_n ) && \
    +
    170 !mcss_prop_is_active( effect_style->prop_n ) \
    +
    171 ) || (\
    +
    172 /* No competition. */ \
    +
    173 NULL == tag_style && \
    +
    174 !mcss_prop_is_active( effect_style->prop_n ) \
    +
    175 ) \
    +
    176 )) \
    +
    177 ) { \
    +
    178 /* Inherit parent property. */ \
    +
    179 if( MCSS_PROP_BACKGROUND_COLOR == p_id ) { \
    +
    180 debug_printf( RETROHTR_TRACE_LVL, "background color was %s", \
    +
    181 0 <= effect_style->prop_n ? \
    +
    182 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    183 } else if( MCSS_PROP_COLOR == p_id ) { \
    +
    184 debug_printf( RETROHTR_TRACE_LVL, "color was %s", \
    +
    185 0 <= effect_style->prop_n ? \
    +
    186 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    187 } \
    +
    188 debug_printf( RETROHTR_TRACE_LVL, "%s using parent %s", \
    +
    189 gc_mhtml_tag_names[tag_type], #prop_n ); \
    +
    190 effect_style->prop_n = parent_style->prop_n; \
    +
    191 effect_style->prop_n ## _flags = parent_style->prop_n ## _flags; \
    +
    192 if( MCSS_PROP_BACKGROUND_COLOR == p_id ) { \
    +
    193 debug_printf( RETROHTR_TRACE_LVL, "background color %s", \
    +
    194 0 <= effect_style->prop_n ? \
    +
    195 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    196 } else if( MCSS_PROP_COLOR == p_id ) { \
    +
    197 debug_printf( RETROHTR_TRACE_LVL, "color %s", \
    +
    198 0 <= effect_style->prop_n ? \
    +
    199 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    200 } \
    +
    201 } else if( \
    +
    202 NULL != tag_style && \
    +
    203 mcss_prop_is_active( tag_style->prop_n ) \
    +
    204 ) { \
    +
    205 /* Use new property. */ \
    +
    206 debug_printf( RETROHTR_TRACE_LVL, "%s using style %s", \
    +
    207 gc_mhtml_tag_names[tag_type], #prop_n ); \
    +
    208 if( MCSS_PROP_COLOR == p_id ) { \
    +
    209 debug_printf( RETROHTR_TRACE_LVL, "color %s", \
    +
    210 0 <= effect_style->prop_n ? \
    +
    211 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    212 } \
    +
    213 effect_style->prop_n = tag_style->prop_n; \
    +
    214 effect_style->prop_n ## _flags = tag_style->prop_n ## _flags; \
    +
    215 }
    +
    216
    +
    217 MCSS_PROP_TABLE( MCSS_PROP_TABLE_MERGE )
    +
    218
    +
    219 /* Apply defaults for display. */
    +
    220
    +
    221 if(
    +
    222 MCSS_PROP_FLAG_ACTIVE !=
    +
    223 (MCSS_PROP_FLAG_ACTIVE & effect_style->DISPLAY_flags)
    +
    224 ) {
    +
    225 /* Set the display property based on the tag's default. */
    +
    226
    +
    227 #define MHTML_TAG_TABLE_DISP( tag_id, tag_name, fields, disp ) \
    +
    228 } else if( tag_id == tag_type ) { \
    +
    229 effect_style->DISPLAY = MCSS_DISPLAY_ ## disp; \
    +
    230 debug_printf( RETROHTR_TRACE_LVL, "%s defaulting to %s DISPLAY", \
    +
    231 gc_mhtml_tag_names[tag_type], \
    +
    232 gc_mcss_display_names[effect_style->DISPLAY] );
    +
    233
    +
    234 if( 0 ) {
    +
    235 MHTML_TAG_TABLE( MHTML_TAG_TABLE_DISP )
    +
    236 }
    +
    237
    +
    238 }
    +
    239
    +
    240 return;
    +
    241}
    +
    242
    +
    243ssize_t retrohtr_get_next_free_node( struct RETROHTR_RENDER_TREE* tree ) {
    +
    244 uint8_t auto_unlocked = 0;
    +
    245 ssize_t retidx = -1;
    +
    246 MAUG_MHANDLE new_nodes_h = (MAUG_MHANDLE)NULL;
    +
    247
    +
    248 if( NULL != tree->nodes ) {
    +
    249 debug_printf( RETROHTR_TRACE_LVL, "auto-unlocking nodes..." );
    +
    250 maug_munlock( tree->nodes_h, tree->nodes );
    +
    251 auto_unlocked = 1;
    +
    252 }
    +
    253
    +
    254 assert( 0 < tree->nodes_sz_max );
    +
    255 assert( NULL == tree->nodes );
    +
    256 assert( (MAUG_MHANDLE)NULL != tree->nodes_h );
    +
    257 if( tree->nodes_sz_max <= tree->nodes_sz + 1 ) {
    +
    258 /* We've run out of nodes, so double the available number. */
    +
    259 /* TODO: Check for sz overflow. */
    +
    260 new_nodes_h = maug_mrealloc( tree->nodes_h, tree->nodes_sz_max * 2,
    +
    261 sizeof( struct RETROHTR_RENDER_NODE ) );
    +
    262 if( (MAUG_MHANDLE)NULL == new_nodes_h ) {
    +
    263 error_printf(
    +
    264 "unable to reallocate " SIZE_T_FMT " nodes!",
    +
    265 tree->nodes_sz_max * 2 );
    +
    266 goto cleanup;
    +
    267 }
    +
    268 tree->nodes_h = new_nodes_h;
    +
    269 tree->nodes_sz_max *= 2;
    +
    270 }
    +
    271
    +
    272 /* Assume handle is unlocked. */
    +
    273 assert( NULL == tree->nodes );
    +
    274 maug_mlock( tree->nodes_h, tree->nodes );
    +
    275 if( NULL == tree->nodes ) {
    +
    276 error_printf( "unable to lock nodes!" );
    +
    277 goto cleanup;
    +
    278 }
    +
    279
    +
    280 /* Zero out the last node, add it to the list, and return its index. */
    +
    281 debug_printf( RETROHTR_TRACE_LVL,
    +
    282 "zeroing node " SIZE_T_FMT " (of " SIZE_T_FMT ")...",
    +
    283 tree->nodes_sz, tree->nodes_sz_max );
    +
    284 maug_mzero( &(tree->nodes[tree->nodes_sz]),
    +
    285 sizeof( struct RETROHTR_RENDER_NODE ) );
    +
    286 retidx = tree->nodes_sz;
    +
    287 tree->nodes_sz++;
    +
    288
    +
    289 /* Compensate for cleanup below. */
    +
    290 maug_munlock( tree->nodes_h, tree->nodes );
    +
    291
    +
    292cleanup:
    +
    293
    +
    294 if( auto_unlocked ) {
    +
    295 debug_printf( RETROHTR_TRACE_LVL, "auto-locking nodes..." );
    +
    296 maug_mlock( tree->nodes_h, tree->nodes );
    +
    297 }
    +
    298
    +
    299 return retidx;
    +
    300}
    +
    301
    +
    302ssize_t retrohtr_add_node_child(
    +
    303 struct RETROHTR_RENDER_TREE* tree, ssize_t node_parent_idx
    +
    304) {
    +
    305 ssize_t node_new_idx = -1,
    +
    306 node_sibling_idx = -1;
    +
    307
    +
    308 node_new_idx = retrohtr_get_next_free_node( tree );
    +
    309 if( 0 > node_new_idx ) {
    +
    310 goto cleanup;
    +
    311 }
    +
    312
    +
    313 retrohtr_node( tree, node_new_idx )->parent = node_parent_idx;
    +
    314 retrohtr_node( tree, node_new_idx )->first_child = -1;
    +
    315 retrohtr_node( tree, node_new_idx )->next_sibling = -1;
    +
    316
    +
    317 if( 0 > node_parent_idx ) {
    +
    318 debug_printf(
    +
    319 1, "adding root node under " SSIZE_T_FMT "...", node_parent_idx );
    +
    320 goto cleanup;
    +
    321 } else {
    +
    322 debug_printf(
    +
    323 1, "adding node " SSIZE_T_FMT " under " SSIZE_T_FMT,
    +
    324 node_new_idx, node_parent_idx );
    +
    325 }
    +
    326
    +
    327 /* Add new child under current node. */
    +
    328 if( 0 > retrohtr_node( tree, node_parent_idx )->first_child ) {
    +
    329 debug_printf( RETROHTR_TRACE_LVL, "adding first child..." );
    +
    330 assert( -1 == retrohtr_node( tree, node_parent_idx )->first_child );
    +
    331 retrohtr_node( tree, node_parent_idx )->first_child = node_new_idx;
    +
    332 } else {
    +
    333 assert( NULL != retrohtr_node( tree, node_parent_idx ) );
    +
    334 node_sibling_idx = retrohtr_node( tree, node_parent_idx )->first_child;
    +
    335 assert( NULL != retrohtr_node( tree, node_sibling_idx ) );
    +
    336 while( 0 <= retrohtr_node( tree, node_sibling_idx )->next_sibling ) {
    +
    337 node_sibling_idx =
    +
    338 retrohtr_node( tree, node_sibling_idx )->next_sibling;
    +
    339 }
    +
    340 retrohtr_node( tree, node_sibling_idx )->next_sibling = node_new_idx;
    +
    341 }
    +
    342
    +
    343cleanup:
    +
    344
    +
    345 return node_new_idx;
    +
    346}
    +
    347
    +
    348MERROR_RETVAL retrohtr_tree_create(
    +
    349 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    350 size_t x, size_t y, size_t w, size_t h,
    +
    351 ssize_t tag_idx, ssize_t node_idx, size_t d
    +
    352) {
    +
    353 ssize_t node_new_idx = -1;
    +
    354 ssize_t tag_iter_idx = -1;
    +
    355 MERROR_RETVAL retval = MERROR_OK;
    +
    356
    +
    357 if( NULL == mhtml_tag( parser, tag_idx ) ) {
    +
    358 goto cleanup;
    +
    359 }
    +
    360
    +
    361 /* Make sure we have a single root node. */
    +
    362 if( 0 > node_idx ) {
    +
    363 assert( MHTML_TAG_TYPE_BODY == mhtml_tag( parser, tag_idx )->base.type );
    +
    364
    +
    365 node_new_idx = retrohtr_add_node_child( tree, node_idx );
    +
    366 if( 0 > node_new_idx ) {
    +
    367 goto cleanup;
    +
    368 }
    +
    369 debug_printf( RETROHTR_TRACE_LVL,
    +
    370 "created initial root node: " SIZE_T_FMT, node_new_idx );
    +
    371
    +
    372 node_idx = node_new_idx;
    +
    373
    +
    374 /* The common root is the body tag. */
    +
    375 retrohtr_node( tree, node_idx )->tag = tag_idx;
    +
    376
    +
    377 retrohtr_node( tree, node_idx )->x = x;
    +
    378 retrohtr_node( tree, node_idx )->y = y;
    +
    379 retrohtr_node( tree, node_idx )->w = w;
    +
    380 retrohtr_node( tree, node_idx )->h = h;
    +
    381 }
    +
    382
    +
    383 tag_iter_idx = mhtml_tag( parser, tag_idx )->base.first_child;
    +
    384 while( 0 <= tag_iter_idx ) {
    +
    385 node_new_idx = retrohtr_add_node_child( tree, node_idx );
    +
    386 if( 0 > node_new_idx ) {
    +
    387 goto cleanup;
    +
    388 }
    +
    389
    +
    390 retrohtr_node( tree, node_new_idx )->tag = tag_iter_idx;
    +
    391
    +
    392 debug_printf( RETROHTR_TRACE_LVL,
    +
    393 "rendering node " SSIZE_T_FMT " (%s) under node " SSIZE_T_FMT,
    +
    394 node_new_idx,
    +
    395 gc_mhtml_tag_names[mhtml_tag( parser, tag_iter_idx )->base.type],
    +
    396 node_idx );
    +
    397
    +
    398 /* Tag-specific rendering preparations. */
    +
    399 if( MHTML_TAG_TYPE_IMG == mhtml_tag( parser, tag_iter_idx )->base.type ) {
    +
    400 /* Load the image for rendering later. */
    +
    401 retval = retroflat_load_bitmap(
    +
    402 mhtml_tag( parser, tag_iter_idx )->IMG.src,
    +
    403 &(retrohtr_node( tree, node_new_idx )->bitmap),
    + +
    405 if( MERROR_OK == retval ) {
    +
    406 debug_printf( RETROHTR_TRACE_LVL, "loaded img: %s",
    +
    407 mhtml_tag( parser, tag_iter_idx )->IMG.src );
    +
    408 } else {
    +
    409 error_printf( "could not load img: %s",
    +
    410 mhtml_tag( parser, tag_iter_idx )->IMG.src );
    +
    411 }
    +
    412 }
    +
    413
    +
    414 retrohtr_tree_create( parser, tree, x, y, w, h,
    +
    415 tag_iter_idx, node_new_idx, d + 1 );
    +
    416
    +
    417 tag_iter_idx = mhtml_tag( parser, tag_iter_idx )->base.next_sibling;
    +
    418 }
    +
    419
    +
    420cleanup:
    +
    421
    +
    422 return retval;
    +
    423}
    +
    424
    + +
    426 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    427 struct MCSS_STYLE* parent_style, struct MCSS_STYLE* effect_style,
    +
    428 ssize_t tag_idx
    +
    429) {
    +
    430 MERROR_RETVAL retval = MERROR_OK;
    +
    431 ssize_t tag_style_idx = -1;
    +
    432 size_t tag_type = 0,
    +
    433 i = 0;
    +
    434
    +
    435 maug_mzero( effect_style, sizeof( struct MCSS_STYLE ) );
    +
    436
    +
    437 if( 0 >= tag_idx ) {
    +
    438 goto cleanup;
    +
    439 }
    +
    440
    +
    441 tag_type = mhtml_tag( parser, tag_idx )->base.type;
    +
    442
    +
    443 /* Try to apply class/ID styles. */
    +
    444 if( 0 < mhtml_tag( parser, tag_idx )->base.classes_sz ) {
    +
    445 for( i = 0 ; parser->styler.styles_sz > i ; i++ ) {
    +
    446 if(
    +
    447 0 == strncmp(
    +
    448 mhtml_tag( parser, tag_idx )->base.classes,
    +
    449 parser->styler.styles[i].class,
    +
    450 mhtml_tag( parser, tag_idx )->base.classes_sz
    +
    451 )
    +
    452 ) {
    +
    453 debug_printf( RETROHTR_TRACE_LVL, "found style for tag class: %s",
    +
    454 parser->styler.styles[i].class );
    +
    455
    +
    456 mhtml_merge_styles(
    +
    457 effect_style,
    +
    458 parent_style,
    +
    459 &(parser->styler.styles[i]),
    +
    460 tag_type );
    +
    461 }
    +
    462 }
    +
    463 }
    +
    464 if( 0 < mhtml_tag( parser, tag_idx )->base.id_sz ) {
    +
    465 for( i = 0 ; parser->styler.styles_sz > i ; i++ ) {
    +
    466 if(
    +
    467 0 == strncmp(
    +
    468 mhtml_tag( parser, tag_idx )->base.id,
    +
    469 parser->styler.styles[i].id,
    +
    470 mhtml_tag( parser, tag_idx )->base.id_sz
    +
    471 )
    +
    472 ) {
    +
    473 debug_printf( RETROHTR_TRACE_LVL, "found style for tag ID: %s",
    +
    474 parser->styler.styles[i].id );
    +
    475
    +
    476 mhtml_merge_styles(
    +
    477 effect_style,
    +
    478 parent_style,
    +
    479 &(parser->styler.styles[i]),
    +
    480 tag_type );
    +
    481 }
    +
    482 }
    +
    483 }
    +
    484
    +
    485 /* Grab element-specific style last. */
    +
    486 tag_style_idx = mhtml_tag( parser, tag_idx )->base.style;
    +
    487
    +
    488cleanup:
    +
    489
    +
    490 /* Make sure we have a root style. */
    +
    491 mhtml_merge_styles(
    +
    492 effect_style,
    +
    493 parent_style,
    +
    494 0 <= tag_style_idx ? &(parser->styler.styles[tag_style_idx]) : NULL,
    +
    495 tag_type );
    +
    496
    +
    497 return retval;
    +
    498}
    +
    499
    +
    500MERROR_RETVAL retrohtr_tree_size(
    +
    501 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    502 struct MCSS_STYLE* prev_sibling_style,
    +
    503 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d
    +
    504) {
    +
    505 struct MCSS_STYLE effect_style;
    +
    506 struct MCSS_STYLE child_prev_sibling_style;
    +
    507 struct MCSS_STYLE child_style;
    +
    508 char* tag_content = NULL;
    +
    509 ssize_t child_iter_idx = -1;
    +
    510 ssize_t tag_idx = -1;
    +
    511 ssize_t node_iter_idx = -1;
    +
    512 size_t this_line_w = 0;
    +
    513 size_t this_line_h = 0;
    +
    514 MERROR_RETVAL retval = MERROR_OK;
    +
    515
    +
    516 if( NULL == retrohtr_node( tree, node_idx ) ) {
    +
    517 goto cleanup;
    +
    518 }
    +
    519
    +
    520 tag_idx = retrohtr_node( tree, node_idx )->tag;
    +
    521
    + +
    523 parser, tree, parent_style, &effect_style, tag_idx );
    +
    524
    +
    525 /* position */
    +
    526
    +
    527 if( mcss_prop_is_active( effect_style.POSITION ) ) {
    +
    528 debug_printf( RETROHTR_TRACE_LVL,
    +
    529 "node " SSIZE_T_FMT ": applying %s positioning",
    +
    530 node_idx, gc_mcss_position_names[effect_style.POSITION] );
    +
    531 /* TODO: MCSS_POS_NOTE: We'd like to get rid of this so all positioning
    +
    532 * is done through CSS... unfortunately, we only track the current
    +
    533 * and previous effective styles while working that out later, so
    +
    534 * we need to pin this to the element directly so we can rule it
    +
    535 * out of the box model e.g. when determining x/y coords of its
    +
    536 * neighbors.
    +
    537 */
    +
    538 retrohtr_node( tree, node_idx )->pos = effect_style.POSITION;
    +
    539 retrohtr_node( tree, node_idx )->pos_flags = effect_style.POSITION_flags;
    +
    540 }
    +
    541
    +
    542 /* Grab fixed dimensions before content-based calculations of children, so
    +
    543 * we know if there are constraints. If these aren't set, then we'll size
    +
    544 * based on childrens' sizes after we determine childrens' sizes below.
    +
    545 */
    +
    546
    +
    547 if( mcss_prop_is_active_NOT_flag( effect_style.WIDTH, AUTO ) ) {
    +
    548 retrohtr_node( tree, node_idx )->w = effect_style.WIDTH;
    +
    549 }
    +
    550
    +
    551 if( mcss_prop_is_active_NOT_flag( effect_style.HEIGHT, AUTO ) ) {
    +
    552 retrohtr_node( tree, node_idx )->h = effect_style.HEIGHT;
    +
    553 }
    +
    554
    +
    555 /* Figure out how big the contents of this node are. */
    +
    556
    +
    557 if(
    +
    558 0 <= tag_idx &&
    +
    559 MHTML_TAG_TYPE_TEXT == mhtml_tag( parser, tag_idx )->base.type
    +
    560 ) {
    +
    561 /* Get text size to use in calculations below. */
    +
    562
    +
    563 maug_mlock( mhtml_tag( parser, tag_idx )->TEXT.content, tag_content );
    +
    564 maug_cleanup_if_null_alloc( char*, tag_content );
    +
    565
    +
    566 retrogxc_string_sz(
    +
    567 NULL, tag_content, mhtml_tag( parser, tag_idx )->TEXT.content_sz,
    +
    568 tree->font_idx,
    +
    569 /* Constrain node text size to parent size. */
    +
    570 retrohtr_node_parent( tree, node_idx )->w,
    +
    571 retrohtr_node_parent( tree, node_idx )->h,
    +
    572 &(retrohtr_node( tree, node_idx )->w),
    +
    573 &(retrohtr_node( tree, node_idx )->h), 0 );
    +
    574
    +
    575 debug_printf( RETROHTR_TRACE_LVL, "TEXT w: " SIZE_T_FMT,
    +
    576 retrohtr_node( tree, node_idx )->w );
    +
    577
    +
    578 maug_munlock( mhtml_tag( parser, tag_idx )->TEXT.content, tag_content );
    +
    579
    +
    580 } else if(
    +
    581 0 <= tag_idx &&
    +
    582 MHTML_TAG_TYPE_INPUT == mhtml_tag( parser, tag_idx )->base.type
    +
    583 ) {
    +
    584
    +
    585 retrogxc_string_sz(
    +
    586 NULL,
    +
    587 mhtml_tag( parser, tag_idx )->INPUT.value,
    +
    588 mhtml_tag( parser, tag_idx )->INPUT.value_sz,
    +
    589 tree->font_idx,
    +
    590 retrohtr_node_parent( tree, node_idx )->w,
    +
    591 retrohtr_node_parent( tree, node_idx )->h,
    +
    592 &(retrohtr_node( tree, node_idx )->w),
    +
    593 &(retrohtr_node( tree, node_idx )->h), 0 );
    +
    594
    +
    595 /* Add space for borders and stuff. (TODO: Add to retrogui!) */
    +
    596 retrohtr_node( tree, node_idx )->w += 8;
    +
    597 retrohtr_node( tree, node_idx )->h += 8;
    +
    598
    +
    599 } else if(
    +
    600 0 <= tag_idx &&
    +
    601 MHTML_TAG_TYPE_IMG == mhtml_tag( parser, tag_idx )->base.type
    +
    602 ) {
    +
    603
    +
    604 if( retroflat_bitmap_ok( &(retrohtr_node( tree, node_idx )->bitmap) ) ) {
    +
    605 retrohtr_node( tree, node_idx )->w =
    +
    606 retroflat_bitmap_w( &(retrohtr_node( tree, node_idx )->bitmap) );
    +
    607 retrohtr_node( tree, node_idx )->h =
    +
    608 retroflat_bitmap_h( &(retrohtr_node( tree, node_idx )->bitmap) );
    +
    609 }
    +
    610
    +
    611 debug_printf( RETROHTR_TRACE_LVL, "TEXT w: " SIZE_T_FMT,
    +
    612 retrohtr_node( tree, node_idx )->w );
    +
    613
    +
    614 } else {
    +
    615 /* Get sizing of child nodes. */
    +
    616
    +
    617 maug_mzero( &child_prev_sibling_style, sizeof( struct MCSS_STYLE ) );
    +
    618 node_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    619 while( 0 <= node_iter_idx ) {
    +
    620 retrohtr_tree_size(
    +
    621 parser, tree, &child_prev_sibling_style, &effect_style,
    +
    622 node_iter_idx, d + 1 );
    +
    623
    +
    624 node_iter_idx = retrohtr_node( tree, node_iter_idx )->next_sibling;
    +
    625 }
    +
    626 }
    +
    627
    +
    628 /* If our width is still zero, then size based on children. */
    +
    629 if( 0 == retrohtr_node( tree, node_idx )->w ) {
    +
    630 if(
    +
    631 MCSS_DISPLAY_BLOCK == effect_style.DISPLAY &&
    +
    632 0 <= retrohtr_node( tree, node_idx )->parent
    +
    633 ) {
    +
    634 /* Use parent width. */
    +
    635 /* TODO: Subtract parent padding! */
    +
    636 retrohtr_node( tree, node_idx )->w =
    +
    637 retrohtr_node_parent( tree, node_idx )->w;
    +
    638 }
    +
    639
    +
    640 /* Cycle through children and use greatest width. */
    +
    641 child_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    642 while( 0 <= child_iter_idx ) {
    + +
    644 parser, tree, &effect_style, &child_style,
    +
    645 retrohtr_node( tree, child_iter_idx )->tag );
    +
    646
    +
    647 /* Skip ABSOLUTE nodes. */
    +
    648 if( MCSS_POSITION_ABSOLUTE == child_style.POSITION ) {
    +
    649 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    650 continue;
    +
    651 }
    +
    652
    +
    653 if( MCSS_DISPLAY_BLOCK == child_style.DISPLAY ) {
    +
    654 /* Reset the line width counter for coming BLOCK node. */
    +
    655 this_line_w = 0;
    +
    656
    +
    657 if(
    +
    658 retrohtr_node( tree, child_iter_idx )->w >
    +
    659 retrohtr_node( tree, node_idx )->w
    +
    660 ) {
    +
    661 /* This BLOCK node is the longest yet! */
    +
    662 retrohtr_node( tree, node_idx )->w =
    +
    663 retrohtr_node( tree, child_iter_idx )->w;
    +
    664 }
    +
    665 } else {
    +
    666 /* Add inline node to this node line's width. */
    +
    667 this_line_w += retrohtr_node( tree, child_iter_idx )->w;
    +
    668
    +
    669 if( this_line_w > retrohtr_node( tree, node_idx )->w ) {
    +
    670 /* The line of nodes we've been adding up is the longest yet! */
    +
    671 retrohtr_node( tree, node_idx )->w = this_line_w;
    +
    672 }
    +
    673 }
    +
    674 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    675 }
    +
    676 }
    +
    677
    +
    678 /* If our height is still zero, then size based on children. */
    +
    679 if( 0 == retrohtr_node( tree, node_idx )->h ) {
    +
    680 /* Cycle through children and add heights. */
    +
    681 child_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    682 while( 0 <= child_iter_idx ) {
    + +
    684 parser, tree, &effect_style, &child_style,
    +
    685 retrohtr_node( tree, child_iter_idx )->tag );
    +
    686
    +
    687 /* Skip ABSOLUTE nodes. */
    +
    688 if( MCSS_POSITION_ABSOLUTE == child_style.POSITION ) {
    +
    689 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    690 continue;
    +
    691 }
    +
    692
    +
    693 if( MCSS_DISPLAY_BLOCK == child_style.DISPLAY ) {
    +
    694 /* Add the last line to the running height. */
    +
    695 retrohtr_node( tree, node_idx )->h += this_line_h;
    +
    696
    +
    697 /* Start a new running line height with this BLOCK node. */
    +
    698 this_line_h = retrohtr_node( tree, child_iter_idx )->h;
    +
    699 } else {
    +
    700 /* Make sure this line is at least as tall as this INLINE node. */
    +
    701 if( this_line_h < retrohtr_node( tree, child_iter_idx )->h ) {
    +
    702 this_line_h = retrohtr_node( tree, child_iter_idx )->h;
    +
    703 }
    +
    704 }
    +
    705
    +
    706 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    707 }
    +
    708
    +
    709 /* Add the last line height the node height. */
    +
    710 retrohtr_node( tree, node_idx )->h += this_line_h;
    +
    711 this_line_h = 0;
    +
    712 }
    +
    713
    +
    714 /* Apply additional modifiers (padding, etc) after children have all been
    +
    715 * calculated.
    +
    716 */
    +
    717
    +
    718 /* Try specific left padding first, then try general padding. */
    +
    719 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_LEFT, AUTO ) ) {
    +
    720 retrohtr_node( tree, node_idx )->w += effect_style.PADDING_LEFT;
    +
    721 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    722 retrohtr_node( tree, node_idx )->w += effect_style.PADDING;
    +
    723 }
    +
    724
    +
    725 /* Try specific right padding first, then try general padding. */
    +
    726 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_RIGHT, AUTO ) ) {
    +
    727 retrohtr_node( tree, node_idx )->w += effect_style.PADDING_RIGHT;
    +
    728 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    729 retrohtr_node( tree, node_idx )->w += effect_style.PADDING;
    +
    730 }
    +
    731
    +
    732 /* Try specific top padding first, then try general padding. */
    +
    733 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_TOP, AUTO ) ) {
    +
    734 retrohtr_node( tree, node_idx )->h += effect_style.PADDING_TOP;
    +
    735 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    736 retrohtr_node( tree, node_idx )->h += effect_style.PADDING;
    +
    737 }
    +
    738
    +
    739 /* Try specific bottom padding first, then try general padding. */
    +
    740 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_BOTTOM, AUTO ) ) {
    +
    741 retrohtr_node( tree, node_idx )->h += effect_style.PADDING_BOTTOM;
    +
    742 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    743 retrohtr_node( tree, node_idx )->h += effect_style.PADDING;
    +
    744 }
    +
    745
    +
    746cleanup:
    +
    747
    +
    748 /* We're done with the prev_sibling_style for this iter, so prepare it for
    +
    749 * the next called by the parent!
    +
    750 */
    +
    751 if( NULL != prev_sibling_style ) {
    +
    752 maug_mcpy(
    +
    753 prev_sibling_style, &effect_style,
    +
    754 sizeof( struct MCSS_STYLE ) );
    +
    755 }
    +
    756
    +
    757 return retval;
    +
    758}
    +
    759
    +
    760/* TODO: See MCSS_POS_NOTE. */
    +
    762#define retrohtr_break_on_active_pos( iter_idx ) \
    +
    763 if( mcss_prop_is_active( retrohtr_node( tree, iter_idx )->pos ) ) { \
    +
    764 break; \
    +
    765 }
    +
    766
    +
    767static ssize_t retrohtr_find_prev_sibling_in_box_model(
    +
    768 struct RETROHTR_RENDER_TREE* tree,
    +
    769 ssize_t node_idx
    +
    770) {
    +
    771 ssize_t sibling_iter_idx = -1;
    +
    772 ssize_t sibling_found_idx = -1;
    +
    773
    +
    774 if( 0 > retrohtr_node( tree, node_idx )->parent ) {
    +
    775 /* Can't determine sibling! */
    +
    776 goto cleanup;
    +
    777 }
    +
    778
    +
    779 sibling_iter_idx = retrohtr_node_parent( tree, node_idx )->first_child;
    +
    780
    +
    781 if( sibling_iter_idx == node_idx ) {
    +
    782 /* No previous siblings! */
    +
    783 goto cleanup;
    +
    784 }
    +
    785
    +
    786 while( 0 <= sibling_iter_idx && node_idx != sibling_iter_idx ) {
    +
    787 if(
    +
    788 /* TODO: See MCSS_POS_NOTE. This is what we were talking about. */
    +
    789 MCSS_POSITION_ABSOLUTE != retrohtr_node( tree, sibling_iter_idx )->pos
    +
    790 ) {
    +
    791 sibling_found_idx = sibling_iter_idx;
    +
    792 }
    +
    793
    +
    794 /* TODO: Reset on <br />? */
    +
    795
    +
    796 sibling_iter_idx = retrohtr_node( tree, sibling_iter_idx )->next_sibling;
    +
    797 }
    +
    798
    +
    799cleanup:
    +
    800 return sibling_found_idx;
    +
    801}
    +
    802
    +
    803static MERROR_RETVAL retrohtr_mark_edge_child_nodes(
    +
    804 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    805 ssize_t node_parent_idx
    +
    806) {
    +
    807 ssize_t node_sibling_idx = -1;
    +
    808 MERROR_RETVAL retval = MERROR_OK;
    +
    809 struct MCSS_STYLE effect_style;
    +
    810 size_t col_idx = 0; /* How many nodes right (X)? */
    +
    811 size_t row_idx = 0; /* How many nodes down (Y)? */
    +
    812
    +
    813 node_sibling_idx = retrohtr_node( tree, node_parent_idx )->first_child;
    +
    814 while( 0 <= node_sibling_idx ) {
    +
    815 maug_mzero( &effect_style, sizeof( struct MCSS_STYLE ) );
    + +
    817 parser, tree, NULL, &effect_style,
    +
    818 retrohtr_node( tree, node_sibling_idx )->tag );
    +
    819
    +
    820 if( MCSS_POSITION_ABSOLUTE == effect_style.POSITION ) {
    +
    821 /* Absolute nodes are never on the edge. */
    +
    822 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_INSIDE;
    +
    823
    +
    824 } else if( MCSS_DISPLAY_INLINE == effect_style.DISPLAY ) {
    +
    825 /* Inline, or something that follows previous column. */
    +
    826 if( 0 == col_idx ) {
    +
    827 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_LEFT;
    +
    828 }
    +
    829 if( 0 == row_idx ) {
    +
    830 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_TOP;
    +
    831 }
    +
    832 if( 0 < row_idx && 0 < col_idx ) {
    +
    833 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_INSIDE;
    +
    834 }
    +
    835 col_idx++;
    +
    836
    +
    837 } else {
    +
    838 /* Block element will be on the next line, so take that into account
    +
    839 * when deciding the edge below.
    +
    840 */
    +
    841 row_idx++;
    +
    842 col_idx = 0;
    +
    843
    +
    844 /* Block, or something else in a new row. */
    +
    845 if( 0 == row_idx ) {
    +
    846 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_TOP;
    +
    847 }
    +
    848
    +
    849 /* Assume block is always on a new line. */
    +
    850 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_LEFT;
    +
    851 }
    +
    852
    +
    853 debug_printf( 1, "marking node " SIZE_T_FMT " (%s) edge: %u",
    +
    854 node_sibling_idx,
    +
    855 gc_mhtml_tag_names[parser->tags[
    +
    856 retrohtr_node( tree, node_sibling_idx )->tag].base.type],
    +
    857 retrohtr_node( tree, node_sibling_idx )->edge );
    +
    858
    +
    859 node_sibling_idx =
    +
    860 retrohtr_node( tree, node_sibling_idx )->next_sibling;
    +
    861 }
    +
    862
    +
    863 return retval;
    +
    864}
    +
    865
    +
    866MERROR_RETVAL retrohtr_tree_pos(
    +
    867 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    868 struct MCSS_STYLE* prev_sibling_style,
    +
    869 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d
    +
    870) {
    +
    871 struct MCSS_STYLE child_prev_sibling_style;
    +
    872 struct MCSS_STYLE effect_style;
    +
    873 ssize_t child_iter_idx = -1;
    +
    874 ssize_t tag_idx = -1;
    +
    875 ssize_t node_iter_idx = -1;
    +
    876 ssize_t prev_sibling_idx = -1;
    +
    877 MERROR_RETVAL retval = MERROR_OK;
    +
    878
    +
    879 if( NULL == retrohtr_node( tree, node_idx ) ) {
    +
    880 goto cleanup;
    +
    881 }
    +
    882
    +
    883 tag_idx = retrohtr_node( tree, node_idx )->tag;
    +
    884
    + +
    886 parser, tree, parent_style, &effect_style, tag_idx );
    +
    887
    +
    888 prev_sibling_idx = retrohtr_find_prev_sibling_in_box_model( tree, node_idx );
    +
    889
    +
    890 /* x */
    +
    891
    +
    892 if( MCSS_POSITION_ABSOLUTE == effect_style.POSITION ) {
    +
    893 /* This node is positioned absolutely. (Relatively) simple! */
    +
    894
    +
    895 if( mcss_prop_is_active_NOT_flag( effect_style.LEFT, AUTO ) ) {
    +
    896
    +
    897 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    898 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    899 retrohtr_break_on_active_pos( child_iter_idx );
    +
    900 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    901 }
    +
    902
    +
    903 /* Set X to highest non-explicit ancestor. */
    +
    904 retrohtr_node( tree, node_idx )->x =
    +
    905 retrohtr_node( tree, child_iter_idx )->x + effect_style.LEFT;
    +
    906 }
    +
    907 if( mcss_prop_is_active_NOT_flag( effect_style.RIGHT, AUTO ) ) {
    +
    908
    +
    909 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    910 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    911 retrohtr_break_on_active_pos( child_iter_idx );
    +
    912 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    913 }
    +
    914
    +
    915 /* Set X to highest non-explicit ancestor. */
    +
    916 retrohtr_node( tree, node_idx )->x =
    +
    917 retrohtr_node( tree, child_iter_idx )->w -
    +
    918 retrohtr_node( tree, node_idx )->w -
    +
    919 effect_style.RIGHT;
    +
    920 }
    +
    921
    +
    922 } else if(
    +
    923 MCSS_DISPLAY_INLINE == effect_style.DISPLAY &&
    +
    924 MCSS_DISPLAY_INLINE == prev_sibling_style->DISPLAY &&
    +
    925 0 <= prev_sibling_idx
    +
    926 ) {
    +
    927 /* Place to the right of the previous sibling. */
    +
    928 retrohtr_node( tree, node_idx )->x =
    +
    929 retrohtr_node( tree, prev_sibling_idx )->x +
    +
    930 retrohtr_node( tree, prev_sibling_idx )->w;
    +
    931
    +
    932 } else if( 0 <= retrohtr_node( tree, node_idx )->parent ) {
    +
    933 retrohtr_node( tree, node_idx )->x = retrohtr_node_parent( tree, node_idx )->x;
    +
    934 }
    +
    935
    +
    936 /* y */
    +
    937
    +
    938 /* TODO: Add margins of children? */
    +
    939
    +
    940 if( MCSS_POSITION_ABSOLUTE == effect_style.POSITION ) {
    +
    941 /* This node is positioned absolutely. (Relatively) simple! */
    +
    942
    +
    943 if( mcss_prop_is_active_NOT_flag( effect_style.TOP, AUTO ) ) {
    +
    944
    +
    945 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    946 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    947 retrohtr_break_on_active_pos( child_iter_idx );
    +
    948 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    949 }
    +
    950
    +
    951 /* Set Y to highest non-explicit ancestor. */
    +
    952 retrohtr_node( tree, node_idx )->y =
    +
    953 retrohtr_node( tree, child_iter_idx )->y + effect_style.TOP;
    +
    954 }
    +
    955 if( mcss_prop_is_active_NOT_flag( effect_style.BOTTOM, AUTO ) ) {
    +
    956
    +
    957 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    958 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    959 retrohtr_break_on_active_pos( child_iter_idx );
    +
    960 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    961 }
    +
    962
    +
    963 /* Set Y to highest non-explicit ancestor. */
    +
    964 retrohtr_node( tree, node_idx )->y =
    +
    965 retrohtr_node( tree, child_iter_idx )->h -
    +
    966 retrohtr_node( tree, node_idx )->h -
    +
    967 effect_style.BOTTOM;
    +
    968 }
    +
    969
    +
    970 } else if(
    +
    971 MCSS_DISPLAY_INLINE == effect_style.DISPLAY &&
    +
    972 MCSS_DISPLAY_INLINE == prev_sibling_style->DISPLAY &&
    +
    973 0 <= prev_sibling_idx
    +
    974 ) {
    +
    975 /* Place to the right of the previous sibling. */
    +
    976 retrohtr_node( tree, node_idx )->y = retrohtr_node( tree, prev_sibling_idx )->y;
    +
    977
    +
    978 } else if( 0 <= prev_sibling_idx ) {
    +
    979 /* Place below the previous block sibling. */
    +
    980
    +
    981 /* TODO: We should probably use the tallest element on the prev sibling's
    +
    982 * line, but that seems hard...
    +
    983 */
    +
    984
    +
    985 retrohtr_node( tree, node_idx )->y =
    +
    986 retrohtr_node( tree, prev_sibling_idx )->y +
    +
    987 retrohtr_node( tree, prev_sibling_idx )->h;
    +
    988
    +
    989 } else if( 0 <= retrohtr_node( tree, node_idx )->parent ) {
    +
    990 /* Position relative to other nodes. */
    +
    991
    +
    992 retrohtr_node( tree, node_idx )->y = retrohtr_node_parent( tree, node_idx )->y;
    +
    993 }
    +
    994
    +
    995 /* margin-left, margin-right */
    +
    996
    +
    997 if(
    +
    998 MCSS_POSITION_ABSOLUTE != retrohtr_node( tree, node_idx )->pos &&
    +
    999 0 <= retrohtr_node( tree, node_idx )->parent &&
    +
    1000 mcss_prop_is_active_flag( effect_style.MARGIN_LEFT, AUTO ) &&
    +
    1001 mcss_prop_is_active_flag( effect_style.MARGIN_RIGHT, AUTO )
    +
    1002 ) {
    +
    1003 /* Center */
    +
    1004 retrohtr_node( tree, node_idx )->x =
    +
    1005 retrohtr_node_parent( tree, node_idx )->x +
    +
    1006 (retrohtr_node_parent( tree, node_idx )->w / 2) -
    +
    1007 (retrohtr_node( tree, node_idx )->w / 2);
    +
    1008
    +
    1009 } else if(
    +
    1010 0 <= retrohtr_node( tree, node_idx )->parent &&
    +
    1011 mcss_prop_is_active_flag( effect_style.MARGIN_LEFT, AUTO ) &&
    +
    1012 mcss_prop_is_active_NOT_flag( effect_style.MARGIN_RIGHT, AUTO )
    +
    1013 ) {
    +
    1014 /* Justify right. */
    +
    1015 /* TODO: Subtract padding below, as well. */
    +
    1016 retrohtr_node( tree, node_idx )->x =
    +
    1017 retrohtr_node_parent( tree, node_idx )->w -
    +
    1018 retrohtr_node( tree, node_idx )->w;
    +
    1019
    +
    1020 } else if( mcss_prop_is_active( effect_style.MARGIN_LEFT ) ) {
    +
    1021 /* Justify left. */
    +
    1022 retrohtr_node( tree, node_idx )->x += effect_style.MARGIN_LEFT;
    +
    1023 }
    +
    1024
    +
    1025 /* padding */
    +
    1026
    +
    1027 /* TODO: Padding is still broken. Needs more involved understanding of
    +
    1028 * where elements are in their container.
    +
    1029 */
    +
    1030
    +
    1031 debug_printf( 1, "(d: " SIZE_T_FMT ") node " SIZE_T_FMT " is on edge: %u",
    +
    1032 d, node_idx, retrohtr_node( tree, node_idx )->edge );
    +
    1033
    +
    1034 assert(
    +
    1035 0 == node_idx ||
    +
    1036 RETROHTR_EDGE_UNKNOWN != retrohtr_node( tree, node_idx )->edge );
    +
    1037
    +
    1038 if(
    +
    1039 RETROHTR_EDGE_LEFT == (RETROHTR_EDGE_LEFT & retrohtr_node( tree, node_idx )->edge)
    +
    1040 ) {
    +
    1041 /* Try specific left padding first, then try general padding. */
    +
    1042 if( mcss_prop_is_active_NOT_flag( parent_style->PADDING_LEFT, AUTO ) ) {
    +
    1043 retrohtr_node( tree, node_idx )->x += parent_style->PADDING_LEFT;
    +
    1044 } else if( mcss_prop_is_active_NOT_flag( parent_style->PADDING, AUTO ) ) {
    +
    1045 retrohtr_node( tree, node_idx )->x += parent_style->PADDING;
    +
    1046 }
    +
    1047 }
    +
    1048
    +
    1049 if(
    +
    1050 RETROHTR_EDGE_TOP == (RETROHTR_EDGE_TOP & retrohtr_node( tree, node_idx )->edge) &&
    +
    1051 /* Only apply padding to first node in line. The rest will pick it up. */
    +
    1052 RETROHTR_EDGE_LEFT == (RETROHTR_EDGE_LEFT & retrohtr_node( tree, node_idx )->edge)
    +
    1053 ) {
    +
    1054 /* Try specific top padding first, then try general padding. */
    +
    1055 if( mcss_prop_is_active_NOT_flag( parent_style->PADDING_TOP, AUTO ) ) {
    +
    1056 retrohtr_node( tree, node_idx )->y += parent_style->PADDING_TOP;
    +
    1057 } else if( mcss_prop_is_active_NOT_flag( parent_style->PADDING, AUTO ) ) {
    +
    1058 retrohtr_node( tree, node_idx )->y += parent_style->PADDING;
    +
    1059 }
    +
    1060 }
    +
    1061
    +
    1062 /* color */
    +
    1063
    +
    1064 if( mcss_prop_is_active( effect_style.COLOR ) ) {
    +
    1065 retrohtr_node( tree, node_idx )->fg = effect_style.COLOR;
    +
    1066 }
    +
    1067
    +
    1068 if( mcss_prop_is_active( effect_style.BACKGROUND_COLOR ) ) {
    +
    1069 retrohtr_node( tree, node_idx )->bg = effect_style.BACKGROUND_COLOR;
    +
    1070 }
    +
    1071
    +
    1072 /* Figure out child positions. */
    +
    1073
    +
    1074 retrohtr_mark_edge_child_nodes( parser, tree, node_idx );
    +
    1075
    +
    1076 maug_mzero( &child_prev_sibling_style, sizeof( struct MCSS_STYLE ) );
    +
    1077 node_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    1078 while( 0 <= node_iter_idx ) {
    +
    1079 /* Mark child nodes on the edge so applying padding can be done. */
    +
    1080
    +
    1081 /* Figure out child node positioning. */
    +
    1082 retrohtr_tree_pos(
    +
    1083 parser, tree, &child_prev_sibling_style, &effect_style,
    +
    1084 node_iter_idx, d + 1 );
    +
    1085
    +
    1086 node_iter_idx = retrohtr_node( tree, node_iter_idx )->next_sibling;
    +
    1087 }
    +
    1088
    +
    1089cleanup:
    +
    1090
    +
    1091 /* We're done with the prev_sibling_style for this iter, so prepare it for
    +
    1092 * the next called by the parent!
    +
    1093 */
    +
    1094 if( NULL != prev_sibling_style ) {
    +
    1095 maug_mcpy(
    +
    1096 prev_sibling_style, &effect_style,
    +
    1097 sizeof( struct MCSS_STYLE ) );
    +
    1098 }
    +
    1099
    +
    1100 return retval;
    +
    1101}
    +
    1102
    +
    1103void retrohtr_tree_draw(
    +
    1104 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    1105 ssize_t node_idx, size_t d
    +
    1106) {
    +
    1107 char* tag_content = NULL;
    +
    1108 union MHTML_TAG* tag = NULL;
    +
    1109 struct RETROHTR_RENDER_NODE* node = NULL;
    +
    1110 union RETROGUI_CTL ctl;
    +
    1111 MERROR_RETVAL retval = MERROR_OK;
    +
    1112
    +
    1113 node = retrohtr_node( tree, node_idx );
    +
    1114
    +
    1115 if( NULL == node ) {
    +
    1116 return;
    +
    1117 }
    +
    1118
    +
    1119 /* TODO: Multi-pass, draw absolute pos afterwards. */
    +
    1120
    +
    1121 if( 0 <= node->tag ) {
    +
    1122 /* Perform drawing. */
    +
    1123 tag = mhtml_tag( parser, node->tag );
    +
    1124
    +
    1125 if( MHTML_TAG_TYPE_TEXT == tag->base.type ) {
    +
    1126 maug_mlock( tag->TEXT.content, tag_content );
    +
    1127 if( NULL == tag_content ) {
    +
    1128 error_printf( "could not lock tag content!" );
    +
    1129 return;
    +
    1130 }
    +
    1131
    +
    1132 retrogxc_string(
    +
    1133 NULL, node->fg, tag_content, 0, tree->font_idx,
    +
    1134 retrohtr_node_screen_x( tree, node_idx ),
    +
    1135 retrohtr_node_screen_y( tree, node_idx ),
    +
    1136 node->w, node->h, 0 );
    +
    1137
    +
    1138 maug_munlock( tag->TEXT.content, tag_content );
    +
    1139
    +
    1140 } else if( MHTML_TAG_TYPE_BODY == tag->base.type ) {
    +
    1141 /* Draw body BG. */
    +
    1142 if( RETROFLAT_COLOR_NULL != node->bg ) {
    + +
    1144 NULL, node->bg,
    +
    1145 retrohtr_node_screen_x( tree, node_idx ),
    +
    1146 retrohtr_node_screen_y( tree, node_idx ),
    +
    1147 retrohtr_node( tree, node_idx )->w,
    +
    1148 retrohtr_node( tree, node_idx )->h,
    + +
    1150 }
    +
    1151
    +
    1152 } else if( MHTML_TAG_TYPE_IMG == tag->base.type ) {
    +
    1153 /* Blit the image. */
    +
    1154
    +
    1155 if( retroflat_bitmap_ok( &(retrohtr_node( tree, node_idx )->bitmap) ) ) {
    + +
    1157 NULL, &(retrohtr_node( tree, node_idx )->bitmap),
    +
    1158 0, 0,
    +
    1159 retrohtr_node_screen_x( tree, node_idx ),
    +
    1160 retrohtr_node_screen_y( tree, node_idx ),
    +
    1161 retroflat_bitmap_w( &(retrohtr_node( tree, node_idx )->bitmap) ),
    +
    1162 retroflat_bitmap_h( &(retrohtr_node( tree, node_idx )->bitmap) )
    +
    1163 /* retrohtr_node( tree, node_idx )->w,
    +
    1164 retrohtr_node( tree, node_idx )->h */ );
    +
    1165 }
    +
    1166
    +
    1167 } else if( MHTML_TAG_TYPE_INPUT == tag->base.type ) {
    +
    1168 /* Push the control (for the client renderer to redraw later). */
    +
    1169
    +
    1170 /* TODO: This shouldn't be in the drawing callback! */
    +
    1171
    +
    1172 retrogui_lock( &(tree->gui) );
    +
    1173
    +
    1174 if(
    +
    1175 /* Use the same ID for the node and control it creates. */
    +
    1176 MERROR_OK != retrogui_init_ctl(
    +
    1177 &ctl, RETROGUI_CTL_TYPE_BUTTON, node_idx )
    +
    1178 ) {
    +
    1179 retrogui_unlock( &(tree->gui) );
    +
    1180 goto cleanup;
    +
    1181 }
    +
    1182
    +
    1183 ctl.base.x = retrohtr_node( tree, node_idx )->x;
    +
    1184 ctl.base.y = retrohtr_node( tree, node_idx )->y;
    +
    1185 ctl.base.w = retrohtr_node( tree, node_idx )->w;
    +
    1186 ctl.base.h = retrohtr_node( tree, node_idx )->h;
    +
    1187 strncpy( ctl.BUTTON.label,
    +
    1188 mhtml_tag( parser,
    +
    1189 retrohtr_node( tree, node_idx )->tag )->INPUT.value,
    +
    1190 RETROGUI_BTN_LBL_SZ_MAX );
    +
    1191
    +
    1192 retrogui_push_ctl( &(tree->gui), &ctl );
    +
    1193
    +
    1194 retrogui_unlock( &(tree->gui) );
    +
    1195
    +
    1196 } else {
    +
    1197 if( RETROFLAT_COLOR_NULL != node->bg ) {
    + +
    1199 NULL, node->bg,
    +
    1200 retrohtr_node_screen_x( tree, node_idx ),
    +
    1201 retrohtr_node_screen_y( tree, node_idx ),
    +
    1202 node->w, node->h,
    + +
    1204 }
    +
    1205 }
    +
    1206 }
    +
    1207
    +
    1208cleanup:
    +
    1209
    +
    1210 if( retrogui_is_locked( &(tree->gui) ) ) {
    +
    1211 retrogui_unlock( &(tree->gui) );
    +
    1212 }
    +
    1213
    +
    1214 if( MERROR_OK != retval ) {
    +
    1215 error_printf( "failed drawing node: " SIZE_T_FMT, node_idx );
    +
    1216 }
    +
    1217
    +
    1218 /* Keep trying to render children, tho. */
    +
    1219
    +
    1220 retrohtr_tree_draw( parser, tree, node->first_child, d + 1 );
    +
    1221
    +
    1222 retrohtr_tree_draw( parser, tree, node->next_sibling, d );
    +
    1223}
    +
    1224
    +
    1225void retrohtr_tree_dump(
    +
    1226 struct RETROHTR_RENDER_TREE* tree, struct MHTML_PARSER* parser,
    +
    1227 ssize_t iter, size_t d
    +
    1228) {
    +
    1229 size_t i = 0;
    +
    1230 char indents[31];
    +
    1231
    +
    1232 if( 0 > iter ) {
    +
    1233 return;
    +
    1234 }
    +
    1235
    +
    1236 /* Generate the indentation. */
    +
    1237 maug_mzero( indents, 30 );
    +
    1238 for( i = 0 ; d > i ; i++ ) {
    +
    1239 if( strlen( indents ) >= 30 ) {
    +
    1240 break;
    +
    1241 }
    +
    1242 strcat( indents, " " );
    +
    1243 }
    +
    1244
    +
    1245 /* Print the debug line. */
    +
    1246 debug_printf(
    +
    1247 1,
    +
    1248 "%s" SSIZE_T_FMT " (tag %s): x: " SSIZE_T_FMT ", y: " SSIZE_T_FMT
    +
    1249 " (" SSIZE_T_FMT " x " SSIZE_T_FMT ")",
    +
    1250 indents, iter,
    +
    1251 0 <= tree->nodes[iter].tag ?
    +
    1252 gc_mhtml_tag_names[parser->tags[tree->nodes[iter].tag].base.type]
    +
    1253 : "ROOT",
    +
    1254 tree->nodes[iter].x, tree->nodes[iter].y,
    +
    1255 tree->nodes[iter].w, tree->nodes[iter].h );
    +
    1256
    +
    1257 retrohtr_tree_dump( tree, parser, tree->nodes[iter].first_child, d + 1 );
    +
    1258
    +
    1259 retrohtr_tree_dump( tree, parser, tree->nodes[iter].next_sibling, d );
    +
    1260}
    +
    1261
    +
    1262void retrohtr_tree_free( struct RETROHTR_RENDER_TREE* tree ) {
    +
    1263
    +
    1264 debug_printf( RETROHTR_TRACE_LVL, "freeing render nodes..." );
    +
    1265
    +
    1266 /* TODO: Free bitmaps from img! */
    +
    1267
    +
    1268 /* TODO: Free GUI! */
    +
    1269
    +
    1270 retrohtr_tree_unlock( tree );
    +
    1271
    +
    1272 if( NULL != tree->nodes_h ) {
    +
    1273 maug_mfree( tree->nodes_h );
    +
    1274 }
    +
    1275}
    +
    1276
    +
    1277MERROR_RETVAL retrohtr_tree_init( struct RETROHTR_RENDER_TREE* tree ) {
    +
    1278 MERROR_RETVAL retval = MERROR_OK;
    +
    1279
    +
    1280 maug_mzero( tree, sizeof( struct RETROHTR_RENDER_TREE ) );
    +
    1281
    +
    1282 /* Perform initial node allocation. */
    +
    1283 tree->nodes_sz_max = MHTML_PARSER_TAGS_INIT_SZ;
    +
    1284 debug_printf( RETROHTR_TRACE_LVL,
    +
    1285 "allocating " SIZE_T_FMT " nodes...", tree->nodes_sz_max );
    +
    1286 tree->nodes_h = maug_malloc(
    +
    1287 tree->nodes_sz_max, sizeof( struct RETROHTR_RENDER_NODE ) );
    +
    1288 maug_cleanup_if_null_alloc( struct RETROHTR_RENDER_NODE*, tree->nodes_h );
    +
    1289
    +
    1290 /* TODO: Dynamically load fonts. */
    +
    1291 tree->font_idx = retrogxc_load_font( "unscii-8.hex", 8, 33, 93 );
    +
    1292 assert( 0 <= tree->font_idx );
    +
    1293
    +
    1294 /* XXX
    +
    1295 r.w_max = retroflat_screen_w();
    +
    1296 r.h_max = retroflat_screen_h(); */
    +
    1297
    +
    1298cleanup:
    +
    1299
    +
    1300 return retval;
    +
    1301}
    +
    1302
    +
    1303#endif /* RETROHTR_C */
    +
    1304
    +
    1305#endif /* !RETROHTR_H */
    +
    1306
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    #define maug_mrealloc(handle, nmemb, sz)
    Definition mmem.h:53
    +
    void retroflat_blit_bitmap(struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
    Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
    +
    MERROR_RETVAL retroflat_load_bitmap(const char *filename, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
    Load a bitmap into the given RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to th...
    +
    #define retroflat_bitmap_ok(bitmap)
    Check to see if a bitmap is loaded.
    Definition retroflt.h:2044
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    #define RETROFLAT_FLAGS_LITERAL_PATH
    Flag for retroflat_load_bitmap() to not use assets path.
    Definition retroflt.h:388
    +
    void retroflat_rect(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
    Draw a rectangle onto the target RETROFLAT_BITMAP.
    +
    #define RETROFLAT_FLAGS_FILL
    Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
    Definition retroflt.h:369
    +
    size_t nodes_sz_max
    Current alloc'd number of nodes in RETROHTR_RENDER_NODE::nodes_h.
    Definition retrohtr.h:56
    +
    ssize_t parent
    Index of container's render node in RETROHTR_RENDER_TREE.
    Definition retrohtr.h:41
    +
    ssize_t first_child
    Index of first child's render node in RETROHTR_RENDER_TREE.
    Definition retrohtr.h:43
    +
    MERROR_RETVAL retrohtr_apply_styles(struct MHTML_PARSER *parser, struct RETROHTR_RENDER_TREE *tree, struct MCSS_STYLE *parent_style, struct MCSS_STYLE *effect_style, ssize_t tag_idx)
    Create a style node that is a composite of a parent style and the styles applicable to the classes/ID...
    +
    ssize_t next_sibling
    Index of next sibling's render node in RETROHTR_RENDER_TREE.
    Definition retrohtr.h:45
    +
    size_t nodes_sz
    Current active number of nodes in RETROHTR_RENDER_NODE::nodes_h.
    Definition retrohtr.h:54
    +
    struct RETROHTR_RENDER_NODE * nodes
    Locked pointer to nodes when locked with retrohtr_tree_lock().
    Definition retrohtr.h:52
    +
    Definition mhtml.h:148
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    Definition retrogui.h:127
    +
    Definition retrohtr.h:24
    +
    Definition retrohtr.h:49
    +
    Definition mhtml.h:143
    +
    Definition retrogui.h:118
    +
    + + +
    + + diff --git a/retrosft_8h_source.html b/retrosft_8h_source.html new file mode 100644 index 00000000..99392b5c --- /dev/null +++ b/retrosft_8h_source.html @@ -0,0 +1,543 @@ + + + + + + + +maug: retrosft.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrosft.h
    +
    +
    +
    1
    +
    2#ifndef RETROSFT_H
    +
    3#define RETROSFT_H
    +
    4
    +
    5#define RETROFLAT_LINE_X 0
    +
    6#define RETROFLAT_LINE_Y 1
    +
    7
    +
    8#ifndef RETROSOFT_TRACE_LVL
    +
    9# define RETROSOFT_TRACE_LVL 0
    +
    10#endif /* RETROSOFT_TRACE_LVL */
    +
    11
    +
    12MERROR_RETVAL retrosoft_load_glyph(
    +
    13 RETROFLAT_COLOR color,
    +
    14 size_t set_idx, size_t glyph_idx, struct RETROFLAT_BITMAP* bmp );
    +
    15
    +
    16MERROR_RETVAL retrosoft_init();
    +
    17
    +
    18void retrosoft_shutdown();
    +
    19
    +
    20void retrosoft_line(
    +
    21 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    22 int x1, int y1, int x2, int y2, uint8_t flags );
    +
    23
    +
    24void retrosoft_rect(
    +
    25 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    26 int x, int y, int w, int h, uint8_t flags );
    +
    27
    +
    28void retrosoft_ellipse(
    +
    29 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    30 int x, int y, int w, int h, uint8_t flags );
    +
    31
    +
    32void retrosoft_ellipse(
    +
    33 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    34 int x, int y, int w, int h, uint8_t flags );
    +
    35
    +
    36void retrosoft_string_sz(
    +
    37 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    38 const char* font_str, size_t* w_out, size_t* h_out, uint8_t flags );
    +
    39
    +
    40void retrosoft_string(
    +
    41 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    42 const char* str, size_t str_sz, const char* font_str, int x_orig, int y_orig,
    +
    43 uint8_t flags );
    +
    44
    +
    45#ifdef RETROSFT_C
    +
    46
    +
    47# include "mfont8x8.h"
    +
    48
    +
    49/* TODO: Create another depth for each color. */
    +
    50static struct RETROFLAT_BITMAP
    +
    51gc_font_bmps[RETROFLAT_COLORS_SZ][RETROSOFT_SETS_COUNT][RETROSOFT_GLYPHS_COUNT];
    +
    52
    +
    53/* === */
    +
    54
    +
    55MERROR_RETVAL retrosoft_load_glyph(
    +
    56 RETROFLAT_COLOR color,
    +
    57 size_t set_idx, size_t glyph_idx, struct RETROFLAT_BITMAP* bmp
    +
    58) {
    +
    59 MERROR_RETVAL retval = MERROR_OK;
    +
    60 int x = 0,
    +
    61 y = 0;
    +
    62 const char* glyph_dots = gc_font8x8[set_idx][glyph_idx];
    +
    63
    +
    64 /* Create a transparent bitmap to draw on. */
    +
    65 retval = retroflat_create_bitmap(
    +
    66 RETROSOFT_GLYPH_W_SZ, RETROSOFT_GLYPH_H_SZ, bmp, 0 );
    +
    67 maug_cleanup_if_not_ok();
    +
    68
    +
    69 /* Normally draw lock is called from the main loop, but we're making an
    +
    70 * off-screen bitmap, here!
    +
    71 */
    + +
    73 retroflat_px_lock( bmp );
    +
    74
    +
    75 /* Draw the glyph onto the bitmap. */
    +
    76 for( y = 0 ; RETROSOFT_GLYPH_H_SZ > y ; y++ ) {
    +
    77 for( x = 0 ; RETROSOFT_GLYPH_W_SZ > x ; x++ ) {
    +
    78 if( 1 == ((glyph_dots[y] >> x) & 0x01) ) {
    +
    79 retroflat_px( bmp, color, x, y, 0 );
    +
    80 }
    +
    81 }
    +
    82 }
    +
    83
    +
    84 retroflat_px_release( bmp );
    +
    85 retroflat_draw_release( bmp );
    +
    86
    +
    87 /*
    +
    88 retroflat_rect(
    +
    89 bmp, RETROFLAT_COLOR_RED, 0, 0,
    +
    90 RETROSOFT_GLYPH_W_SZ, RETROSOFT_GLYPH_H_SZ, RETROFLAT_FLAGS_FILL );
    +
    91 */
    +
    92
    +
    93cleanup:
    +
    94
    +
    95 return retval;
    +
    96}
    +
    97
    +
    98/* === */
    +
    99
    +
    100MERROR_RETVAL retrosoft_init() {
    +
    101 MERROR_RETVAL retval = MERROR_OK;
    +
    102 size_t i = 0,
    +
    103 j = 0;
    +
    104 RETROFLAT_COLOR h = RETROFLAT_COLOR_WHITE;
    +
    105
    +
    106#ifdef RETROSOFT_PRELOAD_COLORS
    +
    107 for( h = 0 ; RETROFLAT_COLORS_SZ > h ; h++ ) {
    +
    108 debug_printf( RETROSOFT_TRACE_LVL,
    +
    109 "loading glyphs in %s...", gc_retroflat_color_names[h] );
    +
    110#endif /* RETROSOFT_PRELOAD_COLORS */
    +
    111 for( i = 0 ; RETROSOFT_SETS_COUNT > i ; i++ ) {
    +
    112 for( j = 0 ; RETROSOFT_GLYPHS_COUNT > j ; j++ ) {
    +
    113 debug_printf( RETROSOFT_TRACE_LVL,
    +
    114 "loading glyph " SIZE_T_FMT "...", j );
    +
    115 retval = retrosoft_load_glyph( h, i, j, &(gc_font_bmps[h][i][j]) );
    +
    116 maug_cleanup_if_not_ok();
    +
    117 }
    +
    118 }
    +
    119#ifdef RETROSOFT_PRELOAD_COLORS
    +
    120 }
    +
    121#endif /* RETROSOFT_PRELOAD_COLORS */
    +
    122
    +
    123cleanup:
    +
    124
    +
    125 /* TODO: Unload loaded bitmaps if retval not OK. */
    +
    126
    +
    127 return retval;
    +
    128}
    +
    129
    +
    130/* === */
    +
    131
    +
    132void retrosoft_shutdown() {
    +
    133 size_t i = 0,
    +
    134 j = 0;
    +
    135 RETROFLAT_COLOR h = RETROFLAT_COLOR_WHITE;
    +
    136
    +
    137 debug_printf( RETROSOFT_TRACE_LVL, "retrosoft shutdown called..." );
    +
    138
    +
    139#ifdef RETROSOFT_PRELOAD_COLORS
    +
    140 for( h = 0 ; RETROFLAT_COLORS_SZ > h ; h++ ) {
    +
    141#endif /* RETROSOFT_PRELOAD_COLORS */
    +
    142 for( i = 0 ; RETROSOFT_SETS_COUNT > i ; i++ ) {
    +
    143 for( j = 0 ; RETROSOFT_GLYPHS_COUNT > j ; j++ ) {
    +
    144 debug_printf( RETROSOFT_TRACE_LVL,
    +
    145 "destroying glyph " SIZE_T_FMT "...", j );
    +
    146 retroflat_destroy_bitmap( &(gc_font_bmps[h][i][j]) );
    +
    147 }
    +
    148 }
    +
    149#ifdef RETROSOFT_PRELOAD_COLORS
    +
    150 }
    +
    151#endif /* RETROSOFT_PRELOAD_COLORS */
    +
    152}
    +
    153
    +
    154/* === */
    +
    155
    +
    156void retrosoft_line_strategy(
    +
    157 int x1, int y1, int x2, int y2,
    +
    158 uint8_t* p_for_axis, uint8_t* p_off_axis, int16_t dist[2],
    +
    159 int16_t start[2], int16_t end[2], int16_t iter[2],
    +
    160 int16_t* p_inc, int16_t* p_delta
    +
    161) {
    +
    162
    +
    163 /* Figure out strategy based on line slope. */
    +
    164 if( abs( y2 - y1 ) < abs( x2 - x1 ) ) {
    +
    165 if( x1 > x2 ) {
    +
    166 start[RETROFLAT_LINE_X] = x2;
    +
    167 start[RETROFLAT_LINE_Y] = y2;
    +
    168 end[RETROFLAT_LINE_X] = x1;
    +
    169 end[RETROFLAT_LINE_Y] = y1;
    +
    170 *p_for_axis = RETROFLAT_LINE_X;
    +
    171 } else {
    +
    172 start[RETROFLAT_LINE_X] = x1;
    +
    173 start[RETROFLAT_LINE_Y] = y1;
    +
    174 end[RETROFLAT_LINE_X] = x2;
    +
    175 end[RETROFLAT_LINE_Y] = y2;
    +
    176 *p_for_axis = RETROFLAT_LINE_X;
    +
    177 }
    +
    178 } else {
    +
    179 if( y2 < y1 ) {
    +
    180 start[RETROFLAT_LINE_X] = x2;
    +
    181 start[RETROFLAT_LINE_Y] = y2;
    +
    182 end[RETROFLAT_LINE_X] = x1;
    +
    183 end[RETROFLAT_LINE_Y] = y1;
    +
    184 *p_for_axis = RETROFLAT_LINE_Y;
    +
    185 } else {
    +
    186 start[RETROFLAT_LINE_X] = x1;
    +
    187 start[RETROFLAT_LINE_Y] = y1;
    +
    188 end[RETROFLAT_LINE_X] = x2;
    +
    189 end[RETROFLAT_LINE_Y] = y2;
    +
    190 *p_for_axis = RETROFLAT_LINE_Y;
    +
    191 }
    +
    192 }
    +
    193
    +
    194 /* C89 requires const initializers, so do math down here. */
    +
    195 *p_off_axis = 1 - *p_for_axis;
    +
    196 iter[RETROFLAT_LINE_X] = start[RETROFLAT_LINE_X];
    +
    197 iter[RETROFLAT_LINE_Y] = start[RETROFLAT_LINE_Y];
    +
    198 dist[RETROFLAT_LINE_X] = end[RETROFLAT_LINE_X] - start[RETROFLAT_LINE_X];
    +
    199 dist[RETROFLAT_LINE_Y] = end[RETROFLAT_LINE_Y] - start[RETROFLAT_LINE_Y];
    +
    200
    +
    201 /* Adjust delta/slope for off-axis. */
    +
    202 *p_delta = (2 * dist[*p_off_axis]) - dist[*p_for_axis];
    +
    203 if( 0 > dist[*p_off_axis] ) {
    +
    204 *p_inc = -1;
    +
    205 dist[*p_off_axis] *= -1;
    +
    206 } else {
    +
    207 *p_inc = 1;
    +
    208 }
    +
    209
    +
    210
    +
    211}
    +
    212
    +
    213#if defined( RETROFLAT_OPENGL ) || \
    +
    214 defined( RETROFLAT_API_PC_BIOS ) || \
    +
    215 defined( RETROFLAT_SOFT_LINES )
    +
    216
    +
    217void retrosoft_line(
    +
    218 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    219 int x1, int y1, int x2, int y2, uint8_t flags
    +
    220) {
    +
    221
    +
    222 uint8_t for_axis = 0,
    +
    223 off_axis = 0;
    +
    224 int16_t dist[2],
    +
    225 start[2],
    +
    226 end[2],
    +
    227 iter[2],
    +
    228 inc = 1,
    +
    229 delta = 0;
    +
    230
    +
    231 /* TODO: Handle thickness. */
    +
    232
    +
    233 retroflat_px_lock( target );
    +
    234
    +
    235 retrosoft_line_strategy(
    +
    236 x1, y1, x2, y2,
    +
    237 &for_axis, &off_axis, dist, start, end, iter, &inc, &delta );
    +
    238
    +
    239 for(
    +
    240 iter[for_axis] = start[for_axis] ;
    +
    241 end[for_axis] > iter[for_axis] ;
    +
    242 iter[for_axis]++
    +
    243 ) {
    +
    244
    +
    245 if(
    +
    246 (size_t)iter[RETROFLAT_LINE_X] < (size_t)retroflat_screen_w() &&
    +
    247 (size_t)iter[RETROFLAT_LINE_Y] < (size_t)retroflat_screen_h()
    +
    248 ) {
    +
    249 retroflat_px(
    +
    250 target, color,
    +
    251 iter[RETROFLAT_LINE_X], iter[RETROFLAT_LINE_Y], 0 );
    +
    252 }
    +
    253
    +
    254 /* Increment off-axis based on for-axis. */
    +
    255 if( 0 < delta ) {
    +
    256 iter[off_axis] += inc;
    +
    257 delta += (2 * (dist[off_axis] - dist[for_axis]));
    +
    258 } else {
    +
    259 delta += (2 * dist[off_axis]);
    +
    260 }
    +
    261 }
    +
    262
    +
    263 retroflat_px_release( target );
    +
    264}
    +
    265
    +
    266#endif /* RETROFLAT_OPENGL || RETROFLAT_SOFT_LINES */
    +
    267
    +
    268/* === */
    +
    269
    +
    270void retrosoft_rect(
    +
    271 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    272 int x, int y, int w, int h, uint8_t flags
    +
    273) {
    +
    274 int x_iter = 0,
    +
    275 y_iter = 0;
    +
    276
    +
    277 retroflat_px_lock( target );
    +
    278
    + +
    280
    +
    281 for( y_iter = y ; y_iter < y + h ; y_iter++ ) {
    +
    282 for( x_iter = x ; x_iter < x + w ; x_iter++ ) {
    +
    283 /* TODO: Optimize filling 4-byte sequences! */
    +
    284 retroflat_px( target, color_idx, x_iter, y_iter, 0 );
    +
    285 }
    +
    286 }
    +
    287
    +
    288 } else {
    +
    289
    +
    290#ifdef RETROFLAT_SOFT_LINES
    +
    291 retrosoft_line( target, color_idx, x, y, x + w, y, 0 );
    +
    292 retrosoft_line( target, color_idx, x + w, y, x + w, y + h, 0 );
    +
    293 retrosoft_line( target, color_idx, x + w, y + h, x, y + h, 0 );
    +
    294 retrosoft_line( target, color_idx, x, y + h, x, y, 0 );
    +
    295#else
    +
    296 retroflat_line( target, color_idx, x, y, x + w, y, 0 );
    +
    297 retroflat_line( target, color_idx, x + w, y, x + w, y + h, 0 );
    +
    298 retroflat_line( target, color_idx, x + w, y + h, x, y + h, 0 );
    +
    299 retroflat_line( target, color_idx, x, y + h, x, y, 0 );
    +
    300#endif
    +
    301
    +
    302 }
    +
    303
    +
    304 retroflat_px_release( target );
    +
    305}
    +
    306
    +
    307/* === */
    +
    308
    +
    309void retrosoft_ellipse(
    +
    310 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    311 int x, int y, int w, int h, uint8_t flags
    +
    312) {
    +
    313 int32_t i = 0,
    +
    314 i_prev = 0;
    +
    315 uint16_t px_x1 = 0,
    +
    316 px_y1 = 0,
    +
    317 px_x2 = 0,
    +
    318 px_y2 = 0;
    +
    319
    +
    320 /* TODO: Switch to Bresenham algorithm. */
    +
    321
    +
    322 /* TODO: Filled ellipse. */
    +
    323
    +
    324 retroflat_px_lock( target );
    +
    325
    +
    326 /* For the soft_lut, input numbers are * 1000... so 0.1 becomes 100. */
    +
    327 for( i = 100 ; 2 * RETROFP_PI + 100 > i ; i += 100 ) {
    +
    328 i_prev = i - 100;
    +
    329
    +
    330 px_x1 = x + (w / 2) + retrofp_cos( i_prev, w / 2 );
    +
    331 px_y1 = y + (h / 2) + retrofp_sin( i_prev, h / 2 );
    +
    332 px_x2 = x + (w / 2) + retrofp_cos( i, w / 2 );
    +
    333 px_y2 = y + (h / 2) + retrofp_sin( i, h / 2 );
    +
    334
    +
    335 if(
    +
    336 retroflat_bitmap_w( target ) <= px_x1 ||
    +
    337 retroflat_bitmap_h( target ) <= px_y1 ||
    +
    338 retroflat_bitmap_w( target ) <= px_x2 ||
    +
    339 retroflat_bitmap_h( target ) <= px_y2
    +
    340 ) {
    +
    341 continue;
    +
    342 }
    +
    343
    +
    344 assert( 0 <= px_y1 );
    +
    345
    +
    346 retroflat_line( target, color, px_x1, px_y1, px_x2, px_y2, 0 );
    +
    347 }
    +
    348
    +
    349 retroflat_px_release( target );
    +
    350}
    +
    351
    +
    352/* === */
    +
    353
    +
    354void retrosoft_string_sz(
    +
    355 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    356 const char* font_str, size_t* w_out, size_t* h_out, uint8_t flags
    +
    357) {
    +
    358 /* TODO: Put a little more effort into sizing. */
    +
    359 if( 0 == str_sz ) {
    +
    360 str_sz = strlen( str );
    +
    361 }
    +
    362
    +
    363 *w_out = RETROSOFT_GLYPH_W_SZ * str_sz;
    +
    364 *h_out = RETROSOFT_GLYPH_H_SZ;
    +
    365}
    +
    366
    +
    367/* === */
    +
    368
    +
    369void retrosoft_string(
    +
    370 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    371 const char* str, size_t str_sz, const char* font_str, int x_orig, int y_orig,
    +
    372 uint8_t flags
    +
    373) {
    +
    374 size_t i = 0,
    +
    375 glyph_idx = 0;
    +
    376 int x = x_orig;
    +
    377
    +
    378 if( 0 == str_sz ) {
    +
    379 str_sz = strlen( str );
    +
    380 }
    +
    381
    +
    382 for( i = 0 ; str_sz > i ; i++ ) {
    +
    383 /* Terminate prematurely at null. */
    +
    384 if( '\0' == str[i] ) {
    +
    385 break;
    +
    386 }
    +
    387
    +
    388 /* Fonts start at character after space. */
    +
    389 glyph_idx = str[i] - ' ';
    +
    390
    +
    391#if defined( RETROFLAT_API_SDL2 ) && !defined( RETROSOFT_PRELOAD_COLORS )
    +
    392 /* If we're not caching the colors, use SDL2 features if available to
    +
    393 * tint the glyph before blitting it. */
    +
    394 SDL_SetSurfaceColorMod(
    +
    395 gc_font_bmps[RETROFLAT_COLOR_WHITE][0][glyph_idx].surface,
    +
    396 g_retroflat_state->palette[color].r,
    +
    397 g_retroflat_state->palette[color].g,
    +
    398 g_retroflat_state->palette[color].b );
    +
    399 SDL_DestroyTexture(
    +
    400 gc_font_bmps[RETROFLAT_COLOR_WHITE][0][glyph_idx].texture );
    +
    401 gc_font_bmps[RETROFLAT_COLOR_WHITE][0][glyph_idx].texture =
    +
    402 SDL_CreateTextureFromSurface(
    +
    403 g_retroflat_state->buffer.renderer,
    +
    404 gc_font_bmps[RETROFLAT_COLOR_WHITE][0][glyph_idx].surface );
    +
    405#endif /* RETROFLAT_API_SDL2 && !RETROSOFT_PRELOAD_COLORS */
    +
    406
    + +
    408 target, &(gc_font_bmps[
    +
    409#ifdef RETROSOFT_PRELOAD_COLORS
    +
    410 color
    +
    411#else
    +
    412 RETROFLAT_COLOR_WHITE
    +
    413#endif /* !RETROSOFT_PRELOAD_COLORS */
    +
    414 ][0][glyph_idx]), 0, 0, x, y_orig,
    +
    415 RETROSOFT_GLYPH_W_SZ, RETROSOFT_GLYPH_H_SZ );
    +
    416
    +
    417 x += 8;
    +
    418 }
    +
    419}
    +
    420
    +
    421#else
    +
    422
    +
    423#endif /* RETROSFT_C */
    +
    424
    +
    425#endif /* !RETROSFT_H */
    +
    426
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    void retroflat_blit_bitmap(struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
    Blit the contents of a RETROFLAT_BITMAP onto another RETROFLAT_BITMAP.
    +
    void retroflat_destroy_bitmap(struct RETROFLAT_BITMAP *bitmap)
    Unload a bitmap from a RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on th...
    +
    int8_t RETROFLAT_COLOR
    Defines an index in the platform-specific color-table.
    Definition retroflt.h:314
    +
    MERROR_RETVAL retroflat_draw_lock(struct RETROFLAT_BITMAP *bmp)
    Lock a bitmap for drawing. This will be done automatically if necessary and not called explicitly,...
    +
    #define RETROFLAT_FLAGS_FILL
    Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
    Definition retroflt.h:369
    +
    void retroflat_line(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags)
    Draw a straight line onto the target RETROFLAT_BITMAP.
    +
    #define retroflat_screen_h()
    Get the current screen height in pixels.
    Definition retroflt.h:2052
    +
    #define retroflat_screen_w()
    Get the current screen width in pixels.
    Definition retroflt.h:2049
    +
    #define RETROFP_PI
    Fixed-point representation of Pi (3.141).
    Definition retrofp.h:17
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:2035
    +
    uint8_t flags
    Platform-specific bitmap flags.
    Definition retroflt.h:2039
    +
    struct RETROFLAT_BITMAP buffer
    Off-screen buffer bitmap.
    Definition retroflt.h:2225
    +
    RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ]
    Index of available colors, initialized on platform init.
    Definition retroflt.h:2223
    +
    + + +
    + + diff --git a/retrosnd_8h.html b/retrosnd_8h.html new file mode 100644 index 00000000..fba2ab52 --- /dev/null +++ b/retrosnd_8h.html @@ -0,0 +1,203 @@ + + + + + + + +maug: retrosnd.h File Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    + +
    retrosnd.h File Reference
    +
    +
    + +

    Abstraction layer header for sound on retro systems. +More...

    + +

    Go to the source code of this file.

    + + + + + +

    +Data Structures

    struct  RETROSND_STATE
     Internal retrosound state struct. Most fields are platform-specific. More...
     
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Macros

    +#define RETROSND_TRACE_LVL   0
     
    +#define RETROSND_REG_TRACE_LVL   0
     
    +#define SF_BANK_FILENAME_SZ_MAX   30
     
    +#define RETROSND_FLAG_INIT   0x01
     Flag in RETROSND_STATE::flags indicating initialization was successful.
     
    +#define RETROSND_VOICE_BREATH   122
     
    +#define RETROSND_VOICE_SEASHORE   123
     
    +#define RETROSND_VOICE_BIRD_TWEET   124
     
    +#define RETROSND_VOICE_PHONE_RING   125
     
    +#define RETROSND_VOICE_HELICOPTER   126
     
    +#define RETROSND_VOICE_APPLAUSE   127
     
    +#define RETROSND_PC_BIOS_SPKR   0x01
     
    +#define RETROSND_PC_BIOS_MPU   0x02
     
    +#define RETROSND_PC_BIOS_GUS   0x04
     
    +#define RETROSND_PC_BIOS_ADLIB   0x08
     
    +#define RETROSND_VOICE_GUNSHOT   128
     Parameter for retrosnd_midi_set_voice() indicating a gunshot sound effect.
     
    + + + + + + + + + + + + + + + + + +

    +Functions

    MERROR_RETVAL retrosnd_init (struct RETROFLAT_ARGS *args)
     Initialize retrosnd engine.
     
    +void retrosnd_set_sf_bank (const char *filename_in)
     Set the name of the voice bank filename to use.
     
    +void retrosnd_midi_set_voice (uint8_t channel, uint8_t voice)
     
    +void retrosnd_midi_set_control (uint8_t channel, uint8_t key, uint8_t val)
     
    +void retrosnd_midi_note_on (uint8_t channel, uint8_t pitch, uint8_t vel)
     
    +void retrosnd_midi_note_off (uint8_t channel, uint8_t pitch, uint8_t vel)
     
    +void retrosnd_shutdown ()
     
    +

    Detailed Description

    +

    Abstraction layer header for sound on retro systems.

    +

    RetroSound is a compatibility layer for making sound on various platforms, including Windows, MS-DOS or Linux.

    +

    To use, define RETROSND_C before including this header from your main.c.

    +

    You may include this header in other .c files, as well, but RETROSND_C should ONLY be declared ONCE in the entire program.

    +

    It is highly advised to use this in conjunction with retroflt.h.

    +

    maug.h should also be included before this header.

    +

    Special thanks to: "Programming the Adlib/Sound Blaster FM Music Chips" by Jeffrey S. Lee (https://bochs.sourceforge.io/techspec/adlib_sb.txt) and "The Gravis Ultrasound" by neuraldk (http://neuraldk.org/document.php?gus) for DOS platform-specific stuff.

    +

    And the MPU-401 interface for being so darn simple!

    +
    + + +
    + + diff --git a/retrosnd_8h_source.html b/retrosnd_8h_source.html new file mode 100644 index 00000000..8ae3665e --- /dev/null +++ b/retrosnd_8h_source.html @@ -0,0 +1,925 @@ + + + + + + + +maug: retrosnd.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrosnd.h
    +
    +
    +Go to the documentation of this file.
    1
    +
    2#ifndef RETROSND_H
    +
    3#define RETROSND_H
    +
    4
    +
    33#ifndef RETROSND_TRACE_LVL
    +
    34# define RETROSND_TRACE_LVL 0
    +
    35#endif /* !RETROSND_TRACE_LVL */
    +
    36
    +
    37#ifndef RETROSND_REG_TRACE_LVL
    +
    38# define RETROSND_REG_TRACE_LVL 0
    +
    39#endif /* !RETROSND_REG_TRACE_LVL */
    +
    40
    +
    41#define SF_BANK_FILENAME_SZ_MAX 30
    +
    42
    +
    53#define RETROSND_FLAG_INIT 0x01
    +
    54
    +
    55 /* maug_retrosnd_flags */
    +
    56
    +
    57#define RETROSND_VOICE_BREATH 122
    +
    58
    +
    59#define RETROSND_VOICE_SEASHORE 123
    +
    60
    +
    61#define RETROSND_VOICE_BIRD_TWEET 124
    +
    62
    +
    63#define RETROSND_VOICE_PHONE_RING 125
    +
    64
    +
    65#define RETROSND_VOICE_HELICOPTER 126
    +
    66
    +
    67#define RETROSND_VOICE_APPLAUSE 127
    +
    68
    +
    69#define RETROSND_PC_BIOS_SPKR 0x01
    +
    70#define RETROSND_PC_BIOS_MPU 0x02
    +
    71#define RETROSND_PC_BIOS_GUS 0x04
    +
    72#define RETROSND_PC_BIOS_ADLIB 0x08
    +
    73
    +
    78#define RETROSND_VOICE_GUNSHOT 128
    +
    79
    +
    80#if defined( RETROSND_API_PC_BIOS )
    +
    81# include <conio.h>
    +
    82# define RETROSND_MPU_FLAG_OUTPUT 0x40
    +
    83# define RETROSND_MPU_TIMEOUT 30
    +
    84#elif defined( RETROSND_API_ALSA )
    +
    85# include <alsa/asoundlib.h>
    +
    86#endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA */
    +
    87
    +
    + +
    95 uint8_t flags;
    +
    96#if defined( RETROSND_API_PC_BIOS )
    +
    97 uint16_t io_base;
    +
    98 uint8_t io_timeout;
    +
    99 uint8_t driver;
    +
    100 struct RETROSND_ADLIB_VOICE* adlib_voices;
    +
    101 char sf_bank_filename[SF_BANK_FILENAME_SZ_MAX + 1];
    +
    102#elif defined( RETROSND_API_ALSA )
    +
    103 snd_seq_t* seq_handle;
    +
    104 int seq_port;
    +
    105 int out_client;
    +
    106 int out_port;
    +
    107#elif defined( RETROSND_API_WINMM )
    +
    108 HMIDIOUT mo_handle;
    +
    109#endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    110};
    +
    +
    111
    + +
    121
    +
    125void retrosnd_set_sf_bank( const char* filename_in );
    +
    126
    +
    127void retrosnd_midi_set_voice( uint8_t channel, uint8_t voice );
    +
    128
    +
    129void retrosnd_midi_set_control( uint8_t channel, uint8_t key, uint8_t val );
    +
    130
    +
    131void retrosnd_midi_note_on( uint8_t channel, uint8_t pitch, uint8_t vel );
    +
    132
    +
    133void retrosnd_midi_note_off( uint8_t channel, uint8_t pitch, uint8_t vel );
    +
    134
    +
    135void retrosnd_shutdown();
    +
    136
    +
    137#ifdef RETROSND_C
    +
    138
    +
    139MAUG_CONST uint8_t SEG_MCONST adlib_ch[] = {0, 1, 2, 8, 9, 10, 16, 17, 18};
    +
    140
    +
    141struct RETROSND_STATE g_retrosnd_state;
    +
    142
    +
    143# if defined( RETROSND_API_PC_BIOS )
    +
    144
    +
    145static void retrosnd_gus_poke( uint32_t loc, uint8_t b ) {
    +
    146 uint16_t add_lo = loc & 0xffff;
    +
    147 uint8_t add_hi = (uint32_t)((loc & 0xff0000)) >> 16;
    +
    148
    +
    149 debug_printf( RETROSND_REG_TRACE_LVL,
    +
    150 "poke hi: 0x%02x, lo: 0x%04x: writing: %02x", add_hi, add_lo, b );
    +
    151
    +
    152 outp( g_retrosnd_state.io_base + 0x103, 0x43 );
    +
    153 outpw( g_retrosnd_state.io_base + 0x104, add_lo );
    +
    154 outp( g_retrosnd_state.io_base + 0x103, 0x44 );
    +
    155 outp( g_retrosnd_state.io_base + 0x105, add_hi );
    +
    156 outp( g_retrosnd_state.io_base + 0x107, b );
    +
    157
    +
    158}
    +
    159
    +
    160static uint8_t retrosnd_gus_peek( uint32_t loc ) {
    +
    161 uint8_t b = 0;
    +
    162 uint16_t add_lo = loc & 0xffff;
    +
    163 uint8_t add_hi = (uint32_t)((loc & 0xff0000)) >> 16;
    +
    164
    +
    165 outp( g_retrosnd_state.io_base + 0x103, 0x43 );
    +
    166 outpw( g_retrosnd_state.io_base + 0x104, add_lo );
    +
    167 outp( g_retrosnd_state.io_base + 0x103, 0x44 );
    +
    168 outp( g_retrosnd_state.io_base + 0x105, add_hi );
    +
    169
    +
    170 b = inp( g_retrosnd_state.io_base + 0x107 );
    +
    171
    +
    172 debug_printf( RETROSND_REG_TRACE_LVL, "read: 0x%02x", b );
    +
    173
    +
    174 return b;
    +
    175}
    +
    176
    +
    177static MERROR_RETVAL retrosnd_mpu_not_ready( int16_t* timeout ) {
    +
    178 uint8_t b = 0;
    +
    179 b = inp( g_retrosnd_state.io_base + 0x01 ) & RETROSND_MPU_FLAG_OUTPUT;
    +
    180 if( (NULL == timeout || 0 < *timeout) && 0 != b ) {
    +
    181 if( NULL == timeout ) {
    +
    182 debug_printf( RETROSND_TRACE_LVL, "waiting for MPU-401..." );
    +
    183 } else {
    +
    184 debug_printf( RETROSND_TRACE_LVL,
    +
    185 "waiting for MPU-401 (%u)...", *timeout );
    +
    186 (*timeout)--;
    +
    187 }
    +
    188 return MERROR_WAIT;
    +
    189 } else if( NULL != timeout && 0 == *timeout ) {
    +
    190 error_printf( "timed out waiting for MPU-401!" );
    +
    191 return MERROR_TIMEOUT;
    +
    192 } else {
    +
    193 debug_printf( RETROSND_TRACE_LVL, "MPU ready within time limit" );
    +
    194 return MERROR_OK;
    +
    195 }
    +
    196}
    +
    197
    +
    198static MERROR_RETVAL retrosnd_mpu_write_byte( uint8_t b_in ) {
    +
    199 int16_t timeout = RETROSND_MPU_TIMEOUT;
    +
    200 MERROR_RETVAL retval = MERROR_OK;
    +
    201 do {
    +
    202 retval = retrosnd_mpu_not_ready( &timeout );
    +
    203 if( MERROR_TIMEOUT == retval ) {
    +
    204 goto cleanup;
    +
    205 }
    +
    206 } while( MERROR_WAIT == retval );
    +
    207 if( MERROR_TIMEOUT != retval ) {
    +
    208 debug_printf(
    +
    209 RETROSND_REG_TRACE_LVL, "writing 0x%02x to MPU-401...", b_in );
    +
    210 outp( g_retrosnd_state.io_base, b_in );
    +
    211 }
    +
    212cleanup:
    +
    213 return retval;
    +
    214}
    +
    215
    +
    216static void retrosnd_adlib_poke( uint8_t reg, uint8_t b_in ) {
    +
    217 int i = 0;
    +
    218 debug_printf(
    +
    219 RETROSND_REG_TRACE_LVL, "poke 0x%02x: writing: %02x", reg, b_in );
    +
    220 outp( g_retrosnd_state.io_base, reg );
    +
    221 for( i = 0 ; 6 > i ; i++ ) {
    +
    222 inp( g_retrosnd_state.io_base );
    +
    223 }
    +
    224 outp( g_retrosnd_state.io_base + 1, b_in );
    +
    225 for( i = 0 ; 35 > i ; i++ ) {
    +
    226 inp( g_retrosnd_state.io_base );
    +
    227 }
    +
    228}
    +
    229
    +
    230static void retrosnd_adlib_clear() {
    +
    231 int i = 0;
    +
    232 for( i = 0 ; 245 > i ; i++ ) {
    +
    233 retrosnd_adlib_poke( i, 0 );
    +
    234 }
    +
    235}
    +
    236
    +
    237# elif defined( RETROSND_API_ALSA )
    +
    238
    +
    239static void retrosnd_alsa_ev( snd_seq_event_t* ev ) {
    +
    240 snd_seq_ev_clear( ev );
    +
    241 snd_seq_ev_set_direct( ev );
    +
    242 snd_seq_ev_set_source( ev, g_retrosnd_state.seq_port );
    +
    243 /* snd_seq_ev_set_dest(
    +
    244 ev, g_retrosnd_state.out_client, g_retrosnd_state.out_port ); */
    +
    245 snd_seq_ev_set_subs( ev );
    +
    246}
    +
    247
    +
    248static void retrosnd_alsa_ev_send( snd_seq_event_t* ev ) {
    +
    249 snd_seq_event_output( g_retrosnd_state.seq_handle, ev );
    +
    250 snd_seq_drain_output( g_retrosnd_state.seq_handle );
    +
    251}
    +
    252
    +
    253# endif /* RETROSND_API_GUS || RETROSND_API_ALSA */
    +
    254
    +
    255/* === */
    +
    256
    + +
    258 MERROR_RETVAL retval = MERROR_OK;
    +
    259# ifdef RETROSND_API_PC_BIOS
    +
    260 uint8_t b = 0;
    +
    261 int16_t timeout = 0;
    +
    262# elif defined( RETROSND_API_ALSA )
    +
    263# elif defined( RETROSND_API_WINMM )
    +
    264 int i = 0;
    +
    265 MAUG_MHANDLE devs_list_buf_h = NULL;
    +
    266 char* devs_list_buf = NULL;
    +
    267 MAUG_MHANDLE devs_list_buf_new = NULL;
    +
    268 size_t devs_list_buf_sz = 512;
    +
    269 MIDIOUTCAPS midi_caps;
    +
    270 uint32_t num_devs = 0;
    +
    271 size_t devs_list_buf_pos = 0;
    +
    272 UINT moo_retval = 0;
    +
    273# endif /* RETROSND_API_PC_BIOS || RETROSND_API_WINMM || RETROSND_API_ALSA */
    +
    274
    +
    275 assert( 2 <= sizeof( MERROR_RETVAL ) );
    +
    276
    +
    277# if defined( RETROSND_API_PC_BIOS )
    +
    278
    +
    279 /* Clear all flags to start. */
    +
    280 g_retrosnd_state.flags = 0;
    +
    281
    +
    282 /* No bank file by default. */
    +
    283 memset(
    +
    284 g_retrosnd_state.sf_bank_filename, '\0',
    +
    285 SF_BANK_FILENAME_SZ_MAX + 1 );
    +
    286
    +
    287 if( 0 == args->snd_io_base ) {
    +
    288 /* Select default port. */
    +
    289 error_printf( "I/O base not specified!" );
    +
    290 switch( args->snd_driver ) {
    +
    291 case RETROSND_PC_BIOS_SPKR:
    +
    292 /* TODO */
    +
    293 break;
    +
    294
    +
    295 case RETROSND_PC_BIOS_MPU:
    +
    296 debug_printf( 3, "assuming 0x330..." );
    +
    297 args->snd_io_base = 0x330;
    +
    298 break;
    +
    299
    +
    300 case RETROSND_PC_BIOS_GUS:
    +
    301 /* TODO: Read port from ULTRASND env variable. */
    +
    302 args->snd_io_base = 0x220;
    +
    303 break;
    +
    304
    +
    305 case RETROSND_PC_BIOS_ADLIB:
    +
    306 /* TODO: Read port from BLASTER env variable? */
    +
    307 debug_printf( 3, "assuming 0x338..." );
    +
    308 args->snd_io_base = 0x388;
    +
    309 break;
    +
    310 }
    +
    311 return retval;
    +
    312 }
    +
    313
    +
    314 g_retrosnd_state.io_base = args->snd_io_base;
    +
    315 g_retrosnd_state.driver = args->snd_driver;
    +
    316
    +
    317 /* Perform actual init. */
    +
    318 switch( g_retrosnd_state.driver ) {
    +
    319 case RETROSND_PC_BIOS_SPKR:
    +
    320 /* TODO */
    +
    321 break;
    +
    322
    +
    323 case RETROSND_PC_BIOS_GUS:
    +
    324 /* Write values to GUS memory. */
    +
    325 outp( g_retrosnd_state.io_base + 0x103, 0x4c );
    +
    326 outp( g_retrosnd_state.io_base + 0x105, 0 );
    +
    327 sleep( 1 );
    +
    328 outp( g_retrosnd_state.io_base + 0x103, 0x4c );
    +
    329 outp( g_retrosnd_state.io_base + 0x105, 1 );
    +
    330
    +
    331 retrosnd_gus_poke( 0, 0xf );
    +
    332 retrosnd_gus_poke( 0x100, 0x55 );
    +
    333
    +
    334 /* Confirm values read are the same as those written. */
    +
    335 b = retrosnd_gus_peek( 0 );
    +
    336 if( 0xf != b ) {
    +
    337 error_printf( "gravis ultrasound not found!" );
    +
    338 retval = MERROR_SND;
    +
    339 goto cleanup;
    +
    340 }
    +
    341
    +
    342 debug_printf( 3, "gravis ultrasound ready!" );
    +
    343 break;
    +
    344
    +
    345 case RETROSND_PC_BIOS_MPU:
    +
    346 timeout = RETROSND_MPU_TIMEOUT;
    +
    347 /* Wait for OK-to-write flag. */
    +
    348 /* TODO: Will this break on some newer cards? */
    +
    349 do {
    +
    350 retval = retrosnd_mpu_not_ready( &timeout );
    +
    351 if( MERROR_TIMEOUT == retval ) {
    +
    352 error_printf( "cancelling initialization!" );
    +
    353 retval = MERROR_SND;
    +
    354 goto cleanup;
    +
    355 }
    +
    356 } while( MERROR_WAIT == retval );
    +
    357
    +
    358 /* Place the MPU-401 in UART mode. */
    +
    359 debug_printf( 3, "placing MPU-401 in UART mode..." );
    +
    360 outp( g_retrosnd_state.io_base + 0x01, 0xff );
    +
    361
    +
    362 debug_printf( 3, "MPU-401 ready!" );
    +
    363 break;
    +
    364
    +
    365 case RETROSND_PC_BIOS_ADLIB:
    +
    366 /* Clear all OPL registers. */
    +
    367 retrosnd_adlib_clear();
    +
    368 break;
    +
    369 }
    +
    370
    +
    371 g_retrosnd_state.flags |= RETROSND_FLAG_INIT;
    +
    372
    +
    373cleanup:
    +
    374# elif defined( RETROSND_API_ALSA )
    +
    375
    +
    376 /* TODO: If the /rsl arg was specified, show a list of MIDI devices. */
    +
    377
    +
    378 /* Make destination seq/port configurable. */
    +
    379 g_retrosnd_state.out_client = args->snd_client;
    +
    380 g_retrosnd_state.out_port = args->snd_port;
    +
    381
    +
    382 retval = snd_seq_open(
    +
    383 &(g_retrosnd_state.seq_handle), "default", SND_SEQ_OPEN_OUTPUT, 0 );
    +
    384 if( 0 > retval ) {
    +
    385 error_printf( "could not open sequencer!" );
    +
    386 retval = MERROR_SND;
    +
    387 goto cleanup;
    +
    388 }
    +
    389 debug_printf( 3, "sequencer initialized" );
    +
    390
    +
    391 g_retrosnd_state.seq_port = snd_seq_create_simple_port(
    +
    392 g_retrosnd_state.seq_handle, "retrosnd",
    +
    393 SND_SEQ_PORT_CAP_READ | SND_SEQ_PORT_CAP_WRITE,
    +
    394 SND_SEQ_PORT_TYPE_APPLICATION );
    +
    395
    +
    396 if( 0 > g_retrosnd_state.seq_port ) {
    +
    397 error_printf( "could not open MIDI port!" );
    +
    398 retval = MERROR_SND;
    +
    399 goto cleanup;
    +
    400 }
    +
    401 debug_printf( 3, "sequencer opened port: %d", g_retrosnd_state.seq_port );
    +
    402
    +
    403 retval = snd_seq_connect_to(
    +
    404 g_retrosnd_state.seq_handle, g_retrosnd_state.seq_port,
    +
    405 g_retrosnd_state.out_client, g_retrosnd_state.out_port );
    +
    406 if( 0 > retval ) {
    +
    407 error_printf( "could not connect sequencer to %u:%u!",
    +
    408 g_retrosnd_state.out_client, g_retrosnd_state.out_port );
    +
    409 retval = MERROR_SND;
    +
    410 goto cleanup;
    +
    411 }
    +
    412 debug_printf( 3, "sequencer connected to to: %u:%u",
    +
    413 g_retrosnd_state.out_client, g_retrosnd_state.out_port );
    +
    414 g_retrosnd_state.flags |= RETROSND_FLAG_INIT;
    +
    415
    +
    416cleanup:
    +
    417# elif defined( RETROSND_API_WINMM )
    +
    418
    +
    419 num_devs = midiOutGetNumDevs();
    +
    420
    +
    421 /* If the /rsl arg was specified, show a list of MIDI devices. */
    +
    422 if(
    +
    423 RETROSND_ARGS_FLAG_LIST_DEVS ==
    +
    424 (RETROSND_ARGS_FLAG_LIST_DEVS & args->snd_flags)
    +
    425 ) {
    +
    426 devs_list_buf_h = maug_malloc( 1, devs_list_buf_sz );
    +
    427
    +
    428 maug_mlock( devs_list_buf_h, devs_list_buf );
    +
    429 strncpy( devs_list_buf, "MIDI devices:\n", devs_list_buf_sz );
    +
    430 maug_munlock( devs_list_buf_h, devs_list_buf );
    +
    431
    +
    432 for( i = 0 ; num_devs > i ; i++ ) {
    +
    433 midiOutGetDevCaps( i, &midi_caps, sizeof( MIDIOUTCAPS ) );
    +
    434 if(
    +
    435 /* +2 for newline and NULL. */
    +
    436 devs_list_buf_pos + 2 + strlen( midi_caps.szPname )
    +
    437 > devs_list_buf_sz
    +
    438 ) {
    +
    439 /* Grow buffer if we need to. */
    +
    440 devs_list_buf_sz *= 2;
    +
    441 devs_list_buf_new =
    +
    442 maug_mrealloc( devs_list_buf_h, 1, devs_list_buf_sz );
    +
    443 maug_cleanup_if_null_alloc( MAUG_MHANDLE, devs_list_buf_new );
    +
    444 devs_list_buf_h = devs_list_buf_new;
    +
    445 }
    +
    446 assert( devs_list_buf_sz + 2 + strlen( midi_caps.szPname )
    +
    447 > devs_list_buf_sz );
    +
    448
    +
    449 /* Copy the current device name into the buffer. */
    +
    450 maug_mlock( devs_list_buf_h, devs_list_buf );
    +
    451 strcpy( &(devs_list_buf[devs_list_buf_pos]), midi_caps.szPname );
    +
    452 devs_list_buf_pos += strlen( midi_caps.szPname );
    +
    453 devs_list_buf[devs_list_buf_pos++] = '\n';
    +
    454 devs_list_buf[devs_list_buf_pos] = '\0';
    +
    455 maug_munlock( devs_list_buf_h, devs_list_buf );
    +
    456 }
    +
    457
    +
    458 /* Show the list dialog. */
    +
    459 maug_mlock( devs_list_buf_h, devs_list_buf );
    + +
    461 "MIDI Devices", "%s", devs_list_buf );
    +
    462 maug_munlock( devs_list_buf_h, devs_list_buf );
    +
    463
    +
    464 /* Cleanup the list and quit. */
    +
    465 maug_mfree( devs_list_buf_h );
    +
    466 retroflat_quit( 0 );
    +
    467 }
    +
    468
    +
    469 /* Try to open the specified device. */
    +
    470 if( 0 == num_devs ) {
    +
    471 error_printf( "no MIDI devices found!" );
    +
    472 retval = MERROR_SND;
    +
    473 goto cleanup;
    +
    474 } else if( num_devs < args->snd_dev_id ) {
    +
    475 error_printf( "invalid MIDI device index: %d", args->snd_dev_id );
    +
    476 retval = MERROR_SND;
    +
    477 goto cleanup;
    +
    478 }
    +
    479 midiOutGetDevCaps( args->snd_dev_id, &midi_caps, sizeof( MIDIOUTCAPS ) );
    +
    480
    +
    481 debug_printf( 3, "attempting to open MIDI device %u...", args->snd_dev_id );
    +
    482 moo_retval = midiOutOpen(
    +
    483 &(g_retrosnd_state.mo_handle), args->snd_dev_id, 0, 0, CALLBACK_NULL );
    +
    484 if( MMSYSERR_NOERROR != moo_retval ) {
    +
    485 error_printf( "could not open MIDI device: %s: %d",
    +
    486 midi_caps.szPname, moo_retval );
    +
    487 retval = MERROR_SND;
    +
    488 goto cleanup;
    +
    489 }
    +
    490 debug_printf( 3, "opened MIDI device: %s", midi_caps.szPname );
    +
    491 g_retrosnd_state.flags |= RETROSND_FLAG_INIT;
    +
    492
    +
    493cleanup:
    +
    494# else
    +
    495# pragma message( "warning: init not implemented" )
    +
    496# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    497
    +
    498 return retval;
    +
    499}
    +
    500
    +
    501/* === */
    +
    502
    +
    503void retrosnd_set_sf_bank( const char* filename_in ) {
    +
    504#ifdef RETROSND_API_PC_BIOS
    +
    505 strncpy( g_retrosnd_state.sf_bank_filename, filename_in,
    +
    506 SF_BANK_FILENAME_SZ_MAX );
    +
    507#endif /* RETROSND_API_PC_BIOS */
    +
    508}
    +
    509
    +
    510/* === */
    +
    511
    +
    512void retrosnd_midi_set_voice( uint8_t channel, uint8_t voice ) {
    +
    513# if defined( RETROSND_API_PC_BIOS )
    +
    514 MERROR_RETVAL retval = 0;
    +
    515 mfile_t opl_defs;
    +
    516 uint8_t byte_buffer = 0;
    +
    517# elif defined( RETROSND_API_ALSA )
    +
    518 snd_seq_event_t ev;
    +
    519# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA */
    +
    520
    +
    521 if(
    + +
    523 (RETROSND_FLAG_INIT & g_retrosnd_state.flags)
    +
    524 ) {
    +
    525 return;
    +
    526 }
    +
    527
    +
    528# if defined( RETROSND_API_PC_BIOS )
    +
    529 memset( &opl_defs, '\0', sizeof( mfile_t ) );
    +
    530
    +
    531 switch( g_retrosnd_state.driver ) {
    +
    532 case RETROSND_PC_BIOS_MPU:
    +
    533 /* Write MIDI message to MPU port, one byte at a time. */
    +
    534
    +
    535 /* 0xc0 (program change) | lower-nibble for channel. */
    +
    536 retval = retrosnd_mpu_write_byte( 0xc0 | (channel & 0x0f) );
    +
    537 maug_cleanup_if_not_ok();
    +
    538
    +
    539 retval = retrosnd_mpu_write_byte( voice );
    +
    540 maug_cleanup_if_not_ok();
    +
    541 break;
    +
    542
    +
    543 case RETROSND_PC_BIOS_GUS:
    +
    544 /* TODO */
    +
    545 break;
    +
    546
    +
    547 case RETROSND_PC_BIOS_ADLIB:
    +
    548
    +
    549 /* TODO: Fail more gracefully on high channel. */
    +
    550 assert( channel < 6 );
    +
    551
    +
    552 if( '\0' == g_retrosnd_state.sf_bank_filename[0] ) {
    +
    553 error_printf( "no bank file specified!" );
    +
    554 goto cleanup;
    +
    555 }
    +
    556
    +
    557 debug_printf(
    +
    558 RETROSND_TRACE_LVL, "channel: %d, reg: %d", channel,
    +
    559 adlib_ch[channel] );
    +
    560
    +
    561 /* TODO: Decouple voices so we can have 10/12 channels? */
    +
    562
    +
    563 /* Determine offset of voice def in OP2 file. */
    +
    564 #define adlib_opl2_offset() (8 + ((voice) * 37))
    +
    565
    +
    566 /* Read specified voice param field into specified reg. */
    +
    567 #define adlib_read_voice( field, reg, offset ) \
    +
    568 mfile_cread_at( &opl_defs, &byte_buffer, \
    +
    569 (adlib_opl2_offset() + offset) ); \
    +
    570 debug_printf( RETROSND_TRACE_LVL, \
    +
    571 "voice %d: " #field ": ofs: %d: 0x%02x -> reg 0x%02x", \
    +
    572 voice, offset, byte_buffer, reg ); \
    +
    573 retrosnd_adlib_poke( reg + adlib_ch[channel], byte_buffer );
    +
    574
    +
    575 /* Actually open the file. */
    +
    576 retval = mfile_open_read(
    +
    577 g_retrosnd_state.sf_bank_filename, &opl_defs );
    +
    578 maug_cleanup_if_not_ok();
    +
    579
    +
    580 debug_printf(
    +
    581 RETROSND_TRACE_LVL, "reading instrument %d at offset %d",
    +
    582 voice, adlib_opl2_offset() );
    +
    583
    +
    584 /* Here we load the requested instrument parameters index from the
    +
    585 * OP2 file into the Adlib registers.
    +
    586 *
    +
    587 * Offsets come from:
    +
    588 * https://moddingwiki.shikadi.net/wiki/OP2_Bank_Format
    +
    589 */
    +
    590
    +
    591 adlib_read_voice( mod_char, 0x20, 4 );
    +
    592 adlib_read_voice( mod_ad_lvl, 0x60, 5 );
    +
    593 adlib_read_voice( mod_sr_lvl, 0x80, 6 );
    +
    594 adlib_read_voice( mod_wave_sel, 0xe0, 7 );
    +
    595 /* adlib_read_voice( mod_key_scale, 8 );
    +
    596 adlib_read_voice( mod_out_lvl, 9 ); */ /* TODO */
    +
    597 adlib_read_voice( feedback, 0xc0, 10 );
    +
    598 adlib_read_voice( car_char, 0x23, 11 );
    +
    599 adlib_read_voice( car_ad_lvl, 0x63, 12 );
    +
    600 adlib_read_voice( car_sr_lvl, 0x83, 13 );
    +
    601 adlib_read_voice( car_wave_sel, 0xe3, 14 );
    +
    602 /* adlib_read_voice( car_key_scale, 15 );
    +
    603 adlib_read_voice( car_out_lvl, 16 ); */ /* TODO */
    +
    604
    +
    605 /* TODO: Parse these from the file properly. */
    +
    606 retrosnd_adlib_poke( 0x40 + adlib_ch[channel], 0x10 ); /* Mod volume. */
    +
    607 retrosnd_adlib_poke( 0x43 + adlib_ch[channel], 0x00 ); /* Carrier volume. */
    +
    608
    +
    609 break;
    +
    610 }
    +
    611
    +
    612cleanup:
    +
    613
    +
    614 mfile_close( &opl_defs );
    +
    615
    +
    616# elif defined( RETROSND_API_ALSA )
    +
    617 debug_printf(
    +
    618 RETROSND_TRACE_LVL,
    +
    619 "setting channel %u to voice: %u", channel, voice );
    +
    620 retrosnd_alsa_ev( &ev );
    +
    621 snd_seq_ev_set_pgmchange( &ev, channel, voice );
    +
    622 retrosnd_alsa_ev_send( &ev );
    +
    623# elif defined( RETROSND_API_WINMM )
    +
    624 midiOutShortMsg( g_retrosnd_state.mo_handle,
    +
    625 (((voice & 0xff) << 8) | 0xc0 | (channel & 0x0f)) );
    +
    626# else
    +
    627# pragma message( "warning: set_voice not implemented" )
    +
    628# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    629}
    +
    630
    +
    631/* === */
    +
    632
    +
    633void retrosnd_midi_set_control( uint8_t channel, uint8_t key, uint8_t val ) {
    +
    634# if defined( RETROSND_API_PC_BIOS )
    +
    635 MERROR_RETVAL retval = 0;
    +
    636# elif defined( RETROSND_API_ALSA )
    +
    637 snd_seq_event_t ev;
    +
    638# elif defined( RETROSND_API_WINMM )
    +
    639 uint32_t midi_msg = 0;
    +
    640# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    641
    +
    642 if( RETROSND_FLAG_INIT != (RETROSND_FLAG_INIT & g_retrosnd_state.flags) ) {
    +
    643 return;
    +
    644 }
    +
    645
    +
    646# if defined( RETROSND_API_PC_BIOS )
    +
    647
    +
    648 switch( g_retrosnd_state.driver ) {
    +
    649 case RETROSND_PC_BIOS_MPU:
    +
    650 /* Write MIDI message to MPU port, one byte at a time. */
    +
    651
    +
    652 /* 0xb0 (controller) | lower-nibble for channel. */
    +
    653 retval = retrosnd_mpu_write_byte( 0xb0 | (channel & 0x0f) );
    +
    654 maug_cleanup_if_not_ok();
    +
    655
    +
    656 retval = retrosnd_mpu_write_byte( key );
    +
    657 maug_cleanup_if_not_ok();
    +
    658
    +
    659 retval = retrosnd_mpu_write_byte( val );
    +
    660 maug_cleanup_if_not_ok();
    +
    661 break;
    +
    662
    +
    663 case RETROSND_PC_BIOS_GUS:
    +
    664 /* TODO */
    +
    665 break;
    +
    666
    +
    667 case RETROSND_PC_BIOS_ADLIB:
    +
    668 /* TODO */
    +
    669 break;
    +
    670 }
    +
    671
    +
    672cleanup:
    +
    673 return;
    +
    674# elif defined( RETROSND_API_ALSA )
    +
    675 debug_printf( RETROSND_TRACE_LVL,
    +
    676 "setting channel %u controller %u to: %u",
    +
    677 channel, key, val );
    +
    678 retrosnd_alsa_ev( &ev );
    +
    679 snd_seq_ev_set_controller( &ev, channel, key, val );
    +
    680 retrosnd_alsa_ev_send( &ev );
    +
    681# elif defined( RETROSND_API_WINMM )
    +
    682 midi_msg |= (val & 0xff);
    +
    683 midi_msg <<= 8;
    +
    684 midi_msg |= (key & 0xff);
    +
    685 midi_msg <<= 8;
    +
    686 midi_msg |= (channel & 0x0f) | 0xb0;
    +
    687 midiOutShortMsg( g_retrosnd_state.mo_handle, midi_msg );
    +
    688# else
    +
    689# pragma message( "warning: set_control not implemented" )
    +
    690# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    691}
    +
    692
    +
    693/* === */
    +
    694
    +
    695void retrosnd_midi_note_on( uint8_t channel, uint8_t pitch, uint8_t vel ) {
    +
    696# if defined( RETROSND_API_PC_BIOS )
    +
    697 MERROR_RETVAL retval = 0;
    +
    698# elif defined( RETROSND_API_ALSA )
    +
    699 snd_seq_event_t ev;
    +
    700# elif defined( RETROSND_API_WINMM )
    +
    701 uint32_t midi_msg = 0;
    +
    702# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    703
    +
    704 if( RETROSND_FLAG_INIT != (RETROSND_FLAG_INIT & g_retrosnd_state.flags) ) {
    +
    705 return;
    +
    706 }
    +
    707
    +
    708# if defined( RETROSND_API_PC_BIOS )
    +
    709
    +
    710 switch( g_retrosnd_state.driver ) {
    +
    711 case RETROSND_PC_BIOS_SPKR:
    +
    712 /* TODO */
    +
    713 break;
    +
    714
    +
    715 case RETROSND_PC_BIOS_MPU:
    +
    716 /* Write MIDI message to MPU port, one byte at a time. */
    +
    717
    +
    718 /* 0x90 (note on) | lower-nibble for channel. */
    +
    719 retval = retrosnd_mpu_write_byte( 0x90 | (channel & 0x0f) );
    +
    720 maug_cleanup_if_not_ok();
    +
    721
    +
    722 retval = retrosnd_mpu_write_byte( pitch );
    +
    723 maug_cleanup_if_not_ok();
    +
    724
    +
    725 retval = retrosnd_mpu_write_byte( vel );
    +
    726 maug_cleanup_if_not_ok();
    +
    727 break;
    +
    728
    +
    729 case RETROSND_PC_BIOS_GUS:
    +
    730 /* TODO */
    +
    731 break;
    +
    732
    +
    733 case RETROSND_PC_BIOS_ADLIB:
    +
    734 /* TODO: Fail more gracefully on high channel. */
    +
    735 assert( channel < 6 );
    +
    736 /* Voice frequency. */
    +
    737 retrosnd_adlib_poke( 0xa0 + channel, pitch );
    +
    738 /* Turn voice on! */
    +
    739 retrosnd_adlib_poke( 0xb0 + channel, 0x31 );
    +
    740 break;
    +
    741 }
    +
    742
    +
    743cleanup:
    +
    744 return;
    +
    745# elif defined( RETROSND_API_ALSA )
    +
    746 retrosnd_alsa_ev( &ev );
    +
    747 snd_seq_ev_set_noteon( &ev, channel, pitch, vel );
    +
    748 retrosnd_alsa_ev_send( &ev );
    +
    749# elif defined( RETROSND_API_WINMM )
    +
    750 midi_msg |= (vel & 0xff);
    +
    751 midi_msg <<= 8;
    +
    752 midi_msg |= (pitch & 0xff);
    +
    753 midi_msg <<= 8;
    +
    754 midi_msg |= (channel & 0x0f) | 0x90;
    +
    755 midiOutShortMsg( g_retrosnd_state.mo_handle, midi_msg );
    +
    756# else
    +
    757# pragma message( "warning: note_on not implemented" )
    +
    758# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    759
    +
    760}
    +
    761
    +
    762/* === */
    +
    763
    +
    764void retrosnd_midi_note_off( uint8_t channel, uint8_t pitch, uint8_t vel ) {
    +
    765# if defined( RETROSND_API_PC_BIOS )
    +
    766 MERROR_RETVAL retval = 0;
    +
    767# elif defined( RETROSND_API_ALSA )
    +
    768 snd_seq_event_t ev;
    +
    769# elif defined( RETROSND_API_WINMM )
    +
    770 uint32_t midi_msg = 0;
    +
    771# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    772
    +
    773 if( RETROSND_FLAG_INIT != (RETROSND_FLAG_INIT & g_retrosnd_state.flags) ) {
    +
    774 return;
    +
    775 }
    +
    776
    +
    777# if defined( RETROSND_API_PC_BIOS )
    +
    778
    +
    779 switch( g_retrosnd_state.driver ) {
    +
    780 case RETROSND_PC_BIOS_SPKR:
    +
    781 /* TODO */
    +
    782 break;
    +
    783
    +
    784 case RETROSND_PC_BIOS_MPU:
    +
    785 /* Write MIDI message to MPU port, one byte at a time. */
    +
    786
    +
    787 /* 0x80 (note off) | lower-nibble for channel. */
    +
    788 retval = retrosnd_mpu_write_byte( 0x80 | (channel & 0x0f) );
    +
    789 maug_cleanup_if_not_ok();
    +
    790
    +
    791 retval = retrosnd_mpu_write_byte( pitch );
    +
    792 maug_cleanup_if_not_ok();
    +
    793
    +
    794 retval = retrosnd_mpu_write_byte( vel );
    +
    795 maug_cleanup_if_not_ok();
    +
    796 break;
    +
    797
    +
    798 case RETROSND_PC_BIOS_GUS:
    +
    799 /* TODO */
    +
    800 break;
    +
    801
    +
    802 case RETROSND_PC_BIOS_ADLIB:
    +
    803 /* TODO: Fail more gracefully on high channel. */
    +
    804 assert( channel < 6 );
    +
    805 /* Turn voice off. */
    +
    806 retrosnd_adlib_poke( 0xb0 + channel, 0x11 );
    +
    807 break;
    +
    808 }
    +
    809
    +
    810cleanup:
    +
    811 return;
    +
    812# elif defined( RETROSND_API_ALSA )
    +
    813 retrosnd_alsa_ev( &ev );
    +
    814 snd_seq_ev_set_noteoff( &ev, channel, pitch, vel );
    +
    815 retrosnd_alsa_ev_send( &ev );
    +
    816# elif defined( RETROSND_API_WINMM )
    +
    817 midi_msg |= (vel & 0xff);
    +
    818 midi_msg <<= 8;
    +
    819 midi_msg |= (pitch & 0xff);
    +
    820 midi_msg <<= 8;
    +
    821 midi_msg |= (channel & 0x0f) | 0x80;
    +
    822 midiOutShortMsg( g_retrosnd_state.mo_handle, midi_msg );
    +
    823# else
    +
    824# pragma message( "warning: note_off not implemented" )
    +
    825# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    826
    +
    827}
    +
    828
    +
    829/* === */
    +
    830
    +
    831void retrosnd_shutdown() {
    +
    832
    +
    833 if( RETROSND_FLAG_INIT != (RETROSND_FLAG_INIT & g_retrosnd_state.flags) ) {
    +
    834 return;
    +
    835 }
    +
    836
    +
    837# ifdef RETROSND_API_PC_BIOS
    +
    838 switch( g_retrosnd_state.driver ) {
    +
    839 case RETROSND_PC_BIOS_MPU:
    +
    840 /* TODO */
    +
    841 break;
    +
    842
    +
    843 case RETROSND_PC_BIOS_GUS:
    +
    844 /* TODO */
    +
    845 break;
    +
    846
    +
    847 case RETROSND_PC_BIOS_ADLIB:
    +
    848 retrosnd_adlib_clear();
    +
    849 break;
    +
    850 }
    +
    851# elif defined( RETROSND_API_ALSA )
    +
    852 snd_seq_close( g_retrosnd_state.seq_handle );
    +
    853# elif defined( RETROSND_API_WINMM )
    +
    854 midiOutClose( g_retrosnd_state.mo_handle );
    +
    855# else
    +
    856# pragma message( "warning: shutdown not implemented" )
    +
    857# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    858}
    +
    859
    +
    860#endif /* RETROSND_C */
    +
    861
    +
    862 /* maug_retrosnd */
    +
    863
    +
    864#endif /* !RETROSND_H */
    +
    865
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mrealloc(handle, nmemb, sz)
    Definition mmem.h:53
    +
    MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
    Open a file and read it into memory or memory-map it.
    +
    void mfile_close(mfile_t *p_file)
    Close a file opened with mfile_open_read().
    +
    #define RETROFLAT_MSG_FLAG_INFO
    This icon/type flag indicates an informational notice. It will try to display messages in a definite ...
    Definition retroflt.h:512
    +
    #define retroflat_quit(retval_in)
    This should be called in order to quit a program using RetroFlat.
    Definition retroflt.h:2061
    +
    void retroflat_message(uint8_t flags, const char *title, const char *format,...)
    Display a message in a dialog box and/or on stderr.
    +
    #define RETROSND_FLAG_INIT
    Flag in RETROSND_STATE::flags indicating initialization was successful.
    Definition retrosnd.h:53
    +
    void retrosnd_set_sf_bank(const char *filename_in)
    Set the name of the voice bank filename to use.
    +
    MERROR_RETVAL retrosnd_init(struct RETROFLAT_ARGS *args)
    Initialize retrosnd engine.
    +
    Definition mfile.h:45
    +
    Struct containing configuration values for a RetroFlat program.
    Definition retroflt.h:2177
    +
    Internal retrosound state struct. Most fields are platform-specific.
    Definition retrosnd.h:91
    +
    uint8_t flags
    Bitfield indicating global state with RetroSound State Flags.
    Definition retrosnd.h:95
    +
    + + +
    + + diff --git a/retrotil_8h_source.html b/retrotil_8h_source.html new file mode 100644 index 00000000..36f2f2cc --- /dev/null +++ b/retrotil_8h_source.html @@ -0,0 +1,1688 @@ + + + + + + + +maug: retrotil.h Source File + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    +
    retrotil.h
    +
    +
    +
    1
    +
    2#ifndef RETROTIL_H
    +
    3#define RETROTIL_H
    +
    4
    +
    5#include <mparser.h>
    +
    6#include <mjson.h>
    +
    7#include <mfile.h>
    +
    8
    +
    16#ifndef RETROTILE_NAME_SZ_MAX
    +
    18# define RETROTILE_NAME_SZ_MAX 10
    +
    19#endif /* !RETROTILE_NAME_SZ_MAX */
    +
    20
    +
    21#ifndef RETROTILE_TILESET_IMAGE_STR_SZ_MAX
    +
    23# define RETROTILE_TILESET_IMAGE_STR_SZ_MAX 48
    +
    24#endif /* !RETROTILE_TILESET_IMAGE_STR_SZ_MAX */
    +
    25
    +
    26#ifndef RETROTILE_TILE_SCALE_DEFAULT
    +
    28# define RETROTILE_TILE_SCALE_DEFAULT 1.0f
    +
    29#endif /* !RETROTILE_TILE_SCALE_DEFAULT */
    +
    30
    +
    31#ifndef RETROTILE_TRACE_LVL
    +
    33# define RETROTILE_TRACE_LVL 0
    +
    34#endif /* !RETROTILE_TRACE_LVL */
    +
    35
    +
    36#ifndef RETROTILE_VORONOI_DEFAULT_SPB
    +
    37# define RETROTILE_VORONOI_DEFAULT_SPB 8
    +
    38#endif /* !RETROTILE_VORONOI_DEFAULT_SPB */
    +
    39
    +
    40#ifndef RETROTILE_VORONOI_DEFAULT_DRIFT
    +
    41# define RETROTILE_VORONOI_DEFAULT_DRIFT 4
    +
    42#endif /* !RETROTILE_VORONOI_DEFAULT_DRIFT */
    +
    43
    +
    44#ifdef MPARSER_TRACE_NAMES
    +
    45# define retrotile_mstate_name( state ) gc_retrotile_mstate_names[state]
    +
    46#else
    +
    47# define retrotile_mstate_name( state ) state
    +
    48#endif /* MPARSER_TRACE_NAMES */
    +
    49
    +
    60#define RETROTILE_PARSER_MODE_MAP 0
    +
    61#define RETROTILE_PARSER_MODE_DEFS 1
    +
    62
    +
    63#define RETROTILE_TILE_FLAG_BLOCK 0x01
    +
    64#define RETROTILE_TILE_FLAG_ROT_X 0x02
    +
    65#define RETROTILE_TILE_FLAG_ROT_Z 0x04
    +
    66#define RETROTILE_TILE_FLAG_PRTCL_FIRE 0x08
    +
    67
    +
    68 /* retrotile_defs_types */
    +
    69
    +
    70#define RETROTILE_DIR4_NORTH 0
    +
    71#define RETROTILE_DIR4_EAST 1
    +
    72#define RETROTILE_DIR4_SOUTH 2
    +
    73#define RETROTILE_DIR4_WEST 3
    +
    74
    +
    75#define RETROTILE_DIR8_NORTH 0
    +
    76#define RETROTILE_DIR8_EAST 2
    +
    77#define RETROTILE_DIR8_SOUTH 4
    +
    78#define RETROTILE_DIR8_WEST 6
    +
    79
    +
    80typedef int16_t retrotile_tile_t;
    +
    81
    +
    82#define RETROTILE_IDX_FMT "%u"
    +
    83
    +
    + +
    85 uint8_t flags;
    + +
    87};
    +
    +
    88
    +
    89 /* retrotile_defs */
    +
    90
    +
    + +
    92 size_t sz;
    +
    93};
    +
    +
    94
    +
    +
    95struct RETROTILE {
    +
    96 uint32_t sz;
    +
    97 uint32_t layers_count;
    +
    98 uint32_t layers_offset;
    +
    99 char name[RETROTILE_NAME_SZ_MAX];
    +
    100 size_t tileset_fgid;
    +
    101 uint8_t tiles_h;
    +
    102 uint8_t tiles_w;
    +
    103 float tile_scale;
    +
    104};
    +
    +
    105
    +
    + +
    112 int16_t sect_x;
    +
    114 int16_t sect_y;
    +
    116 int16_t sect_w;
    +
    118 int16_t sect_h;
    +
    120 int16_t sect_w_half;
    +
    122 int16_t sect_h_half;
    +
    123};
    +
    +
    124
    +
    + +
    126 int16_t tiles_changed;
    +
    127 retrotile_tile_t center;
    +
    128 retrotile_tile_t outside;
    +
    130 retrotile_tile_t mod_to[8];
    +
    131};
    +
    +
    132
    +
    133#define retrotile_get_tile( tilemap, layer, x, y ) \
    +
    134 (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
    +
    135
    +
    136#define retrotile_set_tile( tilemap, layer, x, y, new_val ) \
    +
    137 (retrotile_get_tiles_p( layer )[((y) * (tilemap)->tiles_w) + (x)])
    +
    138
    +
    139#define retrotile_get_tiles_p( layer ) \
    +
    140 ((retrotile_tile_t*)(((uint8_t*)(layer)) + \
    +
    141 sizeof( struct RETROTILE_LAYER )))
    +
    142
    +
    148typedef MERROR_RETVAL (*retrotile_tj_parse_cb)(
    +
    149 const char* filename, MAUG_MHANDLE* p_tm_h,
    +
    150 MAUG_MHANDLE* p_td_h, size_t* p_td_c );
    +
    151
    +
    + +
    153 uint8_t mstate;
    +
    154 /* TODO: Use flags and combine these. */
    +
    155 uint8_t pass;
    +
    156 uint8_t mode;
    +
    157 size_t layer_tile_iter;
    +
    158 size_t pass_layer_iter;
    + +
    164 size_t tiles_w;
    +
    165 size_t tiles_h;
    +
    166 struct RETROTILE* t;
    +
    167 retrotile_tj_parse_cb tj_parse_cb;
    +
    168 struct MJSON_PARSER jparser;
    +
    169 MAUG_MHANDLE* p_tile_defs_h;
    +
    170 size_t* p_tile_defs_count;
    +
    171};
    +
    +
    172
    +
    173#define RETROTILE_PARSER_MSTATE_TABLE( f ) \
    +
    174 f( MTILESTATE_NONE, 0, "", 0, 0 ) \
    +
    175 f( MTILESTATE_HEIGHT, 1, "height", 0 , 0 ) \
    +
    176 f( MTILESTATE_WIDTH, 2, "width", 0 , 0 ) \
    +
    177 f( MTILESTATE_LAYERS, 3, "layers", 0 , 0 ) \
    +
    178 f( MTILESTATE_LAYER_DATA, 4, "data", 15 /* LAYER */, 0 ) \
    +
    179 f( MTILESTATE_LAYER_NAME, 5, "name", 15 /* LAYER */, 0 ) \
    +
    180 f( MTILESTATE_TILES, 6, "tiles", 0 , 1 ) \
    +
    181 f( MTILESTATE_TILES_ID, 7, "id", 6 /* TILES */ , 1 ) \
    +
    182 f( MTILESTATE_TILES_IMAGE, 8, "image", 6 /* TILES */ , 1 ) \
    +
    183 f( MTILESTATE_TILESETS, 9, "tilesets", 0 , 0 ) \
    +
    184 f( MTILESTATE_TILESETS_SRC, 10, "source", 9 /* TILESETS */, 0 ) \
    +
    185 f( MTILESTATE_TILESETS_FGID, 11, "firstgid",9 /* TILESETS */, 0 ) \
    +
    186 f( MTILESTATE_TILESETS_PROP, 12, "firstgid",9 /* TILESETS */, 0 ) \
    +
    187 f( MTILESTATE_GRID, 13, "grid", 0 , 1 ) \
    +
    188 f( MTILESTATE_TILES_PROP, 14, "properties",6 /* TILES */ , 1 ) \
    +
    189 f( MTILESTATE_LAYER, 15, "layers", /* [sic] */ 3 , 0 ) \
    +
    190 f( MTILESTATE_TILES_PROP_NAME, 16, "name", 14 /* TILES_PROP */ , 1 ) \
    +
    191 f( MTILESTATE_TILES_PROP_VAL, 17, "value", 14 /* TILES_PROP */ , 1 )
    +
    192
    + +
    194retrotile_parse_json_c( struct RETROTILE_PARSER* parser, char c );
    +
    195
    +
    196MERROR_RETVAL retrotile_parse_json_file(
    +
    197 const char* filename, MAUG_MHANDLE* p_tilemap_h,
    +
    198 MAUG_MHANDLE* p_tile_defs_h, size_t* p_tile_defs_count );
    +
    199
    +
    200 /* retrotile_parser */
    +
    201
    +
    208typedef MERROR_RETVAL (*retrotile_ani_cb)(
    +
    209 void* animation_cb_data, int16_t iter );
    +
    210
    +
    211typedef MERROR_RETVAL (*retrotile_gen_cb)(
    +
    212 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    213 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    214 retrotile_ani_cb animation_cb, void* animation_cb_data );
    +
    215
    + +
    226 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    227 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    228 retrotile_ani_cb animation_cb, void* animation_cb_data );
    +
    229
    + +
    241 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    242 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    243 retrotile_ani_cb animation_cb, void* animation_cb_data );
    +
    244
    + +
    253 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    254 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    255 retrotile_ani_cb animation_cb, void* animation_cb_data );
    +
    256
    + +
    264 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    265 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    266 retrotile_ani_cb animation_cb, void* animation_cb_data );
    +
    267
    +
    268struct RETROTILE_LAYER* retrotile_get_layer_p(
    +
    269 struct RETROTILE* tilemap, uint32_t layer_idx );
    +
    270
    +
    271MERROR_RETVAL retrotile_alloc_tile_defs(
    +
    272 MAUG_MHANDLE* p_tile_defs_h, size_t* p_tile_defs_count, size_t ndefs );
    +
    273
    +
    274MERROR_RETVAL retrotile_alloc(
    +
    275 MAUG_MHANDLE* p_tilemap_h, size_t w, size_t h, size_t layers_count );
    +
    276
    +
    277 /* retrotile_gen */
    +
    278
    +
    279#ifdef RETROTIL_C
    +
    280
    +
    281# include <stdio.h>
    +
    282
    +
    283# include <mparser.h>
    +
    284
    +
    285MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets8_x[8] =
    +
    286 { 0, 1, 1, 1, 0, -1, -1, -1 };
    +
    287MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets8_y[8] =
    +
    288 { -1, -1, 0, 1, 1, 1, 0, -1 };
    +
    289
    +
    290MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets4_x[4] =
    +
    291 { 0, 1, 0, -1 };
    +
    292MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets4_y[4] =
    +
    293 { -1, 0, 1, 0 };
    +
    294
    +
    295/* TODO: Function names should be verb_noun! */
    +
    296
    +
    297#define retrotile_parser_mstate( parser, new_mstate ) \
    +
    298 parser->mstate = new_mstate;
    +
    299
    +
    300#if 0
    +
    301 debug_printf( \
    +
    302 RETROTILE_TRACE_LVL, "parser mstate: %s", \
    +
    303 retrotile_mstate_name( parser->mstate ) );
    +
    304#endif
    +
    305
    +
    306# define RETROTILE_PARSER_MSTATE_TABLE_CONST( name, idx, tokn, parent, m ) \
    +
    307 static MAUG_CONST uint8_t SEG_MCONST name = idx;
    +
    308
    +
    309RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_CONST )
    +
    310
    +
    311#ifdef MPARSER_TRACE_NAMES
    +
    312# define RETROTILE_PARSER_MSTATE_TABLE_NAME( name, idx, tokn, parent, m ) \
    +
    313 #name,
    +
    314
    +
    315static MAUG_CONST char* SEG_MCONST gc_retrotile_mstate_names[] = {
    +
    316 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_NAME )
    +
    317 ""
    +
    318};
    +
    319#endif /* MPARSER_TRACE_NAMES */
    +
    320
    +
    321# define RETROTILE_PARSER_MSTATE_TABLE_TOKEN( name, idx, tokn, parent, m ) \
    +
    322 tokn,
    +
    323
    +
    324static MAUG_CONST char* SEG_MCONST gc_retrotile_mstate_tokens[] = {
    +
    325 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_TOKEN )
    +
    326 ""
    +
    327};
    +
    328
    +
    329# define RETROTILE_PARSER_MSTATE_TABLE_PARNT( name, idx, tokn, parent, m ) \
    +
    330 parent,
    +
    331
    +
    332static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_parents[] = {
    +
    333 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_PARNT )
    +
    334 0
    +
    335};
    +
    336
    +
    337# define RETROTILE_PARSER_MSTATE_TABLE_MODE( name, idx, tokn, parent, m ) \
    +
    338 m,
    +
    339
    +
    340static MAUG_CONST uint8_t SEG_MCONST gc_retrotile_mstate_modes[] = {
    +
    341 RETROTILE_PARSER_MSTATE_TABLE( RETROTILE_PARSER_MSTATE_TABLE_MODE )
    +
    342 0
    +
    343};
    +
    344
    +
    345/* === */
    +
    346
    +
    347static void retrotile_parser_match_token(
    +
    348 const char* token, size_t token_sz, struct RETROTILE_PARSER* parser
    +
    349) {
    +
    350 size_t j = 1;
    +
    351
    +
    352 /* Figure out what the key is for. */
    +
    353 while( '\0' != gc_retrotile_mstate_tokens[j][0] ) {
    +
    354 if(
    +
    355 /* Make sure tokens match. */
    +
    356 strlen( gc_retrotile_mstate_tokens[j] ) != token_sz ||
    +
    357 0 != strncmp(
    +
    358 token, gc_retrotile_mstate_tokens[j], token_sz
    +
    359 )
    +
    360 ) {
    +
    361 j++;
    +
    362 continue;
    +
    363
    +
    364 } else if(
    +
    365 /* This state can only be
    +
    366 * reached THROUGH that parent state. This allows us to have
    +
    367 * keys with the same name but different parents!
    +
    368 */
    +
    369 parser->mstate != gc_retrotile_mstate_parents[j]
    +
    370 ) {
    +
    371 debug_printf(
    + +
    373 "found token \"%s\" but incorrect parent %s (%d) "
    +
    374 "(needs %s (%d))!",
    +
    375 token,
    +
    376 retrotile_mstate_name( parser->mstate ),
    +
    377 parser->mstate,
    +
    378 retrotile_mstate_name( gc_retrotile_mstate_parents[j] ),
    +
    379 gc_retrotile_mstate_parents[j] );
    +
    380 j++;
    +
    381 continue;
    +
    382
    +
    383 } else if(
    +
    384 /* None works in all modes! */
    +
    385 /* MTILESTATE_NONE != parser->mstate && */
    +
    386 parser->mode != gc_retrotile_mstate_modes[j]
    +
    387 ) {
    +
    388 debug_printf(
    +
    389 RETROTILE_TRACE_LVL, "found token %s but incorrect mode %u!",
    +
    390 token,
    +
    391 gc_retrotile_mstate_modes[j] );
    +
    392 j++;
    +
    393 continue;
    +
    394
    +
    395 } else {
    +
    396 /* Found it! */
    +
    397 retrotile_parser_mstate( parser, j );
    +
    398 return;
    +
    399 }
    +
    400 }
    +
    401}
    +
    402
    +
    403/* === */
    +
    404
    +
    405MERROR_RETVAL retrotile_parser_parse_tiledef_token(
    +
    406 const char* token, size_t token_sz, void* parser_arg
    +
    407) {
    +
    408 MERROR_RETVAL retval = MERROR_OK;
    +
    409 struct RETROTILE_TILE_DEF* tile_defs = NULL;
    +
    410 struct RETROTILE_PARSER* parser = (struct RETROTILE_PARSER*)parser_arg;
    +
    411 size_t tileset_id_parsed = 0;
    +
    412
    +
    413 if( 0 < *(parser->p_tile_defs_count) ) {
    +
    414 maug_mlock( *(parser->p_tile_defs_h), tile_defs );
    +
    415 maug_cleanup_if_null_alloc( struct RETROTILE_TILE_DEF*, tile_defs );
    +
    416 }
    +
    417
    +
    418 if(
    +
    419 MJSON_PSTATE_OBJECT_VAL ==
    +
    420 mjson_parser_pstate( &(parser->jparser) )
    +
    421 ) {
    +
    422 if( MTILESTATE_TILES_ID == parser->mstate ) {
    +
    423 retrotile_parser_mstate( parser, MTILESTATE_TILES );
    +
    424 if( 0 == parser->pass ) {
    +
    425 /* Parse tile ID. */
    +
    426 tileset_id_parsed = atoi( token );
    +
    427 if( tileset_id_parsed > parser->tileset_id_cur ) {
    +
    428 parser->tileset_id_cur = tileset_id_parsed;
    +
    429 debug_printf(
    + +
    431 "new highest tile ID: " SIZE_T_FMT,
    +
    432 parser->tileset_id_cur );
    +
    433 }
    +
    434 } else {
    +
    435 /* TODO: atoi or atoul? */
    +
    436 parser->tileset_id_cur = atoi( token );
    +
    437 debug_printf(
    + +
    439 "next tile ID: " SIZE_T_FMT,
    +
    440 parser->tileset_id_cur );
    +
    441 }
    +
    442
    +
    443 } else if( MTILESTATE_TILES_IMAGE == parser->mstate ) {
    +
    444 if( 1 == parser->pass ) {
    +
    445 debug_printf(
    +
    446 RETROTILE_TRACE_LVL, "setting tile ID " SIZE_T_FMT "...",
    +
    447 parser->tileset_id_cur );
    +
    448
    +
    449 /* Parse tile image. */
    +
    450 strncpy(
    +
    451 tile_defs[parser->tileset_id_cur].image_path,
    +
    452 token,
    + +
    454
    +
    455 debug_printf(
    +
    456 RETROTILE_TRACE_LVL, "set tile ID " SIZE_T_FMT " to: %s",
    +
    457 parser->tileset_id_cur,
    +
    458 tile_defs[parser->tileset_id_cur].image_path );
    +
    459 }
    +
    460 retrotile_parser_mstate( parser, MTILESTATE_TILES );
    +
    461
    +
    462 } else if( MTILESTATE_TILES_PROP_NAME == parser->mstate ) {
    +
    463
    +
    464 if( 1 == parser->pass ) {
    +
    465 if( 0 == strncmp(
    +
    466 parser->jparser.token,
    +
    467 "rotate_x",
    +
    468 parser->jparser.token_sz
    +
    469 ) ) {
    +
    470 /* Found flag: rotate X! */
    +
    471 /* TODO: Read boolean value. */
    +
    472 if( parser->tileset_id_cur >= *(parser->p_tile_defs_count) ) {
    +
    473 error_printf(
    +
    474 "tileset ID " SIZE_T_FMT
    +
    475 " outside of tile defs count " SIZE_T_FMT "!",
    +
    476 parser->tileset_id_cur, *(parser->p_tile_defs_count) );
    +
    477 retval = MERROR_OVERFLOW;
    +
    478 goto cleanup;
    +
    479 }
    +
    480 tile_defs[parser->tileset_id_cur].flags |=
    +
    481 RETROTILE_TILE_FLAG_ROT_X;
    +
    482 }
    +
    483
    +
    484 /* TODO: Read boolean Z and fire particles prop/flag. */
    +
    485 }
    +
    486
    +
    487 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
    +
    488
    +
    489 } else if( MTILESTATE_TILES_PROP_VAL == parser->mstate ) {
    +
    490
    +
    491 retrotile_parser_mstate( parser, MTILESTATE_TILES_PROP );
    +
    492 }
    +
    493 goto cleanup;
    +
    494 }
    +
    495
    +
    496 retrotile_parser_match_token( token, token_sz, parser );
    +
    497
    +
    498cleanup:
    +
    499
    +
    500 if( NULL != tile_defs ) {
    +
    501 maug_munlock( *(parser->p_tile_defs_h), tile_defs );
    +
    502 }
    +
    503
    +
    504 return retval;
    +
    505}
    +
    506
    +
    507MERROR_RETVAL retrotile_parser_parse_token(
    +
    508 const char* token, size_t token_sz, void* parser_arg
    +
    509) {
    +
    510 MERROR_RETVAL retval = MERROR_OK;
    +
    511 struct RETROTILE_TILE_DEF* tile_defs = NULL;
    +
    512 struct RETROTILE_LAYER* tiles_layer = NULL;
    +
    513 struct RETROTILE_PARSER* parser = (struct RETROTILE_PARSER*)parser_arg;
    +
    514 retrotile_tile_t* tiles = NULL;
    +
    515
    +
    516 if( 0 < *(parser->p_tile_defs_count) ) {
    +
    517 maug_mlock( *(parser->p_tile_defs_h), tile_defs );
    +
    518 maug_cleanup_if_null_alloc( struct RETROTILE_TILE_DEF*, tile_defs );
    +
    519 }
    +
    520
    +
    521 if( MJSON_PSTATE_LIST == mjson_parser_pstate( &(parser->jparser) ) ) {
    +
    522 if(
    +
    523 1 == parser->pass &&
    +
    524 MTILESTATE_LAYER_DATA == parser->mstate
    +
    525 ) {
    +
    526 /*
    +
    527 assert( NULL != *(parser->p_tilemap_h) );
    +
    528 maug_mlock( *(parser->p_tilemap_h), tilemap );
    +
    529 maug_cleanup_if_null_alloc( struct RETROTILE*, tilemap );
    +
    530 */
    +
    531
    +
    532 debug_printf( RETROTILE_TRACE_LVL,
    +
    533 "selecting layer " SIZE_T_FMT "...",
    +
    534 parser->pass_layer_iter );
    +
    535 assert( NULL != parser->t );
    +
    536 tiles_layer = retrotile_get_layer_p(
    +
    537 parser->t, parser->pass_layer_iter );
    +
    538 assert( NULL != tiles_layer );
    +
    539
    +
    540 tiles = retrotile_get_tiles_p( tiles_layer );
    +
    541
    +
    542 /* Parse tilemap tile. */
    +
    543 debug_printf( RETROTILE_TRACE_LVL,
    +
    544 "layer " SIZE_T_FMT " tile: " SIZE_T_FMT " (tiles: %p)",
    +
    545 parser->pass_layer_iter, parser->layer_tile_iter,
    +
    546 tiles );
    +
    547 assert( NULL != token );
    +
    548 assert( NULL != parser );
    +
    549 assert( NULL != tiles );
    +
    550
    +
    551 if(
    +
    552 parser->layer_tile_iter >=
    +
    553 parser->t->tiles_w * parser->t->tiles_h
    +
    554 ) {
    +
    555 error_printf(
    +
    556 "tile " SIZE_T_FMT " outside of layer tile buffer size %d!",
    +
    557 parser->layer_tile_iter,
    +
    558 parser->t->tiles_w * parser->t->tiles_h );
    +
    559 retval = MERROR_OVERFLOW;
    +
    560 goto cleanup;
    +
    561 }
    +
    562
    +
    563 assert( 0 == tiles[parser->layer_tile_iter] );
    +
    564
    +
    565 tiles[parser->layer_tile_iter] = atoi( token );
    +
    566 }
    +
    567 parser->layer_tile_iter++;
    +
    568 goto cleanup;
    +
    569
    +
    570 } else if(
    +
    571 MJSON_PSTATE_OBJECT_VAL ==
    +
    572 mjson_parser_pstate( &(parser->jparser) )
    +
    573 ) {
    +
    574 if( MTILESTATE_TILESETS_FGID == parser->mstate ) {
    +
    575 if( 1 == parser->pass ) {
    +
    576 parser->t->tileset_fgid = atoi( token );
    +
    577 debug_printf(
    +
    578 RETROTILE_TRACE_LVL, "tileset FGID set to: " SIZE_T_FMT,
    +
    579 parser->t->tileset_fgid );
    +
    580 }
    +
    581 retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
    +
    582
    +
    583 } else if( MTILESTATE_TILESETS_SRC == parser->mstate ) {
    +
    584 if( 1 == parser->pass ) {
    +
    585 debug_printf( RETROTILE_TRACE_LVL, "parsing %s...", token );
    +
    586 parser->tj_parse_cb(
    +
    587 token, NULL, parser->p_tile_defs_h,
    +
    588 parser->p_tile_defs_count );
    +
    589 }
    +
    590 retrotile_parser_mstate( parser, MTILESTATE_TILESETS );
    +
    591
    +
    592 } else if( MTILESTATE_HEIGHT == parser->mstate ) {
    +
    593 if( 0 == parser->pass ) {
    +
    594 parser->tiles_h = atoi( token );
    +
    595 debug_printf(
    +
    596 RETROTILE_TRACE_LVL, "tilemap height: " SIZE_T_FMT,
    +
    597 parser->tiles_h );
    +
    598 }
    +
    599 retrotile_parser_mstate( parser, MTILESTATE_NONE );
    +
    600
    +
    601 } else if( MTILESTATE_WIDTH == parser->mstate ) {
    +
    602 if( 0 == parser->pass ) {
    +
    603 parser->tiles_w = atoi( token );
    +
    604 debug_printf(
    +
    605 RETROTILE_TRACE_LVL, "tilemap width: " SIZE_T_FMT,
    +
    606 parser->tiles_w );
    +
    607 }
    +
    608 retrotile_parser_mstate( parser, MTILESTATE_NONE );
    +
    609
    +
    610 } else if( MTILESTATE_LAYER_NAME == parser->mstate ) {
    +
    611 /* TODO: Store */
    +
    612 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
    +
    613
    +
    614 }
    +
    615 goto cleanup;
    +
    616 }
    +
    617
    +
    618 retrotile_parser_match_token( token, token_sz, parser );
    +
    619
    +
    620cleanup:
    +
    621
    +
    622 if( NULL != tile_defs ) {
    +
    623 maug_munlock( *(parser->p_tile_defs_h), tile_defs );
    +
    624 }
    +
    625
    +
    626 return retval;
    +
    627}
    +
    628
    +
    629/* === */
    +
    630
    +
    631MERROR_RETVAL retrotile_json_close_list( void* parg ) {
    +
    632 struct RETROTILE_PARSER* parser = (struct RETROTILE_PARSER*)parg;
    +
    633
    +
    634 if( MTILESTATE_LAYER_DATA == parser->mstate ) {
    +
    635 assert( RETROTILE_PARSER_MODE_MAP == parser->mode );
    +
    636 assert( parser->layer_tile_iter == 1600 );
    +
    637 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
    +
    638
    +
    639 } else if( MTILESTATE_LAYERS == parser->mstate ) {
    +
    640 assert( RETROTILE_PARSER_MODE_MAP == parser->mode );
    +
    641 retrotile_parser_mstate( parser, MTILESTATE_NONE );
    +
    642
    +
    643 } else if( MTILESTATE_TILESETS == parser->mstate ) {
    +
    644 assert( RETROTILE_PARSER_MODE_MAP == parser->mode );
    +
    645 retrotile_parser_mstate( parser, MTILESTATE_NONE );
    +
    646
    +
    647 } else if( MTILESTATE_TILES_PROP == parser->mstate ) {
    +
    648 assert( RETROTILE_PARSER_MODE_DEFS == parser->mode );
    +
    649 retrotile_parser_mstate( parser, MTILESTATE_TILES );
    +
    650 }
    +
    651
    +
    652 return MERROR_OK;
    +
    653}
    +
    654
    +
    655/* === */
    +
    656
    +
    657MERROR_RETVAL retrotile_json_open_obj( void* parg ) {
    +
    658 struct RETROTILE_PARSER* parser = (struct RETROTILE_PARSER*)parg;
    +
    659
    +
    660 if( MTILESTATE_LAYERS == parser->mstate ) {
    +
    661 assert( RETROTILE_PARSER_MODE_MAP == parser->mode );
    +
    662 /* Reset on open so count is retained for allocating after first
    +
    663 * pass. */
    +
    664 parser->layer_tile_iter = 0;
    +
    665 retrotile_parser_mstate( parser, MTILESTATE_LAYER );
    +
    666 }
    +
    667
    +
    668 return MERROR_OK;
    +
    669}
    +
    670
    +
    671/* === */
    +
    672
    +
    673MERROR_RETVAL retrotile_json_close_obj( void* parg ) {
    +
    674 struct RETROTILE_PARSER* parser = (struct RETROTILE_PARSER*)parg;
    +
    675
    +
    676 if( MTILESTATE_LAYER == parser->mstate ) {
    +
    677 assert( RETROTILE_PARSER_MODE_MAP == parser->mode );
    +
    678 assert( parser->layer_tile_iter == 1600 );
    +
    679 debug_printf( RETROTILE_TRACE_LVL,
    +
    680 "incrementing pass layer to " SIZE_T_FMT " after " SIZE_T_FMT
    +
    681 " tiles...",
    +
    682 parser->pass_layer_iter + 1, parser->layer_tile_iter );
    +
    683 parser->pass_layer_iter++;
    +
    684 retrotile_parser_mstate( parser, MTILESTATE_LAYERS );
    +
    685
    +
    686 } else if( MTILESTATE_GRID == parser->mstate ) {
    +
    687 retrotile_parser_mstate( parser, MTILESTATE_NONE );
    +
    688 }
    +
    689
    +
    690 return MERROR_OK;
    +
    691}
    +
    692
    +
    693/* === */
    +
    694
    +
    695MERROR_RETVAL retrotile_parse_json_file(
    +
    696 const char* filename, MAUG_MHANDLE* p_tilemap_h,
    +
    697 MAUG_MHANDLE* p_tile_defs_h, size_t* p_tile_defs_count
    +
    698) {
    +
    699 MERROR_RETVAL retval = MERROR_OK;
    +
    700 MAUG_MHANDLE parser_h = (MAUG_MHANDLE)NULL;
    +
    701 struct RETROTILE_PARSER* parser = NULL;
    +
    702 char filename_path[RETROFLAT_PATH_MAX];
    +
    703 mfile_t buffer;
    +
    704 char c;
    +
    705
    +
    706 /* Initialize parser. */
    +
    707 parser_h = maug_malloc( 1, sizeof( struct RETROTILE_PARSER ) );
    +
    708 maug_cleanup_if_null_alloc( MAUG_MHANDLE, parser_h );
    +
    709
    +
    710 maug_mlock( parser_h, parser );
    +
    711 maug_cleanup_if_null_alloc( struct RETROTILE_PARSER*, parser );
    +
    712 maug_mzero( parser, sizeof( struct RETROTILE_PARSER ) );
    +
    713
    +
    714 parser->tj_parse_cb = retrotile_parse_json_file;
    +
    715
    +
    716 /* Setup filename path. */
    +
    717 memset( filename_path, '\0', RETROFLAT_PATH_MAX );
    +
    718 /* TODO: Configurable path. */
    +
    719 maug_snprintf(
    +
    720 filename_path, RETROFLAT_PATH_MAX, "mapsrc/%s", filename );
    +
    721
    +
    722 debug_printf( RETROTILE_TRACE_LVL, "opening %s...", filename_path );
    +
    723
    +
    724 /* TODO: fread chars one by one from disk using retrofil_cread. */
    +
    725 retval = mfile_open_read( filename_path, &buffer );
    +
    726 maug_cleanup_if_not_ok();
    +
    727
    +
    728 assert( NULL != p_tile_defs_count );
    +
    729
    +
    730 /* Parse JSON and react to state. */
    +
    731 for( parser->pass = 0 ; 2 > parser->pass ; parser->pass++ ) {
    +
    732 debug_printf( RETROTILE_TRACE_LVL, "beginning pass #%u...",
    +
    733 parser->pass );
    +
    734
    +
    735 /* Reset tilemap parser. */
    +
    736 parser->mstate = 0;
    +
    737
    +
    738 /* Reset JSON parser. */
    +
    739 maug_mzero( &(parser->jparser), sizeof( struct MJSON_PARSER ) );
    +
    740
    +
    741 /* Figure out if we're parsing a .tmj or .tsj. */
    +
    742 if( 's' == strrchr( filename, '.' )[2] ) {
    +
    743 debug_printf( RETROTILE_TRACE_LVL, "(tile_defs mode)" );
    +
    744 parser->mode = RETROTILE_PARSER_MODE_DEFS;
    +
    745 parser->jparser.token_parser = retrotile_parser_parse_tiledef_token;
    +
    746 parser->jparser.token_parser_arg = parser;
    +
    747 parser->jparser.close_list = retrotile_json_close_list;
    +
    748 parser->jparser.close_list_arg = parser;
    +
    749 parser->jparser.close_obj = retrotile_json_close_obj;
    +
    750 parser->jparser.close_obj_arg = parser;
    +
    751 /*
    +
    752 parser->jparser.close_val = retrotile_json_close_val;
    +
    753 parser->jparser.close_val_arg = parser;
    +
    754 */
    +
    755 parser->p_tile_defs_h = p_tile_defs_h;
    +
    756 parser->p_tile_defs_count = p_tile_defs_count;
    +
    757
    +
    758 assert( NULL != p_tile_defs_h );
    +
    759 if( 1 == parser->pass ) {
    +
    760 /* Allocate tile defs based on highest tile ID found on
    +
    761 * first pass.
    +
    762 */
    +
    763 retval = retrotile_alloc_tile_defs(
    +
    764 p_tile_defs_h, p_tile_defs_count,
    +
    765 parser->tileset_id_cur + 1 );
    +
    766 maug_cleanup_if_not_ok();
    +
    767 }
    +
    768 } else {
    +
    769 debug_printf( RETROTILE_TRACE_LVL, "(tilemap mode)" );
    +
    770 parser->mode = RETROTILE_PARSER_MODE_MAP;
    +
    771
    +
    772 parser->jparser.close_list = retrotile_json_close_list;
    +
    773 parser->jparser.close_list_arg = parser;
    +
    774 parser->jparser.open_obj = retrotile_json_open_obj;
    +
    775 parser->jparser.open_obj_arg = parser;
    +
    776 parser->jparser.close_obj = retrotile_json_close_obj;
    +
    777 parser->jparser.close_obj_arg = parser;
    +
    778 parser->jparser.token_parser = retrotile_parser_parse_token;
    +
    779 parser->jparser.token_parser_arg = parser;
    +
    780 parser->p_tile_defs_h = p_tile_defs_h;
    +
    781 parser->p_tile_defs_count = p_tile_defs_count;
    +
    782
    +
    783 assert( NULL != p_tilemap_h );
    +
    784 if( 1 == parser->pass ) {
    +
    785 /* Allocate tiles for the new layers. */
    +
    786 retval = retrotile_alloc(
    +
    787 p_tilemap_h, parser->tiles_w, parser->tiles_h,
    +
    788 parser->pass_layer_iter );
    +
    789 maug_cleanup_if_not_ok();
    +
    790
    +
    791 maug_mlock( *p_tilemap_h, parser->t );
    +
    792 }
    +
    793 parser->pass_layer_iter = 0;
    +
    794 }
    +
    795
    +
    796 while( mfile_has_bytes( &buffer ) ) {
    +
    797 mfile_cread( &buffer, &c );
    +
    798 retval = mjson_parse_c( &(parser->jparser), c );
    +
    799 if( MERROR_OK != retval ) {
    +
    800 error_printf( "error parsing JSON!" );
    +
    801 goto cleanup;
    +
    802 }
    +
    803 }
    +
    804
    +
    805 mfile_reset( &buffer );
    +
    806
    +
    807 if( 's' != strrchr( filename, '.' )[2] ) {
    +
    808 debug_printf( RETROTILE_TRACE_LVL,
    +
    809 "pass %u found " SIZE_T_FMT " layers",
    +
    810 parser->pass, parser->pass_layer_iter );
    +
    811 }
    +
    812 }
    +
    813
    +
    814 debug_printf(
    +
    815 RETROTILE_TRACE_LVL, "finished parsing %s...", filename_path );
    +
    816
    +
    817cleanup:
    +
    818
    +
    819 if( NULL != parser ) {
    +
    820 if( NULL != parser->t ) {
    +
    821 maug_munlock( *p_tilemap_h, parser->t );
    +
    822 }
    +
    823 maug_munlock( parser_h, parser );
    +
    824 }
    +
    825
    +
    826 if( NULL != parser_h ) {
    +
    827 maug_mfree( parser_h );
    +
    828 }
    +
    829
    +
    830 return retval;
    +
    831}
    +
    832
    +
    833/* === */
    +
    834
    +
    835static retrotile_tile_t retrotile_gen_diamond_square_rand(
    +
    836 retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning,
    +
    837 retrotile_tile_t top_left_z
    +
    838) {
    +
    839 retrotile_tile_t avg = top_left_z;
    +
    840
    +
    841 if( 8 > rand() % 10 ) {
    +
    842 /* avg = min_z + (rand() % (max_z - min_z)); */
    +
    843 avg -= (min_z / tuning) + (rand() % (max_z / tuning));
    +
    844 /* } else {
    +
    845 avg += (min_z / 10) + (rand() % (max_z / 10)); */
    +
    846 }
    +
    847
    +
    848 /* Clamp the result. */
    +
    849
    +
    850 if( min_z > avg ) {
    +
    851 avg = min_z;
    +
    852 }
    +
    853
    +
    854 if( max_z < avg ) {
    +
    855 avg = max_z;
    +
    856 }
    +
    857
    +
    858 return avg;
    +
    859}
    +
    860
    +
    861/* === */
    +
    862
    +
    863static void retrotile_gen_diamond_square_corners(
    +
    864 int16_t corners_x[2][2], int16_t corners_y[2][2],
    +
    865 retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    866 uint32_t tuning, struct RETROTILE_DATA_DS* data_ds,
    +
    867 struct RETROTILE_LAYER* layer, struct RETROTILE* t
    +
    868) {
    +
    869 int16_t iter_x = 0,
    +
    870 iter_y = 0;
    +
    871 retrotile_tile_t* tile_iter = NULL;
    +
    872 retrotile_tile_t top_left_z = 0;
    +
    873
    +
    874 /* Generate missing corner data. Loop through X/Y coords stored in
    +
    875 * corners_x/corners_y convenience arrays.
    +
    876 */
    +
    877 for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
    +
    878 for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
    +
    879
    +
    880 /* Make sure corner X is in bounds. */
    +
    881 corners_x[iter_x][iter_y] =
    +
    882 (data_ds->sect_x - 1) + (iter_x * data_ds->sect_w);
    +
    883 if( 0 > corners_x[iter_x][iter_y] ) {
    +
    884 corners_x[iter_x][iter_y] += 1;
    +
    885 }
    +
    886
    +
    887 /* Make sure corner Y is in bounds. */
    +
    888 corners_y[iter_x][iter_y] =
    +
    889 (data_ds->sect_y - 1) + (iter_y * data_ds->sect_h);
    +
    890 if( 0 > corners_y[iter_x][iter_y] ) {
    +
    891 corners_y[iter_x][iter_y] += 1;
    +
    892 }
    +
    893 }
    +
    894 }
    +
    895
    +
    896 /* Should be handled by the check above. */
    +
    897 assert( 0 <= corners_x[0][0] );
    +
    898 assert( 0 <= corners_y[0][0] );
    +
    899 assert( t->tiles_w > corners_x[0][0] );
    +
    900 assert( t->tiles_h > corners_y[0][0] );
    +
    901
    +
    902 /* Grab the top-left Z-value to anchor generated corners to. */
    +
    903 top_left_z = retrotile_get_tile(
    +
    904 t, layer,
    +
    905 corners_x[0][0],
    +
    906 corners_y[0][0] );
    +
    907
    +
    908 if( 0 > top_left_z ) {
    +
    909 retrotile_get_tile(
    +
    910 t, layer,
    +
    911 corners_x[0][0] >= 0 ? corners_x[0][0] : 0,
    +
    912 corners_y[0][0] >= 0 ? corners_y[0][0] : 0 ) = max_z;
    +
    913 top_left_z = max_z;
    +
    914 }
    +
    915
    +
    916 /* Fill in missing corners. */
    +
    917 for( iter_y = 0 ; iter_y < 2 ; iter_y++ ) {
    +
    918 for( iter_x = 0 ; iter_x < 2 ; iter_x++ ) {
    +
    919 /* Grab a pointer to the corner so we can modify it easily. */
    +
    920 tile_iter = &(retrotile_get_tile(
    +
    921 t, layer,
    +
    922 corners_x[iter_x][iter_y],
    +
    923 corners_y[iter_x][iter_y] ));
    +
    924
    +
    925 /* Check if corner is already filled in. */
    +
    926 if( -1 != *tile_iter ) {
    +
    927 debug_printf(
    +
    928 RETROTILE_TRACE_LVL, "corner coord %d x %d present: %d",
    +
    929 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
    +
    930 retrotile_get_tile(
    +
    931 t, layer,
    +
    932 corners_x[iter_x][iter_y],
    +
    933 corners_y[iter_x][iter_y] ) );
    +
    934 continue;
    +
    935 }
    +
    936
    +
    937 /* Generate a new value for this corner. */
    +
    938 *tile_iter = retrotile_gen_diamond_square_rand(
    +
    939 min_z, max_z, tuning, top_left_z );
    +
    940
    +
    941 debug_printf( RETROTILE_TRACE_LVL,
    +
    942 "missing corner coord %d x %d: %d",
    +
    943 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
    +
    944 *tile_iter );
    +
    945 }
    +
    946 }
    +
    947}
    +
    948
    +
    949/* === */
    +
    950
    +
    951static retrotile_tile_t retrotile_gen_diamond_square_avg(
    +
    952 int16_t corners_x[2][2], int16_t corners_y[2][2],
    +
    953 struct RETROTILE* t, struct RETROTILE_LAYER* layer
    +
    954) {
    +
    955 retrotile_tile_t* tile_iter = NULL;
    +
    956 int16_t iter_x = 0,
    +
    957 iter_y = 0;
    +
    958 retrotile_tile_t avg = 0;
    +
    959
    +
    960 /* Average corner data. */
    +
    961 for( iter_y = 0 ; 2 > iter_y ; iter_y++ ) {
    +
    962 for( iter_x = 0 ; 2 > iter_x ; iter_x++ ) {
    +
    963 tile_iter = &(retrotile_get_tile(
    +
    964 t, layer,
    +
    965 corners_x[iter_x][iter_y],
    +
    966 corners_y[iter_x][iter_y] ));
    +
    967 assert( -1 != *tile_iter );
    +
    968 /*
    +
    969 debug_printf(
    +
    970 RETROTILE_TRACE_LVL, "%d: adding from coords %d x %d: %d",
    +
    971 iter_depth,
    +
    972 corners_x[iter_x][iter_y], corners_y[iter_x][iter_y],
    +
    973 *tile_iter ); */
    +
    974 avg += *tile_iter;
    +
    975 }
    +
    976 }
    +
    977
    +
    978 /* TODO: Use right shift? */
    +
    979 avg /= 4;
    +
    980
    +
    981 return avg;
    +
    982}
    +
    983
    +
    984/* === */
    +
    985
    + +
    987 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    988 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    989 retrotile_ani_cb animation_cb, void* animation_cb_data
    +
    990) {
    +
    991 int16_t iter_x = 0,
    +
    992 iter_y = 0,
    +
    993 iter_depth = 0;
    +
    994 int16_t corners_x[2][2];
    +
    995 int16_t corners_y[2][2];
    +
    996 int32_t avg = 0;
    +
    997 /* size_t tile_idx = 0; */
    +
    998 struct RETROTILE_DATA_DS data_ds_sub;
    +
    999 MAUG_MHANDLE data_ds_h = NULL;
    +
    1000 struct RETROTILE_DATA_DS* data_ds = NULL;
    +
    1001 /* retrotile_tile_t* tiles = NULL; */
    +
    1002 MERROR_RETVAL retval = MERROR_OK;
    +
    1003 struct RETROTILE_LAYER* layer = NULL;
    +
    1004 retrotile_tile_t* tile_iter = NULL;
    +
    1005 uint8_t free_ds_data = 0;
    +
    1006
    +
    1007 /*
    +
    1008 maug_mlock( t->tiles, tiles );
    +
    1009 maug_cleanup_if_null_alloc( struct GRIDCITY_TILE*, tiles );
    +
    1010 */
    +
    1011
    +
    1012 layer = retrotile_get_layer_p( t, layer_idx );
    +
    1013
    +
    1014 if( NULL == data ) {
    +
    1015 data_ds_h = maug_malloc( 1, sizeof( struct RETROTILE_DATA_DS ) );
    +
    1016 maug_cleanup_if_null_alloc( MAUG_MHANDLE, data_ds_h );
    +
    1017 free_ds_data = 1;
    +
    1018 maug_mlock( data_ds_h, data_ds );
    +
    1019 maug_cleanup_if_null_alloc( struct RETROTILE_DATA_DS*, data_ds );
    +
    1020 maug_mzero( data_ds, sizeof( struct RETROTILE_DATA_DS ) );
    +
    1021
    +
    1022 memset( retrotile_get_tiles_p( layer ), -1,
    +
    1023 t->tiles_w * t->tiles_h * sizeof( retrotile_tile_t ) );
    +
    1024
    +
    1025 data_ds->sect_w = t->tiles_w;
    +
    1026 data_ds->sect_h = t->tiles_h;
    +
    1027 data_ds->sect_w_half = data_ds->sect_w >> 1;
    +
    1028 data_ds->sect_h_half = data_ds->sect_h >> 1;
    +
    1029 } else {
    +
    1030 data_ds = (struct RETROTILE_DATA_DS*)data;
    +
    1031 }
    +
    1032 assert( NULL != data_ds );
    +
    1033
    +
    1034 /* Trivial case; end recursion. */
    +
    1035 if( 0 == data_ds->sect_w ) {
    +
    1036 debug_printf(
    +
    1037 RETROTILE_TRACE_LVL, "%d return: null sector", iter_depth );
    +
    1038 goto cleanup;
    +
    1039 }
    +
    1040
    +
    1041 if(
    +
    1042 data_ds->sect_x + data_ds->sect_w > t->tiles_w ||
    +
    1043 data_ds->sect_y + data_ds->sect_h > t->tiles_h
    +
    1044 ) {
    +
    1045 debug_printf(
    +
    1046 RETROTILE_TRACE_LVL, "%d return: overflow sector", iter_depth );
    +
    1047 goto cleanup;
    +
    1048 }
    +
    1049
    +
    1050 iter_depth = t->tiles_w / data_ds->sect_w;
    +
    1051
    +
    1052 /* Generate/grab corners before averaging them! */
    +
    1053 retrotile_gen_diamond_square_corners(
    +
    1054 corners_x, corners_y, min_z, max_z, tuning, data_ds, layer, t );
    +
    1055
    +
    1056 if( 2 == data_ds->sect_w || 2 == data_ds->sect_h ) {
    +
    1057 /* Nothing to average, this sector is just corners! */
    +
    1058 debug_printf(
    + +
    1060 "%d return: reached innermost point", iter_depth );
    +
    1061 goto cleanup; /* Skip further descent regardless. */
    +
    1062 }
    +
    1063
    +
    1064 avg =
    +
    1065 retrotile_gen_diamond_square_avg( corners_x, corners_y, t, layer );
    +
    1066
    +
    1067 tile_iter = &(retrotile_get_tile(
    +
    1068 t, layer,
    +
    1069 data_ds->sect_x + data_ds->sect_w_half,
    +
    1070 data_ds->sect_y + data_ds->sect_h_half ));
    +
    1071 if( -1 != *tile_iter ) {
    +
    1072 debug_printf( RETROTILE_TRACE_LVL, "avg already present at %d x %d!",
    +
    1073 data_ds->sect_x + data_ds->sect_w_half,
    +
    1074 data_ds->sect_y + data_ds->sect_h_half );
    +
    1075 goto cleanup;
    +
    1076 }
    +
    1077 *tile_iter = avg;
    +
    1078
    +
    1079 /* assert( 0 <= tiles[tile_idx].terrain );
    +
    1080
    +
    1081 maug_munlock( city->tiles, tiles );
    +
    1082 tiles = NULL; */
    +
    1083
    +
    1084 /* Recurse into subsectors. */
    +
    1085 for(
    +
    1086 iter_y = data_ds->sect_y ;
    +
    1087 iter_y < (data_ds->sect_y + data_ds->sect_h) ;
    +
    1088 iter_y++
    +
    1089 ) {
    +
    1090 for(
    +
    1091 iter_x = data_ds->sect_x ;
    +
    1092 iter_x < (data_ds->sect_x + data_ds->sect_w) ;
    +
    1093 iter_x++
    +
    1094 ) {
    +
    1095 data_ds_sub.sect_x = data_ds->sect_x + iter_x;
    +
    1096
    +
    1097 data_ds_sub.sect_y = data_ds->sect_y + iter_y;
    +
    1098
    +
    1099 data_ds_sub.sect_w = data_ds->sect_w_half;
    +
    1100 data_ds_sub.sect_h = data_ds->sect_h_half;
    +
    1101 data_ds_sub.sect_w_half = data_ds_sub.sect_w >> 1;
    +
    1102 data_ds_sub.sect_h_half = data_ds_sub.sect_h >> 1;
    +
    1103
    +
    1104 debug_printf(
    +
    1105 RETROTILE_TRACE_LVL, "%d: child sector at %d x %d, %d wide",
    +
    1106 iter_depth,
    +
    1107 data_ds_sub.sect_x, data_ds_sub.sect_y, data_ds_sub.sect_w );
    +
    1108
    + +
    1110 t, min_z, max_z, tuning, layer_idx, flags, &data_ds_sub,
    +
    1111 animation_cb, animation_cb_data );
    +
    1112 maug_cleanup_if_not_ok();
    +
    1113 }
    +
    1114 }
    +
    1115
    +
    1116 if(
    +
    1117 data_ds->sect_w == t->tiles_w >> 1 &&
    +
    1118 NULL != animation_cb
    +
    1119 ) {
    +
    1120 retval = animation_cb( animation_cb_data, iter_y );
    +
    1121 maug_cleanup_if_not_ok();
    +
    1122 }
    +
    1123
    +
    1124 debug_printf(
    +
    1125 RETROTILE_TRACE_LVL, "%d return: all sectors complete", iter_depth );
    +
    1126
    +
    1127cleanup:
    +
    1128
    +
    1129 if( free_ds_data && NULL != data_ds ) {
    +
    1130 maug_munlock( data_ds_h, data_ds );
    +
    1131 }
    +
    1132
    +
    1133 if( free_ds_data && NULL != data_ds_h ) {
    +
    1134 maug_mfree( data_ds_h );
    +
    1135 }
    +
    1136
    +
    1137 return retval;
    +
    1138}
    +
    1139
    +
    1140/* === */
    +
    1141
    + +
    1143 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    1144 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    1145 retrotile_ani_cb animation_cb, void* animation_cb_data
    +
    1146) {
    +
    1147 int16_t x = 0,
    +
    1148 y = 0,
    +
    1149 offset_x = 0,
    +
    1150 offset_y = 0,
    +
    1151 finished = 0;
    +
    1152 MERROR_RETVAL retval = MERROR_OK;
    +
    1153 struct RETROTILE_LAYER* layer = NULL;
    +
    1154 int16_t spb = RETROTILE_VORONOI_DEFAULT_SPB;
    +
    1155 int16_t drift = RETROTILE_VORONOI_DEFAULT_DRIFT;
    +
    1156 MAUG_MHANDLE temp_grid_h = (MAUG_MHANDLE)NULL;
    +
    1157 retrotile_tile_t* temp_grid = NULL;
    +
    1158 retrotile_tile_t* tiles = NULL;
    +
    1159 /* Only use 4 cardinal directions. */
    +
    1160 int8_t side_iter = 0;
    +
    1161
    +
    1162 layer = retrotile_get_layer_p( t, 0 );
    +
    1163
    +
    1164 tiles = retrotile_get_tiles_p( layer );
    +
    1165
    +
    1166 /* Initialize grid to empty. */
    +
    1167 memset( tiles, -1,
    +
    1168 t->tiles_w * t->tiles_h * sizeof( retrotile_tile_t ) );
    +
    1169
    +
    1170 /* Generate the initial sector starting points. */
    +
    1171 for( y = 0 ; t->tiles_w > y ; y += spb ) {
    +
    1172 for( x = 0 ; t->tiles_w > x ; x += spb ) {
    +
    1173 offset_x = x + ((drift * -1) + (rand() % drift));
    +
    1174 offset_y = y + ((drift * -1) + (rand() % drift));
    +
    1175
    +
    1176 /* Clamp sector offsets onto map borders. */
    +
    1177 if( 0 > offset_x ) {
    +
    1178 offset_x = 0;
    +
    1179 }
    +
    1180 if( offset_x >= t->tiles_w ) {
    +
    1181 offset_x = t->tiles_w - 1;
    +
    1182 }
    +
    1183 if( 0 > offset_y ) {
    +
    1184 offset_y = 0;
    +
    1185 }
    +
    1186 if( offset_y >= t->tiles_h ) {
    +
    1187 offset_y = t->tiles_h - 1;
    +
    1188 }
    +
    1189
    +
    1190 retrotile_get_tile( t, layer, offset_x, offset_y ) =
    +
    1191 min_z + (rand() % max_z);
    +
    1192 }
    +
    1193 }
    +
    1194
    +
    1195 temp_grid_h = maug_malloc(
    +
    1196 sizeof( retrotile_tile_t ), t->tiles_w * t->tiles_h );
    +
    1197 maug_cleanup_if_null_alloc( MAUG_MHANDLE, temp_grid_h );
    +
    1198
    +
    1199 maug_mlock( temp_grid_h, temp_grid );
    +
    1200 maug_cleanup_if_null_alloc( retrotile_tile_t*, temp_grid );
    +
    1201
    +
    1202 /* Grow the sector starting points. */
    +
    1203 while( !finished ) {
    +
    1204 if( NULL != animation_cb ) {
    +
    1205 retval = animation_cb( animation_cb_data, -1 );
    +
    1206 maug_cleanup_if_not_ok();
    +
    1207 }
    +
    1208
    +
    1209 /* Prepare sampling grid so we're working from unexpanded sections
    +
    1210 * below.
    +
    1211 */
    +
    1212 memcpy(
    +
    1213 temp_grid, tiles,
    +
    1214 sizeof( retrotile_tile_t ) * t->tiles_w * t->tiles_h );
    +
    1215
    +
    1216 /* Starting another pass, assume finished until proven otherwise. */
    +
    1217 finished = 1;
    +
    1218 for( y = 0 ; t->tiles_h > y ; y++ ) {
    +
    1219 for( x = 0 ; t->tiles_w > x ; x++ ) {
    +
    1220 if( -1 == retrotile_get_tile( t, layer, x, y ) ) {
    +
    1221 /* If there are still unfilled tiles, we're not finished
    +
    1222 * yet!
    +
    1223 */
    +
    1224 finished = 0;
    +
    1225
    +
    1226 /* Skip filled tile. */
    +
    1227 continue;
    +
    1228 }
    +
    1229
    +
    1230
    +
    1231 for( side_iter = 0 ; 4 > side_iter ; side_iter++ ) {
    +
    1232 debug_printf( RETROTILE_TRACE_LVL,
    +
    1233 "%d (%d), %d (%d) (%d, %d)",
    +
    1234 x,
    +
    1235 gc_retrotile_offsets4_x[side_iter],
    +
    1236 y,
    +
    1237 gc_retrotile_offsets4_y[side_iter],
    +
    1238 t->tiles_w, t->tiles_h );
    +
    1239
    +
    1240 /* Iterate through directions to expand. */
    +
    1241 /* TODO: Add tuning to select directional probability. */
    +
    1242 if(
    +
    1243 0 <= x + gc_retrotile_offsets4_x[side_iter] &&
    +
    1244 0 <= y + gc_retrotile_offsets4_y[side_iter] &&
    +
    1245 t->tiles_w > x + gc_retrotile_offsets4_x[side_iter] &&
    +
    1246 t->tiles_h > y + gc_retrotile_offsets4_y[side_iter] &&
    +
    1247 -1 == temp_grid[
    +
    1248 ((y + gc_retrotile_offsets4_y[side_iter]) *
    +
    1249 t->tiles_w) +
    +
    1250 (x + gc_retrotile_offsets4_x[side_iter])]
    +
    1251 ) {
    +
    1252 /* Copy center tile to this direction. */
    +
    1253 retrotile_get_tile( t, layer,
    +
    1254 x + gc_retrotile_offsets4_x[side_iter],
    +
    1255 y + gc_retrotile_offsets4_y[side_iter] ) =
    +
    1256 retrotile_get_tile( t, layer, x, y );
    +
    1257 break;
    +
    1258 }
    +
    1259 }
    +
    1260 }
    +
    1261 }
    +
    1262 }
    +
    1263
    +
    1264cleanup:
    +
    1265
    +
    1266 if( NULL != temp_grid ) {
    +
    1267 maug_munlock( temp_grid_h, temp_grid );
    +
    1268 }
    +
    1269
    +
    1270 if( NULL != temp_grid_h ) {
    +
    1271 maug_mfree( temp_grid_h );
    +
    1272 }
    +
    1273
    +
    1274 return retval;
    +
    1275}
    +
    1276
    +
    1277/* === */
    +
    1278
    + +
    1280 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    1281 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    1282 retrotile_ani_cb animation_cb, void* animation_cb_data
    +
    1283) {
    +
    1284 MERROR_RETVAL retval = MERROR_OK;
    +
    1285 int16_t x = 0,
    +
    1286 y = 0,
    +
    1287 side_iter = 0,
    +
    1288 sides_avail = 0,
    +
    1289 sides_sum = 0;
    +
    1290 /* Sides start from 12 on the clock (up). */
    +
    1291 struct RETROTILE_LAYER* layer = NULL;
    +
    1292
    +
    1293 assert( NULL != t );
    +
    1294 layer = retrotile_get_layer_p( t, layer_idx );
    +
    1295 assert( NULL != layer );
    +
    1296
    +
    1297 for( y = 0 ; t->tiles_h > y ; y++ ) {
    +
    1298 if( NULL != animation_cb ) {
    +
    1299 retval = animation_cb( animation_cb_data, y );
    +
    1300 maug_cleanup_if_not_ok();
    +
    1301 }
    +
    1302 for( x = 0 ; t->tiles_w > x ; x++ ) {
    +
    1303 /* Reset average. */
    +
    1304 sides_avail = 0;
    +
    1305 sides_sum = 0;
    +
    1306
    +
    1307 /* Grab values for available sides. */
    +
    1308 for( side_iter = 0 ; 8 > side_iter ; side_iter++ ) {
    +
    1309 if(
    +
    1310 0 > x + gc_retrotile_offsets8_x[side_iter] ||
    +
    1311 0 > y + gc_retrotile_offsets8_y[side_iter] ||
    +
    1312 t->tiles_w <= x + gc_retrotile_offsets8_x[side_iter] ||
    +
    1313 t->tiles_h <= y + gc_retrotile_offsets8_y[side_iter]
    +
    1314 ) {
    +
    1315 continue;
    +
    1316 }
    +
    1317
    +
    1318 sides_avail++;
    +
    1319 debug_printf(
    + +
    1321 "si %d: x, y: %d (+%d), %d (+%d) idx: %d",
    +
    1322 side_iter,
    +
    1323 x + gc_retrotile_offsets8_x[side_iter],
    +
    1324 gc_retrotile_offsets8_x[side_iter],
    +
    1325 y + gc_retrotile_offsets8_y[side_iter],
    +
    1326 gc_retrotile_offsets8_y[side_iter],
    +
    1327 ((y + gc_retrotile_offsets8_y[side_iter]) * t->tiles_w) +
    +
    1328 x + gc_retrotile_offsets8_x[side_iter] );
    +
    1329 sides_sum += retrotile_get_tile(
    +
    1330 t, layer,
    +
    1331 x + gc_retrotile_offsets8_x[side_iter],
    +
    1332 y + gc_retrotile_offsets8_y[side_iter] );
    +
    1333 }
    +
    1334
    +
    1335 retrotile_get_tile( t, layer, x, y ) = sides_sum / sides_avail;
    +
    1336 }
    +
    1337 }
    +
    1338
    +
    1339cleanup:
    +
    1340
    +
    1341 return retval;
    +
    1342}
    +
    1343
    +
    1344/* === */
    +
    1345
    + +
    1347 struct RETROTILE* t, retrotile_tile_t min_z, retrotile_tile_t max_z,
    +
    1348 uint32_t tuning, size_t layer_idx, uint8_t flags, void* data,
    +
    1349 retrotile_ani_cb animation_cb, void* animation_cb_data
    +
    1350) {
    +
    1351 MERROR_RETVAL retval = MERROR_OK;
    +
    1352 struct RETROTILE_DATA_BORDER* borders =
    +
    1353 (struct RETROTILE_DATA_BORDER*)data;
    +
    1354 size_t i = 0,
    +
    1355 x = 0,
    +
    1356 y = 0,
    +
    1357 x_plus_1 = 0,
    +
    1358 y_plus_1 = 0,
    +
    1359 side = 0;
    +
    1360 int16_t ctr_iter = 0,
    +
    1361 outside_iter = 0;
    +
    1362 struct RETROTILE_LAYER* layer = NULL;
    +
    1363
    +
    1364 assert( NULL != t );
    +
    1365 layer = retrotile_get_layer_p( t, layer_idx );
    +
    1366 assert( NULL != layer );
    +
    1367
    +
    1368 /* Reset tile counter for all defined borders. */
    +
    1369 for( i = 0 ; 0 <= borders[i].center ; i++ ) {
    +
    1370 borders[i].tiles_changed = 0;
    +
    1371 }
    +
    1372
    +
    1373 debug_printf( 1, "adding borders..." );
    +
    1374
    +
    1375 for( y = 0 ; t->tiles_h > y ; y++ ) {
    +
    1376 for( x = 0 ; t->tiles_w > x ; x++ ) {
    +
    1377 i = 0;
    +
    1378 while( 0 <= borders[i].center ) {
    +
    1379 /* Compare/grab current center tile. */
    +
    1380 ctr_iter = retrotile_get_tile( t, layer, x, y );
    +
    1381 debug_printf( RETROTILE_TRACE_LVL,
    +
    1382 "x: " SIZE_T_FMT ", y: " SIZE_T_FMT ", 0x%04x vs 0x%04x",
    +
    1383 x, y, ctr_iter, borders[i].center );
    +
    1384 if( ctr_iter != borders[i].center ) {
    +
    1385 i++;
    +
    1386 continue;
    +
    1387 }
    +
    1388
    +
    1389 debug_printf( RETROTILE_TRACE_LVL, "comparing sides..." );
    +
    1390
    +
    1391 /* Zeroth pass: look for stick-outs. */
    +
    1392 for( side = 0 ; 8 > side ; side += 2 ) {
    +
    1393 if(
    +
    1394 x + gc_retrotile_offsets8_x[side] > t->tiles_w ||
    +
    1395 y + gc_retrotile_offsets8_y[side] > t->tiles_h
    +
    1396 ) {
    +
    1397 /* Skip out-of-bounds. */
    +
    1398 continue;
    +
    1399 }
    +
    1400 /* Get the outside tile on this side. */
    +
    1401 outside_iter = retrotile_get_tile( t, layer,
    +
    1402 x + gc_retrotile_offsets8_x[side],
    +
    1403 y + gc_retrotile_offsets8_y[side] );
    +
    1404
    +
    1405 /* Get the outside tile next two clock-steps from this one.
    +
    1406 */
    +
    1407 if( side + 4 < 8 ) {
    +
    1408 x_plus_1 = x + gc_retrotile_offsets8_x[side + 4];
    +
    1409 y_plus_1 = y + gc_retrotile_offsets8_y[side + 4];
    +
    1410 } else {
    +
    1411 x_plus_1 = x + gc_retrotile_offsets8_x[side - 4];
    +
    1412 y_plus_1 = y + gc_retrotile_offsets8_y[side - 4];
    +
    1413 }
    +
    1414
    +
    1415 if(
    +
    1416 x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
    +
    1417 outside_iter == borders[i].outside &&
    +
    1418 outside_iter == retrotile_get_tile( t, layer,
    +
    1419 x_plus_1, y_plus_1 )
    +
    1420 ) {
    +
    1421 /* This has the outside on two opposing sides, so just
    +
    1422 * erase it and use the outside. */
    +
    1423 retrotile_get_tile( t, layer, x, y ) =
    +
    1424 borders[i].outside;
    +
    1425 borders[i].tiles_changed++;
    +
    1426 goto tile_done;
    +
    1427 }
    +
    1428 }
    +
    1429
    +
    1430
    +
    1431 /* First pass: look for corners. */
    +
    1432 for( side = 0 ; 8 > side ; side += 2 ) {
    +
    1433 if(
    +
    1434 x + gc_retrotile_offsets8_x[side] > t->tiles_w ||
    +
    1435 y + gc_retrotile_offsets8_y[side] > t->tiles_h
    +
    1436 ) {
    +
    1437 /* Skip out-of-bounds. */
    +
    1438 continue;
    +
    1439 }
    +
    1440 /* Get the outside tile on this side. */
    +
    1441 outside_iter = retrotile_get_tile( t, layer,
    +
    1442 x + gc_retrotile_offsets8_x[side],
    +
    1443 y + gc_retrotile_offsets8_y[side] );
    +
    1444
    +
    1445 /* Get the outside tile next two clock-steps from this one.
    +
    1446 */
    +
    1447 if( side + 2 < 8 ) {
    +
    1448 x_plus_1 = x + gc_retrotile_offsets8_x[side + 2];
    +
    1449 y_plus_1 = y + gc_retrotile_offsets8_y[side + 2];
    +
    1450 } else {
    +
    1451 x_plus_1 = x + gc_retrotile_offsets8_x[0];
    +
    1452 y_plus_1 = y + gc_retrotile_offsets8_y[0];
    +
    1453 }
    +
    1454
    +
    1455 if(
    +
    1456 x_plus_1 < t->tiles_w && y_plus_1 < t->tiles_h &&
    +
    1457 outside_iter == borders[i].outside &&
    +
    1458 outside_iter == retrotile_get_tile( t, layer,
    +
    1459 x_plus_1, y_plus_1 )
    +
    1460 ) {
    +
    1461 /* This has the outside on two sides, so use a corner. */
    +
    1462 retrotile_get_tile( t, layer, x, y ) =
    +
    1463 borders[i].mod_to[side + 1 < 8 ? side + 1 : 0];
    +
    1464 borders[i].tiles_changed++;
    +
    1465 goto tile_done;
    +
    1466 }
    +
    1467 }
    +
    1468
    +
    1469 /* Second pass (if first pass fails): look for edges. */
    +
    1470 for( side = 0 ; 8 > side ; side += 2 ) {
    +
    1471 if(
    +
    1472 x + gc_retrotile_offsets8_x[side] > t->tiles_w ||
    +
    1473 y + gc_retrotile_offsets8_y[side] > t->tiles_h
    +
    1474 ) {
    +
    1475 /* Skip out-of-bounds. */
    +
    1476 continue;
    +
    1477 }
    +
    1478 /* Get the outside tile on this side. */
    +
    1479 outside_iter = retrotile_get_tile( t, layer,
    +
    1480 x + gc_retrotile_offsets8_x[side],
    +
    1481 y + gc_retrotile_offsets8_y[side] );
    +
    1482
    +
    1483 if( outside_iter == borders[i].outside ) {
    +
    1484 /* It only matches on this side. */
    +
    1485 debug_printf( RETROTILE_TRACE_LVL, "replacing..." );
    +
    1486 retrotile_get_tile( t, layer, x, y ) =
    +
    1487 borders[i].mod_to[side];
    +
    1488 borders[i].tiles_changed++;
    +
    1489 goto tile_done;
    +
    1490 }
    +
    1491 }
    +
    1492
    +
    1493tile_done:
    +
    1494 /* Tile replaced or not replaceable. */
    +
    1495 break;
    +
    1496 }
    +
    1497 }
    +
    1498 }
    +
    1499
    +
    1500 return retval;
    +
    1501}
    +
    1502
    +
    1503/* === */
    +
    1504
    +
    1505struct RETROTILE_LAYER* retrotile_get_layer_p(
    +
    1506 struct RETROTILE* tilemap, uint32_t layer_idx
    +
    1507) {
    +
    1508 struct RETROTILE_LAYER* layer_iter = NULL;
    +
    1509 uint8_t* tilemap_buf = (uint8_t*)tilemap;
    +
    1510
    +
    1511 if( 0 == tilemap->layers_count || layer_idx >= tilemap->layers_count ) {
    +
    1512 error_printf( "invalid layer " UPRINTF_U32_FMT
    +
    1513 " requested (of " UPRINTF_U32_FMT ")!",
    +
    1514 layer_idx, tilemap->layers_count );
    +
    1515 return NULL;
    +
    1516 }
    +
    1517
    +
    1518 /* Advance to first grid. */
    +
    1519 tilemap_buf += sizeof( struct RETROTILE );
    +
    1520 layer_iter = (struct RETROTILE_LAYER*)tilemap_buf;
    +
    1521 while( layer_idx > 0 ) {
    +
    1522 tilemap_buf += layer_iter->sz;
    +
    1523 layer_iter = (struct RETROTILE_LAYER*)tilemap_buf;
    +
    1524 layer_idx--;
    +
    1525 }
    +
    1526
    +
    1527 return layer_iter;
    +
    1528}
    +
    1529
    +
    1530
    +
    1531/* === */
    +
    1532
    +
    1533MERROR_RETVAL retrotile_alloc_tile_defs(
    +
    1534 MAUG_MHANDLE* p_tile_defs_h, size_t* p_tile_defs_count, size_t ndefs
    +
    1535) {
    +
    1536 MERROR_RETVAL retval = MERROR_OK;
    +
    1537 struct RETROTILE_TILE_DEF* tile_defs = NULL;
    +
    1538
    +
    1539 assert( 0 == *p_tile_defs_count );
    +
    1540 assert( NULL == *p_tile_defs_h );
    +
    1541 debug_printf( 1, "allocating " SIZE_T_FMT " tile definitions ("
    +
    1542 SIZE_T_FMT " bytes)...",
    +
    1543 ndefs, ndefs * sizeof( struct RETROTILE_TILE_DEF ) );
    +
    1544 *p_tile_defs_h =
    +
    1545 maug_malloc( ndefs, sizeof( struct RETROTILE_TILE_DEF ) );
    +
    1546 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_tile_defs_h );
    +
    1547 *p_tile_defs_count = ndefs;
    +
    1548
    +
    1549 /* Zero new allocs. */
    +
    1550 maug_mlock( *p_tile_defs_h, tile_defs );
    +
    1551 maug_cleanup_if_null_alloc( struct RETROTILE_TILE_DEF*, tile_defs );
    +
    1552 maug_mzero( tile_defs, ndefs * sizeof( struct RETROTILE_TILE_DEF ) );
    +
    1553
    +
    1554cleanup:
    +
    1555
    +
    1556 if( NULL != tile_defs ) {
    +
    1557 maug_munlock( *p_tile_defs_h, tile_defs );
    +
    1558 }
    +
    1559
    +
    1560 return retval;
    +
    1561}
    +
    1562
    +
    1563/* === */
    +
    1564
    +
    1565MERROR_RETVAL retrotile_alloc(
    +
    1566 MAUG_MHANDLE* p_tilemap_h, size_t w, size_t h, size_t layers_count
    +
    1567) {
    +
    1568 struct RETROTILE_LAYER* layer_iter = NULL;
    +
    1569 MERROR_RETVAL retval = MERROR_OK;
    +
    1570 size_t tilemap_sz = 0;
    +
    1571 struct RETROTILE* tilemap = NULL;
    +
    1572 size_t i = 0;
    +
    1573
    +
    1574 tilemap_sz = sizeof( struct RETROTILE ) +
    +
    1575 (layers_count * sizeof( struct RETROTILE_LAYER )) +
    +
    1576 (layers_count * (w * h * sizeof( retrotile_tile_t ) ));
    +
    1577
    +
    1578 debug_printf( 1, "allocating new tilemap " SIZE_T_FMT "x" SIZE_T_FMT
    +
    1579 " tiles, " SIZE_T_FMT " layers (" SIZE_T_FMT " bytes)...",
    +
    1580 w, h, layers_count, tilemap_sz );
    +
    1581
    +
    1582 *p_tilemap_h = maug_malloc( 1, tilemap_sz );
    +
    1583 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_tilemap_h );
    +
    1584
    +
    1585 maug_mlock( *p_tilemap_h, tilemap );
    +
    1586 maug_cleanup_if_null_alloc( struct RETROTILE*, tilemap );
    +
    1587
    +
    1588 maug_mzero( tilemap, tilemap_sz );
    +
    1589 tilemap->sz = tilemap_sz;
    +
    1590 tilemap->layers_count = layers_count;
    +
    1591 tilemap->tiles_w = w;
    +
    1592 tilemap->tiles_h = h;
    +
    1593 tilemap->tile_scale = RETROTILE_TILE_SCALE_DEFAULT;
    +
    1594
    +
    1595 for( i = 0 ; layers_count > i ; i++ ) {
    +
    1596 layer_iter = retrotile_get_layer_p( tilemap, i );
    +
    1597 assert( NULL != layer_iter );
    +
    1598 layer_iter->sz = sizeof( struct RETROTILE_LAYER ) +
    +
    1599 (w * h * sizeof( retrotile_tile_t ));
    +
    1600 maug_cleanup_if_not_ok();
    +
    1601 }
    +
    1602
    +
    1603cleanup:
    +
    1604
    +
    1605 if( NULL != tilemap ) {
    +
    1606 maug_munlock( *p_tilemap_h, tilemap );
    +
    1607 }
    +
    1608
    +
    1609 return retval;
    +
    1610}
    +
    1611
    +
    1612#else
    +
    1613
    +
    1614extern MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets8_x[8];
    +
    1615extern MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets8_y[8];
    +
    1616extern MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets4_x[4];
    +
    1617extern MAUG_CONST int16_t SEG_MCONST gc_retrotile_offsets4_y[4];
    +
    1618
    +
    1619#endif /* RETROTIL_C */
    +
    1620
    +
    1621 /* retrotile */
    +
    1622
    +
    1623#endif /* !RETROTIL_H */
    +
    1624
    +
    int MERROR_RETVAL
    Return type indicating function returns a value from this list.
    Definition merror.h:19
    +
    #define maug_mzero(ptr, sz)
    Zero the block of memory pointed to by ptr.
    Definition mmem.h:60
    +
    MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
    Open a file and read it into memory or memory-map it.
    +
    #define RETROFLAT_PATH_MAX
    Maximum size allocated for asset paths.
    Definition retroflt.h:734
    +
    MERROR_RETVAL retrotile_gen_smooth_iter(struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
    Average the values in adjacent tiles over an already-generated tilemap.
    +
    MERROR_RETVAL retrotile_gen_borders_iter(struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
    Given a list of RETROTILE_DATA_BORDER structs, this will search for occurrences of RETROTILE_DATA_BOR...
    +
    MERROR_RETVAL retrotile_gen_diamond_square_iter(struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
    Generate tilemap terrain using diamond square algorithm.
    +
    MERROR_RETVAL retrotile_gen_voronoi_iter(struct RETROTILE *t, retrotile_tile_t min_z, retrotile_tile_t max_z, uint32_t tuning, size_t layer_idx, uint8_t flags, void *data, retrotile_ani_cb animation_cb, void *animation_cb_data)
    Generate tilemap terrain using voronoi graph.
    +
    #define RETROTILE_TILESET_IMAGE_STR_SZ_MAX
    Maximum number of chars in a RETROTILE_TILE_DEF::image_path.
    Definition retrotil.h:23
    +
    #define RETROTILE_TILE_SCALE_DEFAULT
    Default value for RETROTILE::tile_scale.
    Definition retrotil.h:28
    +
    #define RETROTILE_TRACE_LVL
    If defined, bring debug printf statements up to this level.
    Definition retrotil.h:33
    +
    #define RETROTILE_NAME_SZ_MAX
    Maximum number of chars in a RETROTILE::name.
    Definition retrotil.h:18
    + +
    Definition mfile.h:45
    +
    Definition retrotil.h:125
    +
    retrotile_tile_t mod_to[8]
    If the center and outside match, use this mod-to.
    Definition retrotil.h:130
    +
    Internal data structure used by retrotile_gen_diamond_square_iter().
    Definition retrotil.h:110
    +
    int16_t sect_y
    Starting Y of subsector in a given iteration.
    Definition retrotil.h:114
    +
    int16_t sect_w
    Width of subsector in a given iteration.
    Definition retrotil.h:116
    +
    int16_t sect_w_half
    Half of the width of subsector in a given iteration.
    Definition retrotil.h:120
    +
    int16_t sect_x
    Starting X of subsector in a given iteration.
    Definition retrotil.h:112
    +
    int16_t sect_h
    Height of subsector in a given iteration.
    Definition retrotil.h:118
    +
    int16_t sect_h_half
    Half of the height of subsector in a given iteration.
    Definition retrotil.h:122
    +
    Definition retrotil.h:91
    +
    Definition retrotil.h:152
    +
    size_t tileset_id_cur
    Highest tileset ID on first pass and next ID to be assigned on second.
    Definition retrotil.h:163
    +
    Definition retrotil.h:84
    +
    Definition retrotil.h:95
    +
    + + +
    + + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 00000000..3aad84d9 --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['api_0',['API',['../group__maug__cli.html',1,'Command Line API'],['../group__maug__error.html',1,'Error Handling API'],['../group__maug__console.html',1,'In-Situ Console API'],['../group__maug__fmt.html',1,'Maug File Format API'],['../group__maug__mem.html',1,'Memory Management API'],['../group__maug__uprintf.html',1,'Micro-PrintF API'],['../group__retrohtr.html',1,'Retro HyperText Rendering API'],['../group__maug__mfile.html',1,'RetroFile API'],['../group__maug__retroflt.html',1,'RetroFlat API'],['../group__maug__retroflt__assets.html',1,'RetroFlat Assets API'],['../group__maug__retroflt__bitmap.html',1,'RetroFlat Bitmap API'],['../group__maug__retroflt__config.html',1,'RetroFlat Config API'],['../group__maug__retroflt__drawing.html',1,'RetroFlat Drawing API'],['../group__maug__retroflt__input.html',1,'RetroFlat Input API'],['../group__maug__retroflt__msg__api.html',1,'RetroFlat Message API'],['../group__maug__retroflt__vdp.html',1,'RetroFlat VDP API'],['../group__retrofont.html',1,'RetroFont API'],['../group__maug__retroglu.html',1,'RetroGLU API'],['../group__maug__retroglu__overlay.html',1,'RetroGLU Overlay API'],['../group__maug__retrogui.html',1,'RetroGUI API'],['../group__maug__retrosnd.html',1,'RetroSound API'],['../group__retrotile.html',1,'RetroTile API']]], + ['api_20return_20values_1',['RetroFlat API Return Values',['../group__maug__retroflt__retval.html',1,'']]], + ['assets_20api_2',['RetroFlat Assets API',['../group__maug__retroflt__assets.html',1,'']]], + ['assets_5fpath_3',['assets_path',['../structRETROFLAT__ARGS.html#a16f4ac31022d90753e2e4b36bfa48dae',1,'RETROFLAT_ARGS']]] +]; diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 00000000..9c5f8ad5 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['bitmap_0',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]], + ['bitmap_20api_1',['RetroFlat Bitmap API',['../group__maug__retroflt__bitmap.html',1,'']]], + ['bpp_2',['bpp',['../structMFMT__STRUCT__BMPINFO.html#a6761f9c031d0afe92bb21ebdf33ee5cf',1,'MFMT_STRUCT_BMPINFO']]], + ['buffer_3',['buffer',['../structRETROFLAT__STATE.html#a940f28bcdcbe48c35d52d901f8787c50',1,'RETROFLAT_STATE']]], + ['buffer_20types_4',['RetroFlat Config Buffer Types',['../group__maug__retroflt__config__btypes.html',1,'']]] +]; diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 00000000..46348f1d --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['screen_5fh_0',['screen_h',['../structRETROFLAT__ARGS.html#a7407aaec24ac0b212ce12d92858ccc59',1,'RETROFLAT_ARGS::screen_h'],['../structRETROFLAT__STATE.html#a2beaeeea4fb567c8dd1f01d82d283af0',1,'RETROFLAT_STATE::screen_h']]], + ['screen_5fv_5fh_1',['screen_v_h',['../structRETROFLAT__STATE.html#a8c9e3c9de5701cfe4eea736abbd71eaa',1,'RETROFLAT_STATE']]], + ['screen_5fv_5fw_2',['screen_v_w',['../structRETROFLAT__STATE.html#ad40f0e1cf47f376559204fa31a2952de',1,'RETROFLAT_STATE']]], + ['screen_5fw_3',['screen_w',['../structRETROFLAT__STATE.html#a0bdedca1d36837ff86dcf359ef0488c7',1,'RETROFLAT_STATE']]], + ['screen_5fx_4',['screen_x',['../structRETROFLAT__ARGS.html#aef6028d6a8f6c54d75623f8f0f7dbc15',1,'RETROFLAT_ARGS']]], + ['screen_5fy_5',['screen_y',['../structRETROFLAT__ARGS.html#acba814758d8d897ecf4c692c074814c5',1,'RETROFLAT_ARGS']]], + ['sect_5fh_6',['sect_h',['../structRETROTILE__DATA__DS.html#adf49707aeb1660edf27a9c5ed2c8be82',1,'RETROTILE_DATA_DS']]], + ['sect_5fh_5fhalf_7',['sect_h_half',['../structRETROTILE__DATA__DS.html#ae0ec669d8d55925297cd8922021c2122',1,'RETROTILE_DATA_DS']]], + ['sect_5fw_8',['sect_w',['../structRETROTILE__DATA__DS.html#a26954d4c8767996340629414d0e38ec9',1,'RETROTILE_DATA_DS']]], + ['sect_5fw_5fhalf_9',['sect_w_half',['../structRETROTILE__DATA__DS.html#a454241426fe1fef7d630c9714e332a1a',1,'RETROTILE_DATA_DS']]], + ['sect_5fx_10',['sect_x',['../structRETROTILE__DATA__DS.html#a8220cdaa62874ad9570e90598764aaec',1,'RETROTILE_DATA_DS']]], + ['sect_5fy_11',['sect_y',['../structRETROTILE__DATA__DS.html#a081a6ff35940c41ac01eaa636c7aef99',1,'RETROTILE_DATA_DS']]], + ['situ_20console_20api_12',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['sprites_13',['RetroGLU Sprites',['../group__maug__retroglu__sprite.html',1,'']]], + ['state_20flags_14',['RetroSound State Flags',['../group__maug__retrosnd__flags.html',1,'']]], + ['states_15',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['sz_16',['sz',['../structRETROFLAT__BITMAP.html#a2b124a9c36380fc83e4767fe7c101427',1,'RETROFLAT_BITMAP::sz'],['../structMFMT__STRUCT.html#aae861ab44ef1fcb11785876f19305f5d',1,'MFMT_STRUCT::sz'],['../structMFMT__STRUCT__BMPINFO.html#a7ad7a22540f5a3fbc2c92e1237eab4ee',1,'MFMT_STRUCT_BMPINFO::sz']]] +]; diff --git a/search/all_11.js b/search/all_11.js new file mode 100644 index 00000000..731a6b07 --- /dev/null +++ b/search/all_11.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['tag_5fflags_0',['tag_flags',['../structMHTML__PARSER.html#ad64fdd7a0fc41bb1de730023e644989c',1,'MHTML_PARSER']]], + ['tile_20definitions_1',['RetroTile Tile Definitions',['../group__retrotile__defs.html',1,'']]], + ['tileset_5fid_5fcur_2',['tileset_id_cur',['../structRETROTILE__PARSER.html#acf37fa0cfd6f7461d6b8fb5e920ecd51',1,'RETROTILE_PARSER']]], + ['title_3',['title',['../structRETROFLAT__ARGS.html#acb6002e986f780884beb1cf4b2cb5fae',1,'RETROFLAT_ARGS']]], + ['todo_20list_4',['Todo List',['../todo.html',1,'']]], + ['type_5',['type',['../structMFILE__CADDY.html#a3c784a266fe01f394ea0442bb386640c',1,'MFILE_CADDY']]], + ['types_6',['Types',['../group__maug__mfile__types.html',1,'RetroFile Types'],['../group__maug__retroflt__config__btypes.html',1,'RetroFlat Config Buffer Types'],['../group__retrotile__defs__types.html',1,'RetroTile Custom Property Types']]] +]; diff --git a/search/all_12.js b/search/all_12.js new file mode 100644 index 00000000..bfdf0fd6 --- /dev/null +++ b/search/all_12.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uprintf_2eh_0',['uprintf.h',['../uprintf_8h.html',1,'']]] +]; diff --git a/search/all_13.js b/search/all_13.js new file mode 100644 index 00000000..1d017b86 --- /dev/null +++ b/search/all_13.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['values_0',['Values',['../group__maug__retroflt__retval.html',1,'RetroFlat API Return Values'],['../group__maug__error__retvals.html',1,'Return Values']]], + ['vdp_20api_1',['RetroFlat VDP API',['../group__maug__retroflt__vdp.html',1,'']]], + ['vdp_5fargs_2',['vdp_args',['../structRETROFLAT__STATE.html#a108b28801a42fcdb599c2ea988e49bae',1,'RETROFLAT_STATE']]], + ['vdp_5fbuffer_3',['vdp_buffer',['../structRETROFLAT__STATE.html#a51ad861621dc8943ce8ac367aa867425',1,'RETROFLAT_STATE']]], + ['vdp_5fdata_4',['vdp_data',['../structRETROFLAT__STATE.html#ab5ac6383fb2ff36b7de0fc022b5d28f6',1,'RETROFLAT_STATE']]], + ['vdp_5fexe_5',['vdp_exe',['../structRETROFLAT__STATE.html#a9e6a7cd482da7e462e6ba8cb284ef748',1,'RETROFLAT_STATE']]], + ['vdp_5fflags_6',['vdp_flags',['../structRETROFLAT__STATE.html#a1e51cc69dac620c280420a0b0cfc339d',1,'RETROFLAT_STATE']]], + ['vertex_5fidxs_7',['vertex_idxs',['../structRETROGLU__FACE.html#a54f3000f977482234642639a252bd574',1,'RETROGLU_FACE']]], + ['vres_8',['vres',['../structMFMT__STRUCT__BMPINFO.html#a22a0abb98352d7cbad79e102b1dd3d8f',1,'MFMT_STRUCT_BMPINFO']]] +]; diff --git a/search/all_14.js b/search/all_14.js new file mode 100644 index 00000000..08f3ddc9 --- /dev/null +++ b/search/all_14.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['width_0',['width',['../structMFMT__STRUCT__BMPINFO.html#ae54190d2284069f1f24bc09d74193ccf',1,'MFMT_STRUCT_BMPINFO']]] +]; diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 00000000..4a64dfc7 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,16 @@ +var searchData= +[ + ['color_5fplanes_0',['color_planes',['../structMFMT__STRUCT__BMPINFO.html#a6c38c94f2d84c3ff46699b135b128aec',1,'MFMT_STRUCT_BMPINFO']]], + ['colors_1',['RetroFlat Colors',['../group__maug__retroflt__color.html',1,'']]], + ['command_20line_20api_2',['Command Line API',['../group__maug__cli.html',1,'']]], + ['compilation_3',['RetroFlat Compilation',['../group__maug__retroflt__compiling.html',1,'']]], + ['compiler_20definitions_4',['RetroFlat Compiler Definitions',['../group__maug__retroflt__compiling.html',1,'']]], + ['compression_5',['compression',['../structMFMT__STRUCT__BMPINFO.html#a1ca3dfdb23957b9ac8f4a1292fc5f20c',1,'MFMT_STRUCT_BMPINFO']]], + ['config_20api_6',['RetroFlat Config API',['../group__maug__retroflt__config.html',1,'']]], + ['config_20buffer_20types_7',['RetroFlat Config Buffer Types',['../group__maug__retroflt__config__btypes.html',1,'']]], + ['config_20flags_8',['RetroFlat Config Flags',['../group__maug__retroflt__config__flags.html',1,'']]], + ['config_5fpath_9',['config_path',['../structRETROFLAT__ARGS.html#a1364997cebaa4deb17008e4d9a5d0627',1,'RETROFLAT_ARGS']]], + ['console_20api_10',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['controls_11',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['custom_20property_20types_12',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]] +]; diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 00000000..0918b782 --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['definitions_0',['Definitions',['../group__maug__retroflt__compiling.html',1,'RetroFlat Compiler Definitions'],['../group__maug__retroflt__keydefs.html',1,'RetroFlat Key Definitions'],['../group__retrotile__defs.html',1,'RetroTile Tile Definitions']]], + ['drawing_20api_1',['RetroFlat Drawing API',['../group__maug__retroflt__drawing.html',1,'']]] +]; diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 00000000..e02aaafa --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['error_20handling_20api_0',['Error Handling API',['../group__maug__error.html',1,'']]], + ['example_1',['RetroFlat Example',['../group__maug__retroflt__example.html',1,'']]] +]; diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 00000000..e5689100 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['faces_0',['faces',['../structRETROGLU__OBJ.html#adcfa0dba8302d4609221cd41c5ab8ae7',1,'RETROGLU_OBJ']]], + ['file_20format_20api_1',['Maug File Format API',['../group__maug__fmt.html',1,'']]], + ['file_20format_3a_20bitmap_2',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]], + ['first_5fchild_3',['first_child',['../group__retrohtr.html#ga515747176fed9ba2e12a32711733a29f',1,'RETROHTR_RENDER_NODE']]], + ['fixed_20point_4',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['flags_5',['Flags',['../group__maug__retroflt__flags.html',1,'Global Flags'],['../group__maug__retroflt__config__flags.html',1,'RetroFlat Config Flags'],['../group__maug__retrosnd__flags.html',1,'RetroSound State Flags']]], + ['flags_6',['flags',['../structRETROFLAT__BITMAP.html#a6759d6aada5884b51abccf1c9f337078',1,'RETROFLAT_BITMAP::flags'],['../structRETROSND__STATE.html#a7926bcde482c2c5934e2fc3287c8a9b6',1,'RETROSND_STATE::flags']]], + ['format_20api_7',['Maug File Format API',['../group__maug__fmt.html',1,'']]], + ['format_3a_20bitmap_8',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]] +]; diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 00000000..1e25ebf3 --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['generators_0',['RetroTile Generators',['../group__retrotile__gen.html',1,'']]], + ['global_20flags_1',['Global Flags',['../group__maug__retroflt__flags.html',1,'']]] +]; diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 00000000..382231fb --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['h_0',['h',['../structMFILE__CADDY.html#a8e65c7a4f42dd1511e32607bac59780a',1,'MFILE_CADDY']]], + ['handling_20api_1',['Error Handling API',['../group__maug__error.html',1,'']]], + ['height_2',['height',['../structMFMT__STRUCT__BMPINFO.html#ae9981609040e3a04550a3ed93d69ea52',1,'MFMT_STRUCT_BMPINFO']]], + ['hres_3',['hres',['../structMFMT__STRUCT__BMPINFO.html#aa5dfe7374a97c4035638514fefcea816',1,'MFMT_STRUCT_BMPINFO']]], + ['hypertext_20rendering_20api_4',['Retro HyperText Rendering API',['../group__retrohtr.html',1,'']]] +]; diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 00000000..c0b5c4a5 --- /dev/null +++ b/search/all_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['img_5fsz_0',['img_sz',['../structMFMT__STRUCT__BMPINFO.html#a8fb1845bef21f9072bfd95b073baae14',1,'MFMT_STRUCT_BMPINFO']]], + ['imp_5fcolors_1',['imp_colors',['../structMFMT__STRUCT__BMPINFO.html#a7fc199f60f627db81f34627980dc11a7',1,'MFMT_STRUCT_BMPINFO']]], + ['in_20situ_20console_20api_2',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['input_20api_3',['RetroFlat Input API',['../group__maug__retroflt__input.html',1,'']]] +]; diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 00000000..419e98ad --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20definitions_0',['RetroFlat Key Definitions',['../group__maug__retroflt__keydefs.html',1,'']]] +]; diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 00000000..6a051547 --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['line_20api_0',['Command Line API',['../group__maug__cli.html',1,'']]], + ['list_1',['Todo List',['../todo.html',1,'']]] +]; diff --git a/search/all_b.js b/search/all_b.js new file mode 100644 index 00000000..097322bf --- /dev/null +++ b/search/all_b.js @@ -0,0 +1,51 @@ +var searchData= +[ + ['makefiles_0',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]], + ['management_20api_1',['Memory Management API',['../group__maug__mem.html',1,'']]], + ['maug_2',['maug',['../index.html',1,'']]], + ['maug_20file_20format_20api_3',['Maug File Format API',['../group__maug__fmt.html',1,'']]], + ['maug_20file_20format_3a_20bitmap_4',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]], + ['maug_20retro_20fixed_20point_5',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['maug_5fadd_5farg_6',['maug_add_arg',['../group__maug__cli.html#gaa01f6f484f91a815d5776e1b3e88a9db',1,'marge.h']]], + ['maug_5fcli_7',['MAUG_CLI',['../group__maug__cli.html#ga4d54f8a556f4f65df9acb948114ea3f6',1,'marge.h']]], + ['maug_5fcli_5fsigil_8',['MAUG_CLI_SIGIL',['../group__maug__cli.html#gaee9fe9a3cb3f9578249273228cf09ecc',1,'marge.h']]], + ['maug_5ffmt_5fspec_9',['MAUG_FMT_SPEC',['../unionMAUG__FMT__SPEC.html',1,'']]], + ['maug_5fhctoi_10',['maug_hctoi',['../group__maug__uprintf.html#gafc7e38e222583bdc6cf929d3f65bfd58',1,'uprintf.h']]], + ['maug_5fmrealloc_11',['maug_mrealloc',['../group__maug__mem.html#gab7446d8c4aa42d963b300e6b26546fdd',1,'mmem.h']]], + ['maug_5fmzero_12',['maug_mzero',['../group__maug__mem.html#ga928273236bad2d3fbd76fefa6c0aa2aa',1,'mmem.h']]], + ['maug_5fretroflt_5fexample_5fpage_13',['maug_retroflt_example_page',['../group__maug__retroflt__example.html',1,'']]], + ['mem_5fbuffer_14',['mem_buffer',['../structMFILE__CADDY.html#adacf9907a202ae98b5cb758e3d96b40a',1,'MFILE_CADDY']]], + ['mem_5fcursor_15',['mem_cursor',['../structMFILE__CADDY.html#a0cbedeb82526eeb1aaa5b852964d786a',1,'MFILE_CADDY']]], + ['memory_20management_20api_16',['Memory Management API',['../group__maug__mem.html',1,'']]], + ['merror_2eh_17',['merror.h',['../merror_8h.html',1,'']]], + ['merror_5fretval_18',['MERROR_RETVAL',['../group__maug__error__retvals.html#ga0feaaadb840388d32d203f4d6d8f417b',1,'merror.h']]], + ['message_20api_19',['RetroFlat Message API',['../group__maug__retroflt__msg__api.html',1,'']]], + ['mfile_2eh_20',['mfile.h',['../mfile_8h.html',1,'']]], + ['mfile_5fcaddy_21',['MFILE_CADDY',['../structMFILE__CADDY.html',1,'']]], + ['mfile_5fcaddy_5ftype_5ffile_5fread_22',['MFILE_CADDY_TYPE_FILE_READ',['../group__maug__mfile__types.html#ga6b4ccd2e78fa16781deb9544294a5b28',1,'mfile.h']]], + ['mfile_5fcaddy_5ftype_5fmem_5fbuffer_23',['MFILE_CADDY_TYPE_MEM_BUFFER',['../group__maug__mfile__types.html#ga6d515b00c6c2bc474e6942e0c91529f1',1,'mfile.h']]], + ['mfile_5fclose_24',['mfile_close',['../group__maug__mfile.html#gabf28a1a9cb4595b757aa79312749318c',1,'mfile.h']]], + ['mfile_5fhandle_25',['MFILE_HANDLE',['../unionMFILE__HANDLE.html',1,'']]], + ['mfile_5flock_5fbuffer_26',['mfile_lock_buffer',['../group__maug__mfile.html#ga10e9d31a9b9278877e66e2c715dfa739',1,'mfile.h']]], + ['mfile_5fopen_5fread_27',['mfile_open_read',['../group__maug__mfile.html#gaaa053ea8ff41c0b9ecb854d70103221f',1,'mfile.h']]], + ['mfmt_2eh_28',['mfmt.h',['../mfmt_8h.html',1,'']]], + ['mfmt_5fbmp_5fcompression_5fnone_29',['MFMT_BMP_COMPRESSION_NONE',['../group__maug__fmt__bmp.html#ga1b2ef109019cade6ee5a9520acc266a8',1,'mfmt.h']]], + ['mfmt_5fbmp_5fcompression_5frle4_30',['MFMT_BMP_COMPRESSION_RLE4',['../group__maug__fmt__bmp.html#gad92aaed1cbd33e11a2ea960a303f57da',1,'mfmt.h']]], + ['mfmt_5fbmp_5fcompression_5frle8_31',['MFMT_BMP_COMPRESSION_RLE8',['../group__maug__fmt__bmp.html#gaef027c81f2d4dc0523cf0c553c021504',1,'mfmt.h']]], + ['mfmt_5fdecode_32',['mfmt_decode',['../group__maug__fmt.html#ga8e259e5d001248870de7e6ee73d92a9d',1,'mfmt.h']]], + ['mfmt_5fread_5fbmp_5fpx_33',['mfmt_read_bmp_px',['../group__maug__fmt.html#ga3aed5af79845ff84c2b5180728d6a883',1,'mfmt.h']]], + ['mfmt_5fread_5fheader_5fcb_34',['mfmt_read_header_cb',['../group__maug__fmt.html#ga47e252608ab2da1fed96a7da3b0b0be1',1,'mfmt.h']]], + ['mfmt_5fread_5fpalette_5fcb_35',['mfmt_read_palette_cb',['../group__maug__fmt.html#ga8859e21270e5205cc525ab7f2c01ae24',1,'mfmt.h']]], + ['mfmt_5fread_5fpx_5fcb_36',['mfmt_read_px_cb',['../group__maug__fmt.html#ga848cbf028f33a797345549f496ae17a9',1,'mfmt.h']]], + ['mfmt_5fstruct_37',['MFMT_STRUCT',['../structMFMT__STRUCT.html',1,'']]], + ['mfmt_5fstruct_5fbmpfile_38',['MFMT_STRUCT_BMPFILE',['../structMFMT__STRUCT__BMPFILE.html',1,'']]], + ['mfmt_5fstruct_5fbmpinfo_39',['MFMT_STRUCT_BMPINFO',['../structMFMT__STRUCT__BMPINFO.html',1,'']]], + ['mhtml_5fparser_40',['MHTML_PARSER',['../structMHTML__PARSER.html',1,'']]], + ['mhtml_5ftag_41',['MHTML_TAG',['../unionMHTML__TAG.html',1,'']]], + ['mhtml_5ftag_5fbase_42',['MHTML_TAG_BASE',['../structMHTML__TAG__BASE.html',1,'']]], + ['micro_20printf_20api_43',['Micro-PrintF API',['../group__maug__uprintf.html',1,'']]], + ['mmem_2eh_44',['mmem.h',['../mmem_8h.html',1,'']]], + ['mod_5fto_45',['mod_to',['../structRETROTILE__DATA__BORDER.html#a031684eacf32db76598f85fb4da260d4',1,'RETROTILE_DATA_BORDER']]], + ['mouse_5fx_46',['mouse_x',['../structRETROFLAT__INPUT.html#a7d220a4e990ee0d42ceb8d81660fee56',1,'RETROFLAT_INPUT']]], + ['mouse_5fy_47',['mouse_y',['../structRETROFLAT__INPUT.html#a3a213c1aaccd66fdc090dedc2bf92547',1,'RETROFLAT_INPUT']]] +]; diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 00000000..9611716a --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['nds_5foam_5factive_0',['NDS_OAM_ACTIVE',['../group__maug__retroflt__compiling.html#gab8293dce63e63b1b696862f1aa194c55',1,'retroflt.h']]], + ['nds_5fsprites_5factive_1',['NDS_SPRITES_ACTIVE',['../group__maug__retroflt__compiling.html#ga45f0101388c5e8d42c5929cb08eda7a6',1,'retroflt.h']]], + ['next_5fsibling_2',['next_sibling',['../group__retrohtr.html#ga7597e550c2f705f2f594204fc3b5c0bd',1,'RETROHTR_RENDER_NODE']]], + ['nodes_3',['nodes',['../group__retrohtr.html#gad745b58e3d84cb0e8f8b44b7f7f47e2a',1,'RETROHTR_RENDER_TREE']]], + ['nodes_5fsz_4',['nodes_sz',['../group__retrohtr.html#gacf55634c409cc9eeed8d54b9af9f4417',1,'RETROHTR_RENDER_TREE']]], + ['nodes_5fsz_5fmax_5',['nodes_sz_max',['../group__retrohtr.html#ga28ade1fce7aad8bf78a7283527f851d4',1,'RETROHTR_RENDER_TREE']]] +]; diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 00000000..231dd6cd --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['obj_20parser_0',['RetroGLU OBJ Parser',['../group__maug__retroglu__obj__fsm.html',1,'']]], + ['obj_20parser_20states_1',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['overlay_20api_2',['RetroGLU Overlay API',['../group__maug__retroglu__overlay.html',1,'']]] +]; diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 00000000..834c5d95 --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['palette_0',['palette',['../structRETROFLAT__STATE.html#aa9147fb4bf03e4d17dbb6c4157211862',1,'RETROFLAT_STATE']]], + ['palette_5fncolors_1',['palette_ncolors',['../structMFMT__STRUCT__BMPINFO.html#ae0bf439818c67521f127179b5b818162',1,'MFMT_STRUCT_BMPINFO']]], + ['parent_2',['parent',['../group__retrohtr.html#ga50f004f0ec628d082abeae770d2ef032',1,'RETROHTR_RENDER_NODE']]], + ['parser_3',['Parser',['../group__maug__retroglu__obj__fsm.html',1,'RetroGLU OBJ Parser'],['../group__retrotile__parser.html',1,'RetroTile Parser']]], + ['parser_20states_4',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['point_5',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['printf_20api_6',['Micro-PrintF API',['../group__maug__uprintf.html',1,'']]], + ['project_20makefiles_7',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]], + ['property_20types_8',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]] +]; diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 00000000..85b15b1b --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,180 @@ +var searchData= +[ + ['rendering_20api_0',['Retro HyperText Rendering API',['../group__retrohtr.html',1,'']]], + ['retro_20fixed_20point_1',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['retro_20hypertext_20rendering_20api_2',['Retro HyperText Rendering API',['../group__retrohtr.html',1,'']]], + ['retrocon_3',['RETROCON',['../structRETROCON.html',1,'']]], + ['retrocon_5finput_4',['retrocon_input',['../group__maug__console.html#ga27335c378d5e1c475a447a6cca2ae3f2',1,'retrocon.h']]], + ['retrofile_20api_5',['RetroFile API',['../group__maug__mfile.html',1,'']]], + ['retrofile_20types_6',['RetroFile Types',['../group__maug__mfile__types.html',1,'']]], + ['retroflat_20api_7',['RetroFlat API',['../group__maug__retroflt.html',1,'']]], + ['retroflat_20api_20return_20values_8',['RetroFlat API Return Values',['../group__maug__retroflt__retval.html',1,'']]], + ['retroflat_20assets_20api_9',['RetroFlat Assets API',['../group__maug__retroflt__assets.html',1,'']]], + ['retroflat_20bitmap_20api_10',['RetroFlat Bitmap API',['../group__maug__retroflt__bitmap.html',1,'']]], + ['retroflat_20colors_11',['RetroFlat Colors',['../group__maug__retroflt__color.html',1,'']]], + ['retroflat_20compilation_12',['RetroFlat Compilation',['../group__maug__retroflt__compiling.html',1,'']]], + ['retroflat_20compiler_20definitions_13',['RetroFlat Compiler Definitions',['../group__maug__retroflt__compiling.html',1,'']]], + ['retroflat_20config_20api_14',['RetroFlat Config API',['../group__maug__retroflt__config.html',1,'']]], + ['retroflat_20config_20buffer_20types_15',['RetroFlat Config Buffer Types',['../group__maug__retroflt__config__btypes.html',1,'']]], + ['retroflat_20config_20flags_16',['RetroFlat Config Flags',['../group__maug__retroflt__config__flags.html',1,'']]], + ['retroflat_20drawing_20api_17',['RetroFlat Drawing API',['../group__maug__retroflt__drawing.html',1,'']]], + ['retroflat_20example_18',['RetroFlat Example',['../group__maug__retroflt__example.html',1,'']]], + ['retroflat_20input_20api_19',['RetroFlat Input API',['../group__maug__retroflt__input.html',1,'']]], + ['retroflat_20key_20definitions_20',['RetroFlat Key Definitions',['../group__maug__retroflt__keydefs.html',1,'']]], + ['retroflat_20message_20api_21',['RetroFlat Message API',['../group__maug__retroflt__msg__api.html',1,'']]], + ['retroflat_20project_20makefiles_22',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]], + ['retroflat_20vdp_20api_23',['RetroFlat VDP API',['../group__maug__retroflt__vdp.html',1,'']]], + ['retroflat_5fargs_24',['RETROFLAT_ARGS',['../structRETROFLAT__ARGS.html',1,'']]], + ['retroflat_5fasset_5fpath_25',['retroflat_asset_path',['../group__maug__retroflt__assets.html#gab661d4bb88b3a50ac5a3f729d3c0afe0',1,'retroflt.h']]], + ['retroflat_5fassets_5fpath_5fmax_26',['RETROFLAT_ASSETS_PATH_MAX',['../group__maug__retroflt__compiling.html#ga96145c651f78202c11af0d0a46e7e0d3',1,'retroflt.h']]], + ['retroflat_5fbitmap_27',['RETROFLAT_BITMAP',['../structRETROFLAT__BITMAP.html',1,'']]], + ['retroflat_5fbitmap_5fext_28',['RETROFLAT_BITMAP_EXT',['../group__maug__retroflt__bitmap.html#ga01ab983271322476f577e166c9e2ef23',1,'retroflt.h']]], + ['retroflat_5fbitmap_5fok_29',['retroflat_bitmap_ok',['../group__maug__retroflt__bitmap.html#gac186ac5bd220b956357a037e981d2afc',1,'retroflt.h']]], + ['retroflat_5fblit_5fbitmap_30',['retroflat_blit_bitmap',['../group__maug__retroflt__bitmap.html#ga30f6d28030b3437f85a22b0bd7e04669',1,'retroflt.h']]], + ['retroflat_5fbuffer_5fbksp_31',['retroflat_buffer_bksp',['../group__maug__retroflt__input.html#ga846438a73de18eec54ef2e7f8a69f771',1,'retroflt.h']]], + ['retroflat_5fbuffer_5finsert_32',['retroflat_buffer_insert',['../group__maug__retroflt__input.html#ga5a2fcfef94c1074d7402a0862d836e08',1,'retroflt.h']]], + ['retroflat_5fcache_5fasset_33',['RETROFLAT_CACHE_ASSET',['../structRETROFLAT__CACHE__ASSET.html',1,'']]], + ['retroflat_5fcmp_5fasset_5fpath_34',['retroflat_cmp_asset_path',['../group__maug__retroflt__assets.html#ga64e8b195c12c64e3b58550951c296808',1,'retroflt.h']]], + ['retroflat_5fcolor_35',['RETROFLAT_COLOR',['../group__maug__retroflt__color.html#ga64674353770a68f722cb4d5fc90db90d',1,'retroflt.h']]], + ['retroflat_5fcolor_5ftable_36',['RETROFLAT_COLOR_TABLE',['../group__maug__retroflt__color.html#gab6f9cfee4957a67690073b10cbeaf032',1,'retroflt.h']]], + ['retroflat_5fconfig_37',['RETROFLAT_CONFIG',['../group__maug__retroflt__config.html#ga2179341f1318f7d4680a2961cc09c6e6',1,'retroflt.h']]], + ['retroflat_5fconfig_5fflag_5fbin_38',['RETROFLAT_CONFIG_FLAG_BIN',['../group__maug__retroflt__config__flags.html#ga7825e9eb9da2e5685a98ec69af315db5',1,'retroflt.h']]], + ['retroflat_5fconfig_5fflag_5fw_39',['RETROFLAT_CONFIG_FLAG_W',['../group__maug__retroflt__config__flags.html#ga221dffff15d1359c5d0e9ef42162af9e',1,'retroflt.h']]], + ['retroflat_5fconfig_5fopen_40',['retroflat_config_open',['../group__maug__retroflt__config.html#gafe8b210ba090d19b772837e479ddc1de',1,'retroflt.h']]], + ['retroflat_5fconfig_5fread_41',['retroflat_config_read',['../group__maug__retroflt__config.html#gada2b16f53ba3a18018513710526b064d',1,'retroflt.h']]], + ['retroflat_5fconfig_5fwrite_42',['retroflat_config_write',['../group__maug__retroflt__config.html#gac3a7b80f3b166d02c3d8791ca0bdec32',1,'retroflt.h']]], + ['retroflat_5fdestroy_5fbitmap_43',['retroflat_destroy_bitmap',['../group__maug__retroflt__bitmap.html#gaa52e04cfe54ba6ea1985c8dfc2dccbbe',1,'retroflt.h']]], + ['retroflat_5fdraw_5flock_44',['retroflat_draw_lock',['../group__maug__retroflt__drawing.html#ga78766b119670a0ceb6fd84ec6c4cb52d',1,'retroflt.h']]], + ['retroflat_5fellipse_45',['retroflat_ellipse',['../group__maug__retroflt__drawing.html#ga17237a3b9c734c7fe023a3813d687947',1,'retroflt.h']]], + ['retroflat_5ferror_5fbitmap_46',['RETROFLAT_ERROR_BITMAP',['../group__maug__retroflt__retval.html#gaa1bde95ee44dcf6883dc70b9e8e52088',1,'retroflt.h']]], + ['retroflat_5fflags_47',['retroflat_flags',['../structRETROFLAT__STATE.html#a3bd7778cbc80a7807ce47767d0d52289',1,'RETROFLAT_STATE']]], + ['retroflat_5fflags_5fall_5fcaps_48',['RETROFLAT_FLAGS_ALL_CAPS',['../group__maug__retroflt__drawing.html#gaff8825f09c5e2b17c10e0c15c5c0d0c1',1,'retroflt.h']]], + ['retroflat_5fflags_5ffill_49',['RETROFLAT_FLAGS_FILL',['../group__maug__retroflt__drawing.html#gad545331d61095df978213f1285ec1d64',1,'retroflt.h']]], + ['retroflat_5fflags_5fkey_5frepeat_50',['RETROFLAT_FLAGS_KEY_REPEAT',['../group__maug__retroflt__flags.html#gafc12f18f1e586526fe6608fb3e292ef8',1,'retroflt.h']]], + ['retroflat_5fflags_5fliteral_5fpath_51',['RETROFLAT_FLAGS_LITERAL_PATH',['../group__maug__retroflt__drawing.html#ga0a8d5557c6ab08140541029000e76143',1,'retroflt.h']]], + ['retroflat_5fflags_5fopaque_52',['RETROFLAT_FLAGS_OPAQUE',['../group__maug__retroflt__drawing.html#ga35e38063df298bfa2552f58b580b027f',1,'retroflt.h']]], + ['retroflat_5fflags_5foutline_53',['RETROFLAT_FLAGS_OUTLINE',['../group__maug__retroflt__drawing.html#gab2873bd65e121dedda45a6774a33906d',1,'retroflt.h']]], + ['retroflat_5fflags_5frunning_54',['RETROFLAT_FLAGS_RUNNING',['../group__maug__retroflt__flags.html#gad0ea2a78b6a6fda15cfe101005e5ff2e',1,'retroflt.h']]], + ['retroflat_5fflags_5fscale2x_55',['RETROFLAT_FLAGS_SCALE2X',['../group__maug__retroflt__flags.html#ga5bc38a5f63b02f085c6981e8dca63a61',1,'retroflt.h']]], + ['retroflat_5fflags_5fscreen_5fbuffer_56',['RETROFLAT_FLAGS_SCREEN_BUFFER',['../group__maug__retroflt__drawing.html#gadef5b619c4f3c9a99c665e74cb86f43b',1,'retroflt.h']]], + ['retroflat_5fflags_5fscreensaver_57',['RETROFLAT_FLAGS_SCREENSAVER',['../group__maug__retroflt__flags.html#ga0317bb9f6c90b276f909678caef9aeeb',1,'retroflt.h']]], + ['retroflat_5fflags_5funlock_5ffps_58',['RETROFLAT_FLAGS_UNLOCK_FPS',['../group__maug__retroflt__flags.html#ga3de3558eb684a4168f6bb313d1b05375',1,'retroflt.h']]], + ['retroflat_5ffps_59',['RETROFLAT_FPS',['../group__maug__retroflt__compiling.html#ga8b2233a41d03a2444621a8b8788c6c16',1,'retroflt.h']]], + ['retroflat_5finit_60',['retroflat_init',['../group__maug__retroflt.html#gac5511e72055cff916e5f494f8d6fd5f5',1,'retroflt.h']]], + ['retroflat_5finput_61',['RETROFLAT_INPUT',['../structRETROFLAT__INPUT.html',1,'']]], + ['retroflat_5fline_62',['retroflat_line',['../group__maug__retroflt__drawing.html#gaff3354123bc01e143245dbd949597493',1,'retroflt.h']]], + ['retroflat_5fline_5fthickness_63',['RETROFLAT_LINE_THICKNESS',['../group__maug__retroflt__drawing.html#ga109f1a69c0cd8f4ce8f5ba5cca10b80d',1,'retroflt.h']]], + ['retroflat_5fload_5fbitmap_64',['retroflat_load_bitmap',['../group__maug__retroflt__bitmap.html#gab1cb406967afc4fbd36454a1ba481b9f',1,'retroflt.h']]], + ['retroflat_5floop_65',['retroflat_loop',['../group__maug__retroflt.html#gaa796a8098764c38861bec1f0aec2da77',1,'retroflt.h']]], + ['retroflat_5floop_5fiter_66',['retroflat_loop_iter',['../group__maug__retroflt.html#ga7f16b39955b5f77e5535e2198e9e0faa',1,'retroflt.h']]], + ['retroflat_5fmessage_67',['retroflat_message',['../group__maug__retroflt.html#gab2d5a69aa8e2f401b8d38b62dc11c674',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5ferror_68',['RETROFLAT_MSG_FLAG_ERROR',['../group__maug__retroflt__msg__api.html#gacd4b5c7d3be34b2ee30a1158af5bdc94',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5finfo_69',['RETROFLAT_MSG_FLAG_INFO',['../group__maug__retroflt__msg__api.html#gac5610ae1cf0ec3c7817349d51cb3c780',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5ftype_5fmask_70',['RETROFLAT_MSG_FLAG_TYPE_MASK',['../group__maug__retroflt__msg__api.html#ga8ab8ffa1d6e1ddaef12f8bcf92dc522f',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5fwarning_71',['RETROFLAT_MSG_FLAG_WARNING',['../group__maug__retroflt__msg__api.html#ga77ca553e9750bea8b5b77f4b73c868d0',1,'retroflt.h']]], + ['retroflat_5fmsg_5fmax_72',['RETROFLAT_MSG_MAX',['../group__maug__retroflt__compiling.html#ga772947dbdd87d20dff6043e6d4007dea',1,'retroflt.h']]], + ['retroflat_5fok_73',['RETROFLAT_OK',['../group__maug__retroflt__retval.html#ga55abadeca55977b642ab9010e4e6fc76',1,'retroflt.h']]], + ['retroflat_5fpath_5fmax_74',['RETROFLAT_PATH_MAX',['../group__maug__retroflt__compiling.html#gad072a3180e7d50481e2f39babb9077b4',1,'retroflt.h']]], + ['retroflat_5fpath_5fsep_75',['RETROFLAT_PATH_SEP',['../group__maug__retroflt__compiling.html#gafc62d3bd105fa19582ade03d97dc606a',1,'retroflt.h']]], + ['retroflat_5fpoll_5finput_76',['retroflat_poll_input',['../group__maug__retroflt__input.html#gaf8c19bfe4b8e31b84e71ffb6d00de561',1,'retroflt.h']]], + ['retroflat_5fquit_77',['retroflat_quit',['../group__maug__retroflt.html#ga4e588e9b7626bb8ae7e3ce50e6f6ff94',1,'retroflt.h']]], + ['retroflat_5frect_78',['retroflat_rect',['../group__maug__retroflt__drawing.html#ga7f4e8bd5781843624e1b5639724b598d',1,'retroflt.h']]], + ['retroflat_5fscreen_5fbuffer_79',['retroflat_screen_buffer',['../group__maug__retroflt.html#ga5b8ae4b55653cffa196778a9e467ff71',1,'retroflt.h']]], + ['retroflat_5fscreen_5fh_80',['retroflat_screen_h',['../group__maug__retroflt.html#ga2570fa6b56eb033b40e51f9dd7c522cc',1,'retroflt.h']]], + ['retroflat_5fscreen_5fw_81',['retroflat_screen_w',['../group__maug__retroflt.html#gabc0ba97788cdb8fd3d1a651776fad028',1,'retroflt.h']]], + ['retroflat_5fshutdown_82',['retroflat_shutdown',['../group__maug__retroflt.html#ga1f9b2b82622f45623739891838904c24',1,'retroflt.h']]], + ['retroflat_5fstate_83',['RETROFLAT_STATE',['../structRETROFLAT__STATE.html',1,'']]], + ['retroflat_5fstring_84',['retroflat_string',['../group__maug__retroflt__drawing.html#gaeb607b42158ab8cae02230ca472da297',1,'retroflt.h']]], + ['retroflat_5fstring_5fsz_85',['retroflat_string_sz',['../group__maug__retroflt__drawing.html#ga7edf53d278ef709ca5d3ec3e054070e8',1,'retroflt.h']]], + ['retroflat_5ftxp_5fb_86',['RETROFLAT_TXP_B',['../group__maug__retroflt__bitmap.html#gab5d43506739bd0b166fc32358d39e359',1,'retroflt.h']]], + ['retroflat_5ftxp_5fg_87',['RETROFLAT_TXP_G',['../group__maug__retroflt__bitmap.html#ga0a14b581204c9b3f6a06bcba588d6727',1,'retroflt.h']]], + ['retroflat_5ftxp_5fr_88',['RETROFLAT_TXP_R',['../group__maug__retroflt__bitmap.html#gaeb61b7d84a676502e1758bffc92b8a9e',1,'retroflt.h']]], + ['retroflat_5fvdp_5fargs_5fsz_5fmax_89',['RETROFLAT_VDP_ARGS_SZ_MAX',['../group__maug__retroflt__compiling.html#ga6930d8c4d64485eefcdf16130d1302b9',1,'retroflt.h']]], + ['retroflat_5fvdp_5fcall_90',['retroflat_vdp_call',['../group__maug__retroflt__vdp.html#ga686ecce68daf9fd1d2c32656243f6c8d',1,'retroflt.h']]], + ['retroflat_5fvdp_5fflag_5fpxlock_91',['RETROFLAT_VDP_FLAG_PXLOCK',['../group__maug__retroflt__vdp.html#gaf6ed7032fdee9a785610b6c0419d75da',1,'retroflt.h']]], + ['retroflat_5fvdp_5fproc_5ft_92',['retroflat_vdp_proc_t',['../group__maug__retroflt__vdp.html#gac542ec7b64f30a2d19bdbbbc7ef0aaa3',1,'retroflt.h']]], + ['retroflat_5fwin_5fframe_5ftimer_5fid_93',['RETROFLAT_WIN_FRAME_TIMER_ID',['../group__maug__retroflt__compiling.html#ga61c99e23e27fa7a1d3edbe8b5b4cffde',1,'retroflt.h']]], + ['retroflat_5fwin_5floop_5ftimer_5fid_94',['RETROFLAT_WIN_LOOP_TIMER_ID',['../group__maug__retroflt__compiling.html#ga4350389f2ddf28fbd89214a8370b1602',1,'retroflt.h']]], + ['retroflat_5fwindow_5fclass_95',['RETROFLAT_WINDOW_CLASS',['../group__maug__retroflt__compiling.html#ga784d1bd93d86f7dde45c07aa3067584c',1,'retroflt.h']]], + ['retroflt_2eh_96',['retroflt.h',['../retroflt_8h.html',1,'']]], + ['retrofnt_2eh_97',['retrofnt.h',['../retrofnt_8h.html',1,'']]], + ['retrofont_98',['RETROFONT',['../structRETROFONT.html',1,'']]], + ['retrofont_20api_99',['RetroFont API',['../group__retrofont.html',1,'']]], + ['retrofont_5fglyph_5fat_100',['retrofont_glyph_at',['../group__retrofont.html#gabbd2687ed303061f65fb4ad1391408dd',1,'retrofnt.h']]], + ['retrofp_2eh_101',['retrofp.h',['../retrofp_8h.html',1,'']]], + ['retrofp_5flut_102',['retrofp_lut',['../group__maug__retrofp.html#gaf466c8888ec2d28795ed52221ca2b811',1,'retrofp.h']]], + ['retrofp_5fpi_103',['RETROFP_PI',['../group__maug__retrofp.html#ga8c4600c661c79d7f31e5375ce606c51c',1,'retrofp.h']]], + ['retroglu_20api_104',['RetroGLU API',['../group__maug__retroglu.html',1,'']]], + ['retroglu_20obj_20parser_105',['RetroGLU OBJ Parser',['../group__maug__retroglu__obj__fsm.html',1,'']]], + ['retroglu_20obj_20parser_20states_106',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['retroglu_20overlay_20api_107',['RetroGLU Overlay API',['../group__maug__retroglu__overlay.html',1,'']]], + ['retroglu_20sprites_108',['RetroGLU Sprites',['../group__maug__retroglu__sprite.html',1,'']]], + ['retroglu_2eh_109',['retroglu.h',['../retroglu_8h.html',1,'']]], + ['retroglu_5fdraw_5fsprite_110',['retroglu_draw_sprite',['../group__maug__retroglu.html#gaa7f8818844f102a07c3606c9fbdc8702',1,'retroglu.h']]], + ['retroglu_5fface_111',['RETROGLU_FACE',['../structRETROGLU__FACE.html',1,'']]], + ['retroglu_5finit_5fsprite_5fvertices_112',['retroglu_init_sprite_vertices',['../group__maug__retroglu.html#gaa9a7b68018140cc307db23ba5c224ba0',1,'retroglu.h']]], + ['retroglu_5fjitrender_5fsprite_113',['retroglu_jitrender_sprite',['../group__maug__retroglu.html#gad0dbc4a89753c37cdfb03b7b3ff79e10',1,'retroglu.h']]], + ['retroglu_5fmaterial_114',['RETROGLU_MATERIAL',['../structRETROGLU__MATERIAL.html',1,'']]], + ['retroglu_5fmtl_5fcb_115',['retroglu_mtl_cb',['../group__maug__retroglu__obj__fsm.html#gac3fbadc0d5212c1d69830e5a387875cd',1,'retroglu.h']]], + ['retroglu_5fobj_116',['RETROGLU_OBJ',['../structRETROGLU__OBJ.html',1,'']]], + ['retroglu_5fobj_5ftokens_117',['RETROGLU_OBJ_TOKENS',['../group__maug__retroglu__obj__fsm.html#gae2b6f15fcc47afe2ee485f1d95911a6c',1,'retroglu.h']]], + ['retroglu_5fparse_5finit_118',['retroglu_parse_init',['../group__maug__retroglu__obj__fsm.html#ga1eea89882f6c548411ddbbfa11187d27',1,'RETROGLU_PARSER']]], + ['retroglu_5fparse_5fobj_5fc_119',['retroglu_parse_obj_c',['../group__maug__retroglu__obj__fsm.html#ga5198ebd5a2c5c8210f6feee3db63cb06',1,'RETROGLU_PARSER']]], + ['retroglu_5fparser_120',['RETROGLU_PARSER',['../structRETROGLU__PARSER.html',1,'']]], + ['retroglu_5fparser_5fstate_121',['retroglu_parser_state',['../group__maug__retroglu__obj__fsm.html#ga3f52a16418ba7581219ca6adf9680794',1,'retroglu.h']]], + ['retroglu_5fpop_5foverlay_122',['retroglu_pop_overlay',['../group__maug__retroglu__overlay.html#gaf613a50fb2d3e71cc9608492616b9a4d',1,'retroglu.h']]], + ['retroglu_5fprerender_5fsprite_123',['retroglu_prerender_sprite',['../group__maug__retroglu.html#ga8729fd6d63620a3dccaa4b199bfdf958',1,'retroglu.h']]], + ['retroglu_5fproj_5fargs_124',['RETROGLU_PROJ_ARGS',['../structRETROGLU__PROJ__ARGS.html',1,'']]], + ['retroglu_5fpush_5foverlay_125',['retroglu_push_overlay',['../group__maug__retroglu__overlay.html#gab3aecc424f6ad71b7d4c36a2c82105e9',1,'retroglu.h']]], + ['retroglu_5fsprite_126',['RETROGLU_SPRITE',['../structRETROGLU__SPRITE.html',1,'']]], + ['retroglu_5fsprite_5fparms_127',['RETROGLU_SPRITE_PARMS',['../structRETROGLU__SPRITE__PARMS.html',1,'']]], + ['retroglu_5ftile_128',['RETROGLU_TILE',['../structRETROGLU__TILE.html',1,'']]], + ['retroglu_5fvertex_129',['RETROGLU_VERTEX',['../structRETROGLU__VERTEX.html',1,'']]], + ['retroglu_5fvtexture_130',['RETROGLU_VTEXTURE',['../structRETROGLU__VTEXTURE.html',1,'']]], + ['retroglu_5fwhf_131',['retroglu_whf',['../group__maug__retroglu__overlay.html#ga9854c331bc40bfff518131f9026c7799',1,'retroglu.h']]], + ['retrogui_132',['RETROGUI',['../structRETROGUI.html',1,'']]], + ['retrogui_20api_133',['RetroGUI API',['../group__maug__retrogui.html',1,'']]], + ['retrogui_20controls_134',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['retrogui_2eh_135',['retrogui.h',['../retrogui_8h.html',1,'']]], + ['retrogui_5fctl_136',['RETROGUI_CTL',['../unionRETROGUI__CTL.html',1,'']]], + ['retrogui_5fctl_5fbase_137',['RETROGUI_CTL_BASE',['../structRETROGUI__CTL__BASE.html',1,'']]], + ['retrogui_5fctl_5ftable_138',['RETROGUI_CTL_TABLE',['../group__maug__retrogui__ctl.html#ga951c36a0e2f67d88cf7d0d1bd1a94b19',1,'retrogui.h']]], + ['retrogui_5fctl_5ftable_5ffields_139',['RETROGUI_CTL_TABLE_FIELDS',['../group__maug__retrogui__ctl.html#ga35333592fffe3d008ddf81628f6cb99e',1,'retrogui.h']]], + ['retrogui_5fctl_5ftable_5ftypes_140',['RETROGUI_CTL_TABLE_TYPES',['../group__maug__retrogui__ctl.html#gac65a09732f82d950d2366b7d3878f570',1,'retrogui.h']]], + ['retrogui_5fflags_5fdirty_141',['RETROGUI_FLAGS_DIRTY',['../group__maug__retrogui.html#ga15a4e92c3002b66ab24f29f5c6fc00ab',1,'retrogui.h']]], + ['retrogui_5fidc_142',['RETROGUI_IDC',['../group__maug__retrogui.html#ga824281a18362aabc8d033ddb9f9f9466',1,'retrogui.h']]], + ['retrogui_5fpoll_5fctls_143',['retrogui_poll_ctls',['../group__maug__retrogui.html#ga28a19a6657104e0ee65c1a922fb26f3d',1,'retrogui.h']]], + ['retrogxc_5ffont_5fparms_144',['RETROGXC_FONT_PARMS',['../structRETROGXC__FONT__PARMS.html',1,'']]], + ['retrohtr_2eh_145',['retrohtr.h',['../retrohtr_8h.html',1,'']]], + ['retrohtr_5fapply_5fstyles_146',['retrohtr_apply_styles',['../group__retrohtr.html#ga756e78931bdc19906a83678a9e750b58',1,'retrohtr.h']]], + ['retrohtr_5frender_5fnode_147',['RETROHTR_RENDER_NODE',['../structRETROHTR__RENDER__NODE.html',1,'']]], + ['retrohtr_5frender_5ftree_148',['RETROHTR_RENDER_TREE',['../structRETROHTR__RENDER__TREE.html',1,'']]], + ['retrosnd_2eh_149',['retrosnd.h',['../retrosnd_8h.html',1,'']]], + ['retrosnd_5fflag_5finit_150',['RETROSND_FLAG_INIT',['../group__maug__retrosnd__flags.html#gaff1ae784024934bb487989f25f894c8b',1,'retrosnd.h']]], + ['retrosnd_5finit_151',['retrosnd_init',['../group__maug__retrosnd.html#ga70b59655e231c9e908b1824bc4c06c25',1,'retrosnd.h']]], + ['retrosnd_5fset_5fsf_5fbank_152',['retrosnd_set_sf_bank',['../group__maug__retrosnd.html#ga4ca2c3662be36a491dd4ff3e02e343aa',1,'retrosnd.h']]], + ['retrosnd_5fstate_153',['RETROSND_STATE',['../structRETROSND__STATE.html',1,'']]], + ['retrosnd_5fvoice_5fgunshot_154',['RETROSND_VOICE_GUNSHOT',['../group__maug__retrosnd.html#gafa2e56ef134b1f9b79602df7bc31b7d5',1,'retrosnd.h']]], + ['retrosound_20api_155',['RetroSound API',['../group__maug__retrosnd.html',1,'']]], + ['retrosound_20state_20flags_156',['RetroSound State Flags',['../group__maug__retrosnd__flags.html',1,'']]], + ['retrotile_157',['RETROTILE',['../structRETROTILE.html',1,'']]], + ['retrotile_20api_158',['RetroTile API',['../group__retrotile.html',1,'']]], + ['retrotile_20custom_20property_20types_159',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]], + ['retrotile_20generators_160',['RetroTile Generators',['../group__retrotile__gen.html',1,'']]], + ['retrotile_20parser_161',['RetroTile Parser',['../group__retrotile__parser.html',1,'']]], + ['retrotile_20tile_20definitions_162',['RetroTile Tile Definitions',['../group__retrotile__defs.html',1,'']]], + ['retrotile_5fdata_5fborder_163',['RETROTILE_DATA_BORDER',['../structRETROTILE__DATA__BORDER.html',1,'']]], + ['retrotile_5fdata_5fds_164',['RETROTILE_DATA_DS',['../structRETROTILE__DATA__DS.html',1,'']]], + ['retrotile_5fgen_5fborders_5fiter_165',['retrotile_gen_borders_iter',['../group__retrotile__gen.html#ga95759485c058dc9a57711975f9fe526e',1,'retrotil.h']]], + ['retrotile_5fgen_5fdiamond_5fsquare_5fiter_166',['retrotile_gen_diamond_square_iter',['../group__retrotile__gen.html#ga9dda506910b27a778cb9d0b012658f39',1,'retrotil.h']]], + ['retrotile_5fgen_5fsmooth_5fiter_167',['retrotile_gen_smooth_iter',['../group__retrotile__gen.html#ga0a052a4858fcf067bc7e37561078a220',1,'retrotil.h']]], + ['retrotile_5fgen_5fvoronoi_5fiter_168',['retrotile_gen_voronoi_iter',['../group__retrotile__gen.html#ga9de8d41e6a0e46406a480bfbebb7edb9',1,'retrotil.h']]], + ['retrotile_5flayer_169',['RETROTILE_LAYER',['../structRETROTILE__LAYER.html',1,'']]], + ['retrotile_5fname_5fsz_5fmax_170',['RETROTILE_NAME_SZ_MAX',['../group__retrotile.html#gaedb5e962682c52467550f4de3722a251',1,'retrotil.h']]], + ['retrotile_5fparser_171',['RETROTILE_PARSER',['../structRETROTILE__PARSER.html',1,'']]], + ['retrotile_5ftile_5fdef_172',['RETROTILE_TILE_DEF',['../structRETROTILE__TILE__DEF.html',1,'']]], + ['retrotile_5ftile_5fscale_5fdefault_173',['RETROTILE_TILE_SCALE_DEFAULT',['../group__retrotile.html#ga1e45c2ca1266f669fc035275002c44b4',1,'retrotil.h']]], + ['retrotile_5ftileset_5fimage_5fstr_5fsz_5fmax_174',['RETROTILE_TILESET_IMAGE_STR_SZ_MAX',['../group__retrotile.html#ga1d021b8ccd25e5c9081654d942a9938d',1,'retrotil.h']]], + ['retrotile_5ftrace_5flvl_175',['RETROTILE_TRACE_LVL',['../group__retrotile.html#ga7fd3fd4b05cd3fead0d9a624173088b4',1,'retrotil.h']]], + ['return_20values_176',['Return Values',['../group__maug__retroflt__retval.html',1,'RetroFlat API Return Values'],['../group__maug__error__retvals.html',1,'Return Values']]] +]; diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 00000000..c2231fa9 --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['maug_5ffmt_5fspec_0',['MAUG_FMT_SPEC',['../unionMAUG__FMT__SPEC.html',1,'']]], + ['mfile_5fcaddy_1',['MFILE_CADDY',['../structMFILE__CADDY.html',1,'']]], + ['mfile_5fhandle_2',['MFILE_HANDLE',['../unionMFILE__HANDLE.html',1,'']]], + ['mfmt_5fstruct_3',['MFMT_STRUCT',['../structMFMT__STRUCT.html',1,'']]], + ['mfmt_5fstruct_5fbmpfile_4',['MFMT_STRUCT_BMPFILE',['../structMFMT__STRUCT__BMPFILE.html',1,'']]], + ['mfmt_5fstruct_5fbmpinfo_5',['MFMT_STRUCT_BMPINFO',['../structMFMT__STRUCT__BMPINFO.html',1,'']]], + ['mhtml_5fparser_6',['MHTML_PARSER',['../structMHTML__PARSER.html',1,'']]], + ['mhtml_5ftag_7',['MHTML_TAG',['../unionMHTML__TAG.html',1,'']]], + ['mhtml_5ftag_5fbase_8',['MHTML_TAG_BASE',['../structMHTML__TAG__BASE.html',1,'']]] +]; diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 00000000..bf20ac58 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,33 @@ +var searchData= +[ + ['retrocon_0',['RETROCON',['../structRETROCON.html',1,'']]], + ['retroflat_5fargs_1',['RETROFLAT_ARGS',['../structRETROFLAT__ARGS.html',1,'']]], + ['retroflat_5fbitmap_2',['RETROFLAT_BITMAP',['../structRETROFLAT__BITMAP.html',1,'']]], + ['retroflat_5fcache_5fasset_3',['RETROFLAT_CACHE_ASSET',['../structRETROFLAT__CACHE__ASSET.html',1,'']]], + ['retroflat_5finput_4',['RETROFLAT_INPUT',['../structRETROFLAT__INPUT.html',1,'']]], + ['retroflat_5fstate_5',['RETROFLAT_STATE',['../structRETROFLAT__STATE.html',1,'']]], + ['retrofont_6',['RETROFONT',['../structRETROFONT.html',1,'']]], + ['retroglu_5fface_7',['RETROGLU_FACE',['../structRETROGLU__FACE.html',1,'']]], + ['retroglu_5fmaterial_8',['RETROGLU_MATERIAL',['../structRETROGLU__MATERIAL.html',1,'']]], + ['retroglu_5fobj_9',['RETROGLU_OBJ',['../structRETROGLU__OBJ.html',1,'']]], + ['retroglu_5fparser_10',['RETROGLU_PARSER',['../structRETROGLU__PARSER.html',1,'']]], + ['retroglu_5fproj_5fargs_11',['RETROGLU_PROJ_ARGS',['../structRETROGLU__PROJ__ARGS.html',1,'']]], + ['retroglu_5fsprite_12',['RETROGLU_SPRITE',['../structRETROGLU__SPRITE.html',1,'']]], + ['retroglu_5fsprite_5fparms_13',['RETROGLU_SPRITE_PARMS',['../structRETROGLU__SPRITE__PARMS.html',1,'']]], + ['retroglu_5ftile_14',['RETROGLU_TILE',['../structRETROGLU__TILE.html',1,'']]], + ['retroglu_5fvertex_15',['RETROGLU_VERTEX',['../structRETROGLU__VERTEX.html',1,'']]], + ['retroglu_5fvtexture_16',['RETROGLU_VTEXTURE',['../structRETROGLU__VTEXTURE.html',1,'']]], + ['retrogui_17',['RETROGUI',['../structRETROGUI.html',1,'']]], + ['retrogui_5fctl_18',['RETROGUI_CTL',['../unionRETROGUI__CTL.html',1,'']]], + ['retrogui_5fctl_5fbase_19',['RETROGUI_CTL_BASE',['../structRETROGUI__CTL__BASE.html',1,'']]], + ['retrogxc_5ffont_5fparms_20',['RETROGXC_FONT_PARMS',['../structRETROGXC__FONT__PARMS.html',1,'']]], + ['retrohtr_5frender_5fnode_21',['RETROHTR_RENDER_NODE',['../structRETROHTR__RENDER__NODE.html',1,'']]], + ['retrohtr_5frender_5ftree_22',['RETROHTR_RENDER_TREE',['../structRETROHTR__RENDER__TREE.html',1,'']]], + ['retrosnd_5fstate_23',['RETROSND_STATE',['../structRETROSND__STATE.html',1,'']]], + ['retrotile_24',['RETROTILE',['../structRETROTILE.html',1,'']]], + ['retrotile_5fdata_5fborder_25',['RETROTILE_DATA_BORDER',['../structRETROTILE__DATA__BORDER.html',1,'']]], + ['retrotile_5fdata_5fds_26',['RETROTILE_DATA_DS',['../structRETROTILE__DATA__DS.html',1,'']]], + ['retrotile_5flayer_27',['RETROTILE_LAYER',['../structRETROTILE__LAYER.html',1,'']]], + ['retrotile_5fparser_28',['RETROTILE_PARSER',['../structRETROTILE__PARSER.html',1,'']]], + ['retrotile_5ftile_5fdef_29',['RETROTILE_TILE_DEF',['../structRETROTILE__TILE__DEF.html',1,'']]] +]; diff --git a/search/close.svg b/search/close.svg new file mode 100644 index 00000000..337d6cc1 --- /dev/null +++ b/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 00000000..00dfad8e --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['merror_2eh_0',['merror.h',['../merror_8h.html',1,'']]], + ['mfile_2eh_1',['mfile.h',['../mfile_8h.html',1,'']]], + ['mfmt_2eh_2',['mfmt.h',['../mfmt_8h.html',1,'']]], + ['mmem_2eh_3',['mmem.h',['../mmem_8h.html',1,'']]] +]; diff --git a/search/files_1.js b/search/files_1.js new file mode 100644 index 00000000..b360167e --- /dev/null +++ b/search/files_1.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['retroflt_2eh_0',['retroflt.h',['../retroflt_8h.html',1,'']]], + ['retrofnt_2eh_1',['retrofnt.h',['../retrofnt_8h.html',1,'']]], + ['retrofp_2eh_2',['retrofp.h',['../retrofp_8h.html',1,'']]], + ['retroglu_2eh_3',['retroglu.h',['../retroglu_8h.html',1,'']]], + ['retrogui_2eh_4',['retrogui.h',['../retrogui_8h.html',1,'']]], + ['retrohtr_2eh_5',['retrohtr.h',['../retrohtr_8h.html',1,'']]], + ['retrosnd_2eh_6',['retrosnd.h',['../retrosnd_8h.html',1,'']]] +]; diff --git a/search/files_2.js b/search/files_2.js new file mode 100644 index 00000000..bfdf0fd6 --- /dev/null +++ b/search/files_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['uprintf_2eh_0',['uprintf.h',['../uprintf_8h.html',1,'']]] +]; diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 00000000..171cbb58 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['maug_5fadd_5farg_0',['maug_add_arg',['../group__maug__cli.html#gaa01f6f484f91a815d5776e1b3e88a9db',1,'marge.h']]], + ['mfile_5fclose_1',['mfile_close',['../group__maug__mfile.html#gabf28a1a9cb4595b757aa79312749318c',1,'mfile.h']]], + ['mfile_5flock_5fbuffer_2',['mfile_lock_buffer',['../group__maug__mfile.html#ga10e9d31a9b9278877e66e2c715dfa739',1,'mfile.h']]], + ['mfile_5fopen_5fread_3',['mfile_open_read',['../group__maug__mfile.html#gaaa053ea8ff41c0b9ecb854d70103221f',1,'mfile.h']]], + ['mfmt_5fread_5fbmp_5fpx_4',['mfmt_read_bmp_px',['../group__maug__fmt.html#ga3aed5af79845ff84c2b5180728d6a883',1,'mfmt.h']]] +]; diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 00000000..84be31c4 --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['retrocon_5finput_0',['retrocon_input',['../group__maug__console.html#ga27335c378d5e1c475a447a6cca2ae3f2',1,'retrocon.h']]], + ['retroflat_5fblit_5fbitmap_1',['retroflat_blit_bitmap',['../group__maug__retroflt__bitmap.html#ga30f6d28030b3437f85a22b0bd7e04669',1,'retroflt.h']]], + ['retroflat_5fconfig_5fopen_2',['retroflat_config_open',['../group__maug__retroflt__config.html#gafe8b210ba090d19b772837e479ddc1de',1,'retroflt.h']]], + ['retroflat_5fconfig_5fread_3',['retroflat_config_read',['../group__maug__retroflt__config.html#gada2b16f53ba3a18018513710526b064d',1,'retroflt.h']]], + ['retroflat_5fconfig_5fwrite_4',['retroflat_config_write',['../group__maug__retroflt__config.html#gac3a7b80f3b166d02c3d8791ca0bdec32',1,'retroflt.h']]], + ['retroflat_5fdestroy_5fbitmap_5',['retroflat_destroy_bitmap',['../group__maug__retroflt__bitmap.html#gaa52e04cfe54ba6ea1985c8dfc2dccbbe',1,'retroflt.h']]], + ['retroflat_5fdraw_5flock_6',['retroflat_draw_lock',['../group__maug__retroflt__drawing.html#ga78766b119670a0ceb6fd84ec6c4cb52d',1,'retroflt.h']]], + ['retroflat_5fellipse_7',['retroflat_ellipse',['../group__maug__retroflt__drawing.html#ga17237a3b9c734c7fe023a3813d687947',1,'retroflt.h']]], + ['retroflat_5finit_8',['retroflat_init',['../group__maug__retroflt.html#gac5511e72055cff916e5f494f8d6fd5f5',1,'retroflt.h']]], + ['retroflat_5fline_9',['retroflat_line',['../group__maug__retroflt__drawing.html#gaff3354123bc01e143245dbd949597493',1,'retroflt.h']]], + ['retroflat_5fload_5fbitmap_10',['retroflat_load_bitmap',['../group__maug__retroflt__bitmap.html#gab1cb406967afc4fbd36454a1ba481b9f',1,'retroflt.h']]], + ['retroflat_5floop_11',['retroflat_loop',['../group__maug__retroflt.html#gaa796a8098764c38861bec1f0aec2da77',1,'retroflt.h']]], + ['retroflat_5fmessage_12',['retroflat_message',['../group__maug__retroflt.html#gab2d5a69aa8e2f401b8d38b62dc11c674',1,'retroflt.h']]], + ['retroflat_5fpoll_5finput_13',['retroflat_poll_input',['../group__maug__retroflt__input.html#gaf8c19bfe4b8e31b84e71ffb6d00de561',1,'retroflt.h']]], + ['retroflat_5frect_14',['retroflat_rect',['../group__maug__retroflt__drawing.html#ga7f4e8bd5781843624e1b5639724b598d',1,'retroflt.h']]], + ['retroflat_5fshutdown_15',['retroflat_shutdown',['../group__maug__retroflt.html#ga1f9b2b82622f45623739891838904c24',1,'retroflt.h']]], + ['retroflat_5fstring_16',['retroflat_string',['../group__maug__retroflt__drawing.html#gaeb607b42158ab8cae02230ca472da297',1,'retroflt.h']]], + ['retroflat_5fstring_5fsz_17',['retroflat_string_sz',['../group__maug__retroflt__drawing.html#ga7edf53d278ef709ca5d3ec3e054070e8',1,'retroflt.h']]], + ['retroflat_5fvdp_5fcall_18',['retroflat_vdp_call',['../group__maug__retroflt__vdp.html#ga686ecce68daf9fd1d2c32656243f6c8d',1,'retroflt.h']]], + ['retrofp_5flut_19',['retrofp_lut',['../group__maug__retrofp.html#gaf466c8888ec2d28795ed52221ca2b811',1,'retrofp.h']]], + ['retroglu_5fdraw_5fsprite_20',['retroglu_draw_sprite',['../group__maug__retroglu.html#gaa7f8818844f102a07c3606c9fbdc8702',1,'retroglu.h']]], + ['retroglu_5finit_5fsprite_5fvertices_21',['retroglu_init_sprite_vertices',['../group__maug__retroglu.html#gaa9a7b68018140cc307db23ba5c224ba0',1,'retroglu.h']]], + ['retroglu_5fjitrender_5fsprite_22',['retroglu_jitrender_sprite',['../group__maug__retroglu.html#gad0dbc4a89753c37cdfb03b7b3ff79e10',1,'retroglu.h']]], + ['retroglu_5fparse_5finit_23',['retroglu_parse_init',['../group__maug__retroglu__obj__fsm.html#ga1eea89882f6c548411ddbbfa11187d27',1,'RETROGLU_PARSER']]], + ['retroglu_5fparse_5fobj_5fc_24',['retroglu_parse_obj_c',['../group__maug__retroglu__obj__fsm.html#ga5198ebd5a2c5c8210f6feee3db63cb06',1,'RETROGLU_PARSER']]], + ['retroglu_5fprerender_5fsprite_25',['retroglu_prerender_sprite',['../group__maug__retroglu.html#ga8729fd6d63620a3dccaa4b199bfdf958',1,'retroglu.h']]], + ['retrogui_5fpoll_5fctls_26',['retrogui_poll_ctls',['../group__maug__retrogui.html#ga28a19a6657104e0ee65c1a922fb26f3d',1,'retrogui.h']]], + ['retrohtr_5fapply_5fstyles_27',['retrohtr_apply_styles',['../group__retrohtr.html#ga756e78931bdc19906a83678a9e750b58',1,'retrohtr.h']]], + ['retrosnd_5finit_28',['retrosnd_init',['../group__maug__retrosnd.html#ga70b59655e231c9e908b1824bc4c06c25',1,'retrosnd.h']]], + ['retrosnd_5fset_5fsf_5fbank_29',['retrosnd_set_sf_bank',['../group__maug__retrosnd.html#ga4ca2c3662be36a491dd4ff3e02e343aa',1,'retrosnd.h']]], + ['retrotile_5fgen_5fborders_5fiter_30',['retrotile_gen_borders_iter',['../group__retrotile__gen.html#ga95759485c058dc9a57711975f9fe526e',1,'retrotil.h']]], + ['retrotile_5fgen_5fdiamond_5fsquare_5fiter_31',['retrotile_gen_diamond_square_iter',['../group__retrotile__gen.html#ga9dda506910b27a778cb9d0b012658f39',1,'retrotil.h']]], + ['retrotile_5fgen_5fsmooth_5fiter_32',['retrotile_gen_smooth_iter',['../group__retrotile__gen.html#ga0a052a4858fcf067bc7e37561078a220',1,'retrotil.h']]], + ['retrotile_5fgen_5fvoronoi_5fiter_33',['retrotile_gen_voronoi_iter',['../group__retrotile__gen.html#ga9de8d41e6a0e46406a480bfbebb7edb9',1,'retrotil.h']]] +]; diff --git a/search/groups_0.js b/search/groups_0.js new file mode 100644 index 00000000..9d48487d --- /dev/null +++ b/search/groups_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['api_0',['API',['../group__maug__cli.html',1,'Command Line API'],['../group__maug__error.html',1,'Error Handling API'],['../group__maug__console.html',1,'In-Situ Console API'],['../group__maug__fmt.html',1,'Maug File Format API'],['../group__maug__mem.html',1,'Memory Management API'],['../group__maug__uprintf.html',1,'Micro-PrintF API'],['../group__retrohtr.html',1,'Retro HyperText Rendering API'],['../group__maug__mfile.html',1,'RetroFile API'],['../group__maug__retroflt.html',1,'RetroFlat API'],['../group__maug__retroflt__assets.html',1,'RetroFlat Assets API'],['../group__maug__retroflt__bitmap.html',1,'RetroFlat Bitmap API'],['../group__maug__retroflt__config.html',1,'RetroFlat Config API'],['../group__maug__retroflt__drawing.html',1,'RetroFlat Drawing API'],['../group__maug__retroflt__input.html',1,'RetroFlat Input API'],['../group__maug__retroflt__msg__api.html',1,'RetroFlat Message API'],['../group__maug__retroflt__vdp.html',1,'RetroFlat VDP API'],['../group__retrofont.html',1,'RetroFont API'],['../group__maug__retroglu.html',1,'RetroGLU API'],['../group__maug__retroglu__overlay.html',1,'RetroGLU Overlay API'],['../group__maug__retrogui.html',1,'RetroGUI API'],['../group__maug__retrosnd.html',1,'RetroSound API'],['../group__retrotile.html',1,'RetroTile API']]], + ['api_20return_20values_1',['RetroFlat API Return Values',['../group__maug__retroflt__retval.html',1,'']]], + ['assets_20api_2',['RetroFlat Assets API',['../group__maug__retroflt__assets.html',1,'']]] +]; diff --git a/search/groups_1.js b/search/groups_1.js new file mode 100644 index 00000000..a1ebae9c --- /dev/null +++ b/search/groups_1.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['bitmap_0',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]], + ['bitmap_20api_1',['RetroFlat Bitmap API',['../group__maug__retroflt__bitmap.html',1,'']]], + ['buffer_20types_2',['RetroFlat Config Buffer Types',['../group__maug__retroflt__config__btypes.html',1,'']]] +]; diff --git a/search/groups_10.js b/search/groups_10.js new file mode 100644 index 00000000..e4e62a84 --- /dev/null +++ b/search/groups_10.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tile_20definitions_0',['RetroTile Tile Definitions',['../group__retrotile__defs.html',1,'']]], + ['types_1',['Types',['../group__maug__mfile__types.html',1,'RetroFile Types'],['../group__maug__retroflt__config__btypes.html',1,'RetroFlat Config Buffer Types'],['../group__retrotile__defs__types.html',1,'RetroTile Custom Property Types']]] +]; diff --git a/search/groups_11.js b/search/groups_11.js new file mode 100644 index 00000000..eb3b5f44 --- /dev/null +++ b/search/groups_11.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['values_0',['Values',['../group__maug__retroflt__retval.html',1,'RetroFlat API Return Values'],['../group__maug__error__retvals.html',1,'Return Values']]], + ['vdp_20api_1',['RetroFlat VDP API',['../group__maug__retroflt__vdp.html',1,'']]] +]; diff --git a/search/groups_2.js b/search/groups_2.js new file mode 100644 index 00000000..5a786357 --- /dev/null +++ b/search/groups_2.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['colors_0',['RetroFlat Colors',['../group__maug__retroflt__color.html',1,'']]], + ['command_20line_20api_1',['Command Line API',['../group__maug__cli.html',1,'']]], + ['compilation_2',['RetroFlat Compilation',['../group__maug__retroflt__compiling.html',1,'']]], + ['config_20api_3',['RetroFlat Config API',['../group__maug__retroflt__config.html',1,'']]], + ['config_20buffer_20types_4',['RetroFlat Config Buffer Types',['../group__maug__retroflt__config__btypes.html',1,'']]], + ['config_20flags_5',['RetroFlat Config Flags',['../group__maug__retroflt__config__flags.html',1,'']]], + ['console_20api_6',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['controls_7',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['custom_20property_20types_8',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]] +]; diff --git a/search/groups_3.js b/search/groups_3.js new file mode 100644 index 00000000..1ad8f996 --- /dev/null +++ b/search/groups_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['definitions_0',['Definitions',['../group__maug__retroflt__keydefs.html',1,'RetroFlat Key Definitions'],['../group__retrotile__defs.html',1,'RetroTile Tile Definitions']]], + ['drawing_20api_1',['RetroFlat Drawing API',['../group__maug__retroflt__drawing.html',1,'']]] +]; diff --git a/search/groups_4.js b/search/groups_4.js new file mode 100644 index 00000000..e02aaafa --- /dev/null +++ b/search/groups_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['error_20handling_20api_0',['Error Handling API',['../group__maug__error.html',1,'']]], + ['example_1',['RetroFlat Example',['../group__maug__retroflt__example.html',1,'']]] +]; diff --git a/search/groups_5.js b/search/groups_5.js new file mode 100644 index 00000000..edaa6363 --- /dev/null +++ b/search/groups_5.js @@ -0,0 +1,9 @@ +var searchData= +[ + ['file_20format_20api_0',['Maug File Format API',['../group__maug__fmt.html',1,'']]], + ['file_20format_3a_20bitmap_1',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]], + ['fixed_20point_2',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['flags_3',['Flags',['../group__maug__retroflt__flags.html',1,'Global Flags'],['../group__maug__retroflt__config__flags.html',1,'RetroFlat Config Flags'],['../group__maug__retrosnd__flags.html',1,'RetroSound State Flags']]], + ['format_20api_4',['Maug File Format API',['../group__maug__fmt.html',1,'']]], + ['format_3a_20bitmap_5',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]] +]; diff --git a/search/groups_6.js b/search/groups_6.js new file mode 100644 index 00000000..1e25ebf3 --- /dev/null +++ b/search/groups_6.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['generators_0',['RetroTile Generators',['../group__retrotile__gen.html',1,'']]], + ['global_20flags_1',['Global Flags',['../group__maug__retroflt__flags.html',1,'']]] +]; diff --git a/search/groups_7.js b/search/groups_7.js new file mode 100644 index 00000000..27fca14f --- /dev/null +++ b/search/groups_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['handling_20api_0',['Error Handling API',['../group__maug__error.html',1,'']]], + ['hypertext_20rendering_20api_1',['Retro HyperText Rendering API',['../group__retrohtr.html',1,'']]] +]; diff --git a/search/groups_8.js b/search/groups_8.js new file mode 100644 index 00000000..7794a2ff --- /dev/null +++ b/search/groups_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['in_20situ_20console_20api_0',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['input_20api_1',['RetroFlat Input API',['../group__maug__retroflt__input.html',1,'']]] +]; diff --git a/search/groups_9.js b/search/groups_9.js new file mode 100644 index 00000000..419e98ad --- /dev/null +++ b/search/groups_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['key_20definitions_0',['RetroFlat Key Definitions',['../group__maug__retroflt__keydefs.html',1,'']]] +]; diff --git a/search/groups_a.js b/search/groups_a.js new file mode 100644 index 00000000..dadfb5c0 --- /dev/null +++ b/search/groups_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['line_20api_0',['Command Line API',['../group__maug__cli.html',1,'']]] +]; diff --git a/search/groups_b.js b/search/groups_b.js new file mode 100644 index 00000000..f31ffe21 --- /dev/null +++ b/search/groups_b.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['management_20api_0',['Memory Management API',['../group__maug__mem.html',1,'']]], + ['maug_20file_20format_20api_1',['Maug File Format API',['../group__maug__fmt.html',1,'']]], + ['maug_20file_20format_3a_20bitmap_2',['Maug File Format: Bitmap',['../group__maug__fmt__bmp.html',1,'']]], + ['maug_20retro_20fixed_20point_3',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['memory_20management_20api_4',['Memory Management API',['../group__maug__mem.html',1,'']]], + ['message_20api_5',['RetroFlat Message API',['../group__maug__retroflt__msg__api.html',1,'']]], + ['micro_20printf_20api_6',['Micro-PrintF API',['../group__maug__uprintf.html',1,'']]] +]; diff --git a/search/groups_c.js b/search/groups_c.js new file mode 100644 index 00000000..231dd6cd --- /dev/null +++ b/search/groups_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['obj_20parser_0',['RetroGLU OBJ Parser',['../group__maug__retroglu__obj__fsm.html',1,'']]], + ['obj_20parser_20states_1',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['overlay_20api_2',['RetroGLU Overlay API',['../group__maug__retroglu__overlay.html',1,'']]] +]; diff --git a/search/groups_d.js b/search/groups_d.js new file mode 100644 index 00000000..4a6d87d1 --- /dev/null +++ b/search/groups_d.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['parser_0',['Parser',['../group__maug__retroglu__obj__fsm.html',1,'RetroGLU OBJ Parser'],['../group__retrotile__parser.html',1,'RetroTile Parser']]], + ['parser_20states_1',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['point_2',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['printf_20api_3',['Micro-PrintF API',['../group__maug__uprintf.html',1,'']]], + ['property_20types_4',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]] +]; diff --git a/search/groups_e.js b/search/groups_e.js new file mode 100644 index 00000000..6aa2497e --- /dev/null +++ b/search/groups_e.js @@ -0,0 +1,39 @@ +var searchData= +[ + ['rendering_20api_0',['Retro HyperText Rendering API',['../group__retrohtr.html',1,'']]], + ['retro_20fixed_20point_1',['Maug Retro Fixed Point',['../group__maug__retrofp.html',1,'']]], + ['retro_20hypertext_20rendering_20api_2',['Retro HyperText Rendering API',['../group__retrohtr.html',1,'']]], + ['retrofile_20api_3',['RetroFile API',['../group__maug__mfile.html',1,'']]], + ['retrofile_20types_4',['RetroFile Types',['../group__maug__mfile__types.html',1,'']]], + ['retroflat_20api_5',['RetroFlat API',['../group__maug__retroflt.html',1,'']]], + ['retroflat_20api_20return_20values_6',['RetroFlat API Return Values',['../group__maug__retroflt__retval.html',1,'']]], + ['retroflat_20assets_20api_7',['RetroFlat Assets API',['../group__maug__retroflt__assets.html',1,'']]], + ['retroflat_20bitmap_20api_8',['RetroFlat Bitmap API',['../group__maug__retroflt__bitmap.html',1,'']]], + ['retroflat_20colors_9',['RetroFlat Colors',['../group__maug__retroflt__color.html',1,'']]], + ['retroflat_20compilation_10',['RetroFlat Compilation',['../group__maug__retroflt__compiling.html',1,'']]], + ['retroflat_20config_20api_11',['RetroFlat Config API',['../group__maug__retroflt__config.html',1,'']]], + ['retroflat_20config_20buffer_20types_12',['RetroFlat Config Buffer Types',['../group__maug__retroflt__config__btypes.html',1,'']]], + ['retroflat_20config_20flags_13',['RetroFlat Config Flags',['../group__maug__retroflt__config__flags.html',1,'']]], + ['retroflat_20drawing_20api_14',['RetroFlat Drawing API',['../group__maug__retroflt__drawing.html',1,'']]], + ['retroflat_20example_15',['RetroFlat Example',['../group__maug__retroflt__example.html',1,'']]], + ['retroflat_20input_20api_16',['RetroFlat Input API',['../group__maug__retroflt__input.html',1,'']]], + ['retroflat_20key_20definitions_17',['RetroFlat Key Definitions',['../group__maug__retroflt__keydefs.html',1,'']]], + ['retroflat_20message_20api_18',['RetroFlat Message API',['../group__maug__retroflt__msg__api.html',1,'']]], + ['retroflat_20vdp_20api_19',['RetroFlat VDP API',['../group__maug__retroflt__vdp.html',1,'']]], + ['retrofont_20api_20',['RetroFont API',['../group__retrofont.html',1,'']]], + ['retroglu_20api_21',['RetroGLU API',['../group__maug__retroglu.html',1,'']]], + ['retroglu_20obj_20parser_22',['RetroGLU OBJ Parser',['../group__maug__retroglu__obj__fsm.html',1,'']]], + ['retroglu_20obj_20parser_20states_23',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['retroglu_20overlay_20api_24',['RetroGLU Overlay API',['../group__maug__retroglu__overlay.html',1,'']]], + ['retroglu_20sprites_25',['RetroGLU Sprites',['../group__maug__retroglu__sprite.html',1,'']]], + ['retrogui_20api_26',['RetroGUI API',['../group__maug__retrogui.html',1,'']]], + ['retrogui_20controls_27',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['retrosound_20api_28',['RetroSound API',['../group__maug__retrosnd.html',1,'']]], + ['retrosound_20state_20flags_29',['RetroSound State Flags',['../group__maug__retrosnd__flags.html',1,'']]], + ['retrotile_20api_30',['RetroTile API',['../group__retrotile.html',1,'']]], + ['retrotile_20custom_20property_20types_31',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]], + ['retrotile_20generators_32',['RetroTile Generators',['../group__retrotile__gen.html',1,'']]], + ['retrotile_20parser_33',['RetroTile Parser',['../group__retrotile__parser.html',1,'']]], + ['retrotile_20tile_20definitions_34',['RetroTile Tile Definitions',['../group__retrotile__defs.html',1,'']]], + ['return_20values_35',['Return Values',['../group__maug__retroflt__retval.html',1,'RetroFlat API Return Values'],['../group__maug__error__retvals.html',1,'Return Values']]] +]; diff --git a/search/groups_f.js b/search/groups_f.js new file mode 100644 index 00000000..92236cfd --- /dev/null +++ b/search/groups_f.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['situ_20console_20api_0',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['sprites_1',['RetroGLU Sprites',['../group__maug__retroglu__sprite.html',1,'']]], + ['state_20flags_2',['RetroSound State Flags',['../group__maug__retrosnd__flags.html',1,'']]], + ['states_3',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]] +]; diff --git a/search/mag.svg b/search/mag.svg new file mode 100644 index 00000000..ffb6cf0d --- /dev/null +++ b/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/search/mag_d.svg b/search/mag_d.svg new file mode 100644 index 00000000..4122773f --- /dev/null +++ b/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/search/mag_sel.svg b/search/mag_sel.svg new file mode 100644 index 00000000..553dba87 --- /dev/null +++ b/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/search/mag_seld.svg b/search/mag_seld.svg new file mode 100644 index 00000000..c906f84c --- /dev/null +++ b/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 00000000..2553bdaa --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['compiler_20definitions_0',['RetroFlat Compiler Definitions',['../group__maug__retroflt__compiling.html',1,'']]] +]; diff --git a/search/pages_1.js b/search/pages_1.js new file mode 100644 index 00000000..3ea8b130 --- /dev/null +++ b/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['definitions_0',['RetroFlat Compiler Definitions',['../group__maug__retroflt__compiling.html',1,'']]] +]; diff --git a/search/pages_2.js b/search/pages_2.js new file mode 100644 index 00000000..feadd945 --- /dev/null +++ b/search/pages_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['list_0',['Todo List',['../todo.html',1,'']]] +]; diff --git a/search/pages_3.js b/search/pages_3.js new file mode 100644 index 00000000..21eb7b46 --- /dev/null +++ b/search/pages_3.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['makefiles_0',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]], + ['maug_1',['maug',['../index.html',1,'']]], + ['maug_5fretroflt_5fexample_5fpage_2',['maug_retroflt_example_page',['../group__maug__retroflt__example.html',1,'']]] +]; diff --git a/search/pages_4.js b/search/pages_4.js new file mode 100644 index 00000000..e9de5526 --- /dev/null +++ b/search/pages_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['project_20makefiles_0',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]] +]; diff --git a/search/pages_5.js b/search/pages_5.js new file mode 100644 index 00000000..6a2cf24d --- /dev/null +++ b/search/pages_5.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['retroflat_20compiler_20definitions_0',['RetroFlat Compiler Definitions',['../group__maug__retroflt__compiling.html',1,'']]], + ['retroflat_20project_20makefiles_1',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]] +]; diff --git a/search/pages_6.js b/search/pages_6.js new file mode 100644 index 00000000..83220efb --- /dev/null +++ b/search/pages_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['todo_20list_0',['Todo List',['../todo.html',1,'']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 00000000..19f76f9d --- /dev/null +++ b/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 00000000..666af01e --- /dev/null +++ b/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c-{AmhX=Jf(#6djGiuzAr*{o?=JLmPLyc> z_*`QK&+BH@jWrYJ7>r6%keRM@)Qyv8R=enp0jiI>aWlGyB58O zFVR20d+y`K7vDw(hJF3;>dD*3-?v=<8M)@x|EEGLnJsniYK!2U1 Y!`|5biEc?d1`HDhPgg&ebxsLQ02F6;9RL6T literal 0 HcmV?d00001 diff --git a/splitbard.png b/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..8367416d757fd7b6dc4272b6432dc75a75abd068 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fiT zT~&lUj3=cDh^%3HDY9k5CEku}PHXNoNC(_$U3XPb&Q*ME25pT;2(*BOgAf<+R$lzakPG`kF31()Fx{L5Wrac|GQzjeE= zueY1`Ze{#x<8=S|`~MgGetGce)#vN&|J{Cd^tS%;tBYTo?+^d68<#n_Y_xx`J||4O V@QB{^CqU0Kc)I$ztaD0e0svEzbJzd? literal 0 HcmV?d00001 diff --git a/structMFILE__CADDY.html b/structMFILE__CADDY.html new file mode 100644 index 00000000..dbbaabbd --- /dev/null +++ b/structMFILE__CADDY.html @@ -0,0 +1,140 @@ + + + + + + + +maug: MFILE_CADDY Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MFILE_CADDY Struct Reference
    +
    +
    +
    +Collaboration diagram for MFILE_CADDY:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint8_t type
     The RetroFile Types flag describing this file.
     
    +union MFILE_HANDLE h
     The physical handle or pointer to access the file by.
     
    +off_t sz
     
    +off_t last_read
     
    +off_t mem_cursor
     Current position if its type is MFILE_CADDY_TYPE_MEM_BUFFER.
     
    +uint8_t * mem_buffer
     Locked pointer for MFILE_HANDLE::mem.
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structMFILE__CADDY__coll__graph.map b/structMFILE__CADDY__coll__graph.map new file mode 100644 index 00000000..5308188e --- /dev/null +++ b/structMFILE__CADDY__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structMFILE__CADDY__coll__graph.md5 b/structMFILE__CADDY__coll__graph.md5 new file mode 100644 index 00000000..f6d3b881 --- /dev/null +++ b/structMFILE__CADDY__coll__graph.md5 @@ -0,0 +1 @@ +89b4abd2eed761241b0acda08597b269 \ No newline at end of file diff --git a/structMFILE__CADDY__coll__graph.png b/structMFILE__CADDY__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..6ebded0adb16cd50d7f746212943dad7f04f31b6 GIT binary patch literal 3641 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 + + + + + + +maug: MFMT_STRUCT Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MFMT_STRUCT Struct Reference
    +
    +
    + +

    Generic image description struct. + More...

    + +

    #include <mfmt.h>

    + + + + + +

    +Data Fields

    +uint32_t sz
     Size of this struct (use to tell apart).
     
    +

    Detailed Description

    +

    Generic image description struct.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structMFMT__STRUCT__BMPFILE.html b/structMFMT__STRUCT__BMPFILE.html new file mode 100644 index 00000000..37b5a973 --- /dev/null +++ b/structMFMT__STRUCT__BMPFILE.html @@ -0,0 +1,136 @@ + + + + + + + +maug: MFMT_STRUCT_BMPFILE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MFMT_STRUCT_BMPFILE Struct Reference
    +
    +
    +
    +Collaboration diagram for MFMT_STRUCT_BMPFILE:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + +

    +Data Fields

    +char magic [2]
     
    +uint32_t file_sz
     
    +uint16_t reserved1
     
    +uint16_t reserved2
     
    +uint32_t px_offset
     
    +struct MFMT_STRUCT_BMPINFO info
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structMFMT__STRUCT__BMPFILE__coll__graph.map b/structMFMT__STRUCT__BMPFILE__coll__graph.map new file mode 100644 index 00000000..6a3f14b6 --- /dev/null +++ b/structMFMT__STRUCT__BMPFILE__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structMFMT__STRUCT__BMPFILE__coll__graph.md5 b/structMFMT__STRUCT__BMPFILE__coll__graph.md5 new file mode 100644 index 00000000..778caf80 --- /dev/null +++ b/structMFMT__STRUCT__BMPFILE__coll__graph.md5 @@ -0,0 +1 @@ +a75e20e3077af2ea1a32b4429a074477 \ No newline at end of file diff --git a/structMFMT__STRUCT__BMPFILE__coll__graph.png b/structMFMT__STRUCT__BMPFILE__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2ef8bb88d2f60d529e62bf3eaf47a87c91530764 GIT binary patch literal 5467 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 literal 0 HcmV?d00001 diff --git a/structMFMT__STRUCT__BMPINFO.html b/structMFMT__STRUCT__BMPINFO.html new file mode 100644 index 00000000..5f658a64 --- /dev/null +++ b/structMFMT__STRUCT__BMPINFO.html @@ -0,0 +1,173 @@ + + + + + + + +maug: MFMT_STRUCT_BMPINFO Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MFMT_STRUCT_BMPINFO Struct Reference
    +
    +
    + +

    BITMAPINFO struct that comes before Windows bitmap data. + More...

    + +

    #include <mfmt.h>

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

    +Data Fields

    +uint32_t sz
     Size of this struct in bytes (only 40 is supported).
     
    +int32_t width
     Width of the bitmap in pixels.
     
    +int32_t height
     Height of the bitmap in pixels.
     
    +uint16_t color_planes
     Number of color planes (only 0 or 1 are supported).
     
    +uint16_t bpp
     Number of bits per pixel (only =<8 are supported).
     
    +uint32_t compression
     Type of compression used.
     
    +uint32_t img_sz
     Size of pixel data in bytes.
     
    +uint32_t hres
     Horizontal resolution in pixels per inch (unsupported).
     
    +uint32_t vres
     Vertical resolution in pixels per inch (unsupported).
     
    +uint32_t palette_ncolors
     Number of palette colors in this bitmap (<256 supported).
     
    uint32_t imp_colors
     
    +

    Detailed Description

    +

    BITMAPINFO struct that comes before Windows bitmap data.

    +

    Field Documentation

    + +

    ◆ imp_colors

    + +
    +
    + + + + +
    uint32_t MFMT_STRUCT_BMPINFO::imp_colors
    +
    +

    \bried Number of important colors (unsupported).

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structMHTML__PARSER.html b/structMHTML__PARSER.html new file mode 100644 index 00000000..876b23b8 --- /dev/null +++ b/structMHTML__PARSER.html @@ -0,0 +1,163 @@ + + + + + + + +maug: MHTML_PARSER Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MHTML_PARSER Struct Reference
    +
    +
    +
    +Collaboration diagram for MHTML_PARSER:
    +
    +
    Collaboration graph
    + + + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint16_t pstate [MPARSER_STACK_SZ_MAX]
     
    +size_t pstate_sz
     
    +uint16_t attrib_key
     
    +char token [MHTML_PARSER_TOKEN_SZ_MAX]
     
    +size_t token_sz
     
    +size_t i
     
    +MAUG_MHANDLE tags_h
     
    +union MHTML_TAGtags
     
    +size_t tags_sz
     
    +size_t tags_sz_max
     
    +ssize_t tag_iter
     
    +uint8_t tag_flags
     Flags to be pushed to MHTML_TAG_BASE::flags on next mhtml_push_tag().
     
    +struct MCSS_PARSER styler
     
    +ssize_t body_idx
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structMHTML__PARSER__coll__graph.map b/structMHTML__PARSER__coll__graph.map new file mode 100644 index 00000000..d9375619 --- /dev/null +++ b/structMHTML__PARSER__coll__graph.map @@ -0,0 +1,7 @@ + + + + + + + diff --git a/structMHTML__PARSER__coll__graph.md5 b/structMHTML__PARSER__coll__graph.md5 new file mode 100644 index 00000000..1c2ec76d --- /dev/null +++ b/structMHTML__PARSER__coll__graph.md5 @@ -0,0 +1 @@ +0abdca768022e118ff4edbe5b6b0d7b1 \ No newline at end of file diff --git a/structMHTML__PARSER__coll__graph.png b/structMHTML__PARSER__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..a52a80f78abfc4f951fcc6a2e5fcee4aee42c572 GIT binary patch literal 7322 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 NX{hR`pp>j4{ujXf8V>*f literal 0 HcmV?d00001 diff --git a/structMHTML__TAG__BASE.html b/structMHTML__TAG__BASE.html new file mode 100644 index 00000000..351a7008 --- /dev/null +++ b/structMHTML__TAG__BASE.html @@ -0,0 +1,138 @@ + + + + + + + +maug: MHTML_TAG_BASE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MHTML_TAG_BASE Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint16_t type
     
    +uint8_t flags
     
    +ssize_t parent
     
    +ssize_t first_child
     
    +ssize_t next_sibling
     
    +ssize_t style
     
    +char classes [MCSS_CLASS_SZ_MAX+1]
     
    +size_t classes_sz
     
    +char id [MCSS_ID_SZ_MAX+1]
     
    +size_t id_sz
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROCON.html b/structRETROCON.html new file mode 100644 index 00000000..cb8e09d8 --- /dev/null +++ b/structRETROCON.html @@ -0,0 +1,165 @@ + + + + + + + +maug: RETROCON Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROCON Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROCON:
    +
    +
    Collaboration graph
    + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint8_t flags
     
    +int input_prev
     
    +int debounce_wait
     
    +char sbuffer [RETROCON_SBUFFER_SZ_MAX+1]
     
    +size_t sbuffer_sz
     
    +size_t sbuffer_lines [RETROCON_SBUFFER_LINES_MAX]
     
    +size_t sbuffer_lines_sz
     
    +char lbuffer [RETROCON_LBUFFER_SZ_MAX+1]
     
    +size_t lbuffer_sz
     
    +void * callback_data [RETROCON_CB_SZ_MAX]
     
    +char callback_names [RETROCON_CB_SZ_MAX][RETROCON_CB_NAME_SZ_MAX+1]
     
    +retrocon_cb callbacks [RETROCON_CB_SZ_MAX]
     
    +size_t callbacks_sz
     
    +RETROFLAT_COLOR lbuffer_color
     
    +RETROFLAT_COLOR sbuffer_color
     
    +RETROFLAT_COLOR bg_color
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROCON__coll__graph.map b/structRETROCON__coll__graph.map new file mode 100644 index 00000000..e89820bb --- /dev/null +++ b/structRETROCON__coll__graph.map @@ -0,0 +1,4 @@ + + + + diff --git a/structRETROCON__coll__graph.md5 b/structRETROCON__coll__graph.md5 new file mode 100644 index 00000000..79e399fd --- /dev/null +++ b/structRETROCON__coll__graph.md5 @@ -0,0 +1 @@ +88ee59c09e4b9f12ae076c2489fbce58 \ No newline at end of file diff --git a/structRETROCON__coll__graph.png b/structRETROCON__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..136717df02e9bf20d034bffaab3a2f6d2aaafb97 GIT binary patch literal 2708 zcmV;F3TyR=P)NuZf|(#pSb`co6LN|(zTNV|P!ck6s`vZ&k%dH0|a z1yrI0Behe}Pykgq-gZu}ZR}#d2KnpIg7)XyRk|$8xKq$cS|$Aj{0J6GNOf2{MCk4yIqfez;sNLPJAa zq?MYQN=!@)U*Ey^BXBRs^3<#WK2H*zv2~_X|R4^5XNn zWt?hJ!pp$t^G#FLfo`|^4-LHT?{>SFwQ{aj(QK7sFDxu1DJh9tZ@m?O^73->^YdB0 zd^yiO_Z*!&cdi#xL;Lpa2@ek^GBOf?0|yRp;J^WTs3l9G}DIC}IbFTeaUJ$v?K$dDnmMV*tA!@`9N2?+^lwpL+bA^Z02 zBQ7qE-o1O*`YkCb;n=ZbEk2jUy|Z@pD(k=0eDO9S1_tTLz?alL56i;O?=*7 z3@Z=I*cRpwdjFSuhLyM2NaOSd1_gNilPi#`RWw^|8Z%(P0EP@1Qrk{SO5&Mko?-v~ z{fr(xy1|%>>D#w20B6pep{S?`r_sxm?ZGs_~wlp3b60ix8=I2S$r|ENgTb z@S38pr^V-wRngxH`~sv3v|S@zs|4n$Va1DzQ$w1%{T1byO-ymf4;UjYZx|c7=s24;=>O=#N~2v`0!!o&6`&z zrenvB%%4BMMOrgw&IDl6q)BYtxDlVvhuiILwebm}7F;7){iAa`ZS+96J zo(ce;&v&n?P6r&SdH{IQkE`v?;yDeAJ+-hH08BMC7>J z?fyfx=EK0uxt##t!Ur&5| zJe@jqx~%au#^ayHe*rx8>g_uhhgXG6SCvI7RzDH^suCoCLY<4#xqF5k1=4`DRl`2* zb!nkzW@Zi+k^iXbOCqvMRi74-7+{Xq>m8@68%5;zz<0o}fpx%yCam72s$E1RT~$Yk z$PTa98xKSW(re5|ji{;`KA&&Bh(tRaj=KT8UhgBS`bQC2Vp*1m$O}H7@3hP1db1&8 ztyb(A85x9yg#l1iRmJh+$9dw3C+ZYTTwGkeIeWKm-C8BbzJ2?Mh=>T-*WqwbR#wK@ zvu7KPgA3OK&C$A;;lqa$8ym~!&6`O{Non?&TFO(O{OlC4X7l}<|6F<~=5ACL2qXz8 z5OCRXZo%;XU3$zgjD^6unqNt;*PACIPXdU@_o{lI+wFcIz%

    z=~#AJQo!ebwQCn}_qf&Wjp@~^7qPLi#Ky)F z7Z=COnKLOXE92|0TkqEF#&Y!O(}&>TV0P}@S+C!@bLZHxV+V0@aSR+d5WnBw;8N$d zZQJ=h$xGOil0RbhkNOwRT5(5q`09k+qt`lj z)i+q5GRv|$)-=3cZ&+q#=0sIBjvYJphN{l8EbDcL!!cG>oBMaw`QnC%bXL`4P3Q&m zQLV8{Rb9Yae!qWJO`ON$DRjHtqYT3stg3H{$itPDl`jS|cExT43kwUw;c!r1-rB2P z4d)0C4`<4hDQw!biQT(*qk3V(<-~~-tX#Pghr@x(?g0W-AlAfN#eCs7 z7kXM$KDJaIZHCPIB9ijK2OqSrZqGLi<5dx{L}V!N_LwnaJ^>Jsdud+1Bxh!3jsp1T zqmOz4DI)T26M6xC0H|t_$KyF~7{&r%xM`ZR08G<-*EG$v zE4qW)rArqI3kw-KbSO}F&V4b@KKpFFRgcTbk(87~cz8IQHf>_Vh7CkSL~#1_X`D_c zbLY;*FfN?i$&)7&6cj{iYAS|dpsHAw#jIJg=-Yqd;F*G#v zuxXm#1D!--&meIv5DhGG1}G|l5cKUK|eyWMYY z-@e@lq^GLO8u3v}a&q!9pU?L@RedQtJNw;=ii%~1Vf@oH&15dra(lnu|3DyP^(Le# zDJj!LWRv~y#?>b`H<#N!oAPhRnW+CN + + + + + + +maug: RETROFLAT_ARGS Struct Reference + + + + + + + + + + + + + + +

    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROFLAT_ARGS Struct Reference
    +
    +
    + +

    Struct containing configuration values for a RetroFlat program. + More...

    + +

    #include <retroflt.h>

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

    +Data Fields

    +char * title
     Title to set for the main program Window if applicable on the target platform.
     
    +char * assets_path
     Relative path under which bitmap assets are stored.
     
    +uint8_t flags
     
    +char * config_path
     Relative path of local config file (if not using registry).
     
    +int screen_w
     
    +int screen_h
     Desired screen or window height in pixels.
     
    +int screen_x
     Desired window X position in pixels.
     
    +int screen_y
     Desired window Y position in pixels.
     
    +uint8_t snd_flags
     
    + + + + + +

    +Related Symbols

    (Note that these are not member symbols.)

    +
    +#define RETROSND_ARGS_FLAG_LIST_DEVS   0x01
     
    +

    Detailed Description

    +

    Struct containing configuration values for a RetroFlat program.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROFLAT__BITMAP.html b/structRETROFLAT__BITMAP.html new file mode 100644 index 00000000..a6b8cfd0 --- /dev/null +++ b/structRETROFLAT__BITMAP.html @@ -0,0 +1,136 @@ + + + + + + + +maug: RETROFLAT_BITMAP Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROFLAT_BITMAP Struct Reference
    +
    +
    + +

    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine if a valid bitmap is loaded. + More...

    + +

    #include <retroflt.h>

    + + + + + + + + + + +

    +Data Fields

    +size_t sz
     Size of the bitmap structure, used to check VDP compatibility.
     
    +uint8_t flags
     Platform-specific bitmap flags.
     
    +struct RETROFLAT_GLTEX tex
     
    + + + + +

    +Related Symbols

    (Note that these are not member symbols.)

    +
    +#define RETROFLAT_FLAGS_LOCK   0x01
     
    +

    Detailed Description

    +

    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine if a valid bitmap is loaded.

    +

    Please see the RetroFlat Bitmap API for more information.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROFLAT__CACHE__ASSET.html b/structRETROFLAT__CACHE__ASSET.html new file mode 100644 index 00000000..d94e188a --- /dev/null +++ b/structRETROFLAT__CACHE__ASSET.html @@ -0,0 +1,117 @@ + + + + + + + +maug: RETROFLAT_CACHE_ASSET Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROFLAT_CACHE_ASSET Struct Reference
    +
    +
    + + + + + + + + +

    +Data Fields

    +uint8_t type
     
    +MAUG_MHANDLE handle
     
    +retroflat_asset_path id
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROFLAT__INPUT.html b/structRETROFLAT__INPUT.html new file mode 100644 index 00000000..b559c9e5 --- /dev/null +++ b/structRETROFLAT__INPUT.html @@ -0,0 +1,126 @@ + + + + + + + +maug: RETROFLAT_INPUT Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROFLAT_INPUT Struct Reference
    +
    +
    + +

    Struct passed to retroflat_poll_input() to hold return data. + More...

    + +

    #include <retroflt.h>

    + + + + + + + + + + +

    +Data Fields

    +int mouse_x
     X-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
     
    +int mouse_y
     Y-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
     
    +uint8_t key_flags
     
    +

    Detailed Description

    +

    Struct passed to retroflat_poll_input() to hold return data.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROFLAT__STATE.html b/structRETROFLAT__STATE.html new file mode 100644 index 00000000..510178bf --- /dev/null +++ b/structRETROFLAT__STATE.html @@ -0,0 +1,224 @@ + + + + + + + +maug: RETROFLAT_STATE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROFLAT_STATE Struct Reference
    +
    +
    + +

    Global singleton containing state for the current platform. + More...

    + +

    #include <retroflt.h>

    +
    +Collaboration diagram for RETROFLAT_STATE:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +void * loop_data
     
    +MERROR_RETVAL retval
     
    +uint8_t retroflat_flags
     Global Flags indicating current system status.
     
    +char config_path [RETROFLAT_PATH_MAX+1]
     
    +char assets_path [RETROFLAT_ASSETS_PATH_MAX+1]
     
    +RETROFLAT_COLOR_DEF palette [RETROFLAT_COLORS_SZ]
     Index of available colors, initialized on platform init.
     
    +struct RETROFLAT_BITMAP buffer
     Off-screen buffer bitmap.
     
    +struct RETROFLAT_BITMAPvdp_buffer
     A buffer assembled and passed to the RetroFlat VDP API for it to modify, or NULL if no VDP is loaded.
     
    +void * vdp_exe
     A handle for the loaded RetroFlat VDP API module.
     
    +void * vdp_data
     Pointer to data defined by the RetroFlat VDP API for its use.
     
    +char vdp_args [RETROFLAT_VDP_ARGS_SZ_MAX]
     CLI args passed with -vdp to the RetroFlat VDP API.
     
    +uint8_t vdp_flags
     Flags set by the RetroFlat VDP API.
     
    int screen_v_w
     The screen width as seen by our program, before scaling.
     
    int screen_v_h
     The screen height as seen by our program, before scaling.
     
    +int screen_w
     The screen width as seen by the system, after scaling.
     
    +int screen_h
     The screen height as seen by the system, after scaling.
     
    +retroflat_proc_resize_t on_resize
     
    +void * on_resize_data
     
    +

    Detailed Description

    +

    Global singleton containing state for the current platform.

    +

    Field Documentation

    + +

    ◆ screen_v_h

    + +
    +
    + + + + +
    int RETROFLAT_STATE::screen_v_h
    +
    + +

    The screen height as seen by our program, before scaling.

    +

    This is the scale of the buffer, which the platform-specific code should then scale to match screen_v_w on blit.

    + +
    +
    + +

    ◆ screen_v_w

    + +
    +
    + + + + +
    int RETROFLAT_STATE::screen_v_w
    +
    + +

    The screen width as seen by our program, before scaling.

    +

    This is the scale of the buffer, which the platform-specific code should then scale to match screen_v_h on blit.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROFLAT__STATE__coll__graph.map b/structRETROFLAT__STATE__coll__graph.map new file mode 100644 index 00000000..9e9b0a2c --- /dev/null +++ b/structRETROFLAT__STATE__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structRETROFLAT__STATE__coll__graph.md5 b/structRETROFLAT__STATE__coll__graph.md5 new file mode 100644 index 00000000..23984b22 --- /dev/null +++ b/structRETROFLAT__STATE__coll__graph.md5 @@ -0,0 +1 @@ +94d15ea91c519057c462a5e05461f928 \ No newline at end of file diff --git a/structRETROFLAT__STATE__coll__graph.png b/structRETROFLAT__STATE__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..76942f7b6a64e06a36a6239bfcf8c0040c7bdfcb GIT binary patch literal 5901 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 JSE$=X{TCOkaNYm_ literal 0 HcmV?d00001 diff --git a/structRETROFONT.html b/structRETROFONT.html new file mode 100644 index 00000000..046aafb6 --- /dev/null +++ b/structRETROFONT.html @@ -0,0 +1,126 @@ + + + + + + + +maug: RETROFONT Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROFONT Struct Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Data Fields

    +uint16_t sz
     
    +uint16_t first_glyph
     
    +uint16_t glyphs_count
     
    +uint8_t glyph_w
     
    +uint8_t glyph_h
     
    +uint8_t glyph_sz
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__FACE.html b/structRETROGLU__FACE.html new file mode 100644 index 00000000..997623ea --- /dev/null +++ b/structRETROGLU__FACE.html @@ -0,0 +1,141 @@ + + + + + + + +maug: RETROGLU_FACE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_FACE Struct Reference
    +
    +
    + + + + + + + + + + + + + +

    +Data Fields

    uint16_t vertex_idxs [RETROGLU_FACE_VERTICES_SZ_MAX]
     List of vertex indices from the associated RETROGLU_PARSER::vertices.
     
    +uint16_t vnormal_idxs [RETROGLU_FACE_VERTICES_SZ_MAX]
     
    +uint16_t vtexture_idxs [RETROGLU_FACE_VERTICES_SZ_MAX]
     
    +uint16_t vertex_idxs_sz
     
    +uint16_t material_idx
     
    +

    Field Documentation

    + +

    ◆ vertex_idxs

    + +
    +
    + + + + +
    uint16_t RETROGLU_FACE::vertex_idxs[RETROGLU_FACE_VERTICES_SZ_MAX]
    +
    + +

    List of vertex indices from the associated RETROGLU_PARSER::vertices.

    +

    The size of this array is fixed to simplify allocation of arrays.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__MATERIAL.html b/structRETROGLU__MATERIAL.html new file mode 100644 index 00000000..e12c3752 --- /dev/null +++ b/structRETROGLU__MATERIAL.html @@ -0,0 +1,126 @@ + + + + + + + +maug: RETROGLU_MATERIAL Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_MATERIAL Struct Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Data Fields

    +float ambient [4]
     
    +float diffuse [4]
     
    +float specular [4]
     
    +float emissive [4]
     
    +float specular_exp
     
    +char name [RETROGLU_MATERIAL_NAME_SZ_MAX]
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__OBJ.html b/structRETROGLU__OBJ.html new file mode 100644 index 00000000..22fbab72 --- /dev/null +++ b/structRETROGLU__OBJ.html @@ -0,0 +1,158 @@ + + + + + + + +maug: RETROGLU_OBJ Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_OBJ Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROGLU_OBJ:
    +
    +
    Collaboration graph
    + + + + + + + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint8_t flags
     
    +struct RETROGLU_VERTEX vertices [RETROGLU_VERTICES_SZ_MAX]
     
    +uint16_t vertices_sz
     
    +struct RETROGLU_VERTEX vnormals [RETROGLU_VERTICES_SZ_MAX]
     
    +uint16_t vnormals_sz
     
    +struct RETROGLU_VTEXTURE vtextures [RETROGLU_VERTICES_SZ_MAX]
     
    +uint16_t vtextures_sz
     
    +struct RETROGLU_FACE faces [RETROGLU_FACES_SZ_MAX]
     List of faces from an OBJ file. Faces comprise a list of polygons denoted by index of the vertices in RETROGLU_PARSER::vertices.
     
    +uint16_t faces_sz
     
    +struct RETROGLU_MATERIAL materials [RETROGLU_MATERIALS_SZ_MAX]
     
    +uint16_t materials_sz
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__OBJ__coll__graph.map b/structRETROGLU__OBJ__coll__graph.map new file mode 100644 index 00000000..9aab6635 --- /dev/null +++ b/structRETROGLU__OBJ__coll__graph.map @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/structRETROGLU__OBJ__coll__graph.md5 b/structRETROGLU__OBJ__coll__graph.md5 new file mode 100644 index 00000000..63997848 --- /dev/null +++ b/structRETROGLU__OBJ__coll__graph.md5 @@ -0,0 +1 @@ +e53e4d10b6aa44d9e944a842ec4a8863 \ No newline at end of file diff --git a/structRETROGLU__OBJ__coll__graph.png b/structRETROGLU__OBJ__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bf2021559b85b5114c5366cf170c250c0e37d1 GIT binary patch literal 18318 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�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 + + + + + + +maug: RETROGLU_PARSER Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_PARSER Struct Reference
    +
    +
    + +

    As retroglu_parse_obj_c() parses OBJ data, it populates this struct with object information. + More...

    + +

    #include <retroglu.h>

    +
    +Collaboration diagram for RETROGLU_PARSER:
    +
    +
    Collaboration graph
    + + + + + + + + + + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + +

    +Data Fields

    +struct RETROGLU_OBJobj
     
    +int state
     
    +int material_idx
     
    +char token [RETROGLU_PARSER_TOKEN_SZ_MAX]
     
    +size_t token_sz
     
    +retroglu_mtl_cb load_mtl
     
    +void * load_mtl_data
     
    + + + + + + + + +

    +Related Symbols

    (Note that these are not member symbols.)

    +
    void retroglu_parse_init (struct RETROGLU_PARSER *parser, struct RETROGLU_OBJ *obj, retroglu_mtl_cb load_mtl, void *load_mtl_data)
     Initialize a RETROGLU_PARSER.
     
    MERROR_RETVAL retroglu_parse_obj_c (struct RETROGLU_PARSER *parser, unsigned char c)
     Parse OBJ data into a parser, one character at a time.
     
    +

    Detailed Description

    +

    As retroglu_parse_obj_c() parses OBJ data, it populates this struct with object information.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__PARSER__coll__graph.map b/structRETROGLU__PARSER__coll__graph.map new file mode 100644 index 00000000..91b07f86 --- /dev/null +++ b/structRETROGLU__PARSER__coll__graph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/structRETROGLU__PARSER__coll__graph.md5 b/structRETROGLU__PARSER__coll__graph.md5 new file mode 100644 index 00000000..080d2186 --- /dev/null +++ b/structRETROGLU__PARSER__coll__graph.md5 @@ -0,0 +1 @@ +5dc3db168eedbeb67c324a825960aabe \ No newline at end of file diff --git a/structRETROGLU__PARSER__coll__graph.png b/structRETROGLU__PARSER__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..0b007d6af57de38b4ae319c9ad4808e9fe9204da GIT binary patch literal 23237 zcmZs@bzGET(>8noN+TVDw1jkbNs1Bz64KHj-OVZrOQV1^A|N0sB@Ih=i3mt{clUel z{oK#@$MgG4V0W)L&zWP6IcDYxd#R>`hfRqMK@gtuGkHx2LPdbDS1{4RzeXcZ<-mXF zW-pZFp*!U7%*MPp2%>|O<)6OtPTQXG@+VpOi?KhKJfkZ60>aYF!O_gI5Y~VrcF|wT zw8#=_+-rGEfI}%}BdKiw!O{dKI-nfM>vjH>l%glG2Njy$g)c5h2AJph9z1A9n za*|?y$$VB7og2cCw)!V})L&6Q)Gu*_OZS057L)$}_n-V{>z!C+5i49)4^9;Mvh3)x z9IPrXER>yeH%szapKtL)kc*28J_;slltTpeo~xeT#J}GY`EPg8kQzVH27YC4Y=G=;QxdLlB9=g)o0L7dTFM6#M~- zjTYt9>Cw?!hPmdfM}GJ+BY5-n%yB;|;|R55$Lu&yC^Wqke02VOMPc|Y@b)k6K&mkJ zm`IkHsOL6CG_7>WlN}Lydis2gY(?8p!d7!}&+TXGFJANs8y(1U{m;#MM+v|_B5zzi zfdS9-Kew;({TZ6xe^%nvliv{8f8M7Z{{OvAbDhUV*c<^vd8Vw~b77D@lBp0u=DqNd ze7M$a4K=anZ&QF@rOgPc^xd`Fx2d@r7e<tIVq8Ah-b@*4=GErteQg<@fX8nMI2Xbn@5vudt(O(ZF z7YI6B?x|VJ@Z<44UY9+?f@TBGjMm-78jc3VFI=faoav-4mWkI-E*bh9{}#RO_;Sbc z)!%h=B~`pL^J(yY3kI#}LhDDH-#N;I5~%|rXLCWcCP6nI85^Wwe`bCc)`Ok=ZoJoY zck35p=3QP|Z9r}{kfLovvywh(KX~M|^RMcS03~nWwfFh?x#?uNWs<0y)w`{xgHEdR z^Q9P^nNv6+BLM+HtkVsZxy4kYpK##$0><`KH9j7dkoK^Kk@vw@4p-l)2CM>r{ac+@9{ zu>$RhpKs8jABn#A+pWdGmpmr8Jl=?Ns-K(_@9F6QYlszsM-}q(=TC{Nu^JciNNVw4 z!#7+uw~HMSWdT>7{ue8WA9uBO9l*KnN04#$o?X@Zp4h2;m7-qijA|SHCg+yR!pyw* zk=z&|hcEd-c+Q{S`Vt&+zclEka9HnSg846xt-lL5XLH=Y(t@rJl#0O39jy%wRT#eU zvD~xPu=Ejso`ce0*+(WXFE3L%js|fV*1%T!60`lzc14`$p%ekz&rZqqUehiZsHmu} z59TjVw#tAZ`5*SMi1rbDQsPxh6M6Rz4Wo6%b)kpl>xULo#4m>_f=7=cxtq>W7Zw&E z7&u|J(_B+c;EfpacG2-D5oTqXa-k2-54vbanuG4rZp4Ca{Xbn94PQ6t8g^`si0nPL59%btlD#@cFC zfpllBT$Pr_v)NSZNv~NS43mHpQU*pw;6(eSBVvjj@Mdl*|!heYt4YUdfH>}&krr{ovLvHYU*^i#Svh6F=oIGA}M%L zkzSL;YtG|5FLQmlRZ1b@%@gu~I(&WIhJX;Pl!e9PFWe^4BiTxAHUf)?cWBu5NQ(}~=Tdbd8oie(yT<5Xns-mLut&hZFFiq5d53G`ABnle3^WE)@C?_Z9kgN2~ zG4a*;`F=|o$DpDo9CF=~V2zY=|hjlKzf z$LpW8O1C}5*~34V?lQ5kxB)=$S?y1zSuvcrrWW_)fu#*;YDjPm%9r6_e5NI*kz#5nHBZdLm3r z9ZP96e%ri(Hz(sqshSQe z#AvBW^I(?rKL7tp4`s$!UoYD14BlG{MLgU`{H%^ z4HA;K3X>pirgWGk`$yD)MSf5KE@r%vmy0U@Q$w_-!u(Y>;pjt9>xc2`$- ze09k@zBSlQ*SP%H^V+4L4Z7yd2)wkVi0YK+`&0Cq7;O1{GEV&uIXRE}Qv`9qcF4{( z1srkcg3IX#E(6w;b1cnC$JbX(r%3NzUWP9=(xuPl)&dOnL5SnA>Zho*8)F+fuAU2| z0*l&K^>)0MZ^rdo(bjCG?dU!*)@+xhPMn z*k^@Qz-jhTqwh&8duhY_tG(ts=CfaBv2|My)wdj7dfgh?BkEq#)EaVe00Mw7eeFD0 z8H|CyI^|R`8Og3&68|hR;Ocbc?X}hD)(K#B=tRWCWgc5P$AD=fR%rb9pW;&R%zrto z)xMw52N2VBwbZzgQY`&Jz~ylZAV1FM`wJ3A+@5>0QSHcSP?7^2ou>B|Gqm;vIyXl1Tz02xWw$a$Y}yyvLJ!uy1}%b5e*D`A z>@E{nT6NlJalTG5<>lF43<$q#Dh9voAEM*aq&ZD8z4(%8(j1s?R4)X65DCz9#ox9&u7 zxb~|^uw;w-3vH%W1R6~q_~2zBhku!1SA87GA;i&;bPQlFBr;aPi+}}Ir!5T}9v!tU z#Yjg_Oz0i&Opzl48bFJ9r`pBd!MOi8hEB2mM_@GOz41?yL|hmE#|#E|>sz^VsPcdI zMWe!M;4qReHYo`nbbIs_$-M{BgaC|nfK=kO9q+$i4iR%fcZ~>-(cizFug?$ChFSm} za$6O&`@?Eo4@e=W>nqsrm#=Dba&k-ozqJ9xL#yvR4QG7b|Mil;&@RCG3y@uKcGyb#ff(H5$eGRfpTv03(p>6qv%AUu#39nZ)^gFgz@*r9F)JXhtE4 z-}(WikUcz_T0F~oC_^+`29g2kkK3<$^R5RmM^6fjr(L?JFG7s!Nu_Vk84GkvqkWE6 zSJI|4K+=ee8>c%{gp`!wfF;dOIW>2@;BJh!o&k5Z0Q{eQ|HoDDV?TjJdysAG)q8UO zEip1M&Hf=^MiHghpCL&FSZ#OpE_wFIFD@i&ia8OwXY>+EuDgb&pu(%Sv zc{xo%@A@z2!238%njU%9ORjx*Qr!_j&d9-myVrE(I9Lf7?qURYlZ?K;e%Opc&7}Ej z9Us!%KbO!Ih`GQ~zxyh%c}2otkV>i$9(VIKA2O@VFTkdA)B6Ncjx6vN3UN;kN&y>K z^{g)rqhcfiL@QUZ;yYj$NC@~Or!>WTaJ!Q8heh`CVg34 z@wy<*Vt5XS|A{7n zVIYFc&v?x#*x9kc`U}rW8xFCB9H*1`D;Fal^6vw4UIMl@^blWylM@d~2x?FE!nOnJ zYr6(!YTa0xZZEge#C?U$L7uDE;LWR3VwhZtW2mTzj!XprUM~N6nmqy!BW7U$(dX^o zqS_5_;q0I08#@g!q6SpM*wukl^P|-PQS*_NU6aJr8OJl5?U6;Z522xqbaW7MUln6$ zqQpEl=|n{zwuRuef%MrmFfC6d88s* z0-2afU9L0AD=KCIthSl1;pH-EinJRmc+>Nl$!0V+s_QCq#D>Rx{bhfeD8IEtKNYDq z$R49uup-Wq+1emCGvsQZuWRRI8z<7)UFDwBeU^kij6ArfATH;52$CDjjulg%} zK;tCr02@U{tWk=AnNZTQ zRj?y~(;{(8z-AZ%#@`9@)tA+dGyb}oIK4g~we?ty7dJ@Ho)62R`DM4J?5!qeBiFu ze?l`P{meiziHVQjwN=_2ovWJ40HXP~Z{N;=dU6!GVDNHqG*4X#u+@VJ^O!dv{;ZFe znyAtKiy-GV12U60pzTh+CNzQPZ;(1lx|oM7G63}(0A$hB(mIlSq+ji51Xdg8#TSmA zGuhZy5|2mNZcAki2@T$4!D1&UR;x zW_;O8wgHf@x=fO2H+}3t5;Kq*zkK;JV}mOZ2V9#1P%k8DA|>C#E?C-HTg@U&E?1w; za0Yn@8@&Eg-)d&T?r8F&oQveUfHa!Sst5uQdY5nZ&oA;&c}|A%pwAo6E*; zCIIgkK-UY(m}&qy2y(%I5;iKaqA}3~UGz2cAQ>irnmZoKsN!&=bF%i14iCDl8xSjL zq`f`^ZUNly89Co@WC}^$dIhpv*AHv;mtVOL7B=1tA4R z(vcScHXyR0f;; z@;(4HKWbpA$am$~6ancAslnjdV7eR-bO0-G0oM|9cv#61Q4Ut@xU#a+)~dqCZg+zT z=(??1E5#@r@~_!r@Jux>61vcT5?FrwiSGQv^IiTX$jpJW=&WDI#u79DY11<46G6tO zI`(@!K8F^7PSbuI{3;dT+my(F=~52_D;~3Uxa=BOY-${GE{?WHHWphbks-JR_Webo zuQ(pPW6B>Rdf45~+}(*Mb{00EgmHUwd@oOC_n!PmaW4?Cg>aDSGn`F<67e6&IqUh8 zN_^+jtFn*zHaWZD1zZ4JfqZ)8NtyMiC$LA+R@`;@Sy+RDI{fpZyO_s))uC}nhh*g* z{~d@VhL^9yQood|8^p}e89Auw+7&#kgDhgB#}>yqq)8M+HT0(v>b4|pSp)<<-tE4M zqMe={{NBJ`JOn{CGrM1baPv2(TnIK}J1i0>ICh;2wsbj0s=!^ z9vN(eXyP5#xl>KsaH%~%nYMy^tT{2<51P2IolHICXcb_Vc-owQ%tt)SjNhUylkGL*CENEW>fH^LCOpXU zz7>WK%}qy{K&JB%<-J<3B#ZLhAQ&V`a*~*zd4AXK{?9G3`iO{BOC?XzOJQrN`D4~C zDl^)?7d3G!qlyVihG(A{`Mci~6m(H@z3Sk0{;b~%DCeKyj)zyjpIB*O!<~OwBiCF~ z=|-%rn_g)r4b`;6LQoj8=!-mPqlMblQ_m1z^k)avU*T$moNtaijqU+2+_Pcj+jFQQQ8Urn-uEx&Vy*Csr7>rY1MW@qPBfr-suH zOR!DrjxCA4+uE3g;t~w8&@mP|ML#e#;b~k|EA|vobc#vB{<24{L5HptPalZMd-Fiy zh8!`5Vlmg@`kwbpv`};)RWv-D={JpkvhoZ>azVB6cyVsw&;1zH;k_pn%O7-m@HOtA z{a*OHQDs0K`2N+3^y`2`?5AvHDMaFrbvpA1zdx6IG!P`LUv7&<(yih~xj`MxD(CN2 z`k1A+c%2K2p4Yd_^W%me6oqhK@=6%Q>pxR;%vwxFuEdD1pLgYKQ(O`a`r#N01X+5< z{CpBn@ufhYy{yF+SSa#%K`k0PRmu+P&H_PTCTBkz;a z(jb+mTC9fF^<@~*={$p#(Xz&t|1=OZRUeI%550^h=S@GI?$BQofQ2wt@M;d9A3O5w zz@H8Gg~hRIM$S6Ee20k|f;LQO!^EHUEx!WshqCsc9VV#s8MEota39mnqt01mL9ky#e>5x_V8+e~Z)nUQfeXXm*!e zijq)RAuX;BQbc?xqQ7v=;maiAVQYPJuAa=o(i;U<)D%4khCNJmj9W*m;x0EJ$ zIA*zqVTa%0!!Mu6+&PE739UXNoMpnBf6gJ+&5PN-#P}%0cy>_XmE>!ukSo%QW@|&} z_cINQ4_%>peNy}yv+`cbn3f%lAu?kch%wWIA8ix&Zcw;$n0w#-F#Yc0?9ZL>!zf4c zyw6}p4WJ5Fk&8)GB?j%2o@@Dz$KWiE?|K%!#M{sn9xhT5#nJbCGm#{H)y_&RyG&kO z?R5X(W)i=Rcm5S*W!gM=*NeuNlK}BG=Namv3h~zvqsa%IVR#ZBL_7Qal(^QpKY-&Z z;7TZsVJd*aiK6%U(dF!+!QFbWb%20Ia9Re9I!tRzdnaEd=$sUA<4vp2bs>(w!8B^cZvxIks!F*jdgiox^${^@Ec#DYg(Er7D)%2GD7n1QHP$gP ze^wjudm$ot#0(4&9c-3=1b0kH3@F#n!o|*B`R^+}Y*L9A2F&dHZiVAi!PxUNYIIWx zv=-=;h=+ap4gA#85fG#2e;eqO7*W%*iI020<-=P+u|EC>MdM5+Dj`IvD29uMyzl=o zD9iUPu7^zFq}kQgN1hKBPrG@GB&@uq4On^!?f~32sfOeelcqY`3+9DcU3L85Q?z<;F93jNI#6xb2Br152rvXY=;6XE#1RrU^^QBtN1UNyI$Ke6ZMZ)(wFY3`+cQg zK`3?Ys_tMv%209RJDn~BNe!3xf{Bj6rln^{jfqkBsGge11lpZn#nNkzFX)s}xf&p+59*usEb+N8gJkUOib_k)u#*;)MOL@uUkH=qa>`GJ$2v3R|I!vie+5Fq7mH-(#^!OiNq(LRmQ(!xVzC zLv|2_8DBC-Sy@?1tC=3hmsR;n8W~lKz`GpYiXM9*+9QiOv*Xhewgcl@K5Z%FPO__{ zw^D}yqfxka0P$(9VNn_rK>;yC%J=-!zqt&h{oHCAogGla+>7NR$kO~T!K#-85z{9y zmT`FM!W)f{(`vP4GKl|3OTMz(UZ@__71~ffh^7zbg7zLs*gJWFF0-;fgZlm-3JPdJ zrR~ec#zr;@V#7UpcO<)uw$>cz*O6$$V0VNBlT`-b>uwM~l$k`qO)&B_uIJCN1)m`F z6HCTP{fu+^%>;ea+#x$4mPVA#D_w?-H@g6w69?IEl_4^y2G`VdM@K0I*rOJRQw4k* zFIdq%it3>^t3hMTK?-NnI9l2i$l+8}N1bWlxRVe|15sh1nny+ngQKG+jW+sO>BfWljjA-LorEu% z@f^|iOZ3`RHGM1C>;xi(lrRvwynZBnAka>V_>qiyY&riTy;G9gnuPS>&{IrXD5BRA zq-xeEDte~n4PRWU{z7Kq(C8{_;|(1zXZNt^TGP*?+oRdR3W0}FohHRPTcu#(&|Yb) zvSi&TW*>|fO?nY&cqnLeuIgLnP3<)0j@Tgjl{4B+S7odQpL7)kHcSR!;Y1OVkqJ%N zRneHOJ`K-`ECF>W>eKpl*=6En0uqdQnuo!!;nx72*uJk7tqMRdP&lGS zrtom(Vcy{}T3!zkkGS)6$;i+sWaS;LGQLWFfXMFcM!`hiM}v@3#9teM3ZRadbFhVs*#$g6ys4O!AcO3Mrl$I@g&GvKB{e>NWw(_JaujwCkmE;UNErah@bvr}$0DSEJ*>Jz(rHoSWO#j#5<3?3Ib@Qpm zg7TG4ZCE(Sva^2Ucu{Oa49yKeU5^v9$j;?7CT*(zF>xinWrJ;rr8~Ylb!WItg8v0R zE&zp=8r7fT@(Zi0sogFPitqJT;L+033Pak3W2aM~);Q#NHYZ7%O6A@#?8xbyDMYIf)$+n&1XUA%RK! zhrVyAW-IeYGbkSlmRv|ROCGlll=SuQq15#D*FUGPdhW!gXG;=Kp!fmP^Uxfd2N&V$ zwB}J!q_fqW+HYVr^Xs7h`WeP?~XUTn?EChmi&_Ua+`&F_=m!l^r& z=t91&*~TjuXbv?gVMd)CS>USG(un6_uv3;FLhe&n7Yj!r?Jm~!OcaV$g(x0kOJ0Ca zQnInBpujrGNBwVux3=~Gw9A~ug5p2azZ4$vDJA6+AJXW)9tnJ(O#ZjjCZ57f1`h`;#-MM_ozVauls3$7QX4!puGyI{O$P&KyOr^~9 zGKJK`7=(Z{kf>*b?S3XeRjA_IcgSfY@DZOXpR^xB#pI)mDqT)F#kXqe?k9(@%UJ|^ z1)B3E&zf14>lc3t&pNhRWq&=&3Hlw487?P=hMe?(>{1F^xW0etThT}KlQB?!^`p`$ z^r+G)3}^zXoAT=eMSeF}kHw|L+gZKDKEdSVyCDm{Vop{X$bPz}4AjAWNM+tKT#l}| z2K+A6EoH3Mq7e=kY7fH7bfg{b+EgWXvvaO^UGS*(&;8ovz1QDKr;u$Qo|@E!FmRV&-XRuUKM{w+Xr-;42oOhTW(Qx8aGQAz zbCFUgB9cIM>0qRxqwT@X9|J%p0D?f7`(I)*3tvUsj%O*#PZXI){6pvvSPTXEY;Elu z`aTrz;){GxYvsj%3-roiU z_${6zX6OmD%Fka|K$)17v|a()_e`p%8s)UdLi(?1Ax=ZC@eokhRRy$yi<8rVioe=o zRiVF#@2CV>b}9pvJE8C_d(&09{ssz!47i%t%3tJOyNY>`CyPYAS_yl6$FAB&e0;YQ z)#+r#HK-3MTHsYssLFd0jW9!CQ?MXfZS7_ZK6PVk@n5e`=0ykxMmF53!o@OP^U`XP zFr_5N)XX?0Bu900bf!QP4Q{w{|S--@Py%4vCwnuzH0kOIHi(G?eDzWA~yaBkm%78LkR+r;} z{xQ^KZfQ|a<@9|AFCZL|kLx)uAF+u%IXMYHgWUnim+Ei6#*!^G4k#&WTu)^UXya@{ z*~Y@fwf6=Ms(H{k3kyq(K(hfa#Qw}vY1OI}quD_WSafn1aHNES0=4@D&*ZtSZ*It7t4NBJ744uS`OKq! zhDA-TwSEpz+sb#I8yWbw9nJz$iEvCs4mxM82}I#v7D&$Uz`5 zkgsgDtGey!H-N8ieWtJ$t$QJh8CMtkuJ#kwB~iWWU(lxcIHJR~)2bq%qu+s#kI#<2 z@GTAh91h*ucgokL{{pcg4zd?442M5Vnr}n4UAyaiy&oVr81zdEHUa0d!!UKLpV44S za8m}?O|bb#^e$h9`@2Z$R{IVSj09{TCgdut79sXaSW~+yf64Z~^LN0PFN`O*ZE>}= zb#-&Z=zBvzOEs%3GR1&q4gc5Ir#5N3knt>=H!7@lESf+fP^D9{_&y4hA}%q_VDtr$y&)isRadhaeh+# zdB~b09%3KVl>fNa&j6|&shIs5BU7%&GSIJSvofzK%PpENcLes&IFF4O>gV$8z|KiB zPYumt{YazEU^x9w z`s{`FUTU9cLF4Ia)>j5kg6)wE0y|0ZvbM4*%O21yE1sw#ra>Z!DJvxS1jt$N{@XSIHD9I#sy z@FRijk(y|@6^cy-=q#~Q$kE(13vIUp;H3oqu22?lJ?2$KIbcqB^0<}8@CRkH%t)8e zxS2l0y6OEz1~-0OjK1LoD51o|6cf?Vg_{a5Q^o5((8nz)Hi z(PiyH60QA5uIjqlCv^PM4psVhV|nUd`?~#EZ9vqV0bOUGlWPh2@7k;?s?hgQ2%|u= zC!z3)v%FTa5zsOQgb^e(4vBYip}M&hoGJL&?ndR?Oz5L1;4kdt0SXE$@zv zNCBnfzMXh9NdEEqczh>CAIQfDVJ{2E>gMdKGU&2Gp+}~xrBRAYLeO2|h>a(J(HlsJ zcw`xLNZi=+B@3aQM<$W8hbu|YSbBIX{x{2m}}^>zcVikO_-`uOZ@E@4cXh%7>( zuOI*X>T0hJ#6%-)?Evs=$jZW^62vE6(BFFCw|gS&@b6D-G8HnbE)T*5o@Z20a2fLP zBXyO2@eYciruNwQ(9oWpudgo-*m*f5dV!X{fWZvODH=pA747Oj;Ou^oV3q#P!tii^ zBGZ2|ThR#%KFRwK5{^L&q9;@d8bzgJPsCPS%|YR|3ZU7seC3$^;MM-84l`REge5S3 zv}8twSD?=?U8k@y!>AK9dph>?3nJH1*sl@r35-|TlGF8Gd;G$V=ExXVsqerK^~k%2 zCBLPN>Xajk_+DRHS}J)KP|0*|VtV(+NLqTj~^45r_H^!J(O>ez>2vl@@r&Wdz-9V_JfBy2+ASE+D8;GQk zFz-z!+h+Zz)A=PP>LHM|F=w4s%&}TkOkVOIp;|c>vG(@$PgBc?L*tM;>V9#Lh3}wQ z**W2eFhp}N_Fg7Ep#r$ay$Z^LGrA)Myc4($Gru(UJQql{^wGT05YH@TTkVzPvw?jg zdxY;76x7kkxIsNo3eS-|2z)GFXcJ~-0xVf4kR8L3A8S;yDi{yaQ%?K@bT}8r4ODu0 ztQ2fbMxtXXhV7O%BQ+yNRAzn`1BI>U+)>{0l_GCd)Ig)5w1Rwut5MnZP=By0bKJY+ zD~O^BnP@ZkV#!chIa={0|3mQ(PhLYxF0Z$u04Sklk4*4w?OlP*@&d$@2EhQ03Q`Ub zGskThGo%dktD^xF3?xC^&mPemx8SQ9q|ChSK-CO-2Y-;Fk{be)1{9bo$e1+=&Q1g+spJak6rNxbS~j1X>jJb>hfFIbW#p;Kop||= zxD+(>Pu544@F8#)&BMoRHK2L= zpmp$SC{dv(T(P&4A1Pgu-`Px(t7IF^D?vGI$>yO>XGpnpsGHQ3zQNu&HhW}x-so(m zw+@H^x=?d&ULO84b@d<$#BGu7q$?#q(2>&K`cgyWP7~8UR!wM7lIYOS*ZpauF|Rd9 znhy51@2d4U0)U?I6+jm=jDX=^1S+`4$?k^DX-$pzyFaBS(mhrclIt6Ra|J*#Wu{F$ zjX@UOzEc-wA@i`srQf%N#0`DRJBGc5NSR9>LzLM>?Dr-nZ!tsWLlkZhPojW{+>a*Z z{J{DZNY4bus|eK?A?vgjIzq zsOg(Pn-)>tvEsLq5Hi%Lzb^hu*e{Wkd^TgXZH8wg_NTb`%cTHZ{Rg6VlKSlLlbxg$ zqj-8Lne2Ra?fJCl5=ChZj@8p)ps=J%Ql+%>B}f3@iz4^gk}f=46&Whg2>t3FD^3K@ z6{YWv-$R(PZi=Gc79Xj;NTF)jn$7yV^S?U5SfgJC{kR&`{ZQSrJC+_7vAMOC`bH>q zNn2ZxNP}NNLlJdC6Z8>cRFqt=zTWF>uBcO57SI7WiAIM4X8RuEn0{5veu$CD%%7U% zg9U4;t&aO2%>W8P@%~@UAeF7sK)~wlSs|si4}}a~`ryS`s(6c;0$J|pQ~Ua-!_ zkMF7oAKYktFxWcP(BMr1C8duLjaIU6B&aYSc&g13Al2dvn}|?7ZN*?)Ir;a2(LhF! zjh8|;XA~5z()V1>OpNq22DVl z#cMa)=?MR{y5NQS-~yGUv;P!BRL%m>5v&Mm?8UhL%9m&yu^0>=^YxKlLaGM}hc8(- zEua9D8m!9jmI#kq-M?I{X8Btb{_fEput7&E<+Tm&93ipFzV* z0%AMbZ_CD?51nw-8B&CFQHo3#@t18q=x@oU=tr!PrF^F~`VaeD|52d(K><-SER=6l zYxyrO&fL^RK3JYCj($JW7o20?i)n6OjPnCk7*nH3896~I|51>%NZ_xy3T`AS4`zD= z0RN?i^hAOz|G3ck5BXV5n+^44id()qh5KjOULUW4lGmF$@gPi!{6)%POh$z<0TI$vhf^f z;*H`T3i#)~XtM2tZ*ahPX9rh22}aYv_a`X0`<`4(^q|U_$y4lJJA&4phvHwz7a%G0 zG$?Z-;UfVJh52uwMJJ#$b~UDFR|62ceCN%S zG#l}3IB0&y-%%l+{+8P865~g2CNiJ&5&!y`2$Y;V+o|pfJUogc7wJCKkRqo_q3-P$ zlf$O?+OI4ziSg;@KZ4?NZS~P%u1%xlBN-CjC~Wm%?n6&0VMd^Y;kM85?rY|>@r+Jg zfOYjjj;hK_Az>fmGn#Tq2@0^pu6rs)&zw|1nPL40K`9y!W9yrw?HzxKDx{M5Lu}2| zN{s*SoAXjoz?OYwjJ$;DN>GE=c-d-Ts!s}fTR@fUi7IX`MdK0`goe3JxXZJB;;E*P zOuTGUO5j949HJGS`9|w$LA4tjcJLE6)^8YuF$|`d5G}e?xI0CzuedP1{0bAevUb(0 zf)}!GQCa^Wf&0#wD$)c8<<6lkyF1g*+fd^=hI~4LBw@^4d0aNgwu#1ct*6MUoKm41 zGbHlusQGuEL^Iw#5_ttF&nirP$z<5kiDa$?VS8ZJ*Ba6?2(muM0pnf#!jqJRcX|c4 z<$<+8DQM@!h?wxKz%zgUZnaWoy;iH)vp(u3uAQG?WxrIrJ$Vl5+Vn|QWJ$!aBV^%xps0Hu3s-OXe)GiNX)O*}0*pkW^2kP- zT++sC=2@~0o`wZv5jBg>HH7N}s}^pqjjI64K5Au25Kzeu=!~DLNQa2yHv5W8ySSN& zKfW|PRQ021XKWb^#LWrze)yv|W_C~&lOCH<7hI|F!OBdie*hZSna-;fUS=B1Oer)B z(%gytdpGs7gL_u;4;MW^&D`2DCV47L&Cf2!)@T&dJN%s(w1}we9x8r)yFEKN-jI+8 z@=aM}?^$UCHBn)$e~vaQu{1gzT`SFXL$%xCD`e9Xs~yL5N+`pr`$eOQnJ2(H$}|1^ z-eDkM*7q{3Mp3A^okWkZm8rUHHYJpB$illeGvMX5}~ zDoY%ZO&MA#2cXD)0=K0?NenR3k27>2m4&CWAnp4j(f8`R2w0cQbr5b*_)n@|zV%Pj zW?1h#_Y8d(Ow`Ff{x2}jK#L*YCnqwnbtoyf6`^rZh-{8m#099ujKpoWcw`fhnJ+qm z5u)UGmVKkY!fc%E(lK|4Y$Y=8EhOc2z}SBQNl@Hv_h1RUo7Tx$FnhIT0`8YTrKgHQJ{Ob%FT zvkzk)MPnld+7{$by1>(*|9L9<_mnh?sRYUmD4*4Qp7sPC2m&a?6zk~oB=BZ!ZOakR z9P;jSBslEKN2C!NlL8(0A)#RH%#KA`{n+9>1W}qHp9}D9^NF87<)4iN&v=2^Eg~1& zIH$O+Al7$yN;%B2=uDq6>YoM$XmRHIz7VYS96BauDjS#{?9|zcb@^m>9%^y@y0Bu) zUU|jnk(Csv^yp-tuhe&VDWA)xpZ{pZgg=}1L$c2ENU zkng*!Kmn`-2Nzc!$kC1IA*^!$Z72m_6J&*Jf^zeJ3-F-P?!Uc^pMb+6zs%PJ<)Z&- zc_cxe@Bg$sBHxzPN}nZhhwO&#qVdB8J*4-b{v=+;Iljre)uFE@>kQ8zH z2Ek>|zzAdW^&t)%)3Msx$@ui~8r2yndSHMy=hn|mFR*8j4W@*oq$?T^!16dCA@h|8 za%>+t4t9BL3))Q=kP{f7)tKi^>jyCVf8zuu%zSPifTaObt%Gx*@%vQdKV$bJO0;jb zC(1ypI!n{#CcA}&Mds37wb$N=M!e4~qFLQzx5XI?i$JE83FY3K^=bI>Z^_o}tp>4% zZkkW`EM*vfM*Dry@QMu1TFUUC@E9Q^eP2^L$mZ%Y!Oy=rLVDTi@tqiz7Y0*?YClkf zSjfu$o;jJ4e&$R3?3tUg*XP^7!5+~c1$h~32HKAX_g-Zb)E%jjkdvc9?nYgVF%s`V zBRhk%G;K#mhhB4_ByyagsE8v?((iBH+F)wGE)5vRy*k)$!)Fv0CJ)8GT45iRm#-#~ z{_s>@Qq9?!2Q*(Vzoy}{z+_`*Klr1i?lF;D_46ms&>k4~0`t|)1rFBcMJCNOU?jT@ zjL-3U@0&u%;c7q~KP4uHf|+aZ5P)q&-q*lzAe+yFj^mn}(6yK4%0NnoIl2MkYK?|L=2A-4cb7JOZ1V%TKkfQ9AjVq#;<8XBezb$Z|3 zoRwMh5UJBo{sY4*@NaUVi(pKam6a6%W}Y{n1R8+RwCfG^AW-+0OSEzv00#%->=IH} z+x*}a3oENj1~x*CL^Bi>dCBO}4S5d_L0F%gzB-tj2g_y#hTAfP9)zMj|512)1IF&a zPVv+;^s&~pwZ$+E0{z<8I4&tZ;kvg4QPxYMgpo0<2{?S~^2U`i!<7`l= zbtD!sbES_>Q59$cU+7QfPvUulihL%+@86n3zrbtWm)GFxOSWnh+6z6X4}|!KPp|Q4 zBq)#*`M^iZz%vTKjC#@Q3Utt*UH|Qoy!>q^Y7*SHL43Cc&26>+UE9L`Bn9#r3&_d* zS2{YzW1bg>E6-lMXgfbx;(hy<16dm4-}zProY_b67CE?SZ2TaxZ_Mfj>?ue9@q=52 zZE0t%cAx3#QEYB*W^Rdn;duRC((e>JB;uMzI&eB~R1^+(M9-5U&?x1x8K(O)HsHIdUs zKV6m-ffLVzM++dE&F$>$_QBHu7Jx&cw{6fk|-ia-JE76meyhl#ZgRzGSc^6p_^yl`=*DflJX9dr7NCYFeO#^{ZQBjA}ZbLoGJ#kDTB6_&! z!C+R*06am3>)_xZgLkU0-uu8zU3z6@<#SvdBe>Q$I2JX!*5iN3qh+2yoPTx}x< z@}yw8`FWaJ9vlul;AMGv`C|qKS@0wQ3!s-8Tib||0a-nr_O^$Ru%*7oSzg|#9h4xv zu6C+p!ee62yhy$ddr+(85d$UgHhNK)l$2D&Wl{dMr{}3nkTrc4qD>SbFE5p2tB)XW zMj8Ga}3mHN<&iy=#<1^7#M7xriDJS>87yRlf0p6L2(GH^2p~0Hw>_t&`KuU7u;Vt{J%!dJRGY2@8f4^qDeBgWUHpE zm7Rnl_sC7j7D>ihw$!f{^PIn2W;^G5zUQ;QU+*^C7PlzZ!H@B>5h482`{CZKAJnutegmqu)*&%ffloD+s_{m|@Evdzh;=&VwQJ^(h(Dzj@#A-D$Eq zx2~%Py^7yo{O89Z-%4|$(WMt8A(1P6w1Rb3%W)#{It5ntew@7JZ075Mjvz~F4848! z9QxI-e}8p>Y;(t{A2~Q&U6;4K|7}^-7~J3IuL<9w$PZ8P!zZ_TP$$_h7O_aAvl(;s zFa=JwAYw&|OpzD(Zn`F!*ZlnxtH0v28KUAbDQEvYcs%D*5}Xtq*Ie@pJ-*nxbsP;J z+eyG_JmNY6@=hWq5>5yXtT4K5;Oi{VYscd)4bWTk`wh>J>?X`?BZYov^P>Ow_i^|I z$S;X7DE8S{9l97-gDMBUqnCL|WJknq!Z-#Rpgzb4-Cjm~4!mS`IF?9cx=ruWCQu!B z>gq0gqWfrE0sY0m-5}gL+BN?S6T9s`8ze02`*-jDLTm|w?h}`DG==Dq@=_H(64%Na z`l#V!V{2=BzotkCKQD}42-6JJE8eeQ=puaBsq0pXuSYLT6!%T2wwh5fd7}7Ay5}t+qGDFVXZW$eCCk?|{^8LP5Cf5s9wjt7cO*sMx%q@M3ZVLIkIliy|?BAVUQu!>7 zE0TfX?b4WdoR^n(11+D86TfC)Rx0&p;O9?Pal;mu!+FsoQhJK=Se(m9W#0=+uWjV% z)|hY~g|O7VJ|q^8AC0Mk2NnxEoI3f1i@f)l>YTM{r^fnV<7fX3rQQ~%^E?*$@q$j+ zJ%sTszZXQvG+Pq>cTKhNIA?_w#U58J}qu!5s z2g;e@C3gG#xW&E%RklDQ$Z-o|n(e1)mYSTLeA>IvP7v&3I+&T*k2}De?m#cXx4~P> z2^lVPB}tJJgIB`(+I&~zttJ_5M~O@cf7}MV|i+1Al<5}p_4W-w6HGhRT=TDxoTs=HOV_WT3MQf?J5>aA}gGOq$zR(MPE zdN6O4D`}c0cRP^S6vlQV6GieKUJe&o-kZCY>!Cau0wMxcnuVok?a5ZbgLDl;mp`&Y zMnKBL%78Z|BLpv_WY$$Z@8?CBIe;z%^U3S213?jfc~X2Ca`T1W zz!ee+z z#<=pZ3_j2ubs<^C9SKTcmJXyTsmb1cz(Z^{!CXQ<^i<=>^pl)kljWrfK`MeqIFu_- zw`I;5MK-5qo{inO4`U%iKE|-&i4o)#J$5fQuhyWebB>1BL)bwxFpU%FzHNUlagdcFM|b9Ba=o21b)~$X7h*d|&pNvsm#- zNn@Sb2fQp@ii8a68aC0^Yh>p>v>Uxhdi+!wskgb4@JLidSVTauJ(CRKwb`=deI zOOTV}f#~nO26XvsVA-}#p*X7^_l!uoCmO_|qUCp>N6*gARuSXN%F81jIf6O7IL!TZ zbaddY^~dZ_jiVRJ3jphaCO*)YoP7~cInZ6|w*!TiKvysqH@tTl!#J!DlF&b3bx@?t z&B#cId@!Jud;_qBLg%^&{^jz)0N+pCG@%qkxJvW!+>_yZ4UI<4YFiXf?ySpC3GH)G z@xvAbnmzckU1t20KnX!9yFeK?otnx&!s7%|XrhP5_s`F(IXOGX;^AYv#wWG05tNFA z*RP2HjL9r2`XJ}#P;qHf#N*wUw88~9yBj!dkR~SXKjROn z)b2xvq&C)%rpBNsg7)yWi`Qmb4`k)%PZYgN+l0gY142`Opp?K+QacAy0}3xH)`w_* z1Y*myU!9y4NCH64iUTb?#K;JFYRbR=D*ILX#lR;OGx%=fb() z^HPLN`?(~&27)YIF0{HW$F?gvr{pSpHS^NUwmU%dO^h zEAF|~H}OlC_&T?5Ks4rDH*7{@c7M5g5M-d9`$H2G6K}zw!VYL9y6pG4apQ(MQtPa8 z7XEd3aL!z~2{qCcBBU-$cx)hlYp;OZi!}diK5Uf(((YgM#;mL?a?7aUl`9;Z3CJ5^ zKC+i+Kkb^3r8GfQik#18ag+Ygz>O;)q?$nJxtOPu+g zr7p>Wdi204+>0ve(|_7H#diB#OtbaBSF8yk&r(xTZb7TusHdk#;%Cs+SO#mI#=4?M z&Y{!kpJA{u1A5Ej-&Q}xGz~>JDWtaA=EjfDT|Z<7gT%DIbkf>fQs^W|X-r{MWZeOJ zJ5CBB8=R|J|2p$9Ep4@$?zuU2;k1W}82^uoK@&Fd`W-Y*?ksd`9KNK3K_GmGIsyuI zKnY?#dA55YjT!i>2DaA9+%x@GKU7ihOm}xT|5zr_Rm9-USvfg|$B*+xM64~;v=$Yq zIh6U=73%>g5QuD7gNI8ESYJ4hS_9AOUP{V%&mfa|6Uqv1KnOsPCmprBZGe4-VS2o;v9fL zI(Vohd%?cFBQ0xb@Y^!kKuQi*jU;V;DI|Ad7)U$ktv!OYO6UG+fFzO#gB4NBS{fQV z_4KM*Nu8oJ8ciFl7`Y`_ABL*#z|_uwe;cclQ)XyrIQ4hN$_CK%FL>(%{qGVf3U;Zd zrvmB%NTfTrZ{uD!HkS6mLhV#k#FdwqLkU0$^1QnvBd#!cun8t08kEDAj+x{8dje;^ z*$2~%7q-U@o!zz|PaD)qJ`RMNvudHfCH6JerstrC9*n7~1o}*eZLTK1mJh)rnei1o zwW+61pSD4qwNlqV!ZgC%Uj{VhDHvRNhA|-i@=DRtfra6Nb6fYLG2?t^9#XgjA(ooS zg?m_{kn;BJ+XB}&xIJ=mLsP<0tnF?vLJg!Ly`0=!ph?1Di6u&Df$D{J@T4R-E-27p z5g%#!t3PN-Rc%i^?NdW4_5;ABGV*0CxoA0B7M~GbYJ4cMNk$6B=LdD&aa zN)(UBAn9G11H4WSthPMURrdGbXTl+;>bQq)H!%~jQT2F?vmm+NGc?VBE@2cl~+^zpCp{^gth72y9UA1Jp*)-G7zPN#6^Ij;-J~#18m6q|Td| zm~L9?gp5+^aE~C!Fw6Po+)8iyMI}HV8EqlJV6X(Ft{8P^zf$MfUp=X9*XwAgxfPF+amYp9+jW?%{MODobgI@d+87 zRU)r}FL^|%qQ@7(gqA(+q$;_QxM$o}+WOBwDH3F9Vc|>da59H|*vfpwxf;k{?hgT> zg+8E50e1)06F|n+0iDsp*7jR6EFrkWL)IICEzK*n(2%gBfWfA*M4FDTaYHx1@m}5YnPiaVlxAJURz!w4V zBjDZj)>mc$)a0)%2>~DEKMmlRtHMg`j2kGn>S@G<*ewX*g1CW6OA&*WV45A;+M@(x z56|MQW+fyf7B*tBB|S-$-im2+wgA55!GE$5sKh;}c>-C7ogFVexft{%cLpbCf2Hwo zc(A&;7!9PGLCzo1y7sGkZAU^7$%-)EhI;y})bh*IBbsBv3sBf^8BFUF>JL-f9daii zK##l&N5KeeleAg>h_#)i{pwx+qxoqKLsOJK=fk(xbIsnNv;cB{%M;Iv>yy-CnhGn~ z)qTs&qr|V8zf;k7z<=-uo)>@VR!MD@%+13X&1rRE6{OY^8ABwO&irwimmIX&xwdjE zX%TpslCCOZIx8DrfG`IkV^u7-q3(g%3SO}OtlE<9(NY_|X?@4)bOnKd&baWEFKI{+ zN0-NP=g9f@Xy*2>q85} + + + + + + +maug: RETROGLU_PROJ_ARGS Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_PROJ_ARGS Struct Reference
    +
    +
    + + + + + + + + + + +

    +Data Fields

    +uint8_t proj
     
    +float rzoom
     
    +float near_plane
     
    +float far_plane
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__SPRITE.html b/structRETROGLU__SPRITE.html new file mode 100644 index 00000000..0ce72df9 --- /dev/null +++ b/structRETROGLU__SPRITE.html @@ -0,0 +1,148 @@ + + + + + + + +maug: RETROGLU_SPRITE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_SPRITE Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROGLU_SPRITE:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +float vertices_front [6][2]
     
    +float vtexture_front [6][2]
     
    +float vertices_back [6][2]
     
    +float vtexture_back [6][2]
     
    +float translate_x
     
    +float translate_y
     
    +int rotate_y
     
    +RETROGLU_COLOR color
     
    +struct RETROFLAT_BITMAP texture
     
    +GLint lists [RETROGLU_SPRITE_LIST_SZ_MAX]
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__SPRITE__PARMS.html b/structRETROGLU__SPRITE__PARMS.html new file mode 100644 index 00000000..1cd962ea --- /dev/null +++ b/structRETROGLU__SPRITE__PARMS.html @@ -0,0 +1,136 @@ + + + + + + + +maug: RETROGLU_SPRITE_PARMS Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_SPRITE_PARMS Struct Reference
    +
    +
    + +

    If draw lists are disabled, this struct holds a list of params for retroglu_set_sprite_clip() so that the sprite can be drawn without a list. + More...

    + +

    #include <retroglu.h>

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

    +Data Fields

    +uint32_t front_px
     
    +uint32_t front_py
     
    +uint32_t back_px
     
    +uint32_t back_py
     
    +uint32_t pw
     
    +uint32_t ph
     
    +uint8_t flags
     
    +

    Detailed Description

    +

    If draw lists are disabled, this struct holds a list of params for retroglu_set_sprite_clip() so that the sprite can be drawn without a list.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__SPRITE__coll__graph.map b/structRETROGLU__SPRITE__coll__graph.map new file mode 100644 index 00000000..0cdf87e8 --- /dev/null +++ b/structRETROGLU__SPRITE__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structRETROGLU__SPRITE__coll__graph.md5 b/structRETROGLU__SPRITE__coll__graph.md5 new file mode 100644 index 00000000..f043e17f --- /dev/null +++ b/structRETROGLU__SPRITE__coll__graph.md5 @@ -0,0 +1 @@ +25a58d4b9b8d09a2bdc0c60c7e8eb816 \ No newline at end of file diff --git a/structRETROGLU__SPRITE__coll__graph.png b/structRETROGLU__SPRITE__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..ade4344fbff54b5e45110dcc42ff70f2b4403511 GIT binary patch literal 4938 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 J + + + + + + +maug: RETROGLU_TILE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_TILE Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROGLU_TILE:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + +

    +Data Fields

    +float vertices [6][2]
     
    +float vtexture [6][2]
     
    +int rotate_x
     
    +struct RETROFLAT_BITMAP texture
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__TILE__coll__graph.map b/structRETROGLU__TILE__coll__graph.map new file mode 100644 index 00000000..e2e18b3d --- /dev/null +++ b/structRETROGLU__TILE__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structRETROGLU__TILE__coll__graph.md5 b/structRETROGLU__TILE__coll__graph.md5 new file mode 100644 index 00000000..4d8c2150 --- /dev/null +++ b/structRETROGLU__TILE__coll__graph.md5 @@ -0,0 +1 @@ +630b520669c2ba5dcd0928ebef874620 \ No newline at end of file diff --git a/structRETROGLU__TILE__coll__graph.png b/structRETROGLU__TILE__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..759c203cf226004e25750fb4629d10055a7e5ee0 GIT binary patch literal 4601 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 literal 0 HcmV?d00001 diff --git a/structRETROGLU__VERTEX.html b/structRETROGLU__VERTEX.html new file mode 100644 index 00000000..2589e70d --- /dev/null +++ b/structRETROGLU__VERTEX.html @@ -0,0 +1,117 @@ + + + + + + + +maug: RETROGLU_VERTEX Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_VERTEX Struct Reference
    +
    +
    + + + + + + + + +

    +Data Fields

    +float x
     
    +float y
     
    +float z
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGLU__VTEXTURE.html b/structRETROGLU__VTEXTURE.html new file mode 100644 index 00000000..eac6a2d8 --- /dev/null +++ b/structRETROGLU__VTEXTURE.html @@ -0,0 +1,114 @@ + + + + + + + +maug: RETROGLU_VTEXTURE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGLU_VTEXTURE Struct Reference
    +
    +
    + + + + + + +

    +Data Fields

    +float u
     
    +float v
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGUI.html b/structRETROGUI.html new file mode 100644 index 00000000..4e59bd0d --- /dev/null +++ b/structRETROGUI.html @@ -0,0 +1,155 @@ + + + + + + + +maug: RETROGUI Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGUI Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROGUI:
    +
    +
    Collaboration graph
    + + + + + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint8_t flags
     
    +RETROGUI_IDC idc_prev
     
    +MAUG_MHANDLE ctls_h
     
    +union RETROGUI_CTLctls
     
    +size_t ctls_sz
     
    +size_t ctls_sz_max
     
    +RETROGUI_IDC focus
     
    +struct RETROFLAT_BITMAPdraw_bmp
     
    +retrogui_xy_cb draw_xy
     
    +void * draw_xy_data
     
    +MAUG_MHANDLE font_h
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGUI__CTL__BASE.html b/structRETROGUI__CTL__BASE.html new file mode 100644 index 00000000..e5ec1a61 --- /dev/null +++ b/structRETROGUI__CTL__BASE.html @@ -0,0 +1,139 @@ + + + + + + + +maug: RETROGUI_CTL_BASE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGUI_CTL_BASE Struct Reference
    +
    +
    + +

    Fields common to ALL RETROGUI_CTL types. + More...

    + +

    #include <retrogui.h>

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

    +Data Fields

    +uint8_t type
     
    +RETROGUI_IDC idc
     
    +size_t x
     
    +size_t y
     
    +size_t w
     
    +size_t h
     
    +RETROFLAT_COLOR bg_color
     
    +RETROFLAT_COLOR fg_color
     
    +

    Detailed Description

    +

    Fields common to ALL RETROGUI_CTL types.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROGUI__coll__graph.map b/structRETROGUI__coll__graph.map new file mode 100644 index 00000000..907f5707 --- /dev/null +++ b/structRETROGUI__coll__graph.map @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/structRETROGUI__coll__graph.md5 b/structRETROGUI__coll__graph.md5 new file mode 100644 index 00000000..a1ccc727 --- /dev/null +++ b/structRETROGUI__coll__graph.md5 @@ -0,0 +1 @@ +00fa4b4ce16e1266fe72e8f107ded324 \ No newline at end of file diff --git a/structRETROGUI__coll__graph.png b/structRETROGUI__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..921b0041716aa2d5f810e9f4b5271ee72b211c6e GIT binary patch literal 12120 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 + + + + + + +maug: RETROGXC_FONT_PARMS Struct Reference + + + + + + + + + + + + + + +

    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGXC_FONT_PARMS Struct Reference
    +
    +
    + + + + + + + + +

    +Data Fields

    +uint8_t glyph_h
     
    +uint16_t first_glyph
     
    +uint16_t glyphs_count
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROHTR__RENDER__NODE.html b/structRETROHTR__RENDER__NODE.html new file mode 100644 index 00000000..b2ef7ea2 --- /dev/null +++ b/structRETROHTR__RENDER__NODE.html @@ -0,0 +1,175 @@ + + + + + + + +maug: RETROHTR_RENDER_NODE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROHTR_RENDER_NODE Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROHTR_RENDER_NODE:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +ssize_t x
     
    +ssize_t y
     
    +size_t w
     
    +size_t h
     
    +size_t m_l
     
    +size_t m_r
     
    +size_t m_t
     
    +size_t m_b
     
    +uint8_t pos
     
    +uint8_t pos_flags
     
    +uint8_t edge
     
    +RETROFLAT_COLOR bg
     
    +RETROFLAT_COLOR fg
     
    +ssize_t tag
     
    +ssize_t parent
     Index of container's render node in RETROHTR_RENDER_TREE.
     
    +ssize_t first_child
     Index of first child's render node in RETROHTR_RENDER_TREE.
     
    +ssize_t next_sibling
     Index of next sibling's render node in RETROHTR_RENDER_TREE.
     
    +struct RETROFLAT_BITMAP bitmap
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROHTR__RENDER__NODE__coll__graph.map b/structRETROHTR__RENDER__NODE__coll__graph.map new file mode 100644 index 00000000..c6a3cae0 --- /dev/null +++ b/structRETROHTR__RENDER__NODE__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structRETROHTR__RENDER__NODE__coll__graph.md5 b/structRETROHTR__RENDER__NODE__coll__graph.md5 new file mode 100644 index 00000000..95618d30 --- /dev/null +++ b/structRETROHTR__RENDER__NODE__coll__graph.md5 @@ -0,0 +1 @@ +216a1fcb784aad40fe02ef4d96388115 \ No newline at end of file diff --git a/structRETROHTR__RENDER__NODE__coll__graph.png b/structRETROHTR__RENDER__NODE__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..cbb53d101faae1474445d8f749625d3dd3f4d6e6 GIT binary patch literal 5015 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 + + + + + + +maug: RETROHTR_RENDER_TREE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROHTR_RENDER_TREE Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROHTR_RENDER_TREE:
    +
    +
    Collaboration graph
    + + + + + + + + + + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + +

    +Data Fields

    +MAUG_MHANDLE nodes_h
     
    +struct RETROHTR_RENDER_NODEnodes
     Locked pointer to nodes when locked with retrohtr_tree_lock().
     
    +size_t nodes_sz
     Current active number of nodes in RETROHTR_RENDER_NODE::nodes_h.
     
    +size_t nodes_sz_max
     Current alloc'd number of nodes in RETROHTR_RENDER_NODE::nodes_h.
     
    +ssize_t font_idx
     
    +struct RETROGUI gui
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROHTR__RENDER__TREE__coll__graph.map b/structRETROHTR__RENDER__TREE__coll__graph.map new file mode 100644 index 00000000..22fb7030 --- /dev/null +++ b/structRETROHTR__RENDER__TREE__coll__graph.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/structRETROHTR__RENDER__TREE__coll__graph.md5 b/structRETROHTR__RENDER__TREE__coll__graph.md5 new file mode 100644 index 00000000..6a19746b --- /dev/null +++ b/structRETROHTR__RENDER__TREE__coll__graph.md5 @@ -0,0 +1 @@ +94f9e9ff79d20d4bb3f53a7e39cb3055 \ No newline at end of file diff --git a/structRETROHTR__RENDER__TREE__coll__graph.png b/structRETROHTR__RENDER__TREE__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..44a86c31479dcc840c24528d01ea67f57b2f0fe4 GIT binary patch literal 18434 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 + + + + + + +maug: RETROSND_STATE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROSND_STATE Struct Reference
    +
    +
    + +

    Internal retrosound state struct. Most fields are platform-specific. + More...

    + +

    #include <retrosnd.h>

    + + + + + +

    +Data Fields

    +uint8_t flags
     Bitfield indicating global state with RetroSound State Flags.
     
    +

    Detailed Description

    +

    Internal retrosound state struct. Most fields are platform-specific.

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROTILE.html b/structRETROTILE.html new file mode 100644 index 00000000..cecda97b --- /dev/null +++ b/structRETROTILE.html @@ -0,0 +1,132 @@ + + + + + + + +maug: RETROTILE Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROTILE Struct Reference
    +
    +
    + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint32_t sz
     
    +uint32_t layers_count
     
    +uint32_t layers_offset
     
    +char name [RETROTILE_NAME_SZ_MAX]
     
    +size_t tileset_fgid
     
    +uint8_t tiles_h
     
    +uint8_t tiles_w
     
    +float tile_scale
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROTILE__DATA__BORDER.html b/structRETROTILE__DATA__BORDER.html new file mode 100644 index 00000000..a01d6996 --- /dev/null +++ b/structRETROTILE__DATA__BORDER.html @@ -0,0 +1,121 @@ + + + + + + + +maug: RETROTILE_DATA_BORDER Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROTILE_DATA_BORDER Struct Reference
    +
    +
    + + + + + + + + + + + +

    +Data Fields

    +int16_t tiles_changed
     
    +retrotile_tile_t center
     
    +retrotile_tile_t outside
     
    +retrotile_tile_t mod_to [8]
     If the center and outside match, use this mod-to.
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROTILE__DATA__DS.html b/structRETROTILE__DATA__DS.html new file mode 100644 index 00000000..fc6b76b9 --- /dev/null +++ b/structRETROTILE__DATA__DS.html @@ -0,0 +1,139 @@ + + + + + + + +maug: RETROTILE_DATA_DS Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROTILE_DATA_DS Struct Reference
    +
    +
    + +

    Internal data structure used by retrotile_gen_diamond_square_iter(). + More...

    + +

    #include <retrotil.h>

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

    +Data Fields

    +int16_t sect_x
     Starting X of subsector in a given iteration.
     
    +int16_t sect_y
     Starting Y of subsector in a given iteration.
     
    +int16_t sect_w
     Width of subsector in a given iteration.
     
    +int16_t sect_h
     Height of subsector in a given iteration.
     
    +int16_t sect_w_half
     Half of the width of subsector in a given iteration.
     
    +int16_t sect_h_half
     Half of the height of subsector in a given iteration.
     
    +

    Detailed Description

    +

    Internal data structure used by retrotile_gen_diamond_square_iter().

    +

    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROTILE__LAYER.html b/structRETROTILE__LAYER.html new file mode 100644 index 00000000..1cc2e539 --- /dev/null +++ b/structRETROTILE__LAYER.html @@ -0,0 +1,111 @@ + + + + + + + +maug: RETROTILE_LAYER Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROTILE_LAYER Struct Reference
    +
    +
    + + + + +

    +Data Fields

    +size_t sz
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROTILE__PARSER.html b/structRETROTILE__PARSER.html new file mode 100644 index 00000000..fbe18418 --- /dev/null +++ b/structRETROTILE__PARSER.html @@ -0,0 +1,158 @@ + + + + + + + +maug: RETROTILE_PARSER Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROTILE_PARSER Struct Reference
    +
    +
    +
    +Collaboration diagram for RETROTILE_PARSER:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    +uint8_t mstate
     
    +uint8_t pass
     
    +uint8_t mode
     
    +size_t layer_tile_iter
     
    +size_t pass_layer_iter
     
    +size_t tileset_id_cur
     Highest tileset ID on first pass and next ID to be assigned on second.
     
    +size_t tiles_w
     
    +size_t tiles_h
     
    +struct RETROTILEt
     
    +retrotile_tj_parse_cb tj_parse_cb
     
    +struct MJSON_PARSER jparser
     
    +MAUG_MHANDLE * p_tile_defs_h
     
    +size_t * p_tile_defs_count
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/structRETROTILE__PARSER__coll__graph.map b/structRETROTILE__PARSER__coll__graph.map new file mode 100644 index 00000000..baa52b2c --- /dev/null +++ b/structRETROTILE__PARSER__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/structRETROTILE__PARSER__coll__graph.md5 b/structRETROTILE__PARSER__coll__graph.md5 new file mode 100644 index 00000000..90e26a54 --- /dev/null +++ b/structRETROTILE__PARSER__coll__graph.md5 @@ -0,0 +1 @@ +849e183f16f1135c3bbd4ccde896f03d \ No newline at end of file diff --git a/structRETROTILE__PARSER__coll__graph.png b/structRETROTILE__PARSER__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..b0cf226edae3604c93a8e4044580f5147249a6ff GIT binary patch literal 3377 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 literal 0 HcmV?d00001 diff --git a/structRETROTILE__TILE__DEF.html b/structRETROTILE__TILE__DEF.html new file mode 100644 index 00000000..71dbe90d --- /dev/null +++ b/structRETROTILE__TILE__DEF.html @@ -0,0 +1,114 @@ + + + + + + + +maug: RETROTILE_TILE_DEF Struct Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROTILE_TILE_DEF Struct Reference
    +
    +
    + + + + + + +

    +Data Fields

    +uint8_t flags
     
    +char image_path [RETROTILE_TILESET_IMAGE_STR_SZ_MAX]
     
    +
    The documentation for this struct was generated from the following file: +
    + + +
    + + diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..3b443fc62892114406e3d399421b2a881b897acc GIT binary patch literal 853 zcmV-b1FHOqP)oT|#XixUYy%lpuf3i8{fX!o zUyDD0jOrAiT^tq>fLSOOABs-#u{dV^F$b{L9&!2=9&RmV;;8s^x&UqB$PCj4FdKbh zoB1WTskPUPu05XzFbA}=KZ-GP1fPpAfSs>6AHb12UlR%-i&uOlTpFNS7{jm@mkU1V zh`nrXr~+^lsV-s1dkZOaI|kYyVj3WBpPCY{n~yd%u%e+d=f%`N0FItMPtdgBb@py; zq@v6NVArhyTC7)ULw-Jy8y42S1~4n(3LkrW8mW(F-4oXUP3E`e#g**YyqI7h-J2zK zK{m9##m4ri!7N>CqQqCcnI3hqo1I;Yh&QLNY4T`*ptiQGozK>FF$!$+84Z`xwmeMh zJ0WT+OH$WYFALEaGj2_l+#DC3t7_S`vHpSivNeFbP6+r50cO8iu)`7i%Z4BTPh@_m3Tk!nAm^)5Bqnr%Ov|Baunj#&RPtRuK& z4RGz|D5HNrW83-#ydk}tVKJrNmyYt-sTxLGlJY5nc&Re zU4SgHNPx8~Yxwr$bsju?4q&%T1874xxzq+_%?h8_ofw~(bld=o3iC)LUNR*BY%c0y zWd_jX{Y8`l%z+ol1$@Qa?Cy!(0CVIEeYpKZ`(9{z>3$CIe;pJDQk$m3p}$>xBm4lb zKo{4S)`wdU9Ba9jJbVJ0C=SOefZe%d$8=2r={nu<_^a3~>c#t_U6dye5)JrR(_a^E f@}b6j1K9lwFJq@>o)+Ry00000NkvXXu0mjfWa5j* literal 0 HcmV?d00001 diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 0000000000000000000000000000000000000000..e08320fb64e6fa33b573005ed6d8fe294e19db76 GIT binary patch literal 845 zcmV-T1G4;yP)Y;xxyHF2B5Wzm| zOOGupOTn@c(JmBOl)e;XMNnZuiTJP>rM8<|Q`7I_))aP?*T)ow&n59{}X4$3Goat zgjs?*aasfbrokzG5cT4K=uG`E14xZl@z)F={P0Y^?$4t z>v!teRnNZym<6h{7sLyF1V0HsfEl+l6TrZpsfr1}luH~F7L}ktXu|*uVX^RG$L0`K zWs3j|0tIvVe(N%_?2{(iCPFGf#B6Hjy6o&}D$A%W%jfO8_W%ZO#-mh}EM$LMn7joJ z05dHr!5Y92g+31l<%i1(=L1a1pXX+OYnalY>31V4K}BjyRe3)9n#;-cCVRD_IG1fT zOKGeNY8q;TL@K{dj@D^scf&VCs*-Jb>8b>|`b*osv52-!A?BpbYtTQBns5EAU**$m zSnVSm(teh>tQi*S*A>#ySc=n;`BHz`DuG4&g4Kf8lLhca+zvZ7t7RflD6-i-mcK=M z!=^P$*u2)bkY5asG4gsss!Hn%u~>}kIW`vMs%lJLH+u*9<4PaV_c6U`KqWXQH%+Nu zTv41O(^ZVi@qhjQdG!fbZw&y+2o!iYymO^?ud3{P*HdoX83YV*Uu_HB=?U&W9%AU# z80}k1SS-CXTU7dcQlsm<^oYLxVSseqY6NO}dc`Nj?8vrhNuCdm@^{a3AQ_>6myOj+ z`1RsLUXF|dm|3k7s2jD(B{rzE>WI2scH8i1;=O5Cc9xB3^aJk%fQjqsu+kH#0=_5a z0nCE8@dbQa-|YIuUVvG0L_IwHMEhOj$Mj4Uq05 X8=0q~qBNan00000NkvXXu0mjfptF>5 literal 0 HcmV?d00001 diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..3b725c41c5a527a3a3e40097077d0e206a681247 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QlXwMjv*C{Z|8b*H5dputLHD# z=<0|*y7z(Vor?d;H&?EG&cXR}?!j-Lm&u1OOI7AIF5&c)RFE;&p0MYK>*Kl@eiymD r@|NpwKX@^z+;{u_Z~trSBfrMKa%3`zocFjEXaR$#tDnm{r-UW|TZ1%4 literal 0 HcmV?d00001 diff --git a/tab_ad.png b/tab_ad.png new file mode 100644 index 0000000000000000000000000000000000000000..e34850acfc24be58da6d2fd1ccc6b29cc84fe34d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QhuH;jv*C{Z|5d*H3V=pKi{In zd2jxLclDRPylmD}^l7{QOtL{vUjO{-WqItb5sQp2h-99b8^^Scr-=2mblCdZuUm?4 jzOJvgvt3{(cjKLW5(A@0qPS@<&}0TrS3j3^P6y&q2{!U5bk+Tso_B!YCpDh>v z{CM*1U8YvQRyBUHt^Ju0W_sq-?;9@_4equ-bavTs=gk796zopr0EBT&m;e9( literal 0 HcmV?d00001 diff --git a/tab_s.png b/tab_s.png new file mode 100644 index 0000000000000000000000000000000000000000..ab478c95b67371d700a20869f7de1ddd73522d50 GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QuUrLjv*C{Z|^p8HaRdjTwH7) zC?wLlL}}I{)n%R&r+1}IGmDnq;&J#%V6)9VsYhS`O^BVBQlxOUep0c$RENLq#g8A$ z)z7%K_bI&n@J+X_=x}fJoEKed-$<>=ZI-;YrdjIl`U`uzuDWSP?o#Dmo{%SgM#oan kX~E1%D-|#H#QbHoIja2U-MgvsK&LQxy85}Sb4q9e0Efg%P5=M^ literal 0 HcmV?d00001 diff --git a/tab_sd.png b/tab_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..757a565ced4730f85c833fb2547d8e199ae68f19 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qq7(&jv*C{Z|_!fH5o7*c=%9% zcILh!EA=pAQKdx-Cdiev=v{eg{8Ht<{e8_NAN~b=)%W>-WDCE0PyDHGemi$BoXwcK z{>e9^za6*c1ilttWw&V+U;WCPlV9{LdC~Ey%_H(qj`xgfES(4Yz5jSTZfCt`4E$0YRsR*S^mTCR^;V&sxC8{l_Cp7w8-YPgg&ebxsLQ00$vXK>z>% literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css new file mode 100644 index 00000000..fe4854aa --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file diff --git a/todo.html b/todo.html new file mode 100644 index 00000000..e02796e6 --- /dev/null +++ b/todo.html @@ -0,0 +1,116 @@ + + + + + + + +maug: Todo List + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    +
    Todo List
    +
    +
    +
    +
    Module maug_retroflt_assets
    +

    This is kind of a mess and needs better integration with the rest!

    +

    +
    +
    Global retroflat_blit_bitmap (struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h)
    +
    Currently s_x, s_y, w, and h are not functional on all platforms!
    +
    Global RETROFLAT_FLAGS_ALL_CAPS
    +
    This has not yet been implemented and is present for backward compatibility.
    +
    Global RETROFLAT_FLAGS_OUTLINE
    +
    This has not yet been implemented and is present for backward compatibility.
    +
    Global RETROFLAT_FPS
    +
    FPS currently has no effect in Allegro.
    +
    Global retroflat_message (uint8_t flags, const char *title, const char *format,...)
    +
    This should display a dialog box on every platform if possible.
    +
    +
    +
    + + +
    + + diff --git a/topics.html b/topics.html new file mode 100644 index 00000000..e1420a93 --- /dev/null +++ b/topics.html @@ -0,0 +1,147 @@ + + + + + + + +maug: Topics + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Topics
    +
    +
    +
    Here is a list of all topics with brief descriptions:
    +
    [detail level 123]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     RetroFlat APIAbstraction layer header for retro systems
     RetroFlat ExampleAn extremely simple single-file annotated example program written with the RetroFlat API
     RetroFlat CompilationMakefile examples and compiler considerations for using RetroFlat
     RetroFlat ColorsColor definitions RetroFlat is aware of, for use with the RetroFlat Drawing API
     RetroFlat API Return ValuesStandardized return values from RetroFlat API functions
     RetroFlat Drawing APIFunctions for drawing primitives on-screen
     RetroFlat ColorsColor definitions RetroFlat is aware of, for use with the RetroFlat Drawing API
     Global FlagsFlags that may be present on RETROFLAT_STATE::retroflat_flags
     RetroFlat Config APITools for loading and saving config data between sessions
     RetroFlat Config Buffer Types
     RetroFlat Config FlagsFlags for the flags parameter of retroflat_config_open()
     RetroFlat Message APIThese flags can be passed to retroflat_message() to indicate the type of message being conveyed
     RetroFlat VDP APIVideo Display Processor tools for modifying display output
     RetroFlat Bitmap APITools for loading bitmaps from disk and drawing them on-screen
     RetroFlat Assets APIFunctions and macros for handling graphical asset files
     RetroFlat Input APIFunctions and constants for polling and interpreting user input
     RetroFlat Key DefinitionsKeyboard and mouse controls RetroFlat is aware of, for use within the RetroFlat Input API
     RetroFont API
     RetroGLU APILibrary of tools for working with RetroFlat and OpenGL
     RetroGLU OBJ Parser
     RetroGLU OBJ Parser States
     RetroGLU Sprites
     RetroGLU Overlay APIConvenience macros for drawing a 2D overlay using transparent textures
     RetroGUI API
     RetroGUI Controls
     Maug Retro Fixed Point
     In-Situ Console API
     RetroSound APIAbstraction layer header for sound on retro systems
     RetroSound State FlagsFlags indicating global state for the RETROSND_STATE::flags field
     Command Line APITools for parsing command line arguments
     RetroFile APIAbstraction layer for dealing with files on retro systems
     RetroFile TypesTypes of files/data stores that mfile can abstract from
     Maug File Format API
     Maug File Format: BitmapConstants and functions describing the Windows bitmap format
     Retro HyperText Rendering API
     Error Handling API
     Return Values
     Micro-PrintF APIIndependently-implemented printf API for old compilers
     Memory Management API
     RetroTile APIFunctions and structures for working with tilemaps/grids
     RetroTile Tile Definitions
     RetroTile Custom Property Types
     RetroTile Parser
     RetroTile GeneratorsTools for procedurally generating tilemaps
    +
    +
    + + +
    + + diff --git a/unionMAUG__FMT__SPEC.html b/unionMAUG__FMT__SPEC.html new file mode 100644 index 00000000..dedf83db --- /dev/null +++ b/unionMAUG__FMT__SPEC.html @@ -0,0 +1,126 @@ + + + + + + + +maug: MAUG_FMT_SPEC Union Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MAUG_FMT_SPEC Union Reference
    +
    +
    + + + + + + + + + + + + + + +

    +Data Fields

    +long int d
     
    +uint32_t u
     
    +char c
     
    +void * p
     
    +char * s
     
    +size_t z
     
    +
    The documentation for this union was generated from the following file: +
    + + +
    + + diff --git a/unionMFILE__HANDLE.html b/unionMFILE__HANDLE.html new file mode 100644 index 00000000..8c9c9516 --- /dev/null +++ b/unionMFILE__HANDLE.html @@ -0,0 +1,114 @@ + + + + + + + +maug: MFILE_HANDLE Union Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MFILE_HANDLE Union Reference
    +
    +
    + + + + + + +

    +Data Fields

    +FILE * file
     
    +MAUG_MHANDLE mem
     
    +
    The documentation for this union was generated from the following file: +
    + + +
    + + diff --git a/unionMHTML__TAG.html b/unionMHTML__TAG.html new file mode 100644 index 00000000..5c5549ed --- /dev/null +++ b/unionMHTML__TAG.html @@ -0,0 +1,121 @@ + + + + + + + +maug: MHTML_TAG Union Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    MHTML_TAG Union Reference
    +
    +
    +
    +Collaboration diagram for MHTML_TAG:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + +

    +Data Fields

    +struct MHTML_TAG_BASE base
     
    +
    The documentation for this union was generated from the following file: +
    + + +
    + + diff --git a/unionMHTML__TAG__coll__graph.map b/unionMHTML__TAG__coll__graph.map new file mode 100644 index 00000000..e33157e3 --- /dev/null +++ b/unionMHTML__TAG__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/unionMHTML__TAG__coll__graph.md5 b/unionMHTML__TAG__coll__graph.md5 new file mode 100644 index 00000000..556e8135 --- /dev/null +++ b/unionMHTML__TAG__coll__graph.md5 @@ -0,0 +1 @@ +ba60734ee8e3715a2106fb369804f5b0 \ No newline at end of file diff --git a/unionMHTML__TAG__coll__graph.png b/unionMHTML__TAG__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e876c8fce513191387a8f9040122d31cb7fdf79b GIT binary patch literal 4481 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 H%{uHq&;(sK literal 0 HcmV?d00001 diff --git a/unionRETROGUI__CTL.html b/unionRETROGUI__CTL.html new file mode 100644 index 00000000..91bdd20a --- /dev/null +++ b/unionRETROGUI__CTL.html @@ -0,0 +1,121 @@ + + + + + + + +maug: RETROGUI_CTL Union Reference + + + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    maug +
    +
    Quick and dirty C mini-augmentation library.
    +
    +
    + + + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    + +
    RETROGUI_CTL Union Reference
    +
    +
    +
    +Collaboration diagram for RETROGUI_CTL:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + +

    +Data Fields

    +struct RETROGUI_CTL_BASE base
     
    +
    The documentation for this union was generated from the following file: +
    + + +
    + + diff --git a/unionRETROGUI__CTL__coll__graph.map b/unionRETROGUI__CTL__coll__graph.map new file mode 100644 index 00000000..734e036d --- /dev/null +++ b/unionRETROGUI__CTL__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/unionRETROGUI__CTL__coll__graph.md5 b/unionRETROGUI__CTL__coll__graph.md5 new file mode 100644 index 00000000..152a8ca3 --- /dev/null +++ b/unionRETROGUI__CTL__coll__graph.md5 @@ -0,0 +1 @@ +955b15e28b511eece0135c29875cc1e8 \ No newline at end of file diff --git a/unionRETROGUI__CTL__coll__graph.png b/unionRETROGUI__CTL__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..8e371b871dabfcc9d74b9c0f4a0c3744bdf2a9a9 GIT binary patch literal 5389 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 z + + + + + + +maug: uprintf.h File Reference + + + + + + + + + + + + + + +
      +
      + + + + + + +
      +
      maug +
      +
      Quick and dirty C mini-augmentation library.
      +
      +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      + +
      uprintf.h File Reference
      +
      +
      +
      #include <mtypes.h>
      +#include <stdio.h>
      +#include <stdarg.h>
      +#include <mlegacy.h>
      +
      +Include dependency graph for uprintf.h:
      +
      +
      + + + + + + + + + + + +
      +
      +This graph shows which files directly or indirectly include this file:
      +
      +
      + + + + + +
      +
      +

      Go to the source code of this file.

      + + + + +

      +Data Structures

      union  MAUG_FMT_SPEC
       
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      +Macros

      +#define NEWLINE_STR   "\n"
       
      +#define UPRINTF_BUFFER_SZ_MAX   1024
       
      +#define platform_file   FILE*
       
      +#define platform_fprintf   fprintf
       
      +#define platform_vfprintf   vfprintf
       
      +#define platform_fopen   fopen
       
      +#define platform_fflush   fflush
       
      +#define platform_fclose   fclose
       
      +#define LOG_ERR_TARGET   stderr
       
      +#define LOG_STD_TARGET   stdout
       
      +#define SIZE_T_FMT   "%u"
       
      +#define SSIZE_T_FMT   "%d"
       
      +#define OFF_T_FMT   "%lu"
       
      +#define DEBUG_THRESHOLD   1
       
      +#define debug_printf(...)
       
      +#define error_printf(...)
       
      +#define size_printf(...)
       
      +#define size_multi_printf(...)
       
      +#define logging_init()
       
      +#define logging_shutdown()
       
      #define maug_bufcat(c, buf, buf_idx, buf_sz, cleanup)
       
      #define maug_bufpad(pad_c, pad_sz, i, buf, buf_idx, buf_sz, cleanup)
       
      #define maug_xtoa(num, base, rem, dest, dest_idx, digits, digits_done, pad)
       
      +#define maug_hctoi(c)    ('9' > (c) ? (c) - '0' : 'a' > (c) ? 10 + (c) - 'A' : 10 + (c) - 'a')
       Convert a single char hex digit to the int it represents.
       
      + + + + + + + + + + + + + + + + + +

      +Functions

      +int maug_digits (long int num, int base)
       
      +int maug_zdigits (size_t num, int base)
       
      +int maug_itoa (long int num, char *dest, int dest_sz, int base)
       
      +int maug_utoa (uint32_t num, char *dest, int dest_sz, int base)
       
      +int maug_ztoa (size_t num, char *dest, int dest_sz, int base)
       
      +void maug_vsnprintf (char *buffer, int buffer_sz, const char *fmt, va_list vargs)
       
      +void maug_snprintf (char *buffer, int buffer_sz, const char *fmt,...)
       
      +void maug_printf (const char *fmt,...)
       
      + + + +

      +Variables

      +uint32_t g_maug_printf_line
       
      +
      + + +
      + + diff --git a/uprintf_8h__dep__incl.map b/uprintf_8h__dep__incl.map new file mode 100644 index 00000000..ace8dde7 --- /dev/null +++ b/uprintf_8h__dep__incl.map @@ -0,0 +1,5 @@ + + + + + diff --git a/uprintf_8h__dep__incl.md5 b/uprintf_8h__dep__incl.md5 new file mode 100644 index 00000000..013577ad --- /dev/null +++ b/uprintf_8h__dep__incl.md5 @@ -0,0 +1 @@ +ace40642652c5ed6154c08e7835fc7b0 \ No newline at end of file diff --git a/uprintf_8h__dep__incl.png b/uprintf_8h__dep__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..9250018c74c833ae944a7fe228a44895d4974b02 GIT binary patch literal 2533 zcmb_ec{tQtA0I{bkP0!mbF*AB3`%xgl*m#@im^3JT#bw+gUlscT4=^Lmci>qwiv_M z$-ZPPg-F8;CWc0gop68sci;ct=X}rkp65KzIp=#m&vQPX&+}W>X2JsJ1VA8=u=x#B zTOeBl9mRJ77@wbzzX+rg9yiTQK}Ww@ZgUYH1me#yH~rH-B#WI5w{*U9{yi4ymJ1Vt z@yzEBE63mp3*8{J@rRd-OBKpT;*4uhBX9xx2Od>VVcot_EBU0S5QwAtqmr6}MbN8A z2icMlEoIHk3k4{CdjZO@G4GObQTSJ~NR3^rl%c-R0G&7^xJ?{7I$#n5>eIqRaz`Fs z!n$mCW(GW=IGvoMtL5cDIxar-}Q*Sf-3g)b@ zFBoKW{oTP>%|zX&Yad>E=%4WKh<;foeFatNH)B}PaQB@vgWmQm%OGt0VsmY6+LM{5 zS40`Rq8hW73gRRZiLC78>S}{T79o#z*5>#ib=%Wn&HeQ>l&-GsF{#41BryqbaT9a% zzOsG_g`xq2(I;C&HJnivZ&>*@ag>g{N%JW zJdt?vDgq%#rBY8zNX((@LpI0mnp;_Io(lzabaW&qC%cg+d#TheR^Z1^pG^Mzlgo=N zl}U~5@@VrQg|PRRTkGo5cXmS10RjHnG8-Ekuqm<2XVwjSp!cdeF9^GhmD~XqLpZi} zb_e5RM-`Udh$fNLE1G(HZ@BF} z;}cvbM5OT9>){FHy7+j$6TG~vA3u0=%gd<&*SREP+n$Rnf+VG-^Xuygm;V|csB!A< z=_wirsCTZTt>|p4g9C_jI6S_uua5y>EC+?Yij3r{$ddwtscNl1+ok=QBB$8hUSv|h zf;Dh<%D$z!Ib$x-s2e6EARrLVnF(EnQcyGt2ZvO&tR`c9v8lSc`Uao>MxuUivMqX- z;~5(lXKrCJ`;D5}+1dH{U@u7d;zi6pyOy=Q{J_`u<@`J%TJ&o}&Fud*<28 zn2@&P8L>&HknaO*ttAVeNS%oS3!Wdo6g}|6-xK;#KjM`kw_Wp9^jxE-xSp86Lh=2DrN&Ur~^nc>bHTidWd6CQyY2sk;t1%yDX+=v0rKy9#H&KPe-+SzDW4QZ^XDouY z*;75s6|IA-t1u-cB_i|u!pA~oLDhGytvOD$D5cNv8lO8?r|dlkXJt_13T*Z|KeC@YoWtM}f zsi|kZ$&>TrO%}=zq zx6iN88kux@u71F`m(`9c#87e`P{OYYthP=kwI9<#i3VGefZ!mINOIUV>Xf)R z<{JSyL3+R|8?nQ98N?3O6EWBj_4M?Vlb643Z{JCIG^HJ~nv3=|=G$7K-SqWUk=F8c zV}GgH*xXdAeG>O~xIubS(p6*QV<0dX4CvTi*&of1rYKU&!9hWovy#mw!NFQa2OD^_ z@AlUKk=wU#6A!LJ-^z&kdyyx}**IK#D%9z1dGkKQ)yXOI?yB7w9FW8!>ugTHpP%3M z{kuDf9val4O*MKsYNjQ-uu$Q(j84=C=IkdMBTrgG5V21t9lbUWfSU@?Fzz_-Nf-?F zUNI-Uo%EpR4^<-OcE$5Y5gQ|BSw`516<$qYE{QY(!Q8~;_>ZRblPnhN`y@H8q(u3A z#LiX~Bqk=NiPL}4-oasS6i)Ks=}D9=s;a_mYy>JRD{F`EzyMG1X-lV`n&uioz$@CE z*c)z2M>APVOG_Ab2sru + + + + + + + + + + diff --git a/uprintf_8h__incl.md5 b/uprintf_8h__incl.md5 new file mode 100644 index 00000000..cde4790d --- /dev/null +++ b/uprintf_8h__incl.md5 @@ -0,0 +1 @@ +fd737c927886bc7464508b7ffaaf7d2e \ No newline at end of file diff --git a/uprintf_8h__incl.png b/uprintf_8h__incl.png new file mode 100644 index 0000000000000000000000000000000000000000..646ef7608a8782cae3c6850831eec2ba12097074 GIT binary patch literal 8582 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 IsQ%ag03fMB?f?J) literal 0 HcmV?d00001 diff --git a/uprintf_8h_source.html b/uprintf_8h_source.html new file mode 100644 index 00000000..06330338 --- /dev/null +++ b/uprintf_8h_source.html @@ -0,0 +1,758 @@ + + + + + + + +maug: uprintf.h Source File + + + + + + + + + + + + + + +
      +
      + + + + + + +
      +
      maug +
      +
      Quick and dirty C mini-augmentation library.
      +
      +
      + + + + + + + + + + +
      +
      + + +
      +
      +
      +
      +
      +
      Loading...
      +
      Searching...
      +
      No Matches
      +
      +
      +
      +
      + + +
      +
      +
      +
      uprintf.h
      +
      +
      +Go to the documentation of this file.
      1
      +
      2#ifndef UPRINTF_H
      +
      3#define UPRINTF_H
      +
      4
      +
      5#include <mtypes.h>
      +
      6
      +
      7#include <stdio.h>
      +
      8#include <stdarg.h>
      +
      9
      +
      10#ifndef MAUG_NO_LEGACY
      +
      11# include <mlegacy.h>
      +
      12#endif /* !MAUG_NO_LEGACY */
      +
      13
      +
      24/* == Autodetection == */
      +
      25
      +
      26#ifndef UPRINTF_S32_FMT
      +
      27# if __LONG_WIDTH__ == 32 || defined( __WATCOMC__ ) || defined( __BORLANDC__ )
      +
      28# define UPRINTF_S32_FMT "%ld"
      +
      29# elif __LONG_WIDTH__ == 64
      +
      30# define UPRINTF_S32_FMT "%d"
      +
      31# endif /* __LONG_WIDTH__ */
      +
      32#endif /* !UPRINTF_S32_FMT */
      +
      33
      +
      34#ifndef UPRINTF_U32_FMT
      +
      35# if __LONG_WIDTH__ == 32 || defined( __WATCOMC__ ) || defined( __BORLANDC__ )
      +
      36# define UPRINTF_U32_FMT "%lu"
      +
      37# elif __LONG_WIDTH__ == 64
      +
      38# define UPRINTF_U32_FMT "%u"
      +
      39# endif /* __LONG_WIDTH__ */
      +
      40#endif /* !UPRINTF_U32_FMT */
      +
      41
      +
      42#ifndef UPRINTF_X32_FMT
      +
      43# if __LONG_WIDTH__ == 32 || defined( __WATCOMC__ ) || defined( __BORLANDC__ )
      +
      44# define UPRINTF_X32_FMT "%lx"
      +
      45# elif __LONG_WIDTH__ == 64
      +
      46# define UPRINTF_X32_FMT "%x"
      +
      47# endif /* __LONG_WIDTH__ */
      +
      48#endif /* !UPRINTF_X32_FMT */
      +
      49
      +
      50#ifndef NEWLINE_STR
      +
      51/* TODO: Autodetect. */
      +
      52#define NEWLINE_STR "\n"
      +
      53#endif /* !NEWLINE_STR */
      +
      54
      +
      55/* == Manual Config == */
      +
      56
      +
      57#ifndef UPRINTF_BUFFER_SZ_MAX
      +
      58# define UPRINTF_BUFFER_SZ_MAX 1024
      +
      59#endif /* !UPRINTF_BUFFER_SZ_MAX */
      +
      60
      +
      61#ifndef platform_file
      +
      62# define platform_file FILE*
      +
      63#endif /* !platform_file */
      +
      64
      +
      65#ifndef platform_fprintf
      +
      66# define platform_fprintf fprintf
      +
      67#endif /* !platform_fprintf */
      +
      68
      +
      69#ifndef platform_vfprintf
      +
      70# define platform_vfprintf vfprintf
      +
      71#endif /* !platform_vfprintf */
      +
      72
      +
      73#ifndef platform_fopen
      +
      74# define platform_fopen fopen
      +
      75#endif /* !platform_fopen */
      +
      76
      +
      77#ifndef platform_fflush
      +
      78# define platform_fflush fflush
      +
      79#endif /* !platform_fflush */
      +
      80
      +
      81#ifndef platform_fclose
      +
      82# define platform_fclose fclose
      +
      83#endif /* !platform_fclose */
      +
      84
      +
      85#ifdef LOG_TO_FILE
      +
      86# ifndef UPRINTF_LOG
      +
      87# define UPRINTF_LOG
      +
      88# endif /* !UPRINTF_LOG */
      +
      89# define LOG_ERR_TARGET g_log_file
      +
      90# define LOG_STD_TARGET g_log_file
      +
      91#else
      +
      92# define LOG_ERR_TARGET stderr
      +
      93# define LOG_STD_TARGET stdout
      +
      94#endif /* LOG_TO_FILE */
      +
      95
      +
      96#ifdef __GNUC__
      +
      97# ifdef _WIN64 /* __SIZE_WIDTH__ == 64 */
      +
      98# define SIZE_T_FMT "%I64u"
      +
      99# define SSIZE_T_FMT "%I64d"
      +
      100# define OFF_T_FMT "%I64d"
      +
      101# else
      +
      102# define SIZE_T_FMT "%lu"
      +
      103# define SSIZE_T_FMT "%ld"
      +
      104# define OFF_T_FMT "%lu"
      +
      105# endif /* __LONG_WIDTH__ */
      +
      106#else
      +
      107# define SIZE_T_FMT "%u"
      +
      108# define SSIZE_T_FMT "%d"
      +
      109# define OFF_T_FMT "%lu"
      +
      110#endif /* __GNUC__ */
      +
      111
      +
      112#if !defined( DEBUG_THRESHOLD )
      +
      113# define DEBUG_THRESHOLD 1
      +
      114#endif /* !DEBUG_THRESHOLD */
      +
      115
      +
      + +
      117 long int d;
      +
      118 uint32_t u;
      +
      119 char c;
      +
      120 void* p;
      +
      121 char* s;
      +
      122#ifndef UPRINTF_NO_SIZET
      +
      123 size_t z;
      +
      124#endif /* !UPRINTF_NO_SIZET */
      +
      125};
      +
      +
      126
      +
      127#if defined( MAUG_OS_NDS )
      +
      128
      +
      129/* TODO: Figure out a way to get the calling line number for a function. */
      +
      130
      +
      131static void debug_printf( int level, const char* fmt, ... ) {
      +
      132 va_list argp;
      +
      133 char buffer[UPRINTF_BUFFER_SZ_MAX + 1];
      +
      134
      +
      135 if( level >= DEBUG_THRESHOLD ) {
      +
      136 va_start( argp, fmt );
      +
      137 vsnprintf( buffer, UPRINTF_BUFFER_SZ_MAX, fmt, argp );
      +
      138 va_end( argp );
      +
      139 nocashMessage( buffer );
      +
      140 nocashMessage( "\n" );
      +
      141 }
      +
      142}
      +
      143
      +
      144static void error_printf( const char* fmt, ... ) {
      +
      145 va_list argp;
      +
      146 char buffer[UPRINTF_BUFFER_SZ_MAX + 1];
      +
      147
      +
      148 va_start( argp, fmt );
      +
      149 vsnprintf( buffer, UPRINTF_BUFFER_SZ_MAX, fmt, argp );
      +
      150 va_end( argp );
      +
      151
      +
      152 nocashMessage( buffer );
      +
      153 nocashMessage( "\n" );
      +
      154}
      +
      155
      +
      156/* ! */
      +
      157#elif defined( UPRINTF_ANCIENT_C )
      +
      158/* ! */
      +
      159
      +
      160/* TODO: Figure out a way to get the calling line number for a function. */
      +
      161
      +
      162static void debug_printf( int level, const char* fmt, ... ) {
      +
      163 va_list argp;
      +
      164
      +
      165 if( level >= DEBUG_THRESHOLD ) {
      +
      166 va_start( argp, fmt );
      +
      167 vprintf( fmt, argp );
      +
      168 va_end( argp );
      +
      169 printf( "\n" );
      +
      170 }
      +
      171}
      +
      172
      +
      173static void error_printf( const char* fmt, ... ) {
      +
      174 va_list argp;
      +
      175
      +
      176 va_start( argp, fmt );
      +
      177 vprintf( fmt, argp );
      +
      178 va_end( argp );
      +
      179 printf( "\n" );
      +
      180}
      +
      181
      +
      182# define size_printf( lvl, name, sz ) debug_printf( lvl, name " size is " SIZE_T_FMT " bytes", (sz) );
      +
      183
      +
      184# define size_multi_printf( lvl, name, sz, max ) debug_printf( lvl, "single " name " size is " SIZE_T_FMT " bytes, " name " array size is " SIZE_T_FMT " bytes", (sz), ((sz) * (max)) );
      +
      185
      +
      186/* ! */
      +
      187#elif defined( UPRINTF_LOG )
      +
      188/* ! */
      +
      189
      +
      190# ifdef NO_DEBUG_LINE_NUMBER
      +
      191# define LINE_NUMBER() 0
      +
      192# else
      +
      193# define LINE_NUMBER() __LINE__
      +
      194# endif
      +
      195
      +
      196# define internal_debug_printf( lvl, ... ) if( NULL != LOG_ERR_TARGET && lvl >= DEBUG_THRESHOLD ) { platform_fprintf( LOG_STD_TARGET, "(%d) " __FILE__ ": %d: ", lvl, LINE_NUMBER() ); platform_fprintf( LOG_STD_TARGET, __VA_ARGS__ ); platform_fprintf( LOG_STD_TARGET, NEWLINE_STR ); platform_fflush( LOG_STD_TARGET ); }
      +
      197
      +
      198# define internal_error_printf( ... ) if( NULL != LOG_ERR_TARGET ) { platform_fprintf( LOG_ERR_TARGET, "(E) " __FILE__ ": %d: ", LINE_NUMBER() ); platform_fprintf( LOG_ERR_TARGET, __VA_ARGS__ ); platform_fprintf( LOG_ERR_TARGET, NEWLINE_STR ); platform_fflush( LOG_ERR_TARGET ); }
      +
      199
      +
      200# define debug_printf( lvl, ... ) internal_debug_printf( lvl, __VA_ARGS__ )
      +
      201
      +
      202# define error_printf( ... ) internal_error_printf( __VA_ARGS__ )
      +
      203
      +
      204# define size_printf( lvl, name, sz ) internal_debug_printf( lvl, name " size is " SIZE_T_FMT " bytes", (sz) );
      +
      205
      +
      206# define size_multi_printf( lvl, name, sz, max ) internal_debug_printf( lvl, "single " name " size is " SIZE_T_FMT " bytes, " name " array size is " SIZE_T_FMT " bytes", (sz), ((sz) * (max)) );
      +
      207
      +
      208/* ! */
      +
      209#else /* !UPRINTF_LOG, !UPRINTF_ANCIENT_C */
      +
      210/* ! */
      +
      211
      +
      212/* TODO: Stub these without vargarg macros. */
      +
      213
      +
      214# define debug_printf( ... )
      +
      215# define error_printf( ... )
      +
      216# define size_printf( ... )
      +
      217# define size_multi_printf( ... )
      +
      218
      +
      219/* ! */
      +
      220#endif /* UPRINTF_LOG, UPRINTF_ANCIENT_C */
      +
      221/* ! */
      +
      222
      +
      223#ifdef LOG_TO_FILE
      +
      224
      +
      225# define logging_init() g_log_file = platform_fopen( LOG_FILE_NAME, "w" );
      +
      226# define logging_shutdown() platform_fclose( g_log_file );
      +
      227
      +
      228# if defined( UPRINTF_C )
      +
      229platform_file g_log_file = NULL;
      +
      230# else
      +
      231extern platform_file g_log_file;
      +
      232# endif /* MAIN_C || UPRINTF_C */
      +
      233
      +
      234#else
      +
      235
      +
      236# define logging_init()
      +
      237# define logging_shutdown()
      +
      238
      +
      239#endif /* LOG_TO_FILE */
      +
      240
      +
      241#define maug_bufcat( c, buf, buf_idx, buf_sz, cleanup ) \
      +
      242 buf[buf_idx++] = c; \
      +
      243 if( buf_idx >= buf_sz ) { goto cleanup; }
      +
      244
      +
      245#define maug_bufpad( pad_c, pad_sz, i, buf, buf_idx, buf_sz, cleanup ) \
      +
      246 i = 0; \
      +
      247 while( i < pad_sz ) { \
      +
      248 maug_bufcat( pad_c, buffer, buffer_idx, buffer_sz, cleanup ); \
      +
      249 i++; \
      +
      250 }
      +
      251
      +
      252int maug_digits( long int num, int base );
      +
      253
      +
      254#ifndef UPRINTF_NO_SIZET
      +
      255int maug_zdigits( size_t num, int base );
      +
      256#endif /* !UPRINTF_NO_SIZET */
      +
      257
      +
      258#define maug_xtoa( num, base, rem, dest, dest_idx, digits, digits_done, pad ) \
      +
      259 dest_idx += digits; \
      +
      260 while( 0 != num ) { \
      +
      261 /* Get the 1's place. */ \
      +
      262 rem = num % base; \
      +
      263 dest[--dest_idx] = (9 < rem) ? \
      +
      264 /* > 10, so it's a letter. */ \
      +
      265 (rem - 10) + 'a' : \
      +
      266 /* < 10, so it's a number. */ \
      +
      267 rem + '0'; \
      +
      268 /* Move the next place value into range. */ \
      +
      269 num /= base; \
      +
      270 digits_done++; \
      +
      271 } \
      +
      272 while( digits_done < digits ) { \
      +
      273 dest[--dest_idx] = '0'; \
      +
      274 digits_done++; \
      +
      275 }
      +
      276
      +
      +
      280#define maug_hctoi( c ) \
      +
      281 ('9' > (c) ? (c) - '0' : 'a' > (c) ? 10 + (c) - 'A' : 10 + (c) - 'a')
      +
      +
      282
      +
      283int maug_itoa( long int num, char* dest, int dest_sz, int base );
      +
      284
      +
      285int maug_utoa( uint32_t num, char* dest, int dest_sz, int base );
      +
      286
      +
      287#ifndef UPRINTF_NO_SIZET
      +
      288int maug_ztoa( size_t num, char* dest, int dest_sz, int base );
      +
      289#endif /* !UPRINTF_NO_SIZET */
      +
      290
      +
      291void maug_vsnprintf(
      +
      292 char* buffer, int buffer_sz, const char* fmt, va_list vargs );
      +
      293
      +
      294void maug_snprintf( char* buffer, int buffer_sz, const char* fmt, ... );
      +
      295
      +
      296void maug_printf( const char* fmt, ... );
      +
      297
      +
      298/* TODO: void maug_strtou32( const char* str, */
      +
      299
      +
      300#ifdef UPRINTF_C
      +
      301
      +
      302uint32_t g_maug_printf_line = 0;
      +
      303int g_maug_uprintf_threshold = DEBUG_THRESHOLD;
      +
      304
      +
      305int maug_digits( long int num, int base ) {
      +
      306 int digits = 0;
      +
      307 int negative = 0;
      +
      308
      +
      309 if( 0 > num ) {
      +
      310 num *= -1;
      +
      311 negative = 1;
      +
      312 }
      +
      313
      +
      314 while( 0 < num ) {
      +
      315 num /= base;
      +
      316 digits++;
      +
      317 }
      +
      318
      +
      319 if( 0 == digits ) {
      +
      320 digits = 1; /* 0 */
      +
      321 }
      +
      322
      +
      323 if( negative ) {
      +
      324 digits++; /* - symbol */
      +
      325 }
      +
      326
      +
      327 return digits;
      +
      328}
      +
      329
      +
      330/* === */
      +
      331
      +
      332#ifndef UPRINTF_NO_SIZET
      +
      333int maug_zdigits( size_t num, int base ) {
      +
      334 int digits = 0;
      +
      335 int negative = 0;
      +
      336
      +
      337 while( 0 < num ) {
      +
      338 num /= base;
      +
      339 digits++;
      +
      340 }
      +
      341
      +
      342 if( 0 == digits ) {
      +
      343 digits = 1; /* 0 */
      +
      344 }
      +
      345
      +
      346 if( negative ) {
      +
      347 digits++; /* - symbol */
      +
      348 }
      +
      349
      +
      350 return digits;
      +
      351}
      +
      352#endif /* !UPRINTF_NO_SIZET */
      +
      353
      +
      354/* === */
      +
      355
      +
      356int maug_itoa( long int num, char* dest, int dest_sz, int base ) {
      +
      357 long int rem;
      +
      358 int digits;
      +
      359 int digits_done = 0;
      +
      360 int dest_idx = 0;
      +
      361 int negative = 0;
      +
      362
      +
      363 digits = maug_digits( num, base );
      +
      364 assert( (0 == num && 1 == digits) || (0 != num && 0 < digits) );
      +
      365 assert( digits < dest_sz );
      +
      366
      +
      367 /* Handle 0 explicitly, otherwise empty string is printed for 0. */
      +
      368 if( 0 == num ) {
      +
      369 dest[0] = '0';
      +
      370 digits_done++;
      +
      371 } else if( 0 > num ) {
      +
      372 num *= -1;
      +
      373 negative = 1;
      +
      374 }
      +
      375
      +
      376 maug_xtoa( num, base, rem, dest, dest_idx, digits, digits_done, pad );
      +
      377
      +
      378 if( negative ) {
      +
      379 dest[dest_idx] = '-';
      +
      380 }
      +
      381 dest[digits] = '\0';
      +
      382
      +
      383 return digits;
      +
      384}
      +
      385
      +
      386/* === */
      +
      387
      +
      388/* TODO: Seems to force 16-bit in Borland... why? */
      +
      389int maug_utoa( uint32_t num, char* dest, int dest_sz, int base ) {
      +
      390 uint32_t rem;
      +
      391 int digits;
      +
      392 int digits_done = 0;
      +
      393 int dest_idx = 0;
      +
      394
      +
      395 digits = maug_digits( num, base );
      +
      396 assert( (0 == num && 1 == digits) || (0 != num && 0 < digits) );
      +
      397 assert( digits < dest_sz );
      +
      398
      +
      399 /* Handle 0 explicitly, otherwise empty string is printed for 0. */
      +
      400 if( 0 == num ) {
      +
      401 dest[0] = '0';
      +
      402 digits_done++;
      +
      403 }
      +
      404
      +
      405 maug_xtoa( num, base, rem, dest, dest_idx, digits, digits_done, pad );
      +
      406 dest[digits] = '\0';
      +
      407
      +
      408 return digits;
      +
      409}
      +
      410
      +
      411/* === */
      +
      412
      +
      413#ifndef UPRINTF_NO_SIZET
      +
      414int maug_ztoa( size_t num, char* dest, int dest_sz, int base ) {
      +
      415 size_t rem;
      +
      416 int digits;
      +
      417 int digits_done = 0;
      +
      418 int dest_idx = 0;
      +
      419
      +
      420 digits = maug_zdigits( num, base );
      +
      421 assert( (0 == num && 1 == digits) || (0 != num && 0 < digits) );
      +
      422 assert( digits < dest_sz );
      +
      423
      +
      424 /* Handle 0 explicitly, otherwise empty string is printed for 0. */
      +
      425 if( 0 == num ) {
      +
      426 dest[0] = '0';
      +
      427 digits_done++;
      +
      428 }
      +
      429
      +
      430 maug_xtoa( num, base, rem, dest, dest_idx, digits, digits_done, pad );
      +
      431 dest[digits] = '\0';
      +
      432
      +
      433 return digits;
      +
      434}
      +
      435#endif /* !UPRINTF_NO_SIZET */
      +
      436
      +
      437/* === */
      +
      438
      +
      439void maug_vsnprintf(
      +
      440 char* buffer, int buffer_sz, const char* fmt, va_list vargs
      +
      441) {
      +
      442 int i = 0, j = 0;
      +
      443 char last = '\0';
      +
      444 union MAUG_FMT_SPEC spec;
      +
      445 int pad_len = 0;
      +
      446 char c;
      +
      447 char pad_char = ' ';
      +
      448 int buffer_idx = 0;
      +
      449 int spec_is_long = 0;
      +
      450
      +
      451 for( i = 0 ; '\0' != fmt[i] ; i++ ) {
      +
      452 c = fmt[i]; /* Separate so we can play tricks below. */
      +
      453
      +
      454 if( '%' == last ) {
      +
      455 /* Conversion specifier encountered. */
      +
      456 switch( fmt[i] ) {
      +
      457 case 'l':
      +
      458 spec_is_long = 1;
      +
      459 /* Skip resetting the last char. */
      +
      460 continue;
      +
      461
      +
      462 case 's':
      +
      463 spec.s = va_arg( vargs, char* );
      +
      464
      +
      465 /* Print string. */
      +
      466 j = 0;
      +
      467 while( '\0' != spec.s[j] ) {
      +
      468 maug_bufcat( spec.s[j++], buffer, buffer_idx,
      +
      469 buffer_sz, cleanup );
      +
      470 }
      +
      471 break;
      +
      472
      +
      473 case 'u':
      +
      474 if( spec_is_long ) {
      +
      475 spec.u = va_arg( vargs, uint32_t );
      +
      476 } else {
      +
      477 spec.u = va_arg( vargs, unsigned int );
      +
      478 }
      +
      479
      +
      480 /* Print padding. */
      +
      481 pad_len -= maug_digits( spec.d, 10 );
      +
      482 maug_bufpad( pad_char, pad_len, j,
      +
      483 buffer, buffer_idx, buffer_sz, cleanup );
      +
      484
      +
      485 /* Print number. */
      +
      486 buffer_idx += maug_utoa(
      +
      487 spec.d, &(buffer[buffer_idx]), buffer_sz - buffer_idx, 10 );
      +
      488 break;
      +
      489
      +
      490 case 'd':
      +
      491 if( spec_is_long ) {
      +
      492 spec.d = va_arg( vargs, long int );
      +
      493 } else {
      +
      494 spec.d = va_arg( vargs, int );
      +
      495 }
      +
      496
      +
      497 /* Print padding. */
      +
      498 pad_len -= maug_digits( spec.d, 10 );
      +
      499 maug_bufpad( pad_char, pad_len, j,
      +
      500 buffer, buffer_idx, buffer_sz, cleanup );
      +
      501
      +
      502 /* Print number. */
      +
      503 buffer_idx += maug_itoa(
      +
      504 spec.d, &(buffer[buffer_idx]), buffer_sz - buffer_idx, 10 );
      +
      505 break;
      +
      506
      +
      507#ifndef UPRINTF_NO_SIZET
      +
      508 case 'z':
      +
      509 spec.z = va_arg( vargs, size_t );
      +
      510
      +
      511 /* Print padding. */
      +
      512 pad_len -= maug_zdigits( spec.z, 10 );
      +
      513 maug_bufpad( pad_char, pad_len, j,
      +
      514 buffer, buffer_idx, buffer_sz, cleanup );
      +
      515
      +
      516 /* Print number. */
      +
      517 buffer_idx += maug_ztoa(
      +
      518 spec.z, &(buffer[buffer_idx]), buffer_sz - buffer_idx, 10 );
      +
      519 break;
      +
      520#endif /* !UPRINTF_NO_SIZET */
      +
      521
      +
      522 case 'x':
      +
      523 spec.d = va_arg( vargs, int );
      +
      524
      +
      525 /* Print padding. */
      +
      526 pad_len -= maug_digits( spec.d, 16 );
      +
      527 maug_bufpad( pad_char, pad_len, j,
      +
      528 buffer, buffer_idx, buffer_sz, cleanup );
      +
      529
      +
      530 /* Print number. */
      +
      531 buffer_idx += maug_utoa(
      +
      532 spec.d, &(buffer[buffer_idx]), buffer_sz - buffer_idx, 16 );
      +
      533 break;
      +
      534
      +
      535 case 'c':
      +
      536 spec.c = va_arg( vargs, int );
      +
      537
      +
      538 /* Print padding. */
      +
      539 pad_len -= 1;
      +
      540 maug_bufpad( pad_char, pad_len, j,
      +
      541 buffer, buffer_idx, buffer_sz, cleanup );
      +
      542
      +
      543 /* Print char. */
      +
      544 maug_bufcat( spec.c, buffer, buffer_idx,
      +
      545 buffer_sz, cleanup );
      +
      546 break;
      +
      547
      +
      548 case '%':
      +
      549 /* Literal % */
      +
      550 last = '\0';
      +
      551 maug_bufcat( '%', buffer, buffer_idx, buffer_sz, cleanup );
      +
      552 break;
      +
      553
      +
      554 case '0':
      +
      555 /* If we haven't started counting padding with a non-zero number,
      +
      556 * this must be a 0-padding signifier.
      +
      557 */
      +
      558 if( 0 >= pad_len ) {
      +
      559 pad_char = '0';
      +
      560 c = '%';
      +
      561 break;
      +
      562 }
      +
      563 /* If we've already started parsing padding count digits, then
      +
      564 * fall through below as a regular number.
      +
      565 */
      +
      566 case '1':
      +
      567 case '2':
      +
      568 case '3':
      +
      569 case '4':
      +
      570 case '5':
      +
      571 case '6':
      +
      572 case '7':
      +
      573 case '8':
      +
      574 case '9':
      +
      575 /* Handle multi-digit qty padding. */
      +
      576 pad_len *= 10;
      +
      577 pad_len += (c - '0'); /* Convert from char to int. */
      +
      578 c = '%';
      +
      579 break;
      +
      580 }
      +
      581 } else if( '%' != c ) {
      +
      582 pad_char = ' '; /* Reset padding. */
      +
      583 pad_len = 0; /* Reset padding. */
      +
      584 spec_is_long = 0;
      +
      585
      +
      586 /* Print non-escape characters verbatim. */
      +
      587 maug_bufcat( c, buffer, buffer_idx,
      +
      588 buffer_sz, cleanup );
      +
      589 }
      +
      590
      +
      591 last = c;
      +
      592 }
      +
      593
      +
      594 /* Add a terminating null if it'll fit! */
      +
      595 maug_bufcat( '\0', buffer, buffer_idx,
      +
      596 buffer_sz, cleanup );
      +
      597
      +
      598cleanup:
      +
      599 return;
      +
      600}
      +
      601
      +
      602/* === */
      +
      603
      +
      604void maug_snprintf( char* buffer, int buffer_sz, const char* fmt, ... ) {
      +
      605 va_list vargs;
      +
      606
      +
      607 va_start( vargs, fmt );
      +
      608 maug_vsnprintf( buffer, buffer_sz, fmt, vargs );
      +
      609 va_end( vargs );
      +
      610}
      +
      611
      +
      612/* === */
      +
      613
      +
      614void maug_printf( const char* fmt, ... ) {
      +
      615 char buffer[UPRINTF_BUFFER_SZ_MAX];
      +
      616 va_list vargs;
      +
      617
      +
      618 va_start( vargs, fmt );
      +
      619 maug_vsnprintf( buffer, UPRINTF_BUFFER_SZ_MAX, fmt, vargs );
      +
      620 va_end( vargs );
      +
      621
      +
      622 /* TODO */
      +
      623}
      +
      624
      +
      625/* === */
      +
      626
      +
      627void maug_debug_printf(
      +
      628 FILE* out, uint8_t flags, const char* src_name, size_t line, int16_t lvl,
      +
      629 const char* fmt, ...
      +
      630) {
      +
      631 va_list vargs;
      +
      632
      +
      633 if( NULL == out ) {
      +
      634#ifdef MAUG_LOG_FILE
      +
      635 out = g_log_file;
      +
      636#else
      +
      637 out = stdout;
      +
      638#endif /* MAUG_LOG_FILE */
      +
      639 }
      +
      640
      +
      641 if( lvl >= g_maug_uprintf_threshold ) {
      +
      642 platform_fprintf( out, "(%d) %s : " SIZE_T_FMT ": ",
      +
      643 lvl, src_name, line );
      +
      644
      +
      645 va_start( vargs, fmt );
      +
      646 platform_vfprintf( out, fmt, vargs );
      +
      647 va_end( vargs );
      +
      648
      +
      649 platform_fprintf( out, NEWLINE_STR );
      +
      650 platform_fflush( out );
      +
      651 }
      +
      652}
      +
      653
      +
      654#else
      +
      655
      +
      656extern uint32_t g_maug_printf_line;
      +
      657
      +
      658#endif /* UPRINTF_C */
      +
      659
      +
      660 /* maug_uprintf */
      +
      661
      +
      662#endif /* !UPRINTF_H */
      +
      663
      +
      Definition uprintf.h:116
      +
      + + +
      + +
  • + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    + +
    RetroFlat Assets API
    +
    +
    + +

    Functions and macros for handling graphical asset files. +More...

    +
    +Collaboration diagram for RetroFlat Assets API:
    +
    +
    + + + + +
    + + + + + +

    +Macros

    +#define retroflat_cmp_asset_path(a, b)   strncmp( a, b, RETROFLAT_PATH_MAX )
     Compare two asset paths. Return 0 if they're the same.
     
    + + + + +

    +Typedefs

    +typedef char retroflat_asset_path[RETROFLAT_PATH_MAX]
     Path/name used to load an asset from disk.
     
    +

    Detailed Description

    +

    Functions and macros for handling graphical asset files.

    +
    Todo
    This is kind of a mess and needs better integration with the rest!
    +
    + + +