From 6bb3691d4f4c3740efd91a1e1382961cae858864 Mon Sep 17 00:00:00 2001 From: indigoparadox Date: Tue, 4 Jun 2024 03:12:41 +0000 Subject: [PATCH] deploy: eb2e76ca8e3f998286fc129003a0635fcf61c29e --- .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 | 459 ++ 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 | 211 + globals_defs.html | 172 + globals_func.html | 126 + globals_type.html | 109 + 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 | 315 + 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 | 288 + 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 | 421 + group__maug__retroflt.map | 14 + group__maug__retroflt.md5 | 1 + group__maug__retroflt.png | Bin 0 -> 36128 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 | 297 + group__maug__retroflt__compiling.map | 4 + group__maug__retroflt__compiling.md5 | 1 + group__maug__retroflt__compiling.png | Bin 0 -> 3816 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 | 355 + group__maug__retrogui.map | 4 + group__maug__retrogui.md5 | 1 + group__maug__retrogui.png | Bin 0 -> 3927 bytes group__maug__retrogui__ctl.html | 193 + 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 | 391 + 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 | 76 + merror_8h.html | 189 + 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 | 187 + mfile_8h.html | 199 + 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 | 684 ++ 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 | 878 +++ 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 | 709 ++ retroflt_8h__incl.map | 21 + retroflt_8h__incl.md5 | 1 + retroflt_8h__incl.png | Bin 0 -> 19440 bytes retroflt_8h_source.html | 6765 +++++++++++++++++ retrofnt_8h.html | 145 + retrofnt_8h_source.html | 535 ++ retrofp_8h.html | 145 + retrofp_8h_source.html | 296 + retroglu_8h.html | 408 + retroglu_8h_source.html | 1642 ++++ retrogui_8h.html | 233 + retrogui_8h_source.html | 1699 +++++ retrogxc_8h_source.html | 638 ++ retrohtr_8h.html | 189 + retrohtr_8h_source.html | 1653 ++++ 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 | 7 + 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 | 13 + 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 | 171 + 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 | 34 + search/groups_0.js | 6 + search/groups_1.js | 5 + search/groups_10.js | 5 + search/groups_11.js | 5 + search/groups_2.js | 9 + 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 | 36 + 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 | 9 + 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 | 147 + structMFILE__CADDY__coll__graph.map | 6 + structMFILE__CADDY__coll__graph.md5 | 1 + structMFILE__CADDY__coll__graph.png | Bin 0 -> 6027 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 | 181 + 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 | 144 + 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 ++ 418 files changed, 47655 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__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..68c10457 --- /dev/null +++ b/doxygen_crawl.html @@ -0,0 +1,459 @@ + + + +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..8d788e9a --- /dev/null +++ b/globals.html @@ -0,0 +1,211 @@ + + + + + + + +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..a9bcc8cd --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,172 @@ + + + + + + + +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..be52168c --- /dev/null +++ b/globals_func.html @@ -0,0 +1,126 @@ + + + + + + + +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:
+
+ + +
+ + diff --git a/globals_type.html b/globals_type.html new file mode 100644 index 00000000..b275ed8a --- /dev/null +++ b/globals_type.html @@ -0,0 +1,109 @@ + + + + + + + +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..e97714d7 --- /dev/null +++ b/group__maug__error.html @@ -0,0 +1,315 @@ + + + + + + + +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_not_null(type, ptr, err)
 
+#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_lock(type, ptr)    maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to lock " #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_null

+ +
+
+ + + + + + + + + + + + + + + + +
#define maug_cleanup_if_not_null( type,
ptr,
err )
+
+Value:
if( (type)NULL == ptr ) { \
+
error_printf( #ptr " is not NULL!" ); \
+
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 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 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..ed0d1488 --- /dev/null +++ b/group__maug__mfile.html @@ -0,0 +1,288 @@ + + + + + + + +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_READ_FLAG_LSBF   0x01
 
+#define mfile_check_lock(p_file)   (NULL != (p_file)->mem_buffer)
 
#define mfile_default_case(p_file)
 
#define mfile_has_bytes(p_file)
 
+#define mfile_get_sz(p_file)   ((p_file)->sz)
 
#define mfile_reset(p_file)
 
+ + + + + + + +

+Typedefs

+typedef MERROR_RETVAL(* mfile_seek_t) (struct MFILE_CADDY *p_file, off_t pos)
 
+typedef MERROR_RETVAL(* mfile_read_int_t) (struct MFILE_CADDY *p_file, uint8_t *buf, size_t buf_sz, uint8_t flags)
 
+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, off_t, 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_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)
+
#define MFILE_CADDY_TYPE_FILE_READ
A standard UNIX file opened for reading.
Definition mfile.h:31
+
+
+
+ +

◆ 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 ); \
+
}
+
#define MFILE_CADDY_TYPE_MEM_BUFFER
An array of bytes in memory abstracted through this library.
Definition mfile.h:36
+
+
+
+

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 zcmY+Hc|6m9;KxUroVjO6Ut#1*u1t}NIdbKWWC)R)T)EFQEJkufNccJzBe!zXOmbh7 z`#wT$e(&$&@%!WV+aB9zf4sNP`*^*cuh(MqbkrDVxo9B}2!n>YiarEFK@UC)T!Mo4 z04k~gaDiGsR8xVR|M&dZkdFf+sWepX8Tw|de|V*Z8$R!_Od2ETF^j_Hqf@TYPT{|^ zg?WnPEM?UC9qWWy#_5g5VtSq2Yulc4EPB~J!f6Qnvd9QnobW9}F+6r)~x4#B|#N|ufe4s@?27L#RuBT1gUi>F(60{1gW$Us`kQ00G^E>ZpOMOR4) z%OPf7B{tE~A(SoJdWi>bDrR3%Q4zf9cxCEsW~Ne8k?f^P2mijy+5**U@rOt6|cYMX?j zrg}-Z^zANn{;z*CB|R6k&Q5l89ma=;VI{^rZ`egSWgQLGBHV6Q#UVWx%F*8_ImFFW zf`XKW%Pj5J#|S(MUY$kq$NQT?w{NFcPx)gUetoVP=&P{TMd)Ox+u0#JYW6Jaty-Wm zTnwTnrMn`H)bx~R7sa60%G27{dl|==d5|6v+_zjtk}pD`Ilq=U75#T@unbIWY^^hG zn6BPlyQAIZh{#C1=c10jfx+@roy74vy(pLHne29O$Q^S^l5|U=2SyNJQ;dU z{e!wcg!3bfo|kcXZ%$4QWuAW52;PQ5GF6L{9{T0Wm%i0K=d|`3&&6_6u~_a~rIUE) z0z(nVfTL_7}e5X5v;*~kMd(}ZCW_>WpGqm`}_N~#L}D= z`j%{~nvAz^nVw0#NSoW3taBQ#io?KeNTHh{#wBKv#znSZGD%5E&F;=TX zCB>%ruzhlH*7|rge@f42?MqQrRaJT(`L}~bCUt|6b%DonbTA2lyLZV}S<;Fn?$gZ_ zGcz-tot@~@qrHIrNgpw@%1+z0rKRT^QwEmk_GaC^9CAM!{daA2ZK4LJis48|N$KcJ z;E#!qUucbC1tTv62M5p0&cbD$zcuGlI-FzuteuWBHGOYUBdwVEpKM$vYukz+SFFtl zA`powDQcRUv_iU>t1j09i-5|9 zw@1>!3JMC)Gp#Z2wGb>UEU#l?_{7EIe&y@3!eD9|8Z>21X9_hnHDZ>H8J|80ba!`m z_Vmp5=RMR)mAY6ls^#P)1~&9lUY`4(ISmw+SKHkkzkAuV&RcxE${A-}H0T)5tEg#X z!+-beAU9mj#NR24O1!J9%c?6;&}(%l?s0`(0uDFZFR6uKeYL+~J5p}7E{FO28DWWr z4rR9TOv9UFkB2wN${uwpz8XeG$p)<6DNScbn4Fwz%f!my^PujY9t};+oYKUa9y1S**5k+U{Y|n@-=dbTmsjQZA}0q&yNP9BTP$4qZO^=+k1uKiKN1NC=j7q(Sy)^wAS*lQuvSnYT;)pcZ4SKvzvaRc85y}Yf)CeD zm-F*uKU0f_w-=Q)YAP#3AmBC~&t*L3I+-iY#Ipkb!hJTU=6~tlZ5tj=0oDbE8U^!r zt>1=mMsHRIQTUx_bMv-x9=i$p@Xtmo@z5awMcJEZEhp0<-#_9WEA@mM#F@I8D_*uGJ;lNdr+OTJ5fn z5A#L;b{v`3#0o{-1eQHHIT4nSushiLeR8rxYHe-(XedJQUMWxkhtQ@hCKE?19av{O zus&RM0IL&?f$41+n6&Q}8WqpewYNHaGo7f9C7Ub!kd%^^j=^H7i?e96g3plt4Vj6F zED{#AD!{5>f&JS+M56cZm5>fDQc+2IE$KC()J0z~NQ+;`}yj;>y zgdGS>$L9F>So+mpC#ACkpk;=HgaiQrfy!~Qj~5thT3<8wM?%%Lv;>5OUjsJg=ohN1 ztD|=oh~6&;9A6eWA08fR1XDwy`uh6T)lI-lyo&z5C4;PrNF?$tm`84%dUvPpfxB zX-1ai(up#1ax6?t(^B4mZ2+Tfz%Pe?Y?ThCFHF7KZ15&^dW|t~Ffl3X=`j%q1OXwT z9blkrJ>l1H-dvNHf1fIC?{T#2uzWy$nYVJRcc9P!>Ax!s2mt{$+L=$WlzO>hSVpMH zr7pG^>+jbGnb8I!@so+azk-lX#`FR){ppM6LVL~j%Ct<3#ZU?KhwJXajhol`z+M7m z{cH*j2JkX6GKz?b0tEg3yCoVKbn?}!c+|;-5EpcM^mAfD>)t&IG*SA4ynC2cOO#(p z&lSauoI%G&!fbPMb4)Op{V?~z@93+a_SIZmBtQv4177IZaL1v5iVI6h1g~8SyKeCL zqn>ar=;E@9XZ7V22BO*Xs4y8 z=Sh5uJ2>#23OaTMx{Ha8{Zv_*6dOx#N6K6$ly1*<)D7713kgL>L{NQiX<6@frYU$3 z&6tpyx=e^?%%L6G-pZQ~##BM;{@s;fW@A$Uv7niknD;Q{iz``)@v4$mV4xzXGWwJX zGBQcvo7sjUS2iw#LXs%>aHP)XhM%7wh<7Gl-d?&J_0t52WX*YfY(8j8e|C1RtbmLd zDz(7e&;E$VGdDcNnw5BSjg!e)pm&tJ&!WP@!vQ)F2t@nrX!?-b((SzbeA52*_950c zL}wTPA5>a85TUa~)@l@57OM;C5RAo!g5_a^F837ztYz!T&n2#`tbFy`K`=8jcg}n8 z-tkqowH2g|ysvpMTJZ0`_YpW|aB^|nx0c9FO%^N@#=|5M$p!V}u@g5cHvyECT(G3E zmwAhiz)=GNtDsN{b8Nu#^4@Elpg<;d8<#%ms(rb-wX>58?4uNTq+S#~{>H+<-~rei zuDJHu?9LYIrGN%|67PQIS3%#Env<=)fvqJjYVOd`Q14syPb7S5{lCsTj=k&pUbUit zakgm=q0kxs@1Edy?NV|bH16FC{iSLTV$R1@Y{Yo&9bLNuEvVG@U + + + + + + +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 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_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:2186
+
int screen_h
The screen height as seen by the system, after scaling.
Definition retroflt.h:2188
+
+
+
+ +

◆ 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.
+
+
+ +
+
+

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..d973a643 --- /dev/null +++ b/group__maug__retroflt.map @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/group__maug__retroflt.md5 b/group__maug__retroflt.md5 new file mode 100644 index 00000000..3665cf67 --- /dev/null +++ b/group__maug__retroflt.md5 @@ -0,0 +1 @@ +47ddbde225bdb085d9bbd33d519b878b \ No newline at end of file diff --git a/group__maug__retroflt.png b/group__maug__retroflt.png new file mode 100644 index 0000000000000000000000000000000000000000..9eb8347ba93789ee21465400d6b77c57a654d01f GIT binary patch literal 36128 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 + + + + + + +maug: RetroFlat Assets API + + + + + + + + + + + + + + +
+
+ + + + + + +
+
maug +
+
Quick and dirty C mini-augmentation library.
+
+
+ + + + + + + + +
+
+ + +
+
+ + +
+
+
+
+
+
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!
+
+ + +
+ + 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 zcmZX3bySmY-1ihEq)R%4(Sr17+%02&jN` zH@p|m`_FUEbJ$^=-MjCrzTZy~p{f3q^bX@42n0f^tn^450=a;mwH zZ>jq95#;LnC#StA2?C*CQGNv1#bj*Edh6;gUmWioRSV#K&11imS28kZ)a zmaWh}C3XM){q5ad4smfBJiKv(7VkaV`+|Z-Ep9fgpE(KJ;c?0#MH<=MQ0OfK0|Q88 zWTceG3Plo+2DgL+EdfEe?a_Sob3FIu!5$oLqhvte-P5zMzW!}UNQgd5k%S0pz9aMP zTN*&R7)#G9svX6tp1!DqN2aD4)w${#80@VUWjkK)m-A%)PeM`>5_+kZ>^?rF-+B4?7G9GpSRAfTm7BCA zuCJpY`W42HeSBn?U@pJQsye`IU;p}LA!LgE+!adP;(sO?8XDSmb$NDtdb)e~^M(7~ zUmQ>5D!6v*_H7aWQ;*=_U?p|+35M4~XNMczv$L7;@f2!mYHuPU9BSGUIG=*a25Xo2 zD&gKxIAwH23?eCqCgU0#0w=FOYK-@jkq>U*@gGx6+&2xi;jo#3;u zrY2ZHLBZ#q9!e^z;G`t#gM)+SmKN8w2|;j+CV#Tpd*N4IT?nMn+C)Y7z<_EUn4@H5 zQFHTqu#pTcCh8Uz?4qgBB|1fUy8KK%IjSBW;>2`9pNEIzrQQEhu&~UopG=O8QP9%% ztc>J~h>H4P$#p1vYFN<@ZGI8j^Su1*s5bpX#~2J#P{> z@@7t38>o-NYL8Xz(eK||{7ytw3be}_larG}8yXr0ty0s|^EG)P&7K=+f14dySy@e5 zJ&}9Z63MQx_4W1Ynwop!;%}p)NmNu-6QCt}%Z)GQ6-Y=(w)gh%9+v28>*#dD=KcP& zu*ex4%F)PHh-Q^%)Y18_pL~xn*hQY760H9npH88@nMRfzgOih!kXf5jwu1lm_V%y* zIEB&ar$Q-fa{BWf{t{Q4^PP&TtEs!uj)NtfCMYN=KTT9TOBnc* z_S4vyiiHIiNh|PP-nY@#)X*6C@Tw17!(DKJucw^(^TIS~SD3ayD%%$EKrnbF7S+!Kr$91;|2=->Z=6Cjn6r1>B zg+_}2W`*#K=TqPN7=Q1-RPr&)eN1cMBM#vh8u<7KRT4Z5}9;L)#n@#)hiVr$W< z01;uQqw6|=D*MQDa3CiAkf32tBN>l`?(` zo=b!XU)ymGL7dUcdZM^X(|&CQ-Pet%?wHDCO~^ep9i4srfN(aWnDP$kINsT-svC;G zsC749i5k0TT<$ImS?WgUwtu*3pfygfI<068$6P}_b}U~dEc}%sbbo8WUzdfi zoAG}BtCJwkxM|wQi8NTQ1j5k2V~~Z9ok6gmxS#-gulGTv`HwPZSnUXhVSo z@inIviZ}_e5#BMO6PkG{Z_a|ef{wJ%@$@&*#Z(45j`qHZCTcL%#C!MdRru;_uN*>^ zWk3arbS_|pltX-ce7pe$5loA|%O0-T-{0Rgt})`uR~c)c1$xa2s4n)iFQeWB9TaREHiYUxu>T` zW->|=vEVRsd+uMbTe@oElVTriD-x-_a`}jZCQCvkO+B$Ui24@^$&2khQe6qP1OJ95 zP18;Dz-DWGJw3GjFk+G_LURRKsx^M;f!>reOJXMF4Jrw;($dnh>*4jdkwADGUeJ>E zA)=zf*@mZ&(}QE@O(uJNxr#je{WgkfzVe!2o5k;jkX2jtk%@|lN$hC@fPA?%C(q2x zj9IH_V#FC-NFB7h2s%%u)sEwnF@IsZI)18OY0@7?$^;O@yObW_LPTU_9u~_;O-=pv z>sRsD_XezSifMDx^fFO^y@%muemjqG)+RaFaA$zr%!&afPVGW{aco7EmFi+;3*X;e zK+~e`0U|PO^{jchfZ$foc$1aI+S1bEx7*KSXk@hWRiH{vZz>aM!bptZsj04hn5$`z zgX@@^Yrx?*NPP>UA|rYE`SSo10J4Epns=)E`^$52aiyghJ39-WoSY!%pfkp_w6xZC zcGobAE04lj+OGf>0IeNLXNI|fJ}b%3=e!2!w2PVs5y^(k$~_@LK`uZB1mvu8+?F+h0;1VX${>@F>BLPA2WULzR3w|9DJE#T_n$nWA{ z@_OCBKH-&DRCsT-A9?iV=xb@geSENkX^Y=d#U!ped=4DzL>g^d`-WPJi{DuF#Xfg% z=x_Hu+TPiDKA0h`af-Ho1C$iYZ$LkQ)bL8v=5gsTzWeuoA55ATH8#Hc@Hzrsh!>_B}+^*47r6m3>cB7UALwt$5aCX>b1p95>*BZouGaX^f4|KcApb z<+io8PLq`h+1XXJ8i0Zt8ynLm6QMf*Bx_JpqP?*!s$la2Prqja#$g;%ylNYy|21Oe zh{Q3FX_}fMb#-;Y{5@q4yqW0fw}IBE^V~2FBVj<;+H!}Jv2;yNrW9?A(?w`f$S9ea zvHs%$XvP79r2vt^kuuPa!xen^5b_F-z|qmAJB)M*NEBoDXRzNJ8!;wAJe-_(scK>2 z;RKMdurReunPfoe_K8oOrU`9C83Hf&vP()!Il$qbpZoFi^8;~#+bpWo)7RIxw6x4S z$bu>Z9!N+}|7jWhu&hxh+Y77&oFJ#9tQCnw0P1{ldaRdV2c!`1qWLq2b*B(&fyqE-!A37pyMj|N8RB4b;p}8gnF)6g2AZ zzkfx2_U%ExRoB)!x+)SA6Q3S#sH&@z-MxF)cnb)kohiHQonEFF_58gP8BwQgK;HcT zYJ!M}C_@GvSzOF(Vq!u_O6pvbg5?6>iQo~Dl(hZ)hLYy)T~X8zVW@J~{JgnN88+ZT zhKmbHK2~vQ)l^e6Lc&wf(ZD4jpt@GuBmsI~Syk0);GG~nBje5OZgR!?=4>Fafk^n= z+ncA!TR+XB0r<79P7H8UMP!Y{a-PDLdB9015HS%9Vz$4Qmj2Vzqg|VbOtw^3#ieJtiQ*kB>U9kV;BQ>6RieSW#_lB3s}&rMtU(Vp0+)W$1$ka8Bz?8q;r1|*xJ`@(#dTvbX_x*V14)%mwNGP_pRut^km%+h8P_0vq zUnhM0zM$b09+=CMW!N)A!(pKR^_|Uuz)DW0jg5^pUQ1Tt0{Xofi(TB@RDb;VcFF_u zYtat`rLaqeqokgysw(IgUI76su;nJ50hvV9-1c9+(C7j%SD-F*^z=frv)MrTp&C&V z2Q?@Z3INE`Vo%gLa3>fH=GWi9y~zRw^a_4bhlhv8BI4E-7D278vY>{3FE1yhr$<#( z2)=st3W%DV9(txM4W}kCNy#UoOitR3X<--5E#;n6r=p-e6#v_YN}A#s?K6r24o+=447r$W9KF~mWY zJDjo@rJ)k2&dQ?INA|&`_(eIcwN8$)iPXh~JbImj1;jtuLMtbEDe(yi z9{i7`rx2i#G8w|Rqodxu!T2S^wy%PSiWA>g-YVwCGrKjTi7bD68;VDO z(JgDm*RA)OA&v0t%Bs3nk*D0$x#{W8!f$i#E09txya*zHwe0O7J)L%DR2DQb`*{-1 zNS4hd_v{f=g1}e_K)c8?U$}Y8)9lRPkB8U zU%c3&{-~70woSFIP)(;Nn}s#dkKmX7w+of;3m)ds0!M)0dwIH$XB$&WI?VF^_$9*| zemK9kxb#`7dW`N0?e#WBnFm>s(@Ds(ay|9>i0BIl-X6RDxbCJd4A$p?X78#)*8h*U zZcyc@ude?1>C-E%{3jxgW4tJ5=Y)Ri`(|y1VgmZ^Ztm`U0s>Acwc`Wkm%DU{iHY>$ z_L^m}-%UtJ2d+yLA0PkPhOJHhJR33Cz>K}NX>0=i(OQ%t9rnUy->lo6McNJe_wU~y zQ&SExALM`on)BPkkwqXWu%W+x{kjdLmiDv#t$A}9pZ($q?C~*18A$cWm>6f*Ko|_R zy1mft%wN}1J3g4L_+V;!y78YBu4fy=0Dw^Y;lm(tK%6C5EOrClgg_!=-oAS`vDv4` zpPUG;|6X0?YiVv4_qp0}uP7}|Y-?{X*jegxngFz?VO(SRIQ=Ur5m7?$>(|++L^Jq` z1&gP{`s!)~u$rL7)6hU40G@QhEtImp-Tj&@0NPJSU;l}=HWdVz6=1XRG_|!6+S;Q! zLkm88f00zw)YlP0l1Tj{p%iLX)>!Ql>#ezVWN&#{IY9{z2 z7I1lD2Ygv?PZXW9h6WEW@0&jZDZm6aqu1^}YeapTn7DQwz*rcy`!whqfoEsPd2835 zA1}qlEGDoHl8ab=CcKG<=j!Rn&CdSNj-=u_3Kbm}M-JSP6ODU7KtPfW2n=>6J1=Q9 zai4^}cdaKXO^J(HuXaGr0wf*q>t^16XdfnbWSK9KHoS3+K za4`09)Ljt(O<08 zNRdVX`+vYAAXD-^Tu(SZKmTx>_^#6U`1mNmQz$1V=jv#IY9ds56lfTzudnZF;MG|+ zRCzk3V0kDzg@lx}0KGP$tf!}^4LE4o_!ICSuRZFTinaf^=-K5p(OI*sk^?c#2~ zm2d$6E2ZC^j!H>L=+!ngrMS#@2r4H+ZLF=8L{rtUzDF+k^d6bnl>=J`Ym=&Cc7rGy zcXykOx%OvnXmm1EIgyM-21?2#sYY#uKm=O@k;9j)!l$TcE-EZMoI$`I8XkT(nLDL?{K+1($N-2h|iI{2)bq^DOsM~l+iK_4MHP5kO3*?ffo(+=r#TR(NS%Xu$9;{xjNjJbDG{bO#Si05Y+6A@$S|B{(jV48w1#* zSZ3)iK)Jj^LVthvCqdLQq!RL<#)+c;jXmirt*V+__g()XVmp*oQDP(`BU20H`E|}w zRrLTO>$UlN+`!yfvI9U#LP|S&JpfncGevJ!APnV6WEo15D)h`!!Sx#ronhRxf6xWNzM(GSY!n_ituV0eHTweHL6xHGVs$iW3iXXh9Y8|0*+{_M2qRFs!1 zA(75Hep6FZX+-%&>X~0dh^U9Z`(od{8XMCMxL7lXMYgom;*-z^m6ZvAwO)%b(59fz z-^9i7C@5rsa$dbZ0197VE=-46K_Tvm&Yt6=r%$b%oCbKZ{ql_LoSl `*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..47cb6ab1 --- /dev/null +++ b/group__maug__retroflt__compiling.html @@ -0,0 +1,297 @@ + + + + + + + +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_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__drawing.html b/group__maug__retroflt__drawing.html new file mode 100644 index 00000000..d1b7cf27 --- /dev/null +++ b/group__maug__retroflt__drawing.html @@ -0,0 +1,575 @@ + + + + + + + +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 zcmYjUcTf{s+YcB)suZOoAk`oOxquK#lp2bFN=twM5+FqBy$4W{OHriv8WAaxE+S2u zRHe5lp~kC%3epANz`DGkf;g-RJz;i8nVjU}F|whCm=}hA7=z5D1+RxRyA> z0FJgV9;AU2!yRJ-UC5umdr@0?Dj2zLsC(TaIBz3A!ra2;s2|zd`MUKoSx)rP;J;1# zw_tQkDeHoFoLt?_l2|2~P>2lI1B~;82nM6Jqy$$u$Qa!IU8GdbcWtM|s9A=lrWgFL#}pW%P<)3#AEMO3(^M$v}Se|EK@@bJiCdcJr3@kBS**Xxvyy>uNBcxIZ9;E)RSSQvgPY5XWL z5x2cQg2UlhA61JRBtOZ?8SG0Ej89DbW)+v4D_HOLUP@7sGwjIfs@Gz>a8OXtbd9~b zXz1%DPO1y_d?)SX7IIdfF@{^()ZEVQp5^+NFGh}zq7&t2BEAa{LSv3KHsnEBnM6rx zsgIwZptm5ztNlPKFfcHprnQ5$=U}IY2+hmO6IxzbVPa*4Qa3-ghVM*S-;ay)+n86@ ze|+KN#!uU3PnUtGlF-wqcNUtmnYg7K75Mg-;zU9%&AgPpeQeDvj695=oSbB*E3alx z9q1X!y&CepZSTW>{^7fGZjf{5&MEk=q6FW+oWbMS;EF^ZJXD`GqqeK0q=df3Zgk}_ zlKq;W-#>`_*z$&*}dXQ zn`tv53=&kxaGqMKTR}))-34CWxXesmG#XuH*HX9OY?hDEL!nTG^rmi2BX+O-D`oPe`L(sRL;>Z0rz)+v`S@n9cPGdPh9A>r zYn`EtjNBq3@0&ap_SbX0Y}&&^ns@2x>7Q3tmR3|SWt+Ixf4bsL$8$=aj&pBFVvjej zhW)T|<;xdB$YG9&)Mz2n%*jd2w_@D z#6(uW%O^u?pLaspFKD1lOjrT@^5uO{C<(5D;AN&aZEXjet>2$lS4+ys zyc;huGBUce^!5SH&2550NwlhT8O>8eNlcS11J_ng;CMRPILX+;!a^Zz_g+qJE)xrj z^L&GQPfyR2)KndBZv{O)y*EGm1aYpeb%ZI{`bcg+z~#W;;6)^|@L-$ftR%q1%zRNp zBQGn9udcp6TPp%FLw4xz?mk5X1M9=~JQF<9jd}-CrK^7da4Yz&o7{1Bj!#Njo2gVG<_BV+L!PPkTGRqe$b!2t z|NSVu68!G;<)X%1Z)ztU=#!6+4-mcd)}Zh3piMghfiMf;QE63uXSpXHvbwf*6N4eR zAf=@Ge975!&0ZqR4`M!iFn>{5X=rHZw9=Q9Pr#eGsSJl)G%zq2pO}bGPF@EX-#<85 zT3_!o5Q&(q&_p7U{s`gFwu0x+Wx#A7{N8@guNkVu!gHBAU2Xequ|p&(Dr%CT3|I^F zfs>Ony0lb0J3HIL%8E-^*n?CqE5Znc{@Q`lpW^ezMjZ#_<>%Ak@%SP@KOj~`V|Z2n z&l~{(0YVzV9O~-o8CUF$+}$rRvI|kGn?Gq6n^V7jO=xXZzv}g=tg0$;c-TbhMvktp zFMM-zQ%KDhN^}{@xOwZ=+xCc~;JuGQbT+TNi!IsvyNXw0+lz~%0hfQw-zC#2czx1n z-(O~d$;$Gp2Uev&+_h^BOscddV=!9AnOD{hXocm^p7p`HTz8`faDNr4!U7@6^fe}i zUamSM`vH+v;m*PtXQdD0USbi{_sBmD2U!$~T@AL4nK*_od;L0RuHKDXNXR50K)I!* zD#?#on*uzDbCSXdY~cAC)u+##i+(sWxy<{a~1N-Vi-CEwE{r80;ND1-0O;C9#vsUpnmyQR& z=z@awKB={^0gN;>uqWz^1Au|akBNx^!k`CB-&)Ib!0eLAn(i;Ii9 zkvKC8OUqh6nrVidZQt*MZ69CXTfup4Z;y1G9A!_t5_yb(xVX3oX@;hqX5pDFlLj*TRso$>0G>S%$cv884D4Ftmz0V>Cjb5zEAr)oYfs=RW}?IvQXpS8CafEJHaD8m~I z%|Exc-cC%UuJk|l0}LB#_aM95_9gP`7#p)7Pxi$>e{=)J?JJqw zf`UWQrx;Zuf2)F$!66}Nu6-;P3&Nym=8!r?99TNArkB8q>gwu1(gCHp&YyQl<*Bwx z0NE1gwqAuri3Mzo&=`KS(QJ~XP;ATQm|sd50)SETS%!Lb9IK3uj=uT5H6)}Jo^>Nv zCE)IRD+}29+^b&tQmJFJvnXxtn5p|Z546XsA0O$&sob)&qa<*}uP!d1vOCMb#Ke?k z@+^u}R`zQxAxf-)q3|rR^;Bh55NJv6y#t7~p5AGAc9l+~8F}WmrDZQrotMqcv`=ke zz(y{n4pbG4ewe3EF(L(rhJwn&AnQ~!a1Hmv(v2>JelEV?k?U@o31k?=3{G+VBCAS8 zfuyv|%$1Feq}bS4AojGGx#3_UxaSD)yyGo<=~5Rk_;jNwQXBYtbpA?`;8i|l!Z~sM z2Gd@coLuk31UKo{z_;8F)N@-sVj9YwTkAfe?Qc~~!W3rb=FlT-UkUmlW-9X& zO}&fhZM!s8Pl{?~z&6Ut7UXY)iJgao8F-8A^4g7PstCYr|I2o=Bu16K3wdUn(zvAE z;0>kkdLl-jd`*-OuG`6Z2CDOL-yYUgv<(C{@K8`MrbFJotzkioiXx4}!P3Tas2K;1 zO|XE;33{?c^y1(oLDufAlGlz|prO2>pN#+i$}0NWkD{M{BEG~9Y@NP42-biQLp@X7 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 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 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 zcmZWsby$<#-yf);NFy~skr9H7984zt&>$g5j&6_+kx)WF9!jKTNQWY!Fc1&{k(hLM zPMQ%T6_DTY`SX46UDtix+s<|FbI$iu-xytORVoT71q1@2Qdd)Y2!W7DfoJZkWZ+Jm zdjRebG8;`*CCJ6!Pi|95G6X_1rLLr45P%_M2kEAawsp!iqHRbRjXd@03rK|m7Ht$0 zR0K8(i{F`BunKe2u8%lrC!|A5GCzs+TB4G_yn5|S3{us1b;*6fn@XXe_md0R?!>G> zm-eX3d?Mt6Q!>q-nKq?nReV2g+vn{nW=F~~XUE4q2txAzuCVBs(*2mxGNZ;ArTmv+ zw6Fn*z@|UxKY#v|BQxzhr)6V1{U+~9dveUl6kA5m!0?<9(ATi9%$0OUk(>Vfco9dx zMj}jlfgIr4CSPpi-W3^K_f-um;^@!JK;MsviJ?Kil0W|5*-2CLLKaUT#2W~3II)r@ zN-;7rj*O3IVVG$`nZTmLqNA+5Nl8f)CBkvnu3nWMyUNSQ$+>F`%fN(&w%Ep7c_$(z zTZS*e73HlsMH^ofB71V=a_&FbW|1{BF8y9cCE^ z+DrOj7bF&Bh|ul`ttvUGr$p}MWkg*|Q-X}*}CQD08;6-E$M}+C%^TTniY*cD~KG)3bEPSrn zzMF{&Zt82vI4wo+?}%fKFfCt6w|us)CoMBr^<>9F$nvX}xA!OYcE6Fl@y&XF0(9rg zKDE8Qeemz~637iErlpOIsc!b84D}jTGsJ>MR{bPt@%89Gt#?v2wzjqch&Voy0T*ma zYHCtOhFWlNaGgqec6Pi)rQ?qj{t)d(ju<6Uc@q;>XngT>fS|LkKx#@_n)l+jD-Jyw z);H2pQ+I}aP=tvp>q{=!HwqDCCL>-ub29!rb8aH_BpXlYE?8Soosctj-%OjaM7fmB4Y|xX~YeD|nZr(Vy^b zYU&NgeScjvI|`|dOot^WD>oQ@6^1eB___IyPO=6pK&qr1f}H??_lFG-?y z+tb@ytS0{;P{y$jllS>E%l-TJi?uStb8>EhS^?HW+{|+$uQPvg?7x`?H&Y1=M1fj% zf=PRNw0?AVdwF_tN=suzZ95K3b!=^6a(_->6p^GcN{VV~S6f?K&0W^w&_aCT;>l4_ zWPmTBwH5E9qsb*DC8IWbmKky@DiZWdwDru)Vhsd%1OzCUnbY0dde+GX)_pN3zki8D zZ?w7j9+8+|Qq9pMGNx)MD=A$zszBdHBFDe~L=Dfit-GwftCX&ai3U(8 zFc64|i&H8arKh871zKkEHCW2#V@6e#$i~J-06reMySuwEYGi4@(vw*_>H^pq6C2w$ zKF*x2t?J}-2b}M6cY48~QwGAB9_cZMD8xDs^8$IG>OA|k|KI=!mAKm!f}Mi{2$}*n z{a%lFf9{}@7Q$EA#YI54`AiJ#Px^Sqr?9x#w5QpyY`G=uQr9w3mTiVGUB}_LJ8FF){)t?9bNy7^~pq4hqi(0H6*Fk9{L%uLVrY~$1AR3k`+ln?Le z@lHuY0~Bx?MwQJkAdsJ%+cNOY?33NKez^P`yEe@2vIxlwM$@dc<;cF=aVN$ z)@0XPlpd;;h2WMs;OKNe`XO0rq*3>L4Zcf*EASv4r z2!yV_zO7ztb91x$aNUC&%X@9A>7CH<{iI_m1ze*OC8gn$+p4gtD(`TK8+RkTKsi@VRWskwnQ1y-`7HLT^* z?4GEosCinL5|@HddX_Y2lQK8GXvpt_>Y}2e%1dpb?edgv=A%qgX)(r%%F_X}p$mBY zaJAyLyu5s99%JF~`klLX!NJB44CopNFarMn6HU!p;o;)4G}jd5fZsoK>wf0vCm|#x zL>A#nbGlxVLzxpK#>+<^vwL{RBO}8RsTgKjUR+U8Vf2)ek`lo2N~%WtPV+_IOF9^( zxe+8%(ONQxnwnY={rOeD>?tLH^MpN?b{_K+8Y?h~M_|_1zK^3JMBpyU501?(p-AQg}Eytzq%Eqyt{XvmsxnqFIH+>`QfY;)me6+P=;#O`A;B6cfkd)7=mcrF zx&7x`n(0FJV;@W?p@^3{vcC$Aye6imxYE0E-QD=#hnu`*mmY(GD?UI>dfv)p{rI5) zh}ENdE9867PE&Mpa`L1|yo#-1of6mjr^kW$MX=Sr?6&#&`O-nJ$V}`z{Y-OsygflRxa-T&N z>*ToKv$3_s_4E|h*47%KekaX`T|g9C0<4&GPwsv=^`lN?0rdr^vADh-1BAXKo(%|a z6wR%^7zRGdaIa4B_@p(bNtDag_mq9EnEHF|& zQ8aRAuMRiI#jU?x{?gRM54eIty(!Y1KC0c{-^Z8N&E;dUqXSqcKH%@YSx5#b^e?*K zm6mb}2~~8P+|?Ac{EA@}cc5iqd8tuk(}$6YV?!pS-Zdib_sg+4uia~W^X82PuxWR9 zca=S?Fk0Gwi{;w2YsV&v=N-$<32^y)ZsL{Qp?UJhI@7RFfO8%mo{7mxItGS+G&Csq zv@!BU4}pqOiqDE=#@TizSc8O3)hN;zz^`l$#&xoi?~CaG8M-)3JNaZC?GkBKAsRM5Q$N;`H#IXUcA@^qd>-1 zeDHvZflvE;e?Ludd-ZaZPL6LDyiNxcm z`O{lEX6BNe-r`J+B6@(_~nkX&3{_xAQ$LHJ8cV|rg!_7Nx|WmKIHzJuz!jc8jm zP05!p?7+MVaHU5<1kgS8w4 zLUnJBS6ZraC9zcK-?=d{Jn8P&SxA||dm+47r)8GI%?BD980ky^1m%RVG;E_m$kLERcOkvSnQ;70mt)4Vu1%v$(}yP{&m55wrHD=6QzD0AcWNT z56=jjp-KjS-M%T|VvtxvO35bKQ+Q>*lg5DF>*CM3TG2zG`M|?oL`G88)X4tVH$ouR*4BxU z@BCCIT-4>|7e1$>pDVY178~!crKK&% zWVG(vP|!3P`(UA!3pBoDrfui>oRKZtn^!2r^xu2B2V;|8xBzoXH)rLpHFR 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 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 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:1970
+
#define retroflat_screen_w()
Get the current screen width in pixels.
Definition retroflt.h:1967
+
+

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..74bbf37d --- /dev/null +++ b/group__maug__retrogui.html @@ -0,0 +1,355 @@ + + + + + + + +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_BTN_LBL_PADDED_X   8
 
+#define RETROGUI_BTN_LBL_PADDED_Y   8
 
+#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_copy_label(ctl, ctl_type)
 
+#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_sz_ctl (struct RETROGUI *gui, union RETROGUI_CTL *ctl, size_t *p_w, size_t *p_h, size_t max_w, size_t max_h)
 
+MERROR_RETVAL retrogui_pos_ctl (struct RETROGUI *gui, union RETROGUI_CTL *ctl, size_t x, size_t y, size_t w, size_t h)
 
+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_copy_label

+ +
+
+ + + + + + + + + + + +
#define retrogui_copy_label( ctl,
ctl_type )
+
+Value:
size_t label_sz = 0; \
+
char* label_tmp = NULL; \
+
\
+
/* Sanity checking. */ \
+
assert( NULL != ctl->ctl_type.label ); \
+
label_sz = strlen( ctl->ctl_type.label ); \
+
assert( 0 < label_sz ); \
+
assert( (MAUG_MHANDLE)NULL == ctl->ctl_type.label_h ); \
+
\
+
/* Allocate new label space. */ \
+
ctl->ctl_type.label_h = maug_malloc( label_sz + 1, 1 ); \
+
maug_cleanup_if_null_alloc( MAUG_MHANDLE, ctl->ctl_type.label_h ); \
+
maug_mlock( ctl->ctl_type.label_h, label_tmp ); \
+
maug_cleanup_if_null_alloc( char*, label_tmp ); \
+
\
+
/* Copy the label text over. */ \
+
maug_mzero( label_tmp, label_sz + 1 ); \
+
strncpy( label_tmp, ctl->ctl_type.label, label_sz ); \
+
maug_munlock( ctl->ctl_type.label_h, label_tmp ); \
+
ctl->ctl_type.label = NULL;
+
+
+
+ +

◆ 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:149
+
+
+
+ +

◆ 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, MAUG_MHANDLE label_h; char* label; size_t label_sz; 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; ) \
+
f( 4, LABEL, MAUG_MHANDLE label_h; char* label; size_t label_sz; )
+
+

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:116
+
+

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..5bea6b41 --- /dev/null +++ b/group__retrohtr.html @@ -0,0 +1,391 @@ + + + + + + + +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_TREE_FLAG_GUI_ACTIVE   1
 
+#define RETROHTR_NODE_FLAG_DIRTY   2
 
+#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

+uint8_t RETROHTR_RENDER_NODE::flags
 
+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
 
+MAUG_MHANDLE RETROHTR_RENDER_NODE::font_h
 
+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
 
+uint8_t RETROHTR_RENDER_TREE::flags
 
+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.
 
+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:28
+
+
+
+ +

◆ 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 zcmaiZcR1GJ+qY53E@ZE=LL{;UMFNbyCU*GR_o!5DupK*q(K9eWFrNTu+LnBalBBPFmhAsxbhvHztcZ;SN zVfcY%rX(+ec7^)PZYoSbL!)a{kde~x%GjC-Fo-$1Y~9nA&`_6&dz*9bsl9RyKDCW2 zZaN|Di&L{I^P2W@p(=WQ^XSkDT51=$f*tn~*9;&2!_(f$P#ZjKReJ{Vi;zBew#R_yn2CYjydl z!kl=ee`x5Tn5gK#x=X%|PF%TPSDc)j9*;cm+Zt`Er*If_0@9eo2D4xM$Ow;(RWT1` z{I2TdCFtVfLRO&9FU={9Gic4Uc7ySI1d|wJux{K(*5C&m@rS|0FJ$Ahh}%lLnK^QM zyw103!^6XQQdU-0I_q4PaBy*L%a8owRZjhy(%!!%S_re{-uJ;FA&bk)vL+@B3kwTw zYeV@8RYYXxW#(Nm_;jKv$;SSab{lC|{oKaQ-}jgM6ciOP82I=|0|KsWlf4(-lDqMw zKSWk243Q|ynVH=oBqV&A#&;udanUS>PONvL!aO`Gs+4DMYoa1(Xh^-_X{y6X|oRw4rZ&U zsEDZOjH1lr)G5zyI~>fD=iqKWHH+@!)+v`v74a+^+$j0}#q|%VWY3QuW&2{V`d;`m zP2>Fik)e@M*3cJMD`rvA#?IxgXzIdJqo%2k?&~G7%}A$>ailgJ&R=B171we~mi4}{ z`+9JG{#ju$8!o(O^{dY1=?C%5yYew;<$mWL9$QngGBVd9$+@u@9z1vlKOg!Y+Y{0V zN-8MafOELR#ui4&`@(s1f+x>Bh0o>|oEuqzHd*W^s$4%-R#s_g>4|!GyJ`o7QB&IL zsk57Xs|pL;oJjl>En3c;*wxYx*&;T2M@o;$rXMVClWK5&FnX$EW9oW~QdE)6=QB8+S1pJhtu#3R0-3sK~|8^yEAa zjfz<6q7V2zRc-e_>o2|#_d9zRAFuA9Pr~}FV|qG$e%@pZX&n3hJy|lhG1iE9#zRZo z%gf7ud$9o)N9&`d`n5k8R(j8j0(^@%PKu|rN#B~bhs33)_a)wY-rd`~NEC1y)N`Rn zDOA9kme`*z;5y%mj>bntU}IzRJxeV81_{f%q@+&R$`eJ!T&saBG#y>tiWmJPWrigcJ9@Q_(Iq7uV!p>6gM)+F(SHyA@OtlCpe-&f{asEr#$OQ;5z(GH z2~@i<(mnU~_WoE<@Y!aVC4`W+w@587EGDL)s*03@gX4L91%`r8uEO5QiPc!CZs6I# zOi$kGeQz=~IYU%q+sW_7BX zBM6)5#rnu6_h()V3Mza&hV^a>YlR=iE;j%C>G~RkE#$S!(A?ZyS65f=f8i5k*&B1B z**QB)ryA?D{O1q#_r8IFLgjS+>X>TFz9g0|SLF0utrNYtxVXD*373^=^cozSah3H= zr^Y?3!e^OgSC<#4UXqwd`s>#(TUw%S9s6dHK*EnE~^qGoZ96pzeqEOqYiwZB~S|4iGDuMFMX!1Sz z?7Yy16-&mxb3S$KYj4kaU$2Vc?p;h{W8;;953x;6es2vorrv#IO>1u{ipvp)ZMm?H>I`}^cgSZ`S@T@+7}Kf=i!`UT7|5&Bl%x>b zZ(ff@lcy0&j~MDcs=apPm2sO*TI`v&RzEx{Z!JR4WmHz6*XgLYYgY?tGQwK{;JV6^ zGn-51wD{5^ac5g8aTmo~;@lroxmuQbP1>PUNrNpeSHjDqzgUZIs5<^4 zm*!LOFG_x!n9ag<{fKk@W5cYKiua?FzRVM{?AbXg47V@xd$^1;h>2X52lv-yTOwvl zu1$n5M4x}tXml}lJh~;#hvye~4ZozJ!8jitT#Z@1Ut*K2jl-BmiZ{}WNLeQ_n%ua0 zr{5I(fMKB9T3k5Sh**?n>DHvfNS}5U0c9dYKX|XmN+9?IolQ#8;uL*774atN{zYu`cXxboaBS^A|Iu~=qwrKHwiqXmTj2(Sk5&5T2 zpP-hS(T;K#rfhGMQxegO(|CHGbP_)1!we;&FW?$@UiNUU+K$y%HX2dPT9v-4<;OSl z^ViJG-rkf(n`gE>Hg#%V+ZZg z%bl$aWJ?SJalfW!o!L}YR@R`!Ka(}f>y6EDfvKsQUqxI(LJ)j7dYk)Q9F1p)`{~vG z$j!ZDU|`^OVC=i~Xx9JSVGN-!uct?4H(q85)QH6~(-vA!M@Pp4+YvUoSUQIXDgozY zvI_uj6H`OXqh;d0;Ay7;_2^eNC>4O}YBUM<7J=F`|^``t|EB zhpTGBZmQVP_qe!L+TP-M`TDx<&Pz?zIvH>6>+0&VMda$w>Hy(s{JWBl_N(4Ka%4oq z=Wz9Pb@iE36~G6}vy5)wMwEQk#4#~38N%)n&@R)evVw!JT^<%n?7`j_S61X+ykNn^ zCbR%-W2qfgwVe)CmTDpp++B?19)d^B476OHag=BySN6K-yZZV{rYzgr+bM-!GR2DS zhbe5ly8Qdc8@|v5eGb{=V`vs;Jm*IH$8D=Qbw77}ct$O_boES`?S zu|+P=bZe^mAMm-~h}zlWgR_!BN(#J29DGSyi`JDNjpq*+-lvND)qlm-@$nIU9D;8O zfi2ak$eps(F4cJr{|=bXf^a=t9ju?b05Dw}Eg@%pmeD#nse6*u9!hl3ib<3*Qr6tj zA%nuukx$Qsy!V+P2)|cW_SZ|0w}^=)fq5PuM;kYe*AS(@!J2M5Iz0U7cYbWp#qxwH3mbm^r>{j_u& zAl*=xacGxmOp+7ie+@|*vaKd1BU@Nm!D_8A?+ObG%QkHAu&}Z^7PR<*Er7fJ|+_D07m_HK8PqRGV(4vJ1#jn`OB9tDTLkFKs+FLLIB8i zVF8r@xwr?#5rq#SX&~{3a~@;YyKi&?lUyCjKN}q7<>iHUzV;Ry;d05F;IB(&x2s{3 zl*@=Is12`n&9?TR;pFCw9OjspZf@G29j;-v?k#oQASCSk`t@~22F=;=Rv#1tY7ye% zbh2uvE9p+V`}-(}CF9WAow7sjowQtKV$*pADkQKB);Q?HDp%)PBtT7c_Vj$}q%eB5 zCkydx%a#hlN3m{yK=fIQfh;j#z;)6M{QUg&X4wVD7#J8S{0>y-Cp(27KL(?A2lcVH znio4(m*Fo#di(anfXi3)9$UTdIkZ=2n?!&fzCT_7K2@?=*)XlFq;waUWtm|^d|Fy> zx>Iuxq>tUXoq%o=bJJYFmEp+^ZFP0&SFc1-)Uv%j2t`PMP=2-^yd&(n{nX!I+|<4?zQ1@m%}<=3}p2q z^lL$BE-uANtX!PT{RyS_m&_YnjTu1SoNM{;{rl6+%}r-dPpfYcWKYxiqao5zz^xDp z-D+D+L=CdQtM_Amz8XYgXST_GI6fgEJeE74ZYGFG{7H-dg{?g|H+L+Aixy2nLIN0^ z99(8+P*zHxk(r5V9dU7SQ8YsF)3r{+CEDDCw8ApZ&gD|{vvn>(P{P{NR+d{+6BF}5 z)L^6Cf#{fm9-9d)_p=^xqH_daoz7d@Nlw6uZRLKVC;iM<^0h zqs91%&=-Jf*qJENWYs7h*^-WpjWIDZ?{(jeU1gWEva-U$r;r56ib%-1x0fO0iiOaM zl*?nhckc#h14zC)=LL+JdiN5ya|e5SFE~fg07%VOXIMmZuNF5aD|ghr^R2!wgfsH( zDIx(*Sz^!0>FJTv4jj-bxVT~#+C!HX7o`mhXta?=-yl^$5~5)d(sZ|6T{s0XWA#CezSFII zF*-3@s$1!{g-^v72I-Tx$hLv4DxrgmiyIalz5M4x01G!aa;RMiyog7~y1EUuPIIVC z11bN|@60Xh)xJUuy@XMTKLX*S=kYYA;`?Zcc63Cc@5%PW^t3DJaIg(9TR|SU z%?)IVB%>lRH7xN(J?USRE+iX(NGixy2tpJE4~CP|4!gY3!-9d{sp^UfMse{hkfoI% zoxtyS^Wg)%@A2l>q5W9{sd1C8L*P0UwY97q9FdTms633K$`Q%$l6cgPYWLd>JKf#g ztv`Mc1`<&7YfP2#_-Tzf+S;;t^oOQ6ITKVICWomKKqjNt=_CGch@NlZ524iwh4PIoF6E`!y`Am&?6mLqkL5m6gMW zKk-cL?D`hJMZ&4SFI&VTAjk&`4Qm6kxmfi=S6_c=ZS981Pe@l z?<+q)_l5~ghZb=Gf!dJfcL(J24)ap2)Lv+Lm@%I{~#x%614aB&S+{##cR;9tw3kjC(w*md!8J-?aUgU z1ek21c$hgjFEqk#VW3JPfX&~eq*MUoPrJG7;kEjaC?)e& zt*yO1JTkK6YGLu4-`7nKm$yaX_<{`ox4rrw5&oWC#R4ekY@eV^dqqB_DAwoA+v1G2 zkOjtt%Oy{Jjt;+Ts$uIPl3+FR^Ng(uJEH~h$gM*ohrqEw%m?Tb?gK#rgAi#BT0t8vAtDkK)O^Z5xPlCn<>xwJtJrCg3yDDFEqE1>{e|KL>7ty$@%f;=eX;Hv8$d0Kv!$TSbjzT(!IBC8NG21<8T^?(sYbr7so z3atbT%>@Fp-(vRJcS&tAIIj_+H^9iR^WRX^^`HVPTN4Wq{(^yp)FZTxE>i+UY6x;>9F&7=4H)!#u4l|JJndc5cHrp z{oldFCp_3Dd~n^fzxQ7@s11-x{I~ni?uxyVt@XNAH5NNb^YzQf4C2M+G2BOkei#Ol z2#m^mNDL7HJqu|Z7ot_7MCXJEOy&tbltD6BuBYxFX>iLHqw#gUzUcq)NJ0uFRNEfm zJH=5)<0mo%*Tqhv51^GiD8)Fz2ypDElObWz?u&e3v+_Ols@_-6-@n;UQBkoAxL-q3 zVqz6ADd8!KiW|c^;Mfom5nY`cA&|X)W^o4-b#-*2Ts=Lzplh0(flYZ7K;x+rbc+Ri zAZ7u9ldQ7m@mbb2Aw={s|2;uiXMk}-7OU77f+skpTK})<0i^c}Mm9DaJUqN0ZSe0> zc&!MTnVAV{W@$w{G<1-c8}K-&&&;dKlNK~VVd0mT|GX2%Tuy2xr>A+H=Ouvw%o3-M zY{FFFg*kYe7B61Jr>6G2#UqD%ngbsJ%2Cs42`tVJ)kYJ>g*-NOW`tvDMX-Q2#XC+x zU(td7OC)yquE$|xc&=u+P-VEnTpsL8Hcrmc=M5)!zX(wmrkm0)YrfRif3}}| z2%4fDG!BKJvq|Q3%ZDfVtl!fBkAU%^0aWsswp|0007&Z}Ahhyoq_CrQAVNO?RZ>K~ zA7*cd$jQsY3hDWsW}kw4kS8Atx*{C9dO29GReA_D9xpGiRS%~lO|n=XPR^0(^}bt2 zL=yj6fqq&~erAS+{afY^$f>HT8gdYFo<{>Yj&po`j6$WNBDOrU`i9H`MRqY$eo&{~ zJw50n7S3mfHiUGdPXN)f>8KA551Dv);*^rPcwleB9-H02zPO@PE>(005SxuD{YEdI zou(5y(BBJ_Rv*3r!W#SkeG77!1nVh+2IdwQw*wnfdv(c*cNLk&fgP;u}FfFV1C)xCPu6;O-s>-g-;0UUR@K z)=?vs)h#!9{m^sUU`7-h8=LvzLv?r!wExE;7=`55)#(Ua(O;d04z&aX1W|x6EkwiG zP$iXJ8_Wv@v7Kjk0x@{h`Fy4Z1n)gSk>|}icxQU|W-4#BjPlv&iI^`zlprNlx zmW!v>v*@F;Wl*sr>23p4IeD0J5A49-ga?ANbfN70F;$wuBr zCk9a|F!!n*^Z-Ydsimc?h6X8^lOQ~Tz~Vqj70{}N8+CeB)@lx-1-mfd%1<^j` + + + + + + +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..d50b91a1 --- /dev/null +++ b/menudata.js @@ -0,0 +1,76 @@ +/* + @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"}, +{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..86a4c77e --- /dev/null +++ b/merror_8h.html @@ -0,0 +1,189 @@ + + + + + + + +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_not_null(type, ptr, err)
     
    +#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_lock(type, ptr)    maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to lock " #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_not_null( type, ptr, err ) \
    +
    51 if( (type)NULL == ptr ) { \
    +
    52 error_printf( #ptr " is not NULL!" ); \
    +
    53 retval = err; \
    +
    54 goto cleanup; \
    +
    55 }
    +
    56
    +
    57#define maug_cleanup_if_null( type, ptr, err ) \
    +
    58 maug_cleanup_if_null_msg( type, ptr, err, "failed to allocate " #ptr "!" )
    +
    59
    +
    60#define maug_cleanup_if_null_alloc( type, ptr ) \
    +
    61 maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to allocate " #ptr "!" )
    +
    62
    +
    63#define maug_cleanup_if_null_lock( type, ptr ) \
    +
    64 maug_cleanup_if_null_msg( type, ptr, MERROR_ALLOC, "failed to lock " #ptr "!" )
    +
    65
    +
    66#define maug_cleanup_if_null_file( ptr ) \
    +
    67 maug_cleanup_if_null_msg( FILE*, ptr, MERROR_FILE, "failed to open FILE!" )
    +
    68
    +
    69#define maug_cleanup_if_not_ok() \
    +
    70 if( MERROR_OK != retval ) { \
    +
    71 goto cleanup; \
    +
    72 }
    +
    73
    +
    74#define maug_cleanup_if_lt( a, b, fmt, err ) \
    +
    75 if( (a) < (b) ) { \
    +
    76 error_printf( fmt " is less than " fmt "!", a, b ); \
    +
    77 retval = err; \
    +
    78 goto cleanup; \
    +
    79 }
    +
    80
    +
    81#define maug_cleanup_if_lt_overflow( a, b ) \
    +
    82 maug_cleanup_if_lt( a, b, SIZE_T_FMT, MERROR_OVERFLOW )
    +
    83
    +
    84#define maug_cleanup_if_ge( a, b, fmt, err ) \
    +
    85 if( (a) >= (b) ) { \
    +
    86 error_printf( fmt " is greater or equal to " fmt "!", a, b ); \
    +
    87 retval = err; \
    +
    88 goto cleanup; \
    +
    89 }
    +
    90
    +
    91#define maug_cleanup_if_ge_overflow( a, b ) \
    +
    92 maug_cleanup_if_ge( a, (size_t)(b), SIZE_T_FMT, MERROR_OVERFLOW )
    +
    93
    +
    94 /* maug_error */
    +
    95
    +
    96#endif /* MERROR_H */
    +
    97
    +
    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..40872870 --- /dev/null +++ b/mfile_8h.html @@ -0,0 +1,199 @@ + + + + + + + +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_READ_FLAG_LSBF   0x01
     
    +#define mfile_check_lock(p_file)   (NULL != (p_file)->mem_buffer)
     
    #define mfile_default_case(p_file)
     
    #define mfile_has_bytes(p_file)
     
    +#define mfile_get_sz(p_file)   ((p_file)->sz)
     
    #define mfile_reset(p_file)
     
    + + + + + + + +

    +Typedefs

    +typedef MERROR_RETVAL(* mfile_seek_t) (struct MFILE_CADDY *p_file, off_t pos)
     
    +typedef MERROR_RETVAL(* mfile_read_int_t) (struct MFILE_CADDY *p_file, uint8_t *buf, size_t buf_sz, uint8_t flags)
     
    +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, off_t, 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 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 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
    +
    40#define MFILE_READ_FLAG_LSBF 0x01
    +
    41
    +
    42struct MFILE_CADDY;
    +
    43
    +
    44typedef MERROR_RETVAL (*mfile_seek_t)( struct MFILE_CADDY* p_file, off_t pos );
    +
    45typedef MERROR_RETVAL (*mfile_read_int_t)(
    +
    46 struct MFILE_CADDY* p_file, uint8_t* buf, size_t buf_sz, uint8_t flags );
    +
    47
    +
    + +
    49 FILE* file;
    +
    50 MAUG_MHANDLE mem;
    +
    51};
    +
    +
    52
    +
    + +
    55 uint8_t type;
    + +
    58 off_t sz;
    +
    59 off_t last_read;
    + +
    63 uint8_t* mem_buffer;
    +
    64 mfile_seek_t seek;
    +
    65 mfile_read_int_t read_int;
    +
    66};
    +
    +
    67
    +
    68typedef struct MFILE_CADDY mfile_t;
    +
    69
    +
    70#define mfile_check_lock( p_file ) (NULL != (p_file)->mem_buffer)
    +
    71
    +
    72#define mfile_default_case( p_file ) \
    +
    73 default: \
    +
    74 error_printf( "unknown file type: %d", (p_file)->type ); \
    +
    75 break;
    +
    76
    +
    77#define mfile_has_bytes( p_file ) \
    +
    78 ((MFILE_CADDY_TYPE_FILE_READ == ((p_file)->type) ? \
    +
    79 (off_t)ftell( (p_file)->h.file ) : \
    +
    80 (p_file)->mem_cursor) < (p_file)->sz)
    +
    81
    +
    82#ifdef MFILE_LEGACY_MACROS
    +
    83
    +
    84#define mfile_seek( p_file, idx ) \
    +
    85 switch( (p_file)->type ) { \
    +
    86 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    87 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    88 break; \
    +
    89 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    90 (p_file)->mem_cursor = idx; \
    +
    91 break; \
    +
    92 mfile_default_case( p_file ); \
    +
    93 }
    +
    94
    +
    95#define mfile_cread( p_file, p_c ) \
    +
    96 switch( (p_file)->type ) { \
    +
    97 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    98 (p_file)->last_read = fread( p_c, 1, 1, (p_file)->h.file ); \
    +
    99 break; \
    +
    100 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    101 ((uint8_t*)(p_c))[0] = (p_file)->mem_buffer[(p_file)->mem_cursor++]; \
    +
    102 break; \
    +
    103 mfile_default_case( p_file ); \
    +
    104 }
    +
    105
    +
    106#define mfile_cread_at( p_file, p_c, idx ) \
    +
    107 switch( (p_file)->type ) { \
    +
    108 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    109 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    110 (p_file)->last_read = fread( p_c, 1, 1, (p_file)->h.file ); \
    +
    111 break; \
    +
    112 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    113 *p_c = (p_file)->mem_buffer[idx]; \
    +
    114 (p_file)->mem_cursor += 1; \
    +
    115 break; \
    +
    116 mfile_default_case( p_file ); \
    +
    117 }
    +
    118
    +
    119#define mfile_u16read_at( p_file, p_u16, idx ) \
    +
    120 switch( (p_file)->type ) { \
    +
    121 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    122 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    123 (p_file)->last_read = \
    +
    124 fread( (((uint8_t*)p_u16) + 1), 1, 1, (p_file)->h.file ); \
    +
    125 (p_file)->last_read += \
    +
    126 fread( ((uint8_t*)p_u16), 1, 1, (p_file)->h.file ); \
    +
    127 break; \
    +
    128 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    129 ((uint8_t*)(p_u16))[0] = (p_file)->mem_buffer[idx]; \
    +
    130 ((uint8_t*)(p_u16))[1] = (p_file)->mem_buffer[idx + 1]; \
    +
    131 (p_file)->mem_cursor += 2; \
    +
    132 break; \
    +
    133 mfile_default_case( p_file ); \
    +
    134 }
    +
    135
    +
    136#define mfile_u16read_lsbf_at( p_file, p_u16, idx ) \
    +
    137 switch( (p_file)->type ) { \
    +
    138 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    139 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    140 (p_file)->last_read = fread( p_u16, 1, 2, (p_file)->h.file ); \
    +
    141 break; \
    +
    142 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    143 ((uint8_t*)(p_u16))[0] = (p_file)->mem_buffer[idx + 1]; \
    +
    144 ((uint8_t*)(p_u16))[1] = (p_file)->mem_buffer[idx]; \
    +
    145 (p_file)->mem_cursor += 2; \
    +
    146 break; \
    +
    147 mfile_default_case( p_file ); \
    +
    148 }
    +
    149
    +
    150#define mfile_u32read_at( p_file, p_u32, idx ) \
    +
    151 switch( (p_file)->type ) { \
    +
    152 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    153 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    154 (p_file)->last_read = \
    +
    155 fread( (((uint8_t*)p_u32) + 3), 1, 1, (p_file)->h.file ); \
    +
    156 (p_file)->last_read += \
    +
    157 fread( (((uint8_t*)p_u32) + 2), 1, 1, (p_file)->h.file ); \
    +
    158 (p_file)->last_read += \
    +
    159 fread( (((uint8_t*)p_u32) + 1), 1, 1, (p_file)->h.file ); \
    +
    160 (p_file)->last_read += \
    +
    161 fread( ((uint8_t*)p_u32), 1, 1, (p_file)->h.file ); \
    +
    162 break; \
    +
    163 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    164 ((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[idx]; \
    +
    165 ((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[idx + 1]; \
    +
    166 ((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[idx + 2]; \
    +
    167 ((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[idx + 3]; \
    +
    168 (p_file)->mem_cursor += 4; \
    +
    169 break; \
    +
    170 mfile_default_case( p_file ); \
    +
    171 }
    +
    172
    +
    173#define mfile_u32read_lsbf( p_file, p_u32 ) \
    +
    174 switch( (p_file)->type ) { \
    +
    175 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    176 (p_file)->last_read = fread( p_u32, 1, 4, (p_file)->h.file ); \
    +
    177 break; \
    +
    178 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    179 ((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[(p_file)->mem_cursor]; \
    +
    180 ((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[(p_file)->mem_cursor + 1]; \
    +
    181 ((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[(p_file)->mem_cursor + 2]; \
    +
    182 ((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[(p_file)->mem_cursor + 3]; \
    +
    183 (p_file)->mem_cursor += 4; \
    +
    184 break; \
    +
    185 mfile_default_case( p_file ); \
    +
    186 }
    +
    187
    +
    188#define mfile_u32read_lsbf_at( p_file, p_u32, idx ) \
    +
    189 switch( (p_file)->type ) { \
    +
    190 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    191 fseek( (p_file)->h.file, idx, SEEK_SET ); \
    +
    192 (p_file)->last_read = fread( p_u32, 1, 4, (p_file)->h.file ); \
    +
    193 break; \
    +
    194 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    195 ((uint8_t*)(p_u32))[3] = (p_file)->mem_buffer[idx]; \
    +
    196 ((uint8_t*)(p_u32))[2] = (p_file)->mem_buffer[idx + 1]; \
    +
    197 ((uint8_t*)(p_u32))[1] = (p_file)->mem_buffer[idx + 2]; \
    +
    198 ((uint8_t*)(p_u32))[0] = (p_file)->mem_buffer[idx + 3]; \
    +
    199 (p_file)->mem_cursor += 4; \
    +
    200 break; \
    +
    201 mfile_default_case( p_file ); \
    +
    202 }
    +
    203
    +
    204#endif /* MFILE_LEGACY_MACROS */
    +
    205
    +
    206#define mfile_get_sz( p_file ) ((p_file)->sz)
    +
    207
    +
    208#define mfile_reset( p_file ) \
    +
    209 switch( (p_file)->type ) { \
    +
    210 case MFILE_CADDY_TYPE_FILE_READ: \
    +
    211 fseek( (p_file)->h.file, 0, SEEK_SET ); \
    +
    212 break; \
    +
    213 case MFILE_CADDY_TYPE_MEM_BUFFER: \
    +
    214 (p_file)->mem_cursor = 0; \
    +
    215 break; \
    +
    216 mfile_default_case( p_file ); \
    +
    217 }
    +
    218
    +
    219MERROR_RETVAL mfile_read_block( mfile_t* p_f, uint8_t* buf, off_t buf_sz );
    +
    220
    +
    221MERROR_RETVAL mfile_read_line( mfile_t*, char* buffer, off_t buffer_sz );
    +
    222
    +
    226MERROR_RETVAL mfile_lock_buffer( MAUG_MHANDLE, off_t, mfile_t* p_file );
    +
    227
    +
    232MERROR_RETVAL mfile_open_read( const char* filename, mfile_t* p_file );
    +
    233
    +
    237void mfile_close( mfile_t* p_file );
    +
    238
    +
    239#ifdef MFILE_C
    +
    240
    +
    241#ifdef MFILE_MMAP
    +
    242# include <sys/mman.h> /* mmap() */
    +
    243# include <unistd.h> /* close() */
    +
    244# include <fcntl.h> /* open() */
    +
    245# include <sys/stat.h> /* fstat() */
    +
    246#else
    +
    247# include <stdio.h>
    +
    248#endif /* RETROFLAT_OS_UNIX */
    +
    249
    +
    250/* === */
    +
    251
    +
    252MERROR_RETVAL mfile_file_read_int(
    +
    253 struct MFILE_CADDY* p_file, uint8_t* buf, size_t buf_sz, uint8_t flags
    +
    254) {
    +
    255 MERROR_RETVAL retval = MERROR_OK;
    +
    256 ssize_t last_read = 0;
    +
    257
    +
    258 assert( MFILE_CADDY_TYPE_FILE_READ == p_file->type );
    +
    259
    +
    260 if( MFILE_READ_FLAG_LSBF == (MFILE_READ_FLAG_LSBF & flags) ) {
    +
    261 /* Shrink the buffer moving right and read into it. */
    +
    262 while( 0 < buf_sz ) {
    +
    263 last_read = fread( buf, 1, 1, p_file->h.file );
    +
    264 if( 0 >= last_read ) {
    +
    265 error_printf( "unable to read from file!" );
    +
    266 retval = MERROR_FILE;
    +
    267 goto cleanup;
    +
    268 }
    +
    269 buf_sz--;
    +
    270 buf++;
    +
    271 }
    +
    272
    +
    273 } else {
    +
    274 /* Move to the end of the output buffer and read backwards. */
    +
    275 while( 0 < buf_sz ) {
    +
    276 last_read = fread( (buf + (buf_sz - 1)), 1, 1, p_file->h.file );
    +
    277 if( 0 >= last_read ) {
    +
    278 error_printf( "unable to read from file!" );
    +
    279 retval = MERROR_FILE;
    +
    280 goto cleanup;
    +
    281 }
    +
    282 buf_sz--;
    +
    283 }
    +
    284 }
    +
    285
    +
    286cleanup:
    +
    287
    +
    288 return retval;
    +
    289}
    +
    290
    +
    291/* === */
    +
    292
    +
    293MERROR_RETVAL mfile_file_seek( struct MFILE_CADDY* p_file, off_t pos ) {
    +
    294 MERROR_RETVAL retval = MERROR_OK;
    +
    295
    +
    296 assert( MFILE_CADDY_TYPE_FILE_READ == p_file->type );
    +
    297
    +
    298 if( fseek( p_file->h.file, pos, SEEK_SET ) ) {
    +
    299 error_printf( "unable to seek file!" );
    +
    300 retval = MERROR_FILE;
    +
    301 }
    +
    302
    +
    303 return retval;
    +
    304}
    +
    305
    +
    306/* === */
    +
    307
    +
    308MERROR_RETVAL mfile_mem_read_int(
    +
    309 struct MFILE_CADDY* p_file, uint8_t* buf, size_t buf_sz, uint8_t flags
    +
    310) {
    +
    311 MERROR_RETVAL retval = MERROR_OK;
    +
    312
    +
    313 assert( MFILE_CADDY_TYPE_MEM_BUFFER == p_file->type );
    +
    314
    +
    315 if( MFILE_READ_FLAG_LSBF != (MFILE_READ_FLAG_LSBF & flags) ) {
    +
    316 /* Shrink the buffer moving right and read into it. */
    +
    317 while( 0 < buf_sz ) {
    +
    318 /* Check for EOF. */
    +
    319 if( p_file->mem_cursor >= p_file->sz ) {
    +
    320 retval = MERROR_FILE;
    +
    321 error_printf(
    +
    322 "cursor " OFF_T_FMT " beyond end of buffer " OFF_T_FMT "!",
    +
    323 p_file->mem_cursor, p_file->sz );
    +
    324 goto cleanup;
    +
    325 }
    +
    326
    +
    327 buf[buf_sz - 1] = p_file->mem_buffer[p_file->mem_cursor];
    +
    328 debug_printf( 1, "byte #" SIZE_T_FMT " = # " OFF_T_FMT,
    +
    329 buf_sz - 1, p_file->mem_cursor );
    +
    330 buf_sz--;
    +
    331 p_file->mem_cursor++;
    +
    332 }
    +
    333
    +
    334 } else {
    +
    335 /* Move to the end of the output buffer and read backwards. */
    +
    336 while( 0 < buf_sz ) {
    +
    337 /* Check for EOF. */
    +
    338 if( p_file->mem_cursor >= p_file->sz ) {
    +
    339 retval = MERROR_FILE;
    +
    340 error_printf(
    +
    341 "cursor " OFF_T_FMT " beyond end of buffer " OFF_T_FMT "!",
    +
    342 p_file->mem_cursor, p_file->sz );
    +
    343 goto cleanup;
    +
    344 }
    +
    345
    +
    346 buf[buf_sz - 1] = p_file->mem_buffer[p_file->mem_cursor];
    +
    347 debug_printf( 1, "byte #" SIZE_T_FMT " = # " OFF_T_FMT,
    +
    348 buf_sz - 1, p_file->mem_cursor );
    +
    349 buf_sz--;
    +
    350 buf++;
    +
    351 p_file->mem_cursor++;
    +
    352 }
    +
    353 }
    +
    354
    +
    355cleanup:
    +
    356
    +
    357 return retval;
    +
    358}
    +
    359
    +
    360/* === */
    +
    361
    +
    362MERROR_RETVAL mfile_mem_seek( struct MFILE_CADDY* p_file, off_t pos ) {
    +
    363 MERROR_RETVAL retval = MERROR_OK;
    +
    364
    +
    365 assert( MFILE_CADDY_TYPE_MEM_BUFFER == p_file->type );
    +
    366
    +
    367 p_file->mem_cursor = pos;
    +
    368
    +
    369 debug_printf( 1,
    +
    370 "seeking memory buffer to position " OFF_T_FMT " (" OFF_T_FMT ")",
    +
    371 pos, p_file->mem_cursor );
    +
    372
    +
    373 return retval;
    +
    374}
    +
    375
    +
    376/* === */
    +
    377
    +
    378MERROR_RETVAL mfile_read_block( mfile_t* p_f, uint8_t* buf, off_t buf_sz ) {
    +
    379 MERROR_RETVAL retval = MERROR_OK;
    +
    380 off_t i_read = 0;
    +
    381
    +
    382 if( MFILE_CADDY_TYPE_FILE_READ == p_f->type ) {
    +
    383 i_read = fread( buf, 1, buf_sz, p_f->h.file );
    +
    384 if( i_read != buf_sz ) {
    +
    385 error_printf(
    +
    386 "block read size did not match size read! (" SIZE_T_FMT " vs "
    +
    387 SIZE_T_FMT ")", i_read, buf_sz );
    +
    388 retval = MERROR_FILE;
    +
    389 }
    +
    390 goto cleanup;
    +
    391 }
    +
    392
    +
    393 /* Assume we're reading a memory buffer. */
    +
    394 memcpy( buf, p_f->mem_buffer, buf_sz < p_f->sz ? buf_sz : p_f->sz );
    +
    395 if( p_f->sz <= buf_sz ) {
    +
    396 error_printf(
    +
    397 "block read size did not match size read! (" SIZE_T_FMT " vs "
    +
    398 SIZE_T_FMT ")", p_f->sz, buf_sz );
    +
    399 retval = MERROR_FILE;
    +
    400 }
    +
    401
    +
    402cleanup:
    +
    403
    +
    404 return retval;
    +
    405
    +
    406}
    +
    407
    +
    408MERROR_RETVAL mfile_read_line( mfile_t* p_f, char* buffer, off_t buffer_sz ) {
    +
    409 MERROR_RETVAL retval = MERROR_OK;
    +
    410 off_t i = 0;
    +
    411
    +
    412 if( MFILE_CADDY_TYPE_FILE_READ == p_f->type ) {
    +
    413 /* Trivial case; use a native function. Much faster! */
    +
    414 fgets( buffer, buffer_sz - 1, p_f->h.file );
    +
    415 goto cleanup;
    +
    416 }
    +
    417
    +
    418 /* Assume we're reading a memory buffer. */
    +
    419
    +
    420 while( i < buffer_sz - 1 && mfile_has_bytes( p_f ) ) {
    +
    421 /* Check for potential overflow. */
    +
    422 if( i + 1 >= buffer_sz ) {
    +
    423 error_printf( "overflow reading string from file!" );
    +
    424 retval = MERROR_OVERFLOW;
    +
    425 break;
    +
    426 }
    +
    427
    +
    428 p_f->read_int( p_f, (uint8_t*)&(buffer[i]), 1, 0 );
    +
    429 if( '\n' == buffer[i] ) {
    +
    430 /* Break on newline and overwrite it below. */
    +
    431 break;
    +
    432 }
    +
    433 i++;
    +
    434 }
    +
    435
    +
    436 assert( i < buffer_sz ); /* while() above stops before buffer_sz! */
    +
    437
    +
    438 /* Append a null terminator. */
    +
    439 buffer[i] = '\0';
    +
    440
    +
    441cleanup:
    +
    442
    +
    443 return retval;
    +
    444}
    +
    445
    + +
    447 MAUG_MHANDLE handle, off_t handle_sz, mfile_t* p_file
    +
    448) {
    +
    449 MERROR_RETVAL retval = MERROR_OK;
    +
    450
    +
    451 debug_printf( 1,
    +
    452 "locking handle %p as file %p (" OFF_T_FMT " bytes)...",
    +
    453 handle, p_file, handle_sz );
    +
    454
    +
    455 maug_mzero( p_file, sizeof( struct MFILE_CADDY ) );
    +
    456 maug_mlock( handle, p_file->mem_buffer );
    + +
    458
    +
    459 p_file->read_int = mfile_mem_read_int;
    +
    460 p_file->seek = mfile_mem_seek;
    +
    461 p_file->sz = handle_sz;
    +
    462
    +
    463 return retval;
    +
    464}
    +
    465
    +
    466MERROR_RETVAL mfile_open_read( const char* filename, mfile_t* p_file ) {
    +
    467 MERROR_RETVAL retval = MERROR_OK;
    +
    468# ifdef MFILE_MMAP
    +
    469 uint8_t* bytes_ptr = NULL;
    +
    470 struct stat st;
    +
    471 int in_file = 0;
    +
    472# else
    +
    473 struct stat file_stat;
    +
    474# endif /* MFILE_MMAP */
    +
    475
    +
    476 /* MAUG_MHANDLE* p_bytes_ptr_h, off_t* p_bytes_sz */
    +
    477
    +
    478# ifdef MFILE_MMAP
    +
    479
    +
    480 in_file = open( filename, O_RDONLY );
    +
    481 if( 0 >= in_file ) {
    +
    482 error_printf( "could not open file: %s", filename );
    +
    483 retval = MERROR_FILE;
    +
    484 goto cleanup;
    +
    485 }
    +
    486
    +
    487 fstat( in_file, &st );
    +
    488
    +
    489 *p_bytes_ptr_h =
    +
    490 mmap( (caddr_t)0, st.st_size, PROT_READ, MAP_SHARED, in_file, 0 );
    +
    491 maug_cleanup_if_null_alloc( uint8_t*, *p_bytes_ptr_h );
    +
    492 *p_bytes_sz = st.st_size;
    +
    493
    +
    494cleanup:
    +
    495
    +
    496 if( 0 < in_file ) {
    +
    497 close( in_file );
    +
    498 }
    +
    499
    +
    500# else
    +
    501
    +
    502 /* Get the file size from the OS. */
    +
    503 stat( filename, &file_stat );
    +
    504 p_file->sz = file_stat.st_size;
    +
    505
    +
    506# define MFILE_GOT_FILE_SIZE 1
    +
    507
    +
    508 /* Open the permanent file handle. */
    +
    509 p_file->h.file = fopen( filename, "rb" );
    +
    510 if( NULL == p_file->h.file ) {
    +
    511 error_printf( "could not open file: %s", filename );
    +
    512 retval = MERROR_FILE;
    +
    513 goto cleanup;
    +
    514 }
    +
    515
    +
    516#ifndef MFILE_GOT_FILE_SIZE
    +
    517 /* The standard is not required to support SEEK_END, among other issues.
    +
    518 * This is probably the worst way to get file size.
    +
    519 */
    +
    520 debug_printf( 2, "falling back to seek file size..." );
    +
    521 fseek( p_file->h.file, 0, SEEK_END );
    +
    522 p_file->sz = ftell( p_file->h.file );
    +
    523 fseek( p_file->h.file, 0, SEEK_SET );
    +
    524#endif /* MAUG_OS_* */
    +
    525
    +
    526 debug_printf( 1, "opened file %s (" SIZE_T_FMT " bytes)...",
    +
    527 filename, p_file->sz );
    +
    528 /* debug_printf( 3, "XXX %ld bytes", file_stat.st_size );
    +
    529 debug_printf( 3, "XXX size_t: %d, off_t: %d", sizeof( size_t ), sizeof( off_t ) ); */
    +
    530
    + +
    532
    +
    533 p_file->read_int = mfile_file_read_int;
    +
    534 p_file->seek = mfile_file_seek;
    +
    535
    +
    536/*
    +
    537 *p_bytes_ptr_h = maug_malloc( 1, *p_bytes_sz );
    +
    538 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_bytes_ptr_h );
    +
    539
    +
    540 maug_mlock( *p_bytes_ptr_h, bytes_ptr );
    +
    541 maug_cleanup_if_null_alloc( uint8_t*, bytes_ptr );
    +
    542
    +
    543 bytes_rd = fread( bytes_ptr, 1, *p_bytes_sz, in_file );
    +
    544 if( bytes_rd < *p_bytes_sz ) {
    +
    545 error_printf( "could not read entire file!" );
    +
    546 retval = MERROR_FILE;
    +
    547 goto cleanup;
    +
    548 }
    +
    549
    +
    550cleanup:
    +
    551
    +
    552 if( NULL != bytes_ptr ) {
    +
    553 maug_munlock( *p_bytes_ptr_h, bytes_ptr );
    +
    554 }
    +
    555
    +
    556 if( NULL != in_file ) {
    +
    557 fclose( in_file );
    +
    558 }
    +
    559
    +
    560*/
    +
    561
    +
    562cleanup:
    +
    563
    +
    564# endif /* MFILE_MMAP */
    +
    565
    +
    566 return retval;
    +
    567}
    +
    568
    +
    569void mfile_close( mfile_t* p_file ) {
    +
    570# ifdef MFILE_MMAP
    +
    571 munmap( bytes_ptr_h, bytes_sz );
    +
    572# else
    +
    573 /* maug_mfree( bytes_ptr_h ); */
    +
    574 switch( p_file->type ) {
    +
    575 case 0:
    +
    576 /* Do nothing silently. */
    +
    577 break;
    +
    578
    + +
    580 fclose( p_file->h.file );
    +
    581 p_file->type = 0;
    +
    582 break;
    +
    583
    + +
    585 if( NULL != p_file->mem_buffer ) {
    +
    586 maug_munlock( p_file->h.mem, p_file->mem_buffer );
    +
    587 debug_printf( 1, "unlocked handle %p from file %p...",
    +
    588 p_file->h.mem, p_file );
    +
    589 p_file->type = 0;
    +
    590 }
    +
    591 break;
    +
    592
    +
    593 mfile_default_case( p_file );
    +
    594 }
    +
    595# endif /* MFILE_MMAP */
    +
    596}
    +
    597
    +
    598#endif /* MFILE_C */
    +
    599
    +
    600 /* maug_mfile */
    +
    601
    +
    602#endif /* !MFILE_H */
    +
    603
    +
    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_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().
    +
    MERROR_RETVAL mfile_lock_buffer(MAUG_MHANDLE, off_t, mfile_t *p_file)
    Lock a buffer and assign it to an mfile_t to read/write.
    +
    Definition mfile.h:53
    +
    off_t mem_cursor
    Current position if its type is MFILE_CADDY_TYPE_MEM_BUFFER.
    Definition mfile.h:61
    +
    uint8_t type
    The RetroFile Types flag describing this file.
    Definition mfile.h:55
    +
    union MFILE_HANDLE h
    The physical handle or pointer to access the file by.
    Definition mfile.h:57
    +
    uint8_t * mem_buffer
    Locked pointer for MFILE_HANDLE::mem.
    Definition mfile.h:63
    +
    Definition mfile.h:48
    +
    + + +
    + + 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 retval = p_file_in->seek( p_file_in, file_offset + in_byte_cur++ );
    +
    261 maug_cleanup_if_not_ok();
    +
    262 retval = p_file_in->read_int( p_file_in, &byte_buffer, 1, 0 );
    +
    263 maug_cleanup_if_not_ok();
    +
    264
    +
    265 /*
    +
    266 mfile_cread_at(
    +
    267 p_file_in, &(byte_buffer), file_offset + in_byte_cur++ );
    +
    268 */
    +
    269 debug_printf( MFMT_TRACE_RLE_LVL, "in byte " SIZE_T_FMT
    +
    270 ": 0x%02x, out byte " SIZE_T_FMT ", line px: %u",
    +
    271 in_byte_cur, byte_buffer, out_byte_cur, line_px_written );
    +
    272
    +
    273 switch( byte_buffer ) {
    +
    274 case 0:
    +
    275 if( MFMT_RLE_DECODE_RUN == decode_state ) {
    +
    276 mfmt_decode_rle_state( MFMT_RLE_DECODE_ESC );
    +
    277 break;
    +
    278
    +
    279 } else if( MFMT_RLE_DECODE_LITERAL_PAD == decode_state ) {
    +
    280 /* This is just a padding byte to make sure literals are %16. */
    +
    281 assert( 0 == byte_buffer );
    +
    282 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    283 break;
    +
    284
    +
    285 } else if( MFMT_RLE_DECODE_ESC == decode_state ) {
    +
    286 /* This is an EOL marker. */
    +
    287 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    288 "EOL: %u px written", line_px_written );
    +
    289 while( line_px_written < line_w ) {
    +
    290 /* Pad out the end of the line. */
    +
    291 assert( 0 == line_px_written % 2 );
    +
    292 buffer_out[out_byte_cur++] = 0x00;
    +
    293 mfmt_decode_rle_inc_line_w( 2 );
    +
    294 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    295 "padded line (%u written)", line_px_written );
    +
    296 }
    +
    297 mfmt_decode_rle_reset_line();
    +
    298
    +
    299 /* Diversion over, go back to hunting for runs. */
    +
    300 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    301 break;
    +
    302 }
    +
    303
    +
    304 case 1:
    +
    305 if( MFMT_RLE_DECODE_ESC == decode_state ) {
    +
    306 debug_printf( MFMT_TRACE_RLE_LVL, "EOBM" );
    +
    307 /* End of bitmap, so pad the rest of the file. */
    +
    308
    +
    309 while( out_byte_cur < buffer_out_sz ) {
    +
    310 /* Pad out the end of the line. */
    +
    311 assert( 0 == line_px_written % 2 );
    +
    312 mfmt_decode_rle_check_eol();
    +
    313 buffer_out[out_byte_cur++] = 0x00;
    +
    314 mfmt_decode_rle_inc_line_w( 2 );
    +
    315 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    316 "padded file (%u written)", line_px_written );
    +
    317 }
    +
    318
    +
    319 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    320 break;
    +
    321 }
    +
    322
    +
    323 case 2:
    +
    324 if( MFMT_RLE_DECODE_ESC == decode_state ) {
    +
    325 debug_printf( MFMT_TRACE_RLE_LVL, "absolute mode: right" );
    +
    326 /* TODO: Absolute mode. */
    +
    327 assert( 1 == 0 );
    +
    328 mfmt_decode_rle_state( MFMT_RLE_DECODE_ABS_RIGHT );
    +
    329 break;
    +
    330 }
    +
    331
    +
    332 default:
    +
    333 switch( decode_state ) {
    +
    334 case MFMT_RLE_DECODE_LITERAL:
    +
    335
    +
    336 mfmt_decode_rle_check_eol();
    +
    337
    +
    338 run_count -= 2;
    +
    339 unpadded_written += 2;
    +
    340 mfmt_decode_rle_inc_line_w( 2 );
    +
    341 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    342 "writing literal: 0x%02x (%u left, unpadded run val: %u)",
    +
    343 byte_buffer, run_count, unpadded_written );
    +
    344 buffer_out[out_byte_cur++] = byte_buffer;
    +
    345
    +
    346 if( 0 == run_count ) {
    +
    347 if( 0 != unpadded_written % 4 ) {
    +
    348 /* Uneven number of literals copied. */
    +
    349 /* Ignore the byte, as it's a pad to word-size/16-bits. */
    +
    350 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    351 "unpadded: %u, next is pad byte", unpadded_written );
    +
    352 /* assert( 0 == byte_buffer ); */
    +
    353 mfmt_decode_rle_state( MFMT_RLE_DECODE_LITERAL_PAD );
    +
    354 } else {
    +
    355
    +
    356 /* Diversion over, go back to hunting for runs. */
    +
    357 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    358 }
    +
    359 }
    +
    360 break;
    +
    361
    +
    362 case MFMT_RLE_DECODE_ESC:
    +
    363 run_count = byte_buffer;
    +
    364 unpadded_written = 0;
    +
    365 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    366 "literal mode: %u nibbles", run_count );
    +
    367 assert( 0 == run_count % 2 );
    +
    368 mfmt_decode_rle_state( MFMT_RLE_DECODE_LITERAL );
    +
    369 break;
    +
    370
    +
    371 case MFMT_RLE_DECODE_ABS_RIGHT:
    +
    372 debug_printf( MFMT_TRACE_RLE_LVL, "absolute mode: up" );
    +
    373 /* TODO: Absolute mode. */
    +
    374 assert( 1 == 0 );
    +
    375 mfmt_decode_rle_state( MFMT_RLE_DECODE_ABS_DOWN );
    +
    376 break;
    +
    377
    +
    378 case MFMT_RLE_DECODE_RUN:
    +
    379
    +
    380 mfmt_decode_rle_check_eol();
    +
    381
    +
    382 run_count = byte_buffer;
    +
    383 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    384 "starting run: %u nibbles", run_count );
    +
    385 mfmt_decode_rle_state( MFMT_RLE_DECODE_CHAR );
    +
    386 break;
    +
    387
    +
    388 case MFMT_RLE_DECODE_CHAR:
    +
    389 assert( 0 != run_count );
    +
    390 run_char = byte_buffer;
    +
    391 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    392 "%u-long run of 0x%02x...", run_count, run_char );
    +
    393 do {
    +
    394 /* Expand the run into the prescribed number of nibbles. */
    +
    395 debug_printf( MFMT_TRACE_RLE_LVL,
    +
    396 "writing 0x%02x & 0x%02x #%u (line px #%u)...",
    +
    397 run_char, out_mask_cur, run_count, line_px_written );
    +
    398 buffer_out[out_byte_cur] |= (run_char & out_mask_cur);
    +
    399 mfmt_decode_rle_advance_mask();
    +
    400 mfmt_decode_rle_inc_line_w( 1 );
    +
    401 run_count--;
    +
    402
    +
    403 } while( 0 < run_count );
    +
    404
    +
    405 /* Diversion over, go back to hunting for runs. */
    +
    406 mfmt_decode_rle_state( MFMT_RLE_DECODE_RUN );
    +
    407 break;
    +
    408
    +
    409 }
    +
    410 break;
    +
    411 }
    +
    412 } while( in_byte_cur < file_sz );
    +
    413
    +
    414 debug_printf(
    +
    415 MFMT_TRACE_RLE_LVL, "wrote " SIZE_T_FMT " bytes (%u lines)",
    +
    416 out_byte_cur, lines_out );
    +
    417
    +
    418cleanup:
    +
    419
    +
    420 if( NULL != buffer_out ) {
    +
    421 maug_munlock( buffer_out_h, buffer_out );
    +
    422 }
    +
    423
    +
    424 return retval;
    +
    425}
    +
    426
    +
    427MERROR_RETVAL mfmt_read_bmp_header(
    +
    428 struct MFMT_STRUCT* header, mfile_t* p_file_in,
    +
    429 uint32_t file_offset, off_t file_sz, uint8_t* p_flags
    +
    430) {
    +
    431 MERROR_RETVAL retval = MERROR_OK;
    +
    432 struct MFMT_STRUCT_BMPINFO* header_bmp_info = NULL;
    +
    433 struct MFMT_STRUCT_BMPFILE* header_bmp_file = NULL;
    +
    434 uint32_t file_hdr_sz = 0;
    +
    435 off_t header_offset = 0;
    +
    436
    +
    437 mfmt_bmp_check_header();
    +
    438
    +
    439 if( NULL != header_bmp_file ) {
    +
    440 header_offset = 14; /* Size of info header. */
    +
    441
    +
    442 /* Grab file header info. */
    +
    443 retval = p_file_in->seek( p_file_in, file_offset + 2 );
    +
    444 maug_cleanup_if_not_ok();
    +
    445 retval = p_file_in->read_int( p_file_in,
    +
    446 (uint8_t*)&(header_bmp_file->file_sz), 4, MFILE_READ_FLAG_LSBF );
    +
    447 maug_cleanup_if_not_ok();
    +
    448
    +
    449 retval = p_file_in->seek( p_file_in, file_offset + 10 );
    +
    450 maug_cleanup_if_not_ok();
    +
    451 retval = p_file_in->read_int( p_file_in,
    +
    452 (uint8_t*)&(header_bmp_file->px_offset), 4, MFILE_READ_FLAG_LSBF );
    +
    453 maug_cleanup_if_not_ok();
    +
    454
    +
    455 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    456 "bitmap file " UPRINTF_U32_FMT " bytes long, px at "
    +
    457 UPRINTF_U32_FMT " bytes",
    +
    458 header_bmp_file->file_sz, header_bmp_file->px_offset );
    +
    459 }
    +
    460
    +
    461 /* Read the bitmap image header. */
    +
    462 retval = p_file_in->seek( p_file_in, file_offset + header_offset );
    +
    463 maug_cleanup_if_not_ok();
    +
    464 retval = p_file_in->read_int( p_file_in,
    +
    465 (uint8_t*)&file_hdr_sz, 4, MFILE_READ_FLAG_LSBF );
    +
    466 maug_cleanup_if_not_ok();
    +
    467 if( 40 != file_hdr_sz ) { /* Windows BMP. */
    +
    468 error_printf( "invalid header size: " UPRINTF_U32_FMT, file_hdr_sz );
    +
    469 retval = MERROR_FILE;
    +
    470 goto cleanup;
    +
    471 }
    +
    472 debug_printf(
    +
    473 MFMT_TRACE_BMP_LVL, "bitmap header is " UPRINTF_U32_FMT " bytes",
    +
    474 file_hdr_sz );
    +
    475
    +
    476 if( 40 > file_sz - (file_offset + header_offset) ) {
    +
    477 error_printf(
    +
    478 "bitmap header overflow! (only " SIZE_T_FMT " bytes remain!)",
    +
    479 file_sz - (file_offset + header_offset) );
    +
    480 retval = MERROR_OVERFLOW;
    +
    481 goto cleanup;
    +
    482 }
    +
    483
    +
    484 /* Read bitmap image dimensions. */
    +
    485 retval = p_file_in->seek( p_file_in,
    +
    486 file_offset + header_offset + MFMT_BMPINFO_OFS_WIDTH );
    +
    487 maug_cleanup_if_not_ok();
    +
    488 retval = p_file_in->read_int( p_file_in,
    +
    489 (uint8_t*)&(header_bmp_info->width), 4, MFILE_READ_FLAG_LSBF );
    +
    490 maug_cleanup_if_not_ok();
    +
    491
    +
    492 retval = p_file_in->seek( p_file_in,
    +
    493 file_offset + header_offset + MFMT_BMPINFO_OFS_HEIGHT );
    +
    494 maug_cleanup_if_not_ok();
    +
    495 retval = p_file_in->read_int( p_file_in,
    +
    496 (uint8_t*)&(header_bmp_info->height), 4, MFILE_READ_FLAG_LSBF );
    +
    497 maug_cleanup_if_not_ok();
    +
    498
    +
    499 if( 0 > header_bmp_info->height ) {
    +
    500 debug_printf(
    +
    501 MFMT_TRACE_BMP_LVL, "bitmap Y coordinate is inverted..." );
    +
    502 *p_flags |= MFMT_PX_FLAG_INVERT_Y;
    +
    503 }
    +
    504
    +
    505 retval = p_file_in->seek( p_file_in,
    +
    506 file_offset + header_offset + MFMT_BMPINFO_OFS_SZ );
    +
    507 maug_cleanup_if_not_ok();
    +
    508 retval = p_file_in->read_int( p_file_in,
    +
    509 (uint8_t*)&(header_bmp_info->img_sz), 4, MFILE_READ_FLAG_LSBF );
    +
    510 maug_cleanup_if_not_ok();
    +
    511
    +
    512 /* Check that we're a palettized image. */
    +
    513 retval = p_file_in->seek( p_file_in,
    +
    514 file_offset + header_offset + MFMT_BMPINFO_OFS_BPP );
    +
    515 maug_cleanup_if_not_ok();
    +
    516 retval = p_file_in->read_int( p_file_in,
    +
    517 (uint8_t*)&(header_bmp_info->bpp), 2, MFILE_READ_FLAG_LSBF );
    +
    518 maug_cleanup_if_not_ok();
    +
    519
    +
    520 if( 8 < header_bmp_info->bpp ) {
    +
    521 error_printf( "invalid bitmap bpp: %u", header_bmp_info->bpp );
    +
    522 retval = MERROR_FILE;
    +
    523 goto cleanup;
    +
    524 }
    +
    525
    +
    526 /* Make sure there's no weird compression. */
    +
    527 retval = p_file_in->seek( p_file_in,
    +
    528 file_offset + header_offset + MFMT_BMPINFO_OFS_COMPRESSION );
    +
    529 maug_cleanup_if_not_ok();
    +
    530 retval = p_file_in->read_int( p_file_in,
    +
    531 (uint8_t*)&(header_bmp_info->compression), 4, MFILE_READ_FLAG_LSBF );
    +
    532 maug_cleanup_if_not_ok();
    +
    533
    +
    534 if(
    +
    535 MFMT_BMP_COMPRESSION_NONE != header_bmp_info->compression &&
    +
    536 MFMT_BMP_COMPRESSION_RLE4 != header_bmp_info->compression
    +
    537 ) {
    +
    538 error_printf( "invalid bitmap compression: " UPRINTF_U32_FMT,
    +
    539 header_bmp_info->compression );
    +
    540 retval = MERROR_FILE;
    +
    541 goto cleanup;
    +
    542 }
    +
    543
    +
    544 /* Get the number of palette colors. */
    +
    545
    +
    546 retval = p_file_in->seek( p_file_in,
    +
    547 file_offset + header_offset + MFMT_BMPINFO_OFS_PAL_SZ );
    +
    548 maug_cleanup_if_not_ok();
    +
    549 retval = p_file_in->read_int( p_file_in,
    +
    550 (uint8_t*)&(header_bmp_info->palette_ncolors), 4, MFILE_READ_FLAG_LSBF );
    +
    551 maug_cleanup_if_not_ok();
    +
    552
    +
    553 debug_printf( 2, "bitmap is " UPRINTF_S32_FMT " x " UPRINTF_S32_FMT
    +
    554 ", %u bpp (palette has " UPRINTF_U32_FMT " colors)",
    +
    555 header_bmp_info->width, header_bmp_info->height,
    +
    556 header_bmp_info->bpp, header_bmp_info->palette_ncolors );
    +
    557
    +
    558cleanup:
    +
    559
    +
    560 return retval;
    +
    561}
    +
    562
    +
    563MERROR_RETVAL mfmt_read_bmp_palette(
    +
    564 struct MFMT_STRUCT* header, uint32_t* palette, size_t palette_sz,
    +
    565 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags
    +
    566) {
    +
    567 MERROR_RETVAL retval = MERROR_OK;
    +
    568 struct MFMT_STRUCT_BMPINFO* header_bmp_info = NULL;
    +
    569 struct MFMT_STRUCT_BMPFILE* header_bmp_file = NULL;
    +
    570 off_t i = 0;
    +
    571
    +
    572 mfmt_bmp_check_header();
    +
    573
    +
    574 retval = p_file_in->seek( p_file_in, file_offset );
    +
    575 maug_cleanup_if_not_ok();
    +
    576 for( i = 0 ; header_bmp_info->palette_ncolors > i ; i++ ) {
    +
    577 if( i * 4 > palette_sz ) {
    +
    578 error_printf( "palette overflow!" );
    +
    579 retval = MERROR_OVERFLOW;
    +
    580 goto cleanup;
    +
    581 }
    +
    582
    +
    583 retval = p_file_in->read_int( p_file_in,
    +
    584 (uint8_t*)&(palette[i]), 4, MFILE_READ_FLAG_LSBF );
    +
    585 maug_cleanup_if_not_ok();
    +
    586
    +
    587 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    588 "set palette entry " SIZE_T_FMT " to " UPRINTF_X32_FMT,
    +
    589 i, palette[i] );
    +
    590 }
    +
    591
    +
    592cleanup:
    +
    593
    +
    594 return retval;
    +
    595}
    +
    596
    + +
    598 struct MFMT_STRUCT* header, uint8_t SEG_FAR* px, off_t px_sz,
    +
    599 mfile_t* p_file_in, uint32_t file_offset, off_t file_sz, uint8_t flags
    +
    600) {
    +
    601 MERROR_RETVAL retval = MERROR_OK;
    +
    602 struct MFMT_STRUCT_BMPINFO* header_bmp_info = NULL;
    +
    603 struct MFMT_STRUCT_BMPFILE* header_bmp_file = NULL;
    +
    604 int32_t x = 0,
    +
    605 y = 0;
    +
    606 uint32_t i = 0,
    +
    607 byte_in_idx = 0,
    +
    608 byte_out_idx = 0,
    +
    609 bit_idx = 0;
    +
    610 uint8_t byte_buffer = 0,
    +
    611 byte_mask = 0,
    +
    612 pixel_buffer = 0;
    +
    613 MAUG_MHANDLE decomp_buffer_h = (MAUG_MHANDLE)NULL;
    +
    614 mfile_t file_decomp;
    +
    615 mfile_t *p_file_bmp = p_file_in;
    +
    616
    +
    617 /* Check header for validation and info on how to decode pixels. */
    +
    618
    +
    619 mfmt_bmp_check_header();
    +
    620
    +
    621 if( 0 == header_bmp_info->height ) {
    +
    622 error_printf( "bitmap height is 0!" );
    +
    623 retval = MERROR_FILE;
    +
    624 goto cleanup;
    +
    625 }
    +
    626
    +
    627 if( 0 == header_bmp_info->width ) {
    +
    628 error_printf( "bitmap width is 0!" );
    +
    629 retval = MERROR_FILE;
    +
    630 goto cleanup;
    +
    631 }
    +
    632
    +
    633 if( 0 == header_bmp_info->bpp ) {
    +
    634 error_printf( "bitmap BPP is 0!" );
    +
    635 retval = MERROR_FILE;
    +
    636 goto cleanup;
    +
    637 }
    +
    638
    +
    639 if( 8 < header_bmp_info->bpp ) {
    +
    640 error_printf( ">8BPP bitmaps not supported!" );
    +
    641 retval = MERROR_FILE;
    +
    642 goto cleanup;
    +
    643 }
    +
    644
    +
    645 maug_mzero( &file_decomp, sizeof( mfile_t ) );
    +
    646 if( MFMT_BMP_COMPRESSION_RLE4 == header_bmp_info->compression ) {
    +
    647 debug_printf( 1, "allocating decompression buffer..." );
    +
    648
    +
    649 /* Create a temporary memory buffer and decompress into it. */
    +
    650 decomp_buffer_h = maug_malloc(
    +
    651 header_bmp_info->width, header_bmp_info->height );
    +
    652 maug_cleanup_if_null_alloc( MAUG_MHANDLE, decomp_buffer_h );
    +
    653
    +
    654 retval = mfmt_decode_rle(
    +
    655 p_file_in, file_offset, header_bmp_info->img_sz,
    +
    656 header_bmp_info->width,
    +
    657 decomp_buffer_h, header_bmp_info->width * header_bmp_info->height,
    +
    658 MFMT_DECOMP_FLAG_4BIT );
    +
    659 maug_cleanup_if_not_ok();
    +
    660
    +
    661 retval = mfile_lock_buffer(
    +
    662 decomp_buffer_h, header_bmp_info->width * header_bmp_info->height,
    +
    663 &file_decomp );
    +
    664 maug_cleanup_if_not_ok();
    +
    665
    +
    666 /* Switch out the file used below for the decomp buffer mfile_t. */
    +
    667 p_file_bmp = &file_decomp;
    +
    668 }
    +
    669
    +
    670 /* TODO: Handle padding for non-conforming images. */
    +
    671 assert( 0 == header_bmp_info->width % 4 );
    +
    672
    +
    673 #define mfmt_read_bmp_px_out_idx() \
    +
    674 (MFMT_PX_FLAG_INVERT_Y == (MFMT_PX_FLAG_INVERT_Y & flags) ? \
    +
    675 ((header_bmp_info->height - y - 1) * header_bmp_info->width) : \
    +
    676 ((y) * header_bmp_info->width))
    +
    677
    +
    678 y = header_bmp_info->height - 1;
    +
    679 byte_out_idx = mfmt_read_bmp_px_out_idx();
    +
    680 p_file_bmp->seek( p_file_bmp, file_offset );
    +
    681 while( 0 <= y ) {
    +
    682 /* Each iteration is a single, fresh pixel. */
    +
    683 pixel_buffer = 0;
    +
    684
    +
    685 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    686 "byte in: " UPRINTF_U32_FMT " (" SIZE_T_FMT
    +
    687 "), bit " UPRINTF_U32_FMT ", y: " UPRINTF_U32_FMT
    +
    688 ", x: " UPRINTF_U32_FMT "), byte out: " UPRINTF_U32_FMT,
    +
    689 byte_in_idx, file_sz, bit_idx, y, x, byte_out_idx );
    +
    690
    +
    691 /* Buffer bounds check. */
    +
    692 if( px_sz <= byte_out_idx ) {
    +
    693 error_printf(
    +
    694 "byte " UPRINTF_U32_FMT " outside of " SIZE_T_FMT
    +
    695 " pixel buffer!", byte_out_idx, px_sz );
    +
    696 retval = MERROR_OVERFLOW;
    +
    697 goto cleanup;
    +
    698 }
    +
    699
    +
    700 /* Byte finished check. */
    +
    701 if( 0 == bit_idx ) {
    +
    702 if( byte_in_idx >= file_sz ) {
    +
    703 /* TODO: Figure out why ICO parser messes up size. */
    +
    704 error_printf(
    +
    705 "input bitmap has insufficient size " SIZE_T_FMT " bytes)!",
    +
    706 file_sz );
    +
    707 /* retval = MERROR_OVERFLOW;
    +
    708 goto cleanup; */
    +
    709 }
    +
    710
    +
    711 /* Move on to a new byte. */
    +
    712 /* TODO: Bad cursor? */
    +
    713 retval = p_file_bmp->read_int( p_file_bmp, &byte_buffer, 1, 0 );
    +
    714 maug_cleanup_if_not_ok();
    +
    715 /*
    +
    716 mfile_cread( p_file_bmp, &(byte_buffer) );
    +
    717 */
    +
    718 byte_in_idx++;
    +
    719
    +
    720 /* Start at 8 bits from the right (0 from the left). */
    +
    721 bit_idx = 8;
    +
    722
    +
    723 /* Build a bitwise mask based on the bitmap's BPP. */
    +
    724 byte_mask = 0;
    +
    725 for( i = 0 ; header_bmp_info->bpp > i ; i++ ) {
    +
    726 byte_mask >>= 1;
    +
    727 byte_mask |= 0x80;
    +
    728 }
    +
    729 }
    +
    730
    +
    731 /* Use the byte mask to place the bits for this pixel in the
    +
    732 * pixel buffer.
    +
    733 */
    +
    734 pixel_buffer |= byte_buffer & byte_mask;
    +
    735
    +
    736 /* Shift the pixel buffer so the index lines up at the first bit. */
    +
    737 pixel_buffer >>=
    +
    738 /* Index starts from the right, so the current bits from the left
    +
    739 * minus 1 * bpp.
    +
    740 */
    +
    741 (bit_idx - header_bmp_info->bpp);
    +
    742 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    743 "byte_mask: 0x%02x, bit_idx: " UPRINTF_U32_FMT
    +
    744 ", pixel_buffer: 0x%02x",
    +
    745 byte_mask, bit_idx, pixel_buffer );
    +
    746
    +
    747 /* Place the pixel buffer at the X/Y in the grid. */
    +
    748 debug_printf( MFMT_TRACE_BMP_LVL, "writing byte %u (x: %u, y: %u)",
    +
    749 byte_out_idx, x, y );
    +
    750 px[byte_out_idx] = pixel_buffer;
    +
    751 byte_out_idx++;
    +
    752
    +
    753 /* Increment the bits position byte mask by the bpp so it's pointing
    +
    754 * to the next pixel in the bitmap for the next go around.
    +
    755 */
    +
    756 byte_mask >>= header_bmp_info->bpp;
    +
    757 bit_idx -= header_bmp_info->bpp;
    +
    758
    +
    759 /* Move to the next pixel. */
    +
    760 x++;
    +
    761 if( x >= header_bmp_info->width ) {
    +
    762 /* Move to the next row of the input. */
    +
    763 y--;
    +
    764 x = 0;
    +
    765 while( byte_in_idx % 4 != 0 ) {
    +
    766 byte_in_idx++;
    +
    767 p_file_bmp->seek( p_file_bmp, file_offset + byte_in_idx );
    +
    768 }
    +
    769
    +
    770 /* Move to the next row of the output. */
    +
    771 byte_out_idx = mfmt_read_bmp_px_out_idx();
    +
    772
    +
    773 /* TODO Get past the padding. */
    +
    774
    +
    775 debug_printf( MFMT_TRACE_BMP_LVL,
    +
    776 "new row starting at byte_out_idx: " UPRINTF_U32_FMT,
    +
    777 byte_out_idx );
    +
    778 }
    +
    779 }
    +
    780
    +
    781cleanup:
    +
    782
    +
    783 mfile_close( &file_decomp );
    +
    784 /* decomp_buffer_h = file_decomp.h.mem; */
    +
    785
    +
    786 if( NULL != decomp_buffer_h ) {
    +
    787 debug_printf( 1, "freeing decomp buffer %p...", decomp_buffer_h );
    +
    788 maug_mfree( decomp_buffer_h );
    +
    789 }
    +
    790
    +
    791 return retval;
    +
    792}
    +
    793
    +
    794#endif /* MFMT_C */
    +
    795
    +
    796 /* maug_fmt */
    +
    797
    +
    798#endif /* !MFMT_H */
    +
    799
    +
    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
    +
    void mfile_close(mfile_t *p_file)
    Close a file opened with mfile_open_read().
    +
    MERROR_RETVAL mfile_lock_buffer(MAUG_MHANDLE, off_t, mfile_t *p_file)
    Lock a buffer and assign it to an mfile_t to read/write.
    + +
    Definition mfile.h:53
    +
    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..b681a527 --- /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:362
    +
    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:1979
    +
    Definition retrocon.h:78
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:1953
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:818
    +
    + + +
    + + diff --git a/retroflt_8h.html b/retroflt_8h.html new file mode 100644 index 00000000..4e754c12 --- /dev/null +++ b/retroflt_8h.html @@ -0,0 +1,709 @@ + + + + + + + +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_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_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_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 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.
     
    + + + + + +

    +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..1a62d649 --- /dev/null +++ b/retroflt_8h_source.html @@ -0,0 +1,6765 @@ + + + + + + + +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
    +
    362#define RETROFLAT_FLAGS_FILL 0x01
    +
    363
    +
    368#define RETROFLAT_FLAGS_OPAQUE 0x01
    +
    369
    +
    376#define RETROFLAT_FLAGS_ALL_CAPS 0x02
    +
    377
    +
    381#define RETROFLAT_FLAGS_LITERAL_PATH 0x02
    +
    382
    +
    389#define RETROFLAT_FLAGS_OUTLINE 0x04
    +
    390
    +
    397#define RETROFLAT_FLAGS_SCREEN_BUFFER 0x80
    +
    398
    +
    399 /* maug_retroflt_drawing */
    +
    400
    +
    412#define RETROFLAT_FLAGS_RUNNING 0x01
    +
    413
    +
    418#define RETROFLAT_FLAGS_UNLOCK_FPS 0x02
    +
    419
    +
    424#define RETROFLAT_FLAGS_KEY_REPEAT 0x04
    +
    425
    +
    430#define RETROFLAT_FLAGS_SCREENSAVER 0x08
    +
    431
    +
    435#define RETROFLAT_FLAGS_SCALE2X 0x10
    +
    436
    +
    437 /* maug_retroflt_flags */
    +
    438
    +
    447#define RETROFLAT_MSG_FLAG_TYPE_MASK 0x07
    +
    448
    +
    453#define RETROFLAT_MSG_FLAG_ERROR 0x01
    +
    454
    +
    460#define RETROFLAT_MSG_FLAG_INFO 0x02
    +
    461
    +
    467#define RETROFLAT_MSG_FLAG_WARNING 0x04
    +
    468
    +
    469 /* maug_retroflt_msg_flags */
    +
    470
    +
    471struct RETROFLAT_STATE;
    +
    472
    +
    492#define RETROFLAT_VDP_FLAG_PXLOCK 0x01
    +
    493
    + +
    506
    +
    507 /* maug_retroflt_vdp */
    +
    508
    +
    509typedef MERROR_RETVAL (*retroflat_proc_resize_t)(
    +
    510 uint16_t new_w, uint16_t new_h, void* data );
    +
    511
    +
    517#define RETROSND_ARGS_FLAG_LIST_DEVS 0x01
    +
    518
    +
    550#define RETROFLAT_FLAGS_LOCK 0x01
    +
    551
    +
    552#define RETROFLAT_FLAGS_SCREEN_LOCK 0x02
    +
    553
    +
    558#ifndef RETROFLAT_BITMAP_EXT
    +
    559# define RETROFLAT_BITMAP_EXT "bmp"
    +
    560#endif /* !RETROFLAT_BITMAP_EXT */
    +
    561
    +
    562#ifndef RETROFLAT_OPENGL_BPP
    +
    563# define RETROFLAT_OPENGL_BPP 32
    +
    564#endif /* !RETROFLAT_OPENGL_BPP */
    +
    565
    +
    566/* Transparency background color: black by default, to match Allegro. */
    +
    567#ifndef RETROFLAT_TXP_R
    +
    573# define RETROFLAT_TXP_R 0x00
    +
    574#endif /* !RETROFLAT_TXP_R */
    +
    575
    +
    576#ifndef RETROFLAT_TXP_G
    +
    582# define RETROFLAT_TXP_G 0x00
    +
    583#endif /* !RETROFLAT_TXP_G */
    +
    584
    +
    585#ifndef RETROFLAT_TXP_B
    +
    591# define RETROFLAT_TXP_B 0x00
    +
    592#endif /* !RETROFLAT_TXP_B */
    +
    593
    +
    594#ifndef RETROFLAT_TXP_PAL_IDX
    +
    595# define RETROFLAT_TXP_PAL_IDX 0
    +
    596#endif /* !RETROFLAT_TXP_PAL_IDX */
    +
    597
    +
    598 /* maug_retroflt_bitmap */
    +
    599
    +
    600#ifndef RETROFLAT_DEFAULT_SCREEN_W
    +
    601# define RETROFLAT_DEFAULT_SCREEN_W 320
    +
    602#endif /* RETROFLAT_DEFAULT_SCREEN_W */
    +
    603
    +
    604#ifndef RETROFLAT_DEFAULT_SCREEN_H
    +
    605# define RETROFLAT_DEFAULT_SCREEN_H 200
    +
    606#endif /* RETROFLAT_DEFAULT_SCREEN_H */
    +
    607
    +
    608#ifndef RETROFLAT_GL_Z
    +
    609# define RETROFLAT_GL_Z -0.001
    +
    610#endif /* !RETROFLAT_GL_Z */
    +
    611
    +
    612#define retroflat_on_resize( w, h ) \
    +
    613 g_retroflat_state->screen_w = w; \
    +
    614 g_retroflat_state->screen_h = h;
    +
    615
    +
    621#ifndef RETROFLAT_LINE_THICKNESS
    +
    626# define RETROFLAT_LINE_THICKNESS 1
    +
    627#endif /* !RETROFLAT_LINE_THICKNESS */
    +
    628
    +
    629#define RETROFLAT_PI 3.14159
    +
    630
    +
    631 /* maug_retroflt_drawing */
    +
    632
    +
    638#ifndef RETROFLAT_FPS
    +
    643# define RETROFLAT_FPS 30
    +
    644#endif /* !RETROFLAT_FPS */
    +
    645
    +
    646#define retroflat_fps_next() (1000 / RETROFLAT_FPS)
    +
    647
    +
    648#ifndef RETROFLAT_WINDOW_CLASS
    +
    653# define RETROFLAT_WINDOW_CLASS "RetroFlatWindowClass"
    +
    654#endif /* !RETROFLAT_WINDOW_CLASS */
    +
    655
    +
    656#ifndef RETROFLAT_WIN_FRAME_TIMER_ID
    +
    661# define RETROFLAT_WIN_FRAME_TIMER_ID 6001
    +
    662#endif /* !RETROFLAT_WIN_FRAME_TIMER_ID */
    +
    663
    +
    664#ifndef RETROFLAT_WIN_LOOP_TIMER_ID
    +
    669# define RETROFLAT_WIN_LOOP_TIMER_ID 6002
    +
    670#endif /* !RETROFLAT_WIN_LOOP_TIMER_ID */
    +
    671
    +
    672#ifndef RETROFLAT_MSG_MAX
    +
    677# define RETROFLAT_MSG_MAX 4096
    +
    678#endif /* !RETROFLAT_MSG_MAX */
    +
    679
    +
    680#ifndef RETROFLAT_PATH_MAX
    +
    682# define RETROFLAT_PATH_MAX 256
    +
    683#endif /* !RETROFLAT_PATH_MAX */
    +
    684
    +
    685#ifndef RETROFLAT_TITLE_MAX
    +
    686# define RETROFLAT_TITLE_MAX 255
    +
    687#endif /* !RETROFLAT_TITLE_MAX */
    +
    688
    +
    689#ifndef RETROFLAT_VDP_ARGS_SZ_MAX
    +
    693# define RETROFLAT_VDP_ARGS_SZ_MAX 255
    +
    694#endif /* !RETROFLAT_VDP_ARGS_SZ_MAX */
    +
    695
    +
    696#if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    697# if !defined( RETROFLAT_WIN_STYLE )
    +
    698# if defined( RETROFLAT_API_WINCE )
    +
    699# define RETROFLAT_WIN_STYLE (WS_VISIBLE)
    +
    700# else
    +
    701# define RETROFLAT_WIN_STYLE (WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX & ~WS_THICKFRAME)
    +
    702# endif /* RETROFLAT_API_WINCE */
    +
    703# endif /* !RETROFLAT_WIN_STYLE */
    +
    704#endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    705
    +
    706#if defined( RETROFLAT_API_SDL2 )
    +
    707# if !defined( NO_RETROFLAT_RESIZABLE )
    +
    708# define RETROFLAT_WIN_FLAGS SDL_WINDOW_RESIZABLE
    +
    709# else
    +
    710# define RETROFLAT_WIN_FLAGS 0
    +
    711# endif /* !NO_RETROFLAT_RESIZABLE */
    +
    712#endif /* RETROFLAT_API_SDL2 */
    +
    713
    +
    714#if defined( RETROFLAT_API_SDL1 )
    +
    715# define RETROFLAT_SDL_CC_FLAGS (SDL_RLEACCEL | SDL_SRCCOLORKEY)
    +
    716#elif defined( RETROFLAT_API_SDL2 )
    +
    717# define RETROFLAT_SDL_CC_FLAGS (SDL_TRUE)
    +
    718#endif /* RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 */
    +
    719
    +
    720#ifdef RETROFLAT_OS_DOS
    +
    721# define RETROFLAT_PATH_SEP '\\'
    +
    722#else
    +
    724# define RETROFLAT_PATH_SEP '/'
    +
    725#endif /* RETROFLAT_OS_DOS */
    +
    726
    +
    728#define RETROFLAT_ASSETS_PATH_MAX (RETROFLAT_PATH_MAX >> 1)
    +
    729
    +
    730#ifndef NDS_OAM_ACTIVE
    +
    732# define NDS_OAM_ACTIVE &oamMain
    +
    733#endif /* !NDS_OAM_ACTIVE */
    +
    734
    +
    735#ifndef NDS_SPRITES_ACTIVE
    +
    737# define NDS_SPRITES_ACTIVE 24
    +
    738#endif /* !NDS_SPRITES_ACTIVE */
    +
    739
    +
    740#ifndef RETROFLAT_BMP_COLORS_SZ_MAX
    +
    741# define RETROFLAT_BMP_COLORS_SZ_MAX 256
    +
    742#endif /* !RETROFLAT_BMP_COLORS_SZ_MAX */
    +
    743
    +
    744 /* maug_retroflt_compiling */
    +
    745
    + +
    757
    +
    761#define retroflat_cmp_asset_path( a, b ) strncmp( a, b, RETROFLAT_PATH_MAX )
    +
    762
    +
    763 /* maug_retroflt_assets */
    +
    764
    +
    768typedef void (*retroflat_loop_iter)(void* data);
    +
    769
    +
    +
    779#define retroflat_buffer_bksp( buffer, buffer_cur, buffer_sz ) \
    +
    780 if( 0 < buffer_cur ) { \
    +
    781 if( buffer_cur < buffer_sz ) { \
    +
    782 memmove( \
    +
    783 &(buffer[(buffer_cur) - 1]), \
    +
    784 &(buffer[buffer_cur]), \
    +
    785 (buffer_sz) - (buffer_cur) ); \
    +
    786 } \
    +
    787 buffer_cur--; \
    +
    788 buffer_sz--; \
    +
    789 buffer[buffer_sz] = '\0'; \
    +
    790 }
    +
    +
    791
    +
    +
    795#define retroflat_buffer_insert( c, buffer, buffer_cur, buffer_sz, buffer_mx ) \
    +
    796 if( buffer_sz + 1 < buffer_mx ) { \
    +
    797 if( buffer_cur < buffer_sz ) { \
    +
    798 memmove( \
    +
    799 &(buffer[(buffer_cur) + 1]), \
    +
    800 &(buffer[buffer_cur]), \
    +
    801 (buffer_sz) - (buffer_cur) ); \
    +
    802 } \
    +
    803 buffer[buffer_cur] = c; \
    +
    804 buffer_cur++; \
    +
    805 buffer_sz++; \
    +
    806 buffer[buffer_sz] = '\0'; \
    +
    807 }
    +
    +
    808
    +
    809#define RETROFLAT_INPUT_MOD_SHIFT 0x01
    +
    810
    +
    811#define RETROFLAT_INPUT_MOD_ALT 0x02
    +
    812
    +
    813#define RETROFLAT_INPUT_MOD_CTRL 0x04
    +
    814
    +
    815#define RETROFLAT_INPUT_FORCE_UPPER 0x08
    +
    816
    +
    + + + +
    829 uint8_t key_flags;
    +
    830};
    +
    +
    831
    +
    832 /* maug_retroflt_input */
    +
    833
    +
    834#ifdef RETROFLAT_OPENGL
    +
    835struct RETROFLAT_GLTEX {
    +
    836 MAUG_MHANDLE bytes_h;
    +
    837 uint8_t* bytes;
    +
    838 uint32_t bpp;
    +
    839 uint32_t sz;
    +
    840 uint8_t* px;
    +
    841 uint32_t id;
    +
    842 size_t w;
    +
    843 size_t h;
    +
    844};
    +
    845#endif /* RETROFLAT_OPENGL */
    +
    846
    +
    847/* === OS-Specific Includes and Defines === */
    +
    848
    +
    849#if defined( RETROFLAT_OS_WIN ) && !defined( MAUG_WINDOWS_H )
    +
    850# include <windows.h>
    +
    851# define MAUG_WINDOWS_H
    +
    852#endif /* !MAUG_WINDOWS_H */
    +
    853
    +
    854/* === API-Specific Includes and Defines === */
    +
    855
    +
    856#if defined( RETROFLAT_API_ALLEGRO )
    +
    857
    +
    858# ifdef RETROFLAT_OPENGL
    +
    859# error "opengl support not implemented for allegro"
    +
    860# endif /* RETROFLAT_OPENGL */
    +
    861
    +
    862/* == Allegro == */
    +
    863
    +
    864# include <allegro.h>
    +
    865
    +
    866# ifdef RETROFLAT_OS_DOS
    +
    867# include <dos.h>
    +
    868# include <conio.h>
    +
    869# endif /* RETROFLAT_OS_DOS */
    +
    870
    +
    871#include <time.h> /* For srand() */
    +
    872
    +
    873typedef int16_t RETROFLAT_IN_KEY;
    +
    874typedef uint32_t retroflat_ms_t;
    +
    875
    +
    876#define RETROFLAT_MS_FMT "%u"
    +
    877
    +
    878struct RETROFLAT_BITMAP {
    +
    879 size_t sz;
    +
    880 uint8_t flags;
    +
    881 BITMAP* b;
    +
    882};
    +
    883
    +
    884typedef int RETROFLAT_COLOR_DEF;
    +
    885
    +
    886# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->b)
    +
    887# define retroflat_bitmap_locked( bmp ) (0)
    +
    888# ifdef RETROFLAT_OPENGL
    +
    889# define retroflat_bitmap_w( bmp ) ((bmp)->tex.w)
    +
    890# define retroflat_bitmap_h( bmp ) ((bmp)->tex.h)
    +
    891# else
    +
    892# define retroflat_bitmap_w( bmp ) (NULL == (bmp) ? SCREEN_W : (bmp)->b->w)
    +
    893# define retroflat_bitmap_h( bmp ) (NULL == (bmp) ? SCREEN_H : (bmp)->b->h)
    +
    894# endif /* RETROFLAT_OPENGL */
    +
    895# define retroflat_screen_w() SCREEN_W
    +
    896# define retroflat_screen_h() SCREEN_H
    +
    897# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    898# define retroflat_root_win() (NULL) /* TODO */
    +
    899# define retroflat_px_lock( bmp )
    +
    900# define retroflat_px_release( bmp )
    +
    901# ifdef RETROFLAT_VDP
    +
    902# define retroflat_vdp_lock( bmp )
    +
    903# define retroflat_vdp_release( bmp )
    +
    904# endif /* RETROFLAT_VDP */
    +
    905
    +
    906# define retroflat_quit( retval_in ) \
    +
    907 g_retroflat_state->retroflat_flags &= ~RETROFLAT_FLAGS_RUNNING; \
    +
    908 g_retroflat_state->retval = retval_in;
    +
    909
    +
    910# define RETROFLAT_MOUSE_B_LEFT -1
    +
    911# define RETROFLAT_MOUSE_B_RIGHT -2
    +
    912
    +
    913# define RETROFLAT_KEY_UP KEY_UP
    +
    914# define RETROFLAT_KEY_DOWN KEY_DOWN
    +
    915# define RETROFLAT_KEY_RIGHT KEY_RIGHT
    +
    916# define RETROFLAT_KEY_LEFT KEY_LEFT
    +
    917# define RETROFLAT_KEY_A KEY_A
    +
    918# define RETROFLAT_KEY_B KEY_B
    +
    919# define RETROFLAT_KEY_C KEY_C
    +
    920# define RETROFLAT_KEY_D KEY_D
    +
    921# define RETROFLAT_KEY_E KEY_E
    +
    922# define RETROFLAT_KEY_F KEY_F
    +
    923# define RETROFLAT_KEY_G KEY_G
    +
    924# define RETROFLAT_KEY_H KEY_H
    +
    925# define RETROFLAT_KEY_I KEY_I
    +
    926# define RETROFLAT_KEY_J KEY_J
    +
    927# define RETROFLAT_KEY_K KEY_K
    +
    928# define RETROFLAT_KEY_L KEY_L
    +
    929# define RETROFLAT_KEY_M KEY_M
    +
    930# define RETROFLAT_KEY_N KEY_N
    +
    931# define RETROFLAT_KEY_O KEY_O
    +
    932# define RETROFLAT_KEY_P KEY_P
    +
    933# define RETROFLAT_KEY_Q KEY_Q
    +
    934# define RETROFLAT_KEY_R KEY_R
    +
    935# define RETROFLAT_KEY_S KEY_S
    +
    936# define RETROFLAT_KEY_T KEY_T
    +
    937# define RETROFLAT_KEY_U KEY_U
    +
    938# define RETROFLAT_KEY_V KEY_V
    +
    939# define RETROFLAT_KEY_W KEY_W
    +
    940# define RETROFLAT_KEY_X KEY_X
    +
    941# define RETROFLAT_KEY_Y KEY_Y
    +
    942# define RETROFLAT_KEY_Z KEY_Z
    +
    943# define RETROFLAT_KEY_0 KEY_0
    +
    944# define RETROFLAT_KEY_1 KEY_1
    +
    945# define RETROFLAT_KEY_2 KEY_2
    +
    946# define RETROFLAT_KEY_3 KEY_3
    +
    947# define RETROFLAT_KEY_4 KEY_4
    +
    948# define RETROFLAT_KEY_5 KEY_5
    +
    949# define RETROFLAT_KEY_6 KEY_6
    +
    950# define RETROFLAT_KEY_7 KEY_7
    +
    951# define RETROFLAT_KEY_8 KEY_8
    +
    952# define RETROFLAT_KEY_9 KEY_9
    +
    953# define RETROFLAT_KEY_TAB KEY_TAB
    +
    954# define RETROFLAT_KEY_SPACE KEY_SPACE
    +
    955# define RETROFLAT_KEY_ESC KEY_ESC
    +
    956# define RETROFLAT_KEY_ENTER KEY_ENTER
    +
    957# define RETROFLAT_KEY_HOME KEY_HOME
    +
    958# define RETROFLAT_KEY_END KEY_END
    +
    959# define RETROFLAT_KEY_DELETE KEY_DEL
    +
    960# define RETROFLAT_KEY_PGUP KEY_PGUP
    +
    961# define RETROFLAT_KEY_PGDN KEY_PGDN
    +
    962# define RETROFLAT_KEY_GRAVE KEY_BACKQUOTE
    +
    963# define RETROFLAT_KEY_BKSP KEY_BACKSPACE
    +
    964# define RETROFLAT_KEY_SLASH KEY_SLASH
    +
    965# define RETROFLAT_KEY_SEMICOLON KEY_SEMICOLON
    +
    966# define RETROFLAT_KEY_PERIOD KEY_STOP
    +
    967# define RETROFLAT_KEY_COMMA KEY_COMMA
    +
    968# define RETROFLAT_KEY_EQUALS KEY_EQUALS
    +
    969# define RETROFLAT_KEY_DASH KEY_MINUS
    +
    970# define RETROFLAT_KEY_BRACKETL KEY_OPENBRACE
    +
    971# define RETROFLAT_KEY_BRACKETR KEY_CLOSEBRACE
    +
    972# define RETROFLAT_KEY_BACKSLASH KEY_BACKSLASH
    +
    973# define RETROFLAT_KEY_QUOTE KEY_QUOTE
    +
    974
    +
    975#elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    976
    +
    977# if defined( RETROFLAT_API_SDL2 ) && defined( RETROFLAT_OPENGL )
    +
    978# error "opengl support not implemented for SDL 2"
    +
    979# endif /* RETROFLAT_API_SDL2 && RETROFLAT_OPENGL */
    +
    980
    +
    981# include <time.h> /* For srand() */
    +
    982
    +
    983# if defined( RETROFLAT_OS_WASM )
    +
    984# include <emscripten.h>
    +
    985# endif /* RETROFLAT_OS_WASM */
    +
    986
    +
    987# include <SDL.h>
    +
    988# if defined( RETROFLAT_API_SDL1 ) && !defined( RETROFLAT_OS_WASM )
    +
    989# include <SDL_getenv.h>
    +
    990# endif /* RETROFLAT_API_SDL1 */
    +
    991
    +
    992# if !defined( RETROFLAT_SOFT_SHAPES ) && !defined( RETROFLAT_OPENGL )
    +
    993# define RETROFLAT_SOFT_SHAPES
    +
    994# endif /* !RETROFLAT_SOFT_SHAPES */
    +
    995
    +
    996# if !defined( RETROFLAT_SOFT_LINES ) && !defined( RETROFLAT_OPENGL )
    +
    997/* TODO: Do we need soft lines for this? */
    +
    998# define RETROFLAT_SOFT_LINES
    +
    999# endif /* !RETROFLAT_SOFT_LINES */
    +
    1000
    +
    1001#ifdef RETROFLAT_API_SDL2
    +
    1002typedef int32_t RETROFLAT_IN_KEY;
    +
    1003#else
    +
    1004typedef int16_t RETROFLAT_IN_KEY;
    +
    1005#endif /* RETROFLAT_API_SDL2 */
    +
    1006typedef uint32_t retroflat_ms_t;
    +
    1007
    +
    1008#define RETROFLAT_MS_FMT "%u"
    +
    1009
    +
    1010struct RETROFLAT_BITMAP {
    +
    1011 size_t sz;
    +
    1012 uint8_t flags;
    +
    1013 SDL_Surface* surface;
    +
    1014# ifdef RETROFLAT_API_SDL1
    +
    1015 /* SDL1 autolock counter. */
    +
    1016 ssize_t autolock_refs;
    +
    1017# else
    +
    1018 /* SDL2 texture pointers. */
    +
    1019 SDL_Texture* texture;
    +
    1020 SDL_Renderer* renderer;
    +
    1021# endif /* RETROFLAT_API_SDL1 */
    +
    1022# ifdef RETROFLAT_OPENGL
    +
    1023 struct RETROFLAT_GLTEX tex;
    +
    1024# endif /* RETROFLAT_OPENGL */
    +
    1025};
    +
    1026
    +
    1027# define RETROFLAT_KEY_UP SDLK_UP
    +
    1028# define RETROFLAT_KEY_DOWN SDLK_DOWN
    +
    1029# define RETROFLAT_KEY_RIGHT SDLK_RIGHT
    +
    1030# define RETROFLAT_KEY_LEFT SDLK_LEFT
    +
    1031# define RETROFLAT_KEY_A SDLK_a
    +
    1032# define RETROFLAT_KEY_B SDLK_b
    +
    1033# define RETROFLAT_KEY_C SDLK_c
    +
    1034# define RETROFLAT_KEY_D SDLK_d
    +
    1035# define RETROFLAT_KEY_E SDLK_e
    +
    1036# define RETROFLAT_KEY_F SDLK_f
    +
    1037# define RETROFLAT_KEY_G SDLK_g
    +
    1038# define RETROFLAT_KEY_H SDLK_h
    +
    1039# define RETROFLAT_KEY_I SDLK_i
    +
    1040# define RETROFLAT_KEY_J SDLK_j
    +
    1041# define RETROFLAT_KEY_K SDLK_k
    +
    1042# define RETROFLAT_KEY_L SDLK_l
    +
    1043# define RETROFLAT_KEY_M SDLK_m
    +
    1044# define RETROFLAT_KEY_N SDLK_n
    +
    1045# define RETROFLAT_KEY_O SDLK_o
    +
    1046# define RETROFLAT_KEY_P SDLK_p
    +
    1047# define RETROFLAT_KEY_Q SDLK_q
    +
    1048# define RETROFLAT_KEY_R SDLK_r
    +
    1049# define RETROFLAT_KEY_S SDLK_s
    +
    1050# define RETROFLAT_KEY_T SDLK_t
    +
    1051# define RETROFLAT_KEY_U SDLK_u
    +
    1052# define RETROFLAT_KEY_V SDLK_v
    +
    1053# define RETROFLAT_KEY_W SDLK_w
    +
    1054# define RETROFLAT_KEY_X SDLK_x
    +
    1055# define RETROFLAT_KEY_Y SDLK_y
    +
    1056# define RETROFLAT_KEY_Z SDLK_z
    +
    1057# define RETROFLAT_KEY_0 SDLK_0
    +
    1058# define RETROFLAT_KEY_1 SDLK_1
    +
    1059# define RETROFLAT_KEY_2 SDLK_2
    +
    1060# define RETROFLAT_KEY_3 SDLK_3
    +
    1061# define RETROFLAT_KEY_4 SDLK_4
    +
    1062# define RETROFLAT_KEY_5 SDLK_5
    +
    1063# define RETROFLAT_KEY_6 SDLK_6
    +
    1064# define RETROFLAT_KEY_7 SDLK_7
    +
    1065# define RETROFLAT_KEY_8 SDLK_8
    +
    1066# define RETROFLAT_KEY_9 SDLK_9
    +
    1067# define RETROFLAT_KEY_TAB SDLK_TAB
    +
    1068# define RETROFLAT_KEY_SPACE SDLK_SPACE
    +
    1069# define RETROFLAT_KEY_ESC SDLK_ESCAPE
    +
    1070# define RETROFLAT_KEY_ENTER SDLK_RETURN
    +
    1071# define RETROFLAT_KEY_HOME SDLK_HOME
    +
    1072# define RETROFLAT_KEY_END SDLK_END
    +
    1073# define RETROFLAT_KEY_DELETE SDLK_DELETE
    +
    1074# define RETROFLAT_KEY_PGUP SDLK_PAGEUP
    +
    1075# define RETROFLAT_KEY_PGDN SDLK_PAGEDOWN
    +
    1076# define RETROFLAT_KEY_GRAVE SDLK_BACKQUOTE
    +
    1077# define RETROFLAT_KEY_SLASH SDLK_SLASH
    +
    1078# define RETROFLAT_KEY_BKSP SDLK_BACKSPACE
    +
    1079# define RETROFLAT_KEY_SEMICOLON SDLK_SEMICOLON
    +
    1080# define RETROFLAT_KEY_PERIOD SDLK_PERIOD
    +
    1081# define RETROFLAT_KEY_COMMA SDLK_COMMA
    +
    1082# define RETROFLAT_KEY_EQUALS SDLK_EQUALS
    +
    1083# define RETROFLAT_KEY_DASH SDLK_MINUS
    +
    1084# define RETROFLAT_KEY_BACKSLASH SDLK_BACKSLASH
    +
    1085# define RETROFLAT_KEY_QUOTE SDLK_QUOTE
    +
    1086# define RETROFLAT_KEY_BRACKETL SDLK_LEFTBRACKET
    +
    1087# define RETROFLAT_KEY_BRACKETR SDLK_RIGHTBRACKET
    +
    1088
    +
    1089# define RETROFLAT_MOUSE_B_LEFT -1
    +
    1090# define RETROFLAT_MOUSE_B_RIGHT -2
    +
    1091
    +
    1092# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->surface)
    +
    1093# ifdef RETROFLAT_OPENGL
    +
    1094# define retroflat_bitmap_w( bmp ) ((bmp)->tex.w)
    +
    1095# define retroflat_bitmap_h( bmp ) ((bmp)->tex.h)
    +
    1096# else
    +
    1097# define retroflat_bitmap_w( bmp ) \
    +
    1098 (NULL == (bmp) || NULL == (bmp)->surface ? \
    +
    1099 g_retroflat_state->screen_v_w : (bmp)->surface->w)
    +
    1100# define retroflat_bitmap_h( bmp ) \
    +
    1101 (NULL == (bmp) || NULL == (bmp)->surface ? \
    +
    1102 g_retroflat_state->screen_v_h : (bmp)->surface->h)
    +
    1103# endif /* RETROFLAT_OPENGL */
    +
    1104# ifdef RETROFLAT_API_SDL1
    +
    1105# define retroflat_bitmap_locked( bmp ) \
    +
    1106 (RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & (bmp)->flags))
    +
    1107# else
    +
    1108# define retroflat_bitmap_locked( bmp ) (NULL != (bmp)->renderer)
    +
    1109# endif
    +
    1110# define retroflat_screen_w() (g_retroflat_state->screen_v_w)
    +
    1111# define retroflat_screen_h() (g_retroflat_state->screen_v_h)
    +
    1112
    +
    1113# ifdef RETROFLAT_VDP
    +
    1114# define retroflat_screen_buffer() \
    +
    1115 (NULL == g_retroflat_state->vdp_buffer ? \
    +
    1116 &(g_retroflat_state->buffer) : g_retroflat_state->vdp_buffer)
    +
    1117# else
    +
    1118# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1119# endif /* RETROFLAT_VDP */
    +
    1120# define retroflat_root_win() (NULL) /* TODO */
    +
    1121
    +
    1122# if defined( RETROFLAT_API_SDL1 ) && !defined( RETROFLAT_OPENGL )
    +
    1123/* Special pixel lock JUST for SDL1 surfaces. */
    +
    1124# define retroflat_px_lock( bmp ) \
    +
    1125 if( NULL != bmp ) { \
    +
    1126 (bmp)->autolock_refs++; \
    +
    1127 SDL_LockSurface( (bmp)->surface ); \
    +
    1128 }
    +
    1129# define retroflat_px_release( bmp ) \
    +
    1130 if( NULL != bmp ) { \
    +
    1131 assert( 0 < (bmp)->autolock_refs ); \
    +
    1132 (bmp)->autolock_refs--; \
    +
    1133 SDL_UnlockSurface( (bmp)->surface ); \
    +
    1134 }
    +
    1135# ifdef RETROFLAT_VDP
    +
    1136# define retroflat_vdp_lock( bmp ) retroflat_px_lock( bmp )
    +
    1137# define retroflat_vdp_release( bmp ) retroflat_px_release( bmp )
    +
    1138# endif /* RETROFLAT_VDP */
    +
    1139# else
    +
    1140/* Pixel lock above does not apply to SDL2 surfaces or bitmap textures. */
    +
    1141# define retroflat_px_lock( bmp )
    +
    1142# define retroflat_px_release( bmp )
    +
    1143# endif
    +
    1144
    +
    1145# define retroflat_quit( retval_in ) \
    +
    1146 g_retroflat_state->retroflat_flags &= ~RETROFLAT_FLAGS_RUNNING; \
    +
    1147 g_retroflat_state->retval = retval_in;
    +
    1148
    +
    1149# define END_OF_MAIN()
    +
    1150
    +
    1151 /* SDL Icon */
    +
    1152# if defined( RETROFLT_C ) && defined( RETROFLAT_SDL_ICO )
    +
    1153# include <sdl_ico.h>
    +
    1154# endif /* RETROFLT_C && RETROFLAT_SDL_ICO */
    +
    1155
    +
    1156# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    1157# define RETROFLAT_CONFIG_USE_FILE
    +
    1158# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    1159
    +
    1160 /* SDL Colors */
    +
    1161# ifdef RETROFLAT_OPENGL
    +
    1162typedef float MAUG_CONST* RETROFLAT_COLOR_DEF;
    +
    1163#else
    +
    1164typedef SDL_Color RETROFLAT_COLOR_DEF;
    +
    1165# endif /* RETROFLAT_OPENGL */
    +
    1166
    +
    1167#elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    1168
    +
    1169/* == Win16/Win32 == */
    +
    1170
    +
    1171typedef int16_t RETROFLAT_IN_KEY;
    +
    1172typedef uint32_t retroflat_ms_t;
    +
    1173
    +
    1174# define RETROFLAT_MS_FMT "%lu"
    +
    1175
    +
    1176# if defined( RETROFLAT_API_WIN16 ) && defined( RETROFLAT_OPENGL )
    +
    1177# error "opengl support not implemented for win16"
    +
    1178# endif /* RETROFLAT_API_SDL2 && RETROFLAT_OPENGL */
    +
    1179
    +
    1180# include <mmsystem.h>
    +
    1181
    +
    1182# ifndef RETROFLAT_API_WINCE
    +
    1183# include <time.h> /* For srand() */
    +
    1184# endif /* !RETROFLAT_API_WINCE */
    +
    1185
    +
    1186# ifdef RETROFLAT_WING
    +
    1187
    +
    1188# if defined( RETROFLAT_API_WIN32 )
    +
    1189# define WINGAPI WINAPI
    +
    1190# else
    +
    1191# define WINGAPI WINAPI _loadds
    +
    1192# endif
    +
    1193
    +
    1194# define RETROFLAT_WING_LLTABLE( f ) \
    +
    1195 f( HDC, WinGCreateDC, 1001 ) \
    +
    1196 f( BOOL, WinGRecommendDIBFormat, 1002 ) \
    +
    1197 f( HBITMAP, WinGCreateBitmap, 1003 ) \
    +
    1198 f( BOOL, WinGStretchBlt, 1009 )
    +
    1199
    +
    1200typedef int16_t RETROFLAT_IN_KEY;
    +
    1201typedef uint32_t retroflat_ms_t;
    +
    1202typedef uint32_t retroflat_ms_t;
    +
    1203
    +
    1204# define RETROFLAT_MS_FMT "%lu"
    +
    1205
    +
    1206typedef HDC (WINGAPI *WinGCreateDC_t)();
    +
    1207typedef BOOL (WINGAPI *WinGRecommendDIBFormat_t)( BITMAPINFO FAR* );
    +
    1208typedef HBITMAP (WINGAPI *WinGCreateBitmap_t)(
    +
    1209 HDC, BITMAPINFO const FAR*, void FAR* FAR* );
    +
    1210typedef BOOL (WINGAPI *WinGStretchBlt_t)(
    +
    1211 HDC, int, int, int, int, HDC, int, int, int, int );
    +
    1212
    +
    1213# define RETROFLAT_WING_LLTABLE_STRUCT_MEMBERS( retval, proc, ord ) \
    +
    1214 proc ## _t proc;
    +
    1215
    +
    1216struct RETROFLAT_WING_MODULE {
    +
    1217 HMODULE module;
    +
    1218 uint8_t success;
    +
    1219 RETROFLAT_WING_LLTABLE( RETROFLAT_WING_LLTABLE_STRUCT_MEMBERS )
    +
    1220};
    +
    1221# endif /* RETROFLAT_WING */
    +
    1222
    +
    1223struct RETROFLAT_BMI {
    +
    1224 BITMAPINFOHEADER header;
    +
    1225 RGBQUAD colors[RETROFLAT_BMP_COLORS_SZ_MAX];
    +
    1226};
    +
    1227
    +
    1228struct RETROFLAT_BITMAP {
    +
    1229 size_t sz;
    +
    1230 uint8_t flags;
    +
    1231 HBITMAP b;
    +
    1232 HBITMAP mask;
    +
    1233 HDC hdc_b;
    +
    1234 HDC hdc_mask;
    +
    1235 HBITMAP old_hbm_b;
    +
    1236 HBITMAP old_hbm_mask;
    +
    1237# ifdef RETROFLAT_API_WIN16
    +
    1238 uint8_t far* bits;
    +
    1239# else
    +
    1240 uint8_t* bits;
    +
    1241# endif /* RETROFLAT_API_WIN16 */
    +
    1242 ssize_t autolock_refs;
    +
    1243# ifdef RETROFLAT_OPENGL
    +
    1244 struct RETROFLAT_GLTEX tex;
    +
    1245# endif /* RETROFLAT_OPENGL */
    +
    1246 struct RETROFLAT_BMI bmi;
    +
    1247};
    +
    1248
    +
    1249LPSTR* retroflat_win_cli( LPSTR cmd_line, int* argc_out );
    +
    1250
    +
    1251# ifdef RETROFLAT_OPENGL
    +
    1252
    +
    1253typedef float MAUG_CONST* RETROFLAT_COLOR_DEF;
    +
    1254
    +
    1255# else
    +
    1256
    +
    1257/* Use Windoes API and generate brushes/pens for GDI. */
    +
    1258
    +
    1259typedef COLORREF RETROFLAT_COLOR_DEF;
    +
    1260
    +
    1261/* === Setup Brush Cache === */
    +
    1262
    +
    1263/* This will be initialized in setup, so just preserve the number. */
    +
    1264# define RETROFLAT_COLOR_TABLE_WIN_BRUSH( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1265 (HBRUSH)NULL,
    +
    1266
    +
    1267# define RETROFLAT_COLOR_TABLE_WIN_BRSET( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1268 gc_retroflat_win_brushes[idx] = CreateSolidBrush( RGB( r, g, b ) );
    +
    1269
    +
    1270# define RETROFLAT_COLOR_TABLE_WIN_BRRM( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1271 if( (HBRUSH)NULL != gc_retroflat_win_brushes[idx] ) { \
    +
    1272 DeleteObject( gc_retroflat_win_brushes[idx] ); \
    +
    1273 gc_retroflat_win_brushes[idx] = (HBRUSH)NULL; \
    +
    1274 }
    +
    1275
    +
    1276/* === End Setup Brush Cache === */
    +
    1277
    +
    1278/* === Setup Pen Cache === */
    +
    1279
    +
    1280# define RETROFLAT_COLOR_TABLE_WIN_PENS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1281 (HPEN)NULL,
    +
    1282
    +
    1283# define RETROFLAT_COLOR_TABLE_WIN_PNSET( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1284 gc_retroflat_win_pens[idx] = CreatePen( \
    +
    1285 PS_SOLID, RETROFLAT_LINE_THICKNESS, RGB( r, g, b ) );
    +
    1286
    +
    1287# define RETROFLAT_COLOR_TABLE_WIN_PENRM( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    1288 if( (HPEN)NULL != gc_retroflat_win_pens[idx] ) { \
    +
    1289 DeleteObject( gc_retroflat_win_pens[idx] ); \
    +
    1290 gc_retroflat_win_pens[idx] = (HPEN)NULL; \
    +
    1291 }
    +
    1292
    +
    1293/* === End Setup Pen Cache === */
    +
    1294
    +
    1295# ifdef RETROFLT_C
    +
    1296
    +
    1297HBRUSH gc_retroflat_win_brushes[] = {
    +
    1298 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_BRUSH )
    +
    1299};
    +
    1300
    +
    1301static HPEN gc_retroflat_win_pens[] = {
    +
    1302 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_PENS )
    +
    1303};
    +
    1304
    +
    1305# else
    +
    1306
    +
    1307extern HBRUSH gc_retroflat_win_brushes[];
    +
    1308
    +
    1309# endif /* RETROFLT_C */
    +
    1310
    +
    1311/* Create a brush and set it to the target HDC. */
    +
    1312# define retroflat_win_setup_brush( old_brush, target, color, flags ) \
    +
    1313 if( RETROFLAT_FLAGS_FILL != (RETROFLAT_FLAGS_FILL & flags) ) { \
    +
    1314 old_brush = \
    +
    1315 SelectObject( target->hdc_b, GetStockObject( NULL_BRUSH ) ); \
    +
    1316 } else { \
    +
    1317 old_brush = SelectObject( \
    +
    1318 target->hdc_b, gc_retroflat_win_brushes[color] ); \
    +
    1319 }
    +
    1320
    +
    1321/* Create a pen and set it to the target HDC. */
    +
    1322# define retroflat_win_setup_pen( old_pen, target, color, flags ) \
    +
    1323 old_pen = \
    +
    1324 SelectObject( target->hdc_b, gc_retroflat_win_pens[color] );
    +
    1325
    +
    1326# define retroflat_win_cleanup_brush( old_brush, target ) \
    +
    1327 if( (HBRUSH)NULL != old_brush ) { \
    +
    1328 SelectObject( target->hdc_b, old_brush ); \
    +
    1329 }
    +
    1330
    +
    1331# define retroflat_win_cleanup_pen( old_pen, target ) \
    +
    1332 if( (HPEN)NULL != old_pen ) { \
    +
    1333 SelectObject( target->hdc_b, old_pen ); \
    +
    1334 }
    +
    1335
    +
    1336# endif /* RETROFLAT_OPENGL */
    +
    1337
    +
    1338/* TODO: This is a parallel bitmap system... maybe move OPENGL stuff into its
    +
    1339 * own header that takes over graphics stuff in OPENGL mode? */
    +
    1340# ifdef RETROFLAT_OPENGL
    +
    1341# define retroflat_bitmap_w( bmp ) ((bmp)->tex.w)
    +
    1342# define retroflat_bitmap_h( bmp ) ((bmp)->tex.h)
    +
    1343# define retroflat_bitmap_locked( bmp ) (NULL != (bmp)->tex.bytes)
    +
    1344# else
    +
    1345# define retroflat_bitmap_w( bmp ) ((bmp)->bmi.header.biWidth)
    +
    1346# define retroflat_bitmap_h( bmp ) ((bmp)->bmi.header.biHeight)
    +
    1347# define retroflat_bitmap_locked( bmp ) ((HDC)NULL != (bmp)->hdc_b)
    +
    1348# endif /* RETROFLAT_OPENGL */
    +
    1349/* TODO: Adapt this for the OPENGL test above? */
    +
    1350# define retroflat_bitmap_ok( bitmap ) ((HBITMAP)NULL != (bitmap)->b)
    +
    1351
    +
    1352# ifdef RETROFLAT_VDP
    +
    1353
    +
    1354# ifdef RETROFLAT_API_WIN16
    +
    1355# error "VDP not supported in Win16!"
    +
    1356# endif /* RETROFLAT_API_WIN16 */
    +
    1357
    +
    1358# define retroflat_vdp_lock( bmp ) \
    +
    1359 assert( NULL != (bmp)->hdc_b ); \
    +
    1360 /* Confirm header info. */ \
    +
    1361 (bmp)->autolock_refs++; \
    +
    1362 if( \
    +
    1363 1 == (bmp)->autolock_refs && \
    +
    1364 RETROFLAT_FLAGS_SCREEN_BUFFER != \
    +
    1365 (RETROFLAT_FLAGS_SCREEN_BUFFER & (bmp)->flags) \
    +
    1366 ) { \
    +
    1367 assert( NULL == (bmp)->bits ); \
    +
    1368 assert( (bmp)->bmi.header.biBitCount == 32 ); \
    +
    1369 assert( (bmp)->bmi.header.biWidth > 0 ); \
    +
    1370 assert( (bmp)->bmi.header.biHeight > 0 ); \
    +
    1371 assert( (bmp)->bmi.header.biSizeImage == \
    +
    1372 (bmp)->bmi.header.biWidth * (bmp)->bmi.header.biHeight * 4 ); \
    +
    1373 (bmp)->bits = VirtualAlloc( \
    +
    1374 0, (bmp)->bmi.header.biSizeImage, \
    +
    1375 MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE ); \
    +
    1376 /* TODO: Check alloc without assert! */ \
    +
    1377 assert( NULL != (bmp)->bits ); \
    +
    1378 /* Get bitmap bits from bitmap HDC into bitmap->bits so that the bitmap
    +
    1379 * can be altered byte-by-byte.
    +
    1380 */ \
    +
    1381 GetDIBits( (bmp)->hdc_b, (bmp)->b, 0, (bmp)->bmi.header.biHeight, \
    +
    1382 (bmp)->bits, (BITMAPINFO*)&((bmp)->bmi), DIB_RGB_COLORS ); \
    +
    1383 }
    +
    1384
    +
    1385# define retroflat_vdp_release( bmp ) \
    +
    1386 assert( 0 < (bmp)->autolock_refs ); \
    +
    1387 (bmp)->autolock_refs--; \
    +
    1388 if( \
    +
    1389 0 == (bmp)->autolock_refs && \
    +
    1390 RETROFLAT_FLAGS_SCREEN_BUFFER != \
    +
    1391 (RETROFLAT_FLAGS_SCREEN_BUFFER & (bmp)->flags) \
    +
    1392 ) { \
    +
    1393 /* TODO: Causes alpha blending in mdemos? */ \
    +
    1394 if( \
    +
    1395 /* Set bitmap bits from bitmap->bits into HDC. */ \
    +
    1396 SetDIBits( g_retroflat_state->hdc_win, (bmp)->b, 0, \
    +
    1397 (bmp)->bmi.header.biHeight, (bmp)->bits, \
    +
    1398 (BITMAPINFO*)&((bmp)->bmi), DIB_RGB_COLORS ) < \
    +
    1399 (bmp)->bmi.header.biHeight \
    +
    1400 ) { \
    +
    1401 error_printf( "SetDIBits failed!" ); \
    +
    1402 } \
    +
    1403 VirtualFree( (bmp)->bits, 0, MEM_RELEASE ); \
    +
    1404 (bmp)->bits = NULL; \
    +
    1405 }
    +
    1406
    +
    1407# define retroflat_screen_buffer() \
    +
    1408 (NULL == g_retroflat_state->vdp_buffer ? \
    +
    1409 &(g_retroflat_state->buffer) : g_retroflat_state->vdp_buffer)
    +
    1410
    +
    1411# else
    +
    1412
    +
    1413# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1414
    +
    1415# endif /* RETROFLAT_VDP */
    +
    1416
    +
    1417# define retroflat_px_lock( bmp )
    +
    1418# define retroflat_px_release( bmp )
    +
    1419# define retroflat_screen_w() (g_retroflat_state->screen_v_w)
    +
    1420# define retroflat_screen_h() (g_retroflat_state->screen_v_h)
    +
    1421# define retroflat_root_win() (g_retroflat_state->window)
    +
    1422# define retroflat_quit( retval_in ) PostQuitMessage( retval_in );
    +
    1423
    +
    1424# ifndef VK_OEM_1
    +
    1425# define VK_OEM_1 0xba
    +
    1426# endif /* !VK_OEM_1 */
    +
    1427
    +
    1428# ifndef VK_OEM_2
    +
    1429# define VK_OEM_2 0xbf
    +
    1430# endif /* !VK_OEM_2 */
    +
    1431
    +
    1432# ifndef VK_OEM_3
    +
    1433# define VK_OEM_3 0xc0
    +
    1434# endif /* !VK_OEM_3 */
    +
    1435
    +
    1436# ifndef VK_OEM_4
    +
    1437# define VK_OEM_4 0xdb
    +
    1438# endif /* !VK_OEM_4 */
    +
    1439
    +
    1440# ifndef VK_OEM_5
    +
    1441# define VK_OEM_5 0xdc
    +
    1442# endif /* !VK_OEM_5 */
    +
    1443
    +
    1444# ifndef VK_OEM_6
    +
    1445# define VK_OEM_6 0xdd
    +
    1446# endif /* !VK_OEM_6 */
    +
    1447
    +
    1448# ifndef VK_OEM_7
    +
    1449# define VK_OEM_7 0xde
    +
    1450# endif /* !VK_OEM_7 */
    +
    1451
    +
    1452# ifndef VK_OEM_MINUS
    +
    1453# define VK_OEM_MINUS 0xbd
    +
    1454# endif /* !VK_OEM_MINUS */
    +
    1455
    +
    1456# ifndef VK_OEM_PLUS
    +
    1457# define VK_OEM_PLUS 0xbb
    +
    1458# endif /* !VK_OEM_PLUS */
    +
    1459
    +
    1460# ifndef VK_OEM_PERIOD
    +
    1461# define VK_OEM_PERIOD 0xbe
    +
    1462# endif /* !VK_OEM_PERIOD */
    +
    1463
    +
    1464# ifndef VK_OEM_COMMA
    +
    1465# define VK_OEM_COMMA 0xbc
    +
    1466# endif /* !VK_OEM_COMMA */
    +
    1467
    +
    1468# define RETROFLAT_KEY_GRAVE VK_OEM_3
    +
    1469# define RETROFLAT_KEY_SLASH VK_OEM_2
    +
    1470# define RETROFLAT_KEY_UP VK_UP
    +
    1471# define RETROFLAT_KEY_DOWN VK_DOWN
    +
    1472# define RETROFLAT_KEY_RIGHT VK_RIGHT
    +
    1473# define RETROFLAT_KEY_LEFT VK_LEFT
    +
    1474# define RETROFLAT_KEY_BKSP VK_BACK
    +
    1475# define RETROFLAT_KEY_A 0x41
    +
    1476# define RETROFLAT_KEY_B 0x42
    +
    1477# define RETROFLAT_KEY_C 0x43
    +
    1478# define RETROFLAT_KEY_D 0x44
    +
    1479# define RETROFLAT_KEY_E 0x45
    +
    1480# define RETROFLAT_KEY_F 0x46
    +
    1481# define RETROFLAT_KEY_G 0x47
    +
    1482# define RETROFLAT_KEY_H 0x48
    +
    1483# define RETROFLAT_KEY_I 0x49
    +
    1484# define RETROFLAT_KEY_J 0x4a
    +
    1485# define RETROFLAT_KEY_K 0x4b
    +
    1486# define RETROFLAT_KEY_L 0x4c
    +
    1487# define RETROFLAT_KEY_M 0x4d
    +
    1488# define RETROFLAT_KEY_N 0x4e
    +
    1489# define RETROFLAT_KEY_O 0x4f
    +
    1490# define RETROFLAT_KEY_P 0x50
    +
    1491# define RETROFLAT_KEY_Q 0x51
    +
    1492# define RETROFLAT_KEY_R 0x52
    +
    1493# define RETROFLAT_KEY_S 0x53
    +
    1494# define RETROFLAT_KEY_T 0x54
    +
    1495# define RETROFLAT_KEY_U 0x55
    +
    1496# define RETROFLAT_KEY_V 0x56
    +
    1497# define RETROFLAT_KEY_W 0x57
    +
    1498# define RETROFLAT_KEY_X 0x58
    +
    1499# define RETROFLAT_KEY_Y 0x59
    +
    1500# define RETROFLAT_KEY_Z 0x60
    +
    1501# define RETROFLAT_KEY_0 0x30
    +
    1502# define RETROFLAT_KEY_1 0x31
    +
    1503# define RETROFLAT_KEY_2 0x32
    +
    1504# define RETROFLAT_KEY_3 0x33
    +
    1505# define RETROFLAT_KEY_4 0x34
    +
    1506# define RETROFLAT_KEY_5 0x35
    +
    1507# define RETROFLAT_KEY_6 0x36
    +
    1508# define RETROFLAT_KEY_7 0x37
    +
    1509# define RETROFLAT_KEY_8 0x38
    +
    1510# define RETROFLAT_KEY_9 0x39
    +
    1511# define RETROFLAT_KEY_TAB VK_TAB
    +
    1512# define RETROFLAT_KEY_SPACE VK_SPACE
    +
    1513# define RETROFLAT_KEY_ESC VK_ESCAPE
    +
    1514# define RETROFLAT_KEY_ENTER VK_RETURN
    +
    1515# define RETROFLAT_KEY_HOME VK_HOME
    +
    1516# define RETROFLAT_KEY_END VK_END
    +
    1517# define RETROFLAT_KEY_DELETE VK_DELETE
    +
    1518# define RETROFLAT_KEY_PGUP VK_PRIOR
    +
    1519# define RETROFLAT_KEY_PGDN VK_NEXT
    +
    1520# define RETROFLAT_KEY_SEMICOLON VK_OEM_1
    +
    1521# define RETROFLAT_KEY_PERIOD VK_OEM_PERIOD
    +
    1522# define RETROFLAT_KEY_COMMA VK_OEM_COMMA
    +
    1523# define RETROFLAT_KEY_EQUALS VK_OEM_PLUS
    +
    1524# define RETROFLAT_KEY_DASH VK_OEM_MINUS
    +
    1525# define RETROFLAT_KEY_BACKSLASH VK_OEM_5
    +
    1526# define RETROFLAT_KEY_QUOTE VK_OEM_7
    +
    1527# define RETROFLAT_KEY_BRACKETL VK_OEM_4
    +
    1528# define RETROFLAT_KEY_BRACKETR VK_OEM_6
    +
    1529
    +
    1530# define RETROFLAT_MOUSE_B_LEFT VK_LBUTTON
    +
    1531# define RETROFLAT_MOUSE_B_RIGHT VK_RBUTTON
    +
    1532
    +
    1533/* Set the calling convention for WinMain, depending on Win16/Win32. */
    +
    1534# if defined( RETROFLAT_API_WIN16 )
    +
    1535# define WINXAPI PASCAL
    +
    1536# elif defined( RETROFLAT_API_WIN32 )
    +
    1537# define WINXAPI WINAPI
    +
    1538# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    1539
    +
    1540/* TODO: Verify this on multi-monitor Win32 systems. */
    +
    1541#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
    +
    1542#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
    +
    1543
    +
    1544#define main( argc, argv ) retroflat_main( argc, argv )
    +
    1545
    +
    1546/* Improvise a rough WinMain to call main(). */
    +
    1547#define END_OF_MAIN() \
    +
    1548 int WINXAPI WinMain( \
    +
    1549 HINSTANCE hInstance, HINSTANCE hPrevInstance, \
    +
    1550 LPSTR lpCmdLine, int nCmdShow \
    +
    1551 ) { \
    +
    1552 LPSTR* rf_argv = NULL; \
    +
    1553 int rf_argc = 0; \
    +
    1554 int retval = 0; \
    +
    1555 g_retroflat_instance = hInstance; \
    +
    1556 g_retroflat_cmd_show = nCmdShow; \
    +
    1557 rf_argv = retroflat_win_cli( lpCmdLine, &rf_argc ); \
    +
    1558 retval = retroflat_main( rf_argc, rf_argv ); \
    +
    1559 free( rf_argv ); \
    +
    1560 return retval; \
    +
    1561 }
    +
    1562
    +
    1563/* Convenience macro for auto-locking inside of draw functions. */
    +
    1564/* TODO: Use maug_cleanup and assume retval. */
    +
    1565#define retroflat_internal_autolock_bitmap( bmp, lock_auto ) \
    +
    1566 if( !retroflat_bitmap_locked( bmp ) ) { \
    +
    1567 retval = retroflat_draw_lock( bmp ); \
    +
    1568 maug_cleanup_if_not_ok(); \
    +
    1569 lock_auto = 1; \
    +
    1570 }
    +
    1571
    +
    1572#elif defined( RETROFLAT_API_LIBNDS )
    +
    1573
    +
    1574/* == Nintendo DS == */
    +
    1575
    +
    1576# include <nds.h>
    +
    1577
    +
    1578/* NDS doesn't have primitives. */
    +
    1579# ifndef RETROFLAT_SOFT_SHAPES
    +
    1580# define RETROFLAT_SOFT_SHAPES
    +
    1581# endif /* !RETROFLAT_SOFT_SHAPES */
    +
    1582
    +
    1583# ifndef RETROFLAT_SOFT_LINES
    +
    1584# define RETROFLAT_SOFT_LINES
    +
    1585# endif /* !RETROFLAT_SOFT_LINES */
    +
    1586
    +
    1587# define BG_TILE_W_PX 8
    +
    1588# define BG_TILE_H_PX 8
    +
    1589# define BG_W_TILES 32
    +
    1590
    +
    1591typedef int16_t RETROFLAT_IN_KEY;
    +
    1592typedef uint32_t retroflat_ms_t;
    +
    1593
    +
    1594#define RETROFLAT_MS_FMT "%lu"
    +
    1595
    +
    1596struct RETROFLAT_BITMAP {
    +
    1597 size_t sz;
    +
    1598 uint8_t flags;
    +
    1599 uint16_t* b;
    +
    1600# ifdef RETROFLAT_OPENGL
    +
    1601 struct RETROFLAT_GLTEX tex;
    +
    1602 ssize_t w;
    +
    1603 ssize_t h;
    +
    1604# endif /* RETROFLAT_OPENGL */
    +
    1605};
    +
    1606
    +
    1607typedef int RETROFLAT_COLOR_DEF;
    +
    1608
    +
    1609# ifdef RETROFLAT_NDS_WASD
    +
    1610# define RETROFLAT_KEY_A KEY_LEFT
    +
    1611# define RETROFLAT_KEY_D KEY_RIGHT
    +
    1612# define RETROFLAT_KEY_W KEY_UP
    +
    1613# define RETROFLAT_KEY_S KEY_DOWN
    +
    1614# endif /* RETROFLAT_NDS_WASD */
    +
    1615# define RETROFLAT_KEY_LEFT KEY_LEFT
    +
    1616# define RETROFLAT_KEY_RIGHT KEY_RIGHT
    +
    1617# define RETROFLAT_KEY_UP KEY_UP
    +
    1618# define RETROFLAT_KEY_DOWN KEY_DOWN
    +
    1619# define RETROFLAT_KEY_ENTER KEY_START
    +
    1620# define RETROFLAT_KEY_SPACE KEY_A
    +
    1621# define RETROFLAT_KEY_ESC KEY_B
    +
    1622# define RETROFLAT_MOUSE_B_LEFT (-1)
    +
    1623# define RETROFLAT_MOUSE_B_RIGHT (-2)
    +
    1624
    +
    1625/* TODO */
    +
    1626# define retroflat_bitmap_locked( bmp ) (0)
    +
    1627# define retroflat_px_lock( bmp )
    +
    1628# define retroflat_px_release( bmp )
    +
    1629# ifdef RETROFLAT_VDP
    +
    1630# define retroflat_vdp_lock( bmp )
    +
    1631# define retroflat_vdp_release( bmp )
    +
    1632# endif /* RETROFLAT_VDP */
    +
    1633
    +
    1634# define retroflat_screen_w() (256)
    +
    1635# define retroflat_screen_h() (192)
    +
    1636# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1637# define retroflat_root_win() (NULL) /* TODO */
    +
    1638
    +
    1639# define END_OF_MAIN()
    +
    1640
    +
    1641/* TODO? */
    +
    1642# define retroflat_quit( retval_in )
    +
    1643# define retroflat_bitmap_w( bmp ) (0)
    +
    1644# define retroflat_bitmap_h( bmp ) (0)
    +
    1645# define retroflat_bitmap_ok( bitmap ) (0)
    +
    1646
    +
    1647#elif defined( RETROFLAT_API_GLUT )
    +
    1648
    +
    1649# ifndef RETROFLAT_OPENGL
    +
    1650# error "RETROFLAT_API_GLUT specified without RETROFLAT_OPENGL!"
    +
    1651# define RETROFLAT_OPENGL
    +
    1652# endif /* !RETROFLAT_OPENGL */
    +
    1653
    +
    1654# ifdef __WATCOMC__
    +
    1655# define GLUT_DISABLE_ATEXIT_HACK
    +
    1656# endif
    +
    1657
    +
    1658# include <GL/glut.h>
    +
    1659
    +
    1660# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    1661# define RETROFLAT_CONFIG_USE_FILE
    +
    1662# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    1663
    +
    1664typedef int16_t RETROFLAT_IN_KEY;
    +
    1665typedef uint32_t retroflat_ms_t;
    +
    1666
    +
    1667# define RETROFLAT_MS_FMT "%lu"
    +
    1668
    +
    1669typedef float MAUG_CONST* RETROFLAT_COLOR_DEF;
    +
    1670
    +
    1671struct RETROFLAT_BITMAP {
    +
    1672 size_t sz;
    +
    1673 uint8_t flags;
    +
    1674 struct RETROFLAT_GLTEX tex;
    +
    1675 ssize_t w;
    +
    1676 ssize_t h;
    +
    1677};
    +
    1678
    +
    1679# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->b)
    +
    1680# define retroflat_bitmap_locked( bmp ) \
    +
    1681 (RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & (bmp)->flags))
    +
    1682/* TODO */
    +
    1683# define retroflat_bitmap_w( bmp ) (0)
    +
    1684# define retroflat_bitmap_h( bmp ) (0)
    +
    1685
    +
    1687# define retroflat_px_lock( bmp )
    +
    1688# define retroflat_px_release( bmp )
    +
    1689# ifdef RETROFLAT_VDP
    +
    1690# define retroflat_vdp_lock( bmp )
    +
    1691# define retroflat_vdp_release( bmp )
    +
    1692# endif /* RETROFLAT_VDP */
    +
    1693# define retroflat_screen_w() (g_retroflat_state->screen_v_w)
    +
    1694# define retroflat_screen_h() (g_retroflat_state->screen_v_h)
    +
    1695# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1696# define retroflat_root_win() (NULL) /* TODO */
    +
    1697# define retroflat_quit( retval_in ) glutDestroyWindow( glutGetWindow() )
    +
    1698# define END_OF_MAIN()
    +
    1699
    +
    1700# define GLUT_SPECIAL_KEY_OFFSET 0x80
    +
    1701
    +
    1702# define RETROFLAT_MOUSE_B_LEFT -1
    +
    1703# define RETROFLAT_MOUSE_B_RIGHT -2
    +
    1704
    +
    1705# define RETROFLAT_KEY_UP (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_UP)
    +
    1706# define RETROFLAT_KEY_DOWN (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_DOWN)
    +
    1707# define RETROFLAT_KEY_RIGHT (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_RIGHT)
    +
    1708# define RETROFLAT_KEY_LEFT (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_LEFT)
    +
    1709# define RETROFLAT_KEY_HOME (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_HOME)
    +
    1710# define RETROFLAT_KEY_END (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_END)
    +
    1711# define RETROFLAT_KEY_PGUP (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_PAGE_UP)
    +
    1712# define RETROFLAT_KEY_PGDN \
    +
    1713 (GLUT_SPECIAL_KEY_OFFSET + GLUT_KEY_PAGE_DOWN)
    +
    1714# define RETROFLAT_KEY_DELETE 0x7f
    +
    1715# define RETROFLAT_KEY_ESC 0x1b
    +
    1716# define RETROFLAT_KEY_ENTER 0x0d
    +
    1717# define RETROFLAT_KEY_TAB '\t'
    +
    1718# define RETROFLAT_KEY_SPACE ' '
    +
    1719# define RETROFLAT_KEY_GRAVE '`'
    +
    1720# define RETROFLAT_KEY_SLASH '/'
    +
    1721# define RETROFLAT_KEY_BKSP 0x08
    +
    1722# define RETROFLAT_KEY_SEMICOLON ';'
    +
    1723# define RETROFLAT_KEY_PERIOD '.'
    +
    1724# define RETROFLAT_KEY_COMMA ','
    +
    1725# define RETROFLAT_KEY_EQUALS '='
    +
    1726# define RETROFLAT_KEY_DASH '-'
    +
    1727# define RETROFLAT_KEY_A 'a'
    +
    1728# define RETROFLAT_KEY_B 'b'
    +
    1729# define RETROFLAT_KEY_C 'c'
    +
    1730# define RETROFLAT_KEY_D 'd'
    +
    1731# define RETROFLAT_KEY_E 'e'
    +
    1732# define RETROFLAT_KEY_F 'f'
    +
    1733# define RETROFLAT_KEY_G 'g'
    +
    1734# define RETROFLAT_KEY_H 'h'
    +
    1735# define RETROFLAT_KEY_I 'i'
    +
    1736# define RETROFLAT_KEY_J 'j'
    +
    1737# define RETROFLAT_KEY_K 'k'
    +
    1738# define RETROFLAT_KEY_L 'l'
    +
    1739# define RETROFLAT_KEY_M 'm'
    +
    1740# define RETROFLAT_KEY_N 'n'
    +
    1741# define RETROFLAT_KEY_O 'o'
    +
    1742# define RETROFLAT_KEY_P 'p'
    +
    1743# define RETROFLAT_KEY_Q 'q'
    +
    1744# define RETROFLAT_KEY_R 'r'
    +
    1745# define RETROFLAT_KEY_S 's'
    +
    1746# define RETROFLAT_KEY_T 't'
    +
    1747# define RETROFLAT_KEY_U 'u'
    +
    1748# define RETROFLAT_KEY_V 'v'
    +
    1749# define RETROFLAT_KEY_W 'w'
    +
    1750# define RETROFLAT_KEY_X 'x'
    +
    1751# define RETROFLAT_KEY_Y 'y'
    +
    1752# define RETROFLAT_KEY_Z 'z'
    +
    1753# define RETROFLAT_KEY_0 '0'
    +
    1754# define RETROFLAT_KEY_1 '1'
    +
    1755# define RETROFLAT_KEY_2 '2'
    +
    1756# define RETROFLAT_KEY_3 '3'
    +
    1757# define RETROFLAT_KEY_4 '4'
    +
    1758# define RETROFLAT_KEY_5 '5'
    +
    1759# define RETROFLAT_KEY_6 '6'
    +
    1760# define RETROFLAT_KEY_7 '7'
    +
    1761# define RETROFLAT_KEY_8 '8'
    +
    1762# define RETROFLAT_KEY_9 '9'
    +
    1763/* TODO */
    +
    1764# define RETROFLAT_KEY_BRACKETL '['
    +
    1765/* TODO */
    +
    1766# define RETROFLAT_KEY_BRACKETR ']'
    +
    1767/* TODO */
    +
    1768# define RETROFLAT_KEY_BACKSLASH '\\'
    +
    1769/* TODO */
    +
    1770# define RETROFLAT_KEY_QUOTE '\''
    +
    1771/* TODO */
    +
    1772# define RETROFLAT_KEY_EQUALS '='
    +
    1773
    +
    1774#elif defined( RETROFLAT_API_PC_BIOS )
    +
    1775
    +
    1776# include <time.h> /* For srand() */
    +
    1777
    +
    1778# if defined( MAUG_OS_DOS_REAL ) && \
    +
    1779 defined( MAUG_DOS_MEM_L ) && \
    +
    1780 defined( __WATCOMC__ )
    +
    1781# define SEG_RETROBMP __based( __segname( "RETROBMP" ) )
    +
    1782# else
    +
    1783# define SEG_RETROBMP
    +
    1784# endif /* __WATCOMC__ */
    +
    1785
    +
    1786typedef int16_t RETROFLAT_IN_KEY;
    +
    1787typedef uint16_t retroflat_ms_t;
    +
    1788
    +
    1789# define RETROFLAT_MS_FMT "%u"
    +
    1790
    +
    1791/* Explicity screen sizes aren't supported, only screen modes handled in
    +
    1792 * special cases during init.
    +
    1793 */
    +
    1794# define RETROFLAT_NO_CLI_SZ
    +
    1795
    +
    1796# define RETROFLAT_SCREEN_MODE_CGA 0x04
    +
    1797# define RETROFLAT_SCREEN_MODE_VGA 0x13
    +
    1798
    +
    1799# define RETROFLAT_CGA_COLOR_BLACK 0
    +
    1800# define RETROFLAT_CGA_COLOR_CYAN 1
    +
    1801# define RETROFLAT_CGA_COLOR_MAGENTA 2
    +
    1802# define RETROFLAT_CGA_COLOR_WHITE 3
    +
    1803
    +
    1804# ifndef RETROFLAT_SOFT_SHAPES
    +
    1805# define RETROFLAT_SOFT_SHAPES
    +
    1806# endif /* !RETROFLAT_SOFT_SHAPES */
    +
    1807
    +
    1808# ifndef RETROFLAT_DOS_TIMER_DIV
    +
    1809/* #define RETROFLAT_DOS_TIMER_DIV 1103 */
    +
    1810# define RETROFLAT_DOS_TIMER_DIV 100
    +
    1811# endif /* !RETROFLAT_DOS_TIMER_DIV */
    +
    1812
    +
    1813# define retroflat_bitmap_w( bmp ) ((bmp)->w)
    +
    1814# define retroflat_bitmap_h( bmp ) ((bmp)->h)
    +
    1815
    +
    1816# define retroflat_px_lock( bmp )
    +
    1817# define retroflat_px_release( bmp )
    +
    1818
    +
    1819# ifdef RETROFLAT_VDP
    +
    1820# define retroflat_vdp_lock( bmp )
    +
    1821# define retroflat_vdp_release( bmp )
    +
    1822# endif /* RETROFLAT_VDP */
    +
    1823
    +
    1824# ifndef NO_I86
    +
    1825# include <i86.h>
    +
    1826# endif /* NO_I86 */
    +
    1827# include <dos.h>
    +
    1828# include <conio.h>
    +
    1829# include <malloc.h>
    +
    1830
    +
    1831# define END_OF_MAIN()
    +
    1832
    +
    1833# ifndef RETROFLAT_CONFIG_USE_FILE
    +
    1834# define RETROFLAT_CONFIG_USE_FILE
    +
    1835# endif /* !RETROFLAT_CONFIG_USE_FILE */
    +
    1836
    +
    1837# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->px)
    +
    1838
    +
    1839# define retroflat_quit( retval_in ) \
    +
    1840 g_retroflat_state->retroflat_flags &= ~RETROFLAT_FLAGS_RUNNING; \
    +
    1841 g_retroflat_state->retval = retval_in;
    +
    1842
    +
    1843typedef uint8_t RETROFLAT_COLOR_DEF;
    +
    1844
    +
    1845struct RETROFLAT_BITMAP {
    +
    1846 size_t sz;
    +
    1847 uint8_t flags;
    +
    1848 int16_t w;
    +
    1849 int16_t h;
    +
    1850 uint8_t SEG_FAR* px;
    +
    1851 uint8_t SEG_FAR* mask;
    +
    1852};
    +
    1853
    +
    1854# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1855
    +
    1856/* We only explicitly support screen modes with these dimensions anyway.
    +
    1857 */
    +
    1858# define retroflat_screen_w() (g_retroflat_state->buffer.w)
    +
    1859# define retroflat_screen_h() (g_retroflat_state->buffer.h)
    +
    1860
    +
    1861/* TODO: DOS Keycodes */
    +
    1862
    +
    1863# define RETROFLAT_KEY_BKSP 0x08
    +
    1864/* TODO */
    +
    1865# define RETROFLAT_KEY_GRAVE /* 0x60 */ '`'
    +
    1866# define RETROFLAT_KEY_DASH '-'
    +
    1867# define RETROFLAT_KEY_SLASH '/'
    +
    1868# define RETROFLAT_KEY_PERIOD '.'
    +
    1869# define RETROFLAT_KEY_COMMA ','
    +
    1870# define RETROFLAT_KEY_SEMICOLON ';'
    +
    1871# define RETROFLAT_KEY_A 0x41
    +
    1872# define RETROFLAT_KEY_B 0x42
    +
    1873# define RETROFLAT_KEY_C 0x43
    +
    1874# define RETROFLAT_KEY_D 0x44
    +
    1875# define RETROFLAT_KEY_E 0x45
    +
    1876# define RETROFLAT_KEY_F 0x46
    +
    1877# define RETROFLAT_KEY_G 0x47
    +
    1878# define RETROFLAT_KEY_H 0x48
    +
    1879# define RETROFLAT_KEY_I 0x49
    +
    1880# define RETROFLAT_KEY_J 0x4a
    +
    1881# define RETROFLAT_KEY_K 0x4b
    +
    1882# define RETROFLAT_KEY_L 0x4c
    +
    1883# define RETROFLAT_KEY_M 0x4d
    +
    1884# define RETROFLAT_KEY_N 0x4e
    +
    1885# define RETROFLAT_KEY_O 0x4f
    +
    1886# define RETROFLAT_KEY_P 0x50
    +
    1887# define RETROFLAT_KEY_Q 0x51
    +
    1888# define RETROFLAT_KEY_R 0x52
    +
    1889# define RETROFLAT_KEY_S 0x53
    +
    1890# define RETROFLAT_KEY_T 0x54
    +
    1891# define RETROFLAT_KEY_U 0x55
    +
    1892# define RETROFLAT_KEY_V 0x56
    +
    1893# define RETROFLAT_KEY_W 0x57
    +
    1894# define RETROFLAT_KEY_X 0x58
    +
    1895# define RETROFLAT_KEY_Y 0x59
    +
    1896# define RETROFLAT_KEY_Z 0x60
    +
    1897# define RETROFLAT_KEY_0 0x30
    +
    1898# define RETROFLAT_KEY_1 0x31
    +
    1899# define RETROFLAT_KEY_2 0x32
    +
    1900# define RETROFLAT_KEY_3 0x33
    +
    1901# define RETROFLAT_KEY_4 0x34
    +
    1902# define RETROFLAT_KEY_5 0x35
    +
    1903# define RETROFLAT_KEY_6 0x36
    +
    1904# define RETROFLAT_KEY_7 0x37
    +
    1905# define RETROFLAT_KEY_8 0x38
    +
    1906# define RETROFLAT_KEY_9 0x39
    +
    1907/* TODO */
    +
    1908# define RETROFLAT_KEY_TAB 0
    +
    1909# define RETROFLAT_KEY_SPACE 0x20
    +
    1910# define RETROFLAT_KEY_ESC 0x1b
    +
    1911# define RETROFLAT_KEY_ENTER 0x0d
    +
    1912/* TODO */
    +
    1913# define RETROFLAT_KEY_BRACKETL '['
    +
    1914/* TODO */
    +
    1915# define RETROFLAT_KEY_BRACKETR ']'
    +
    1916/* TODO */
    +
    1917# define RETROFLAT_KEY_BACKSLASH '\\'
    +
    1918/* TODO */
    +
    1919# define RETROFLAT_KEY_QUOTE '\''
    +
    1920/* TODO */
    +
    1921# define RETROFLAT_KEY_EQUALS '='
    +
    1922
    +
    1923/* Handle keys that send a double-code. */
    +
    1924# define RETROFLAT_KEY_UP -3
    +
    1925# define RETROFLAT_KEY_DOWN -4
    +
    1926# define RETROFLAT_KEY_RIGHT -5
    +
    1927# define RETROFLAT_KEY_LEFT -6
    +
    1928# define RETROFLAT_KEY_HOME -7
    +
    1929# define RETROFLAT_KEY_END -8
    +
    1930# define RETROFLAT_KEY_PGUP -9
    +
    1931# define RETROFLAT_KEY_PGDN -10
    +
    1932# define RETROFLAT_KEY_DELETE -11
    +
    1933
    +
    1934# define RETROFLAT_MOUSE_B_LEFT -100
    +
    1935# define RETROFLAT_MOUSE_B_RIGHT -200
    +
    1936
    +
    1937typedef void (__interrupt __far* retroflat_intfunc)( void );
    +
    1938
    +
    1939#else
    +
    1940# pragma message( "warning: not implemented" )
    +
    1941
    +
    + +
    1955 size_t sz;
    +
    1957 uint8_t flags;
    +
    1958 struct RETROFLAT_GLTEX tex;
    +
    1959};
    +
    +
    1960
    +
    1962# define retroflat_bitmap_ok( bitmap ) (NULL != (bitmap)->b)
    +
    1963
    +
    1964 /* maug_retroflt_bitmap */
    +
    1965
    +
    1967# define retroflat_screen_w()
    +
    1968
    +
    1970# define retroflat_screen_h()
    +
    1971
    +
    1973# define retroflat_screen_buffer() (&(g_retroflat_state->buffer))
    +
    1974
    +
    1979# define retroflat_quit( retval_in )
    +
    1980
    +
    1994typedef int RETROFLAT_COLOR_DEF;
    +
    1995
    +
    1996# define RETROFLAT_COLOR_BLACK 0
    +
    1997# define RETROFLAT_COLOR_DARKBLUE 1
    +
    1998# define RETROFLAT_COLOR_DARKGREEN 2
    +
    1999# define RETROFLAT_COLOR_TEAL 3
    +
    2000# define RETROFLAT_COLOR_DARKRED 4
    +
    2001# define RETROFLAT_COLOR_VIOLET 5
    +
    2002# define RETROFLAT_COLOR_BROWN 6
    +
    2003# define RETROFLAT_COLOR_GRAY 7
    +
    2004# define RETROFLAT_COLOR_DARKGRAY 8
    +
    2005# define RETROFLAT_COLOR_BLUE 9
    +
    2006# define RETROFLAT_COLOR_GREEN 10
    +
    2007# define RETROFLAT_COLOR_CYAN 11
    +
    2008# define RETROFLAT_COLOR_RED 12
    +
    2009# define RETROFLAT_COLOR_MAGENTA 13
    +
    2010# define RETROFLAT_COLOR_YELLOW 14
    +
    2011# define RETROFLAT_COLOR_WHITE 15
    +
    2012
    +
    2013 /* maug_retroflt_color */
    +
    2014
    +
    2015 /* maug_retroflt_drawing */
    +
    2016
    +
    2030# define RETROFLAT_KEY_UP 0
    +
    2031# define RETROFLAT_KEY_DOWN 0
    +
    2032# define RETROFLAT_KEY_RIGHT 0
    +
    2033# define RETROFLAT_KEY_LEFT 0
    +
    2034# define RETROFLAT_KEY_A 0x41
    +
    2035# define RETROFLAT_KEY_B 0x42
    +
    2036# define RETROFLAT_KEY_C 0x43
    +
    2037# define RETROFLAT_KEY_D 0x44
    +
    2038# define RETROFLAT_KEY_E 0x45
    +
    2039# define RETROFLAT_KEY_F 0x46
    +
    2040# define RETROFLAT_KEY_G 0x47
    +
    2041# define RETROFLAT_KEY_H 0x48
    +
    2042# define RETROFLAT_KEY_I 0x49
    +
    2043# define RETROFLAT_KEY_J 0x4a
    +
    2044# define RETROFLAT_KEY_K 0x4b
    +
    2045# define RETROFLAT_KEY_L 0x4c
    +
    2046# define RETROFLAT_KEY_M 0x4d
    +
    2047# define RETROFLAT_KEY_N 0x4e
    +
    2048# define RETROFLAT_KEY_O 0x4f
    +
    2049# define RETROFLAT_KEY_P 0x50
    +
    2050# define RETROFLAT_KEY_Q 0x51
    +
    2051# define RETROFLAT_KEY_R 0x52
    +
    2052# define RETROFLAT_KEY_S 0x53
    +
    2053# define RETROFLAT_KEY_T 0x54
    +
    2054# define RETROFLAT_KEY_U 0x55
    +
    2055# define RETROFLAT_KEY_V 0x56
    +
    2056# define RETROFLAT_KEY_W 0x57
    +
    2057# define RETROFLAT_KEY_X 0x58
    +
    2058# define RETROFLAT_KEY_Y 0x59
    +
    2059# define RETROFLAT_KEY_Z 0x60
    +
    2060# define RETROFLAT_KEY_0 0x30
    +
    2061# define RETROFLAT_KEY_1 0x31
    +
    2062# define RETROFLAT_KEY_2 0x32
    +
    2063# define RETROFLAT_KEY_3 0x33
    +
    2064# define RETROFLAT_KEY_4 0x34
    +
    2065# define RETROFLAT_KEY_5 0x35
    +
    2066# define RETROFLAT_KEY_6 0x36
    +
    2067# define RETROFLAT_KEY_7 0x37
    +
    2068# define RETROFLAT_KEY_8 0x38
    +
    2069# define RETROFLAT_KEY_9 0x39
    +
    2070# define RETROFLAT_KEY_TAB 0
    +
    2071# define RETROFLAT_KEY_SPACE 0
    +
    2072# define RETROFLAT_KEY_ESC 0
    +
    2073# define RETROFLAT_KEY_ENTER 0
    +
    2074# define RETROFLAT_KEY_HOME 0
    +
    2075# define RETROFLAT_KEY_END 0
    +
    2076
    +
    2077# define RETROFLAT_MOUSE_B_LEFT 0
    +
    2078# define RETROFLAT_MOUSE_B_RIGHT 0
    +
    2079
    +
    2080 /* maug_retroflt_keydefs */
    +
    2081
    +
    2082 /* maug_retroflt_input */
    +
    2083
    +
    2084#endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2085
    +
    2086/* OpenGL can be called from several different APIs. */
    +
    2087# if defined( RETROFLAT_OPENGL ) && !defined( RETROFLAT_API_LIBNDS )
    +
    2088# include <GL/gl.h>
    +
    2089# include <GL/glu.h>
    +
    2090# endif /* RETROFLAT_OPENGL */
    +
    2091
    +
    2092/* === Structures === */
    +
    2093
    +
    + +
    2100 char* title;
    + +
    2103 uint8_t flags;
    + +
    2106# ifdef RETROFLAT_API_PC_BIOS
    +
    2108 uint8_t screen_mode;
    +
    2109# elif !defined( RETROFLAT_NO_CLI_SZ )
    +
    2110 int screen_w;
    + + + +
    2117# endif /* RETROFLAT_API_PC_BIOS */
    +
    2118 uint8_t snd_flags;
    +
    2119# if defined( RETROSND_API_WINMM )
    +
    2120 UINT snd_dev_id;
    +
    2121# elif defined( RETROSND_API_PC_BIOS )
    +
    2122 uint16_t snd_io_base;
    +
    2123 uint8_t snd_driver;
    +
    2124# elif defined( RETROSND_API_ALSA )
    +
    2125 uint8_t snd_client;
    +
    2126 uint8_t snd_port;
    +
    2127# else
    +
    2128# pragma message( "warning: sound args not specified" )
    +
    2129# endif /* RETROSND_API_WINMM */
    +
    2130};
    +
    +
    2131
    +
    + +
    2134 void* loop_data;
    +
    2135 MERROR_RETVAL retval;
    + +
    2138 char config_path[RETROFLAT_PATH_MAX + 1];
    +
    2139 char assets_path[RETROFLAT_ASSETS_PATH_MAX + 1];
    +
    2141 RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ];
    + +
    2144
    +
    2145# if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION ) || \
    +
    2146defined( RETROVDP_C )
    + +
    2152# ifdef RETROFLAT_OS_WIN
    +
    2153 HMODULE vdp_exe;
    +
    2154# else
    +
    2156 void* vdp_exe;
    +
    2157# endif /* RETROFLAT_OS_WIN */
    + + +
    2166 uint8_t vdp_flags;
    +
    2167# endif /* RETROFLAT_VDP || DOCUMENTATION || RETROVDP_C */
    +
    2168
    +
    2169 /* These are used by VDP so should be standardized/not put in plat-spec! */
    +
    2170
    + + + + +
    2189
    +
    2190 /* WARNING: The VDP requires the state specifier to be the same size
    +
    2191 * as the one it was compiled for! Do not modify above here!
    +
    2192 */
    +
    2193
    +
    2194 /* TODO: Put these in a platform-specific struct of some kind to maintain
    +
    2195 * consistent state struct size for VDP?
    +
    2196 */
    +
    2197
    +
    2198 retroflat_proc_resize_t on_resize;
    +
    2199 void* on_resize_data;
    +
    2200
    +
    2201# if defined( RETROFLAT_OPENGL )
    +
    2202 uint8_t tex_palette[RETROFLAT_COLORS_SZ][3];
    +
    2203# endif /* RETROFLAT_OPENGL */
    +
    2204
    +
    2205#if defined( RETROFLAT_API_ALLEGRO )
    +
    2206
    +
    2207# ifdef RETROFLAT_OS_DOS
    +
    2208 unsigned int last_mouse;
    +
    2209 unsigned int last_mouse_x;
    +
    2210 unsigned int last_mouse_y;
    +
    2211# endif /* RETROFLAT_OS_DOS */
    +
    2212 unsigned int close_button;
    +
    2213
    +
    2214#elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    2215
    +
    2216# ifndef RETROFLAT_API_SDL1
    +
    2217 SDL_Window* window;
    +
    2218# endif /* !RETROFLAT_API_SDL1 */
    +
    2219 int mouse_state;
    +
    2220
    +
    2221#elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    2222
    +
    2223 HWND window;
    +
    2224 int16_t last_idc; /* Last clicked button. */
    +
    2225# ifdef RETROFLAT_SCREENSAVER
    +
    2226 HWND parent;
    +
    2227# endif /* RETROFLAT_SCREENSAVER */
    +
    2228 HDC hdc_win;
    +
    2229# ifdef RETROFLAT_OPENGL
    +
    2230 HGLRC hrc_win;
    +
    2231# endif /* RETROFLAT_OPENGL */
    +
    2232 int16_t last_key;
    +
    2233 uint8_t vk_mods;
    +
    2234 unsigned int last_mouse;
    +
    2235 unsigned int last_mouse_x;
    +
    2236 unsigned int last_mouse_y;
    +
    2237 retroflat_loop_iter loop_iter;
    +
    2238 retroflat_loop_iter frame_iter;
    +
    2239
    +
    2240# elif defined( RETROFLAT_API_LIBNDS )
    +
    2241
    +
    2242 uint16_t* sprite_frames[NDS_SPRITES_ACTIVE];
    +
    2243 int bg_id;
    +
    2244 uint8_t bg_bmp_changed;
    +
    2245 uint8_t window_bmp_changed;
    +
    2246 int window_id;
    +
    2247 int px_id;
    +
    2248 uint16_t bg_tiles[1024];
    +
    2249 uint16_t window_tiles[1024];
    +
    2250
    +
    2251# elif defined( RETROFLAT_API_GLUT )
    +
    2252
    +
    2253 size_t retroflat_next;
    +
    2254 retroflat_loop_iter loop_iter;
    +
    2255 retroflat_loop_iter frame_iter;
    +
    2256 int16_t retroflat_last_key;
    +
    2257
    +
    2258# elif defined( RETROFLAT_API_PC_BIOS )
    +
    2259
    +
    2260 retroflat_intfunc old_timer_interrupt;
    +
    2261 uint8_t old_video_mode;
    +
    2262 uint8_t cga_color_table[16];
    +
    2263 uint8_t cga_dither_table[16];
    +
    2264 uint8_t screen_mode;
    +
    2265
    +
    2266# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2267
    +
    2268};
    +
    +
    2269
    +
    2270/* === Translation Module === */
    +
    2271
    +
    2272/* Declare the prototypes so that internal functions can call each other. */
    +
    2273
    + +
    2280 retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void* data );
    +
    2281
    + +
    2289 uint8_t flags, const char* title, const char* format, ... );
    +
    2290
    +
    2298MERROR_RETVAL retroflat_init( int argc, char* argv[], struct RETROFLAT_ARGS* args );
    +
    2299
    +
    2306void retroflat_shutdown( int retval );
    +
    2307
    +
    2308# if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION )
    +
    2317MERROR_RETVAL retroflat_vdp_call( const char* proc_name );
    +
    2318
    +
    2319 /* maug_retroflt_vdp */
    +
    2320# endif /* RETROFLAT_VDP || DOCUMENTATION */
    +
    2321
    +
    2322void retroflat_set_title( const char* format, ... );
    +
    2323
    +
    2324retroflat_ms_t retroflat_get_ms();
    +
    2325
    +
    2326uint32_t retroflat_get_rand();
    +
    2327
    +
    2328# if !defined( RETROFLAT_NO_KEYBOARD )
    +
    2329char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags );
    +
    2330# endif /* !RETROFLAT_NO_KEYBOARD */
    +
    2331
    + +
    2348 const char* filename, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
    +
    2349
    +
    2350MERROR_RETVAL retroflat_create_bitmap(
    +
    2351 size_t w, size_t h, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
    +
    2352
    + +
    2359
    + +
    2374 struct RETROFLAT_BITMAP* target, struct RETROFLAT_BITMAP* src,
    +
    2375 int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h );
    +
    2376
    +
    2377 /* maug_retroflt_bitmap */
    +
    2378
    + +
    2394
    +
    2395MERROR_RETVAL retroflat_draw_release( struct RETROFLAT_BITMAP* bmp );
    +
    2396
    +
    2397void retroflat_px(
    +
    2398 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2399 int16_t x, int16_t y, uint8_t flags );
    +
    2400
    + +
    2412 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2413 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
    +
    2414
    + +
    2426 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2427 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
    +
    2428
    + +
    2441 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2442 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags );
    +
    2443
    +
    2444void retroflat_cursor( struct RETROFLAT_BITMAP* target, uint8_t flags );
    +
    2445
    + +
    2459 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    2460 const char* font_str, size_t* w_out, size_t* h_out, uint8_t flags );
    +
    2461
    + +
    2480 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    2481 const char* str, int str_sz, const char* font_str, int16_t x_orig, int16_t y_orig,
    +
    2482 uint8_t flags );
    +
    2483
    +
    2484/* TODO: Documentation! */
    +
    2485void retroflat_get_palette( uint8_t idx, uint32_t* rgb );
    +
    2486
    +
    2487MERROR_RETVAL retroflat_set_palette( uint8_t idx, uint32_t rgb );
    +
    2488
    +
    2489 /* maug_retroflt_bitmap */
    +
    2490
    +
    2491void retroflat_set_proc_resize(
    +
    2492 retroflat_proc_resize_t on_resize_in, void* data_in );
    +
    2493
    +
    2494void retroflat_resize_v();
    +
    2495
    +
    2506RETROFLAT_IN_KEY retroflat_poll_input( struct RETROFLAT_INPUT* input );
    +
    2507
    +
    2508 /* maug_retroflt_input */
    +
    2509
    +
    2510#ifdef RETROFLT_C
    +
    2511
    +
    2512# if defined( RETROFLAT_API_ALLEGRO ) || defined( RETROFLAT_API_PC_BIOS )
    +
    2513static volatile retroflat_ms_t g_ms = 0;
    +
    2514# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_PC_BIOS */
    +
    2515MAUG_MHANDLE g_retroflat_state_h = (MAUG_MHANDLE)NULL;
    +
    2516struct RETROFLAT_STATE* g_retroflat_state = NULL;
    +
    2517
    +
    2518# define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    2519 MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u = idx;
    +
    2520
    +
    2521RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CONSTS )
    +
    2522
    +
    2523# define RETROFLAT_COLOR_TABLE_NAMES( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    2524 #name_u,
    +
    2525
    +
    2526MAUG_CONST char* SEG_MCONST gc_retroflat_color_names[] = {
    +
    2527 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_NAMES )
    +
    2528};
    +
    2529
    +
    2530# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    2531/* For now, these are set by WinMain(), so they need to be outside of the
    +
    2532 * state that's zeroed on init()!
    +
    2533 */
    +
    2534HINSTANCE g_retroflat_instance;
    +
    2535int g_retroflat_cmd_show;
    +
    2536
    +
    2537# ifdef RETROFLAT_WING
    +
    2538struct RETROFLAT_WING_MODULE g_w;
    +
    2539# endif /* RETROFLAT_WING */
    +
    2540# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2541
    +
    2542# include <stdio.h>
    +
    2543# include <stdlib.h>
    +
    2544# include <string.h>
    +
    2545
    +
    2546/* Callback table is down below, after the statically-defined callbacks. */
    +
    2547
    +
    2548/* === Function Definitions === */
    +
    2549
    +
    2550# if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES )) \
    +
    2551 && !defined( MAUG_NO_AUTO_C )
    +
    2552# define RETROFP_C
    +
    2553# include <retrofp.h>
    +
    2554# define RETROSFT_C
    +
    2555# include <retrosft.h>
    +
    2556# endif /* RETROFLAT_SOFT_SHAPES */
    +
    2557
    +
    2558# if defined( RETROFLAT_OPENGL ) && !defined( MAUG_NO_AUTO_C )
    +
    2559# define RETROGLU_C
    +
    2560# include <retroglu.h>
    +
    2561# define RETROFP_C
    +
    2562# include <retrofp.h>
    +
    2563# define RETROSFT_C
    +
    2564# include <retrosft.h>
    +
    2565# endif /* RETROFLAT_OPENGL */
    +
    2566
    +
    2567# if defined( RETROFLAT_VDP ) && defined( RETROFLAT_OS_UNIX )
    +
    2568# include <dlfcn.h>
    +
    2569# endif
    +
    2570
    +
    2571# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    2572
    +
    2573static LRESULT CALLBACK WndProc(
    +
    2574 HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
    +
    2575) {
    +
    2576# ifndef RETROFLAT_OPENGL
    +
    2577 PAINTSTRUCT ps;
    +
    2578 HDC hdc_paint = (HDC)NULL;
    +
    2579# endif /* !RETROFLAT_OPENGL */
    +
    2580# if defined( RETROFLAT_OPENGL )
    +
    2581 int pixel_fmt_int = 0;
    +
    2582 static PIXELFORMATDESCRIPTOR pixel_fmt = {
    +
    2583 sizeof( PIXELFORMATDESCRIPTOR ),
    +
    2584 1,
    +
    2585 PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,
    +
    2586 PFD_TYPE_RGBA,
    +
    2587 RETROFLAT_OPENGL_BPP,
    +
    2588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    +
    2589 16,
    +
    2590 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0
    +
    2591 };
    +
    2592# endif /* RETROFLAT_OPENGL */
    +
    2593
    +
    2594 switch( message ) {
    +
    2595 case WM_CREATE:
    +
    2596
    +
    2597 g_retroflat_state->hdc_win = GetDC( hWnd );
    +
    2598
    +
    2599# if defined( RETROFLAT_OPENGL )
    +
    2600
    +
    2601 pixel_fmt_int =
    +
    2602 ChoosePixelFormat( g_retroflat_state->hdc_win, &pixel_fmt );
    +
    2603 SetPixelFormat(
    +
    2604 g_retroflat_state->hdc_win, pixel_fmt_int, &pixel_fmt );
    +
    2605
    +
    2606 debug_printf( 1, "setting up OpenGL context..." );
    +
    2607
    +
    2608 g_retroflat_state->hrc_win =
    +
    2609 wglCreateContext( g_retroflat_state->hdc_win );
    +
    2610 if(
    +
    2611 FALSE == wglMakeCurrent( g_retroflat_state->hdc_win,
    +
    2612 g_retroflat_state->hrc_win )
    +
    2613 ) {
    + +
    2615 "Error", "Error creating OpenGL context: %d",
    +
    2616 GetLastError() );
    +
    2617 }
    +
    2618
    +
    2619# else
    +
    2620
    +
    2621 /* Setup the screen buffer. */
    +
    2622 if( !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    +
    2623 debug_printf( 1, "retroflat: creating window buffer (%d x %d)...",
    +
    2624 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    2625 /* Do this in its own function so a one-time setup isn't using stack
    +
    2626 * in our WndProc!
    +
    2627 */
    +
    2628 retroflat_create_bitmap(
    +
    2629 g_retroflat_state->screen_v_w,
    +
    2630 g_retroflat_state->screen_v_h,
    +
    2631 &(g_retroflat_state->buffer),
    + +
    2633 if( (HDC)NULL == g_retroflat_state->buffer.hdc_b ) {
    + +
    2635 "Error", "Could not determine buffer device context!" );
    +
    2636 g_retroflat_state->retval = RETROFLAT_ERROR_GRAPHICS;
    +
    2637 retroflat_quit( g_retroflat_state->retval );
    +
    2638 break;
    +
    2639 }
    +
    2640
    +
    2641 }
    +
    2642 if( !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    + +
    2644 "Error", "Could not create screen buffer!" );
    +
    2645 g_retroflat_state->retval = RETROFLAT_ERROR_GRAPHICS;
    +
    2646 retroflat_quit( g_retroflat_state->retval );
    +
    2647 break;
    +
    2648 }
    +
    2649
    +
    2650# endif /* RETROFLAT_OPENGL */
    +
    2651 break;
    +
    2652
    +
    2653 case WM_CLOSE:
    +
    2654# if defined( RETROFLAT_OPENGL )
    +
    2655 wglMakeCurrent( g_retroflat_state->hdc_win, NULL );
    +
    2656 wglDeleteContext( g_retroflat_state->hrc_win );
    +
    2657# endif /* RETROFLAT_OPENGL */
    +
    2658
    +
    2659 /* Quit on window close. */
    +
    2660 retroflat_quit( 0 );
    +
    2661 break;
    +
    2662
    +
    2663# if !defined( RETROFLAT_OPENGL )
    +
    2664 case WM_PAINT:
    +
    2665
    +
    2666 if( !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    +
    2667 error_printf( "screen buffer not ready!" );
    +
    2668 break;
    +
    2669 }
    +
    2670
    +
    2671 /* Create HDC for window to blit to. */
    +
    2672 /* maug_mzero( &ps, sizeof( PAINTSTRUCT ) ); */
    +
    2673 hdc_paint = BeginPaint( hWnd, &ps );
    +
    2674 if( (HDC)NULL == hdc_paint ) {
    + +
    2676 "Error", "Could not determine window device context!" );
    +
    2677 g_retroflat_state->retval = RETROFLAT_ERROR_GRAPHICS;
    +
    2678 retroflat_quit( g_retroflat_state->retval );
    +
    2679 break;
    +
    2680 }
    +
    2681
    +
    2682# if defined( RETROFLAT_VDP )
    +
    2683 retroflat_vdp_call( "retroflat_vdp_flip" );
    +
    2684# endif /* RETROFLAT_VDP */
    +
    2685
    +
    2686# ifdef RETROFLAT_WING
    +
    2687 if( (WinGStretchBlt_t)NULL != g_w.WinGStretchBlt ) {
    +
    2688 g_w.WinGStretchBlt(
    +
    2689 hdc_paint,
    +
    2690 0, 0,
    +
    2691 g_retroflat_state->screen_w, g_retroflat_state->screen_h,
    +
    2692 g_retroflat_state->buffer.hdc_b,
    +
    2693 0, 0,
    +
    2694 g_retroflat_state->screen_w,
    +
    2695 g_retroflat_state->screen_h
    +
    2696 );
    +
    2697# ifdef RETROFLAT_API_WIN32
    +
    2698 GdiFlush();
    +
    2699# endif /* RETROFLAT_API_WIN32 */
    +
    2700 } else {
    +
    2701# endif /* RETROFLAT_WING */
    +
    2702 StretchBlt(
    +
    2703 hdc_paint,
    +
    2704 0, 0,
    +
    2705 g_retroflat_state->screen_w, g_retroflat_state->screen_h,
    +
    2706 g_retroflat_state->buffer.hdc_b,
    +
    2707 0, 0,
    +
    2708 g_retroflat_state->screen_v_w,
    +
    2709 g_retroflat_state->screen_v_h,
    +
    2710 SRCCOPY
    +
    2711 );
    +
    2712# ifdef RETROFLAT_WING
    +
    2713 }
    +
    2714# endif /* RETROFLAT_WING */
    +
    2715
    +
    2716 DeleteDC( hdc_paint );
    +
    2717 EndPaint( hWnd, &ps );
    +
    2718 break;
    +
    2719
    +
    2720# endif /* !RETROFLAT_OPENGL */
    +
    2721
    +
    2722 case WM_ERASEBKGND:
    +
    2723 return 1;
    +
    2724
    +
    2725 case WM_KEYDOWN:
    +
    2726 switch( wParam ) {
    +
    2727 case VK_SHIFT:
    +
    2728 g_retroflat_state->vk_mods |= RETROFLAT_INPUT_MOD_SHIFT;
    +
    2729 break;
    +
    2730
    +
    2731 case VK_CONTROL:
    +
    2732 g_retroflat_state->vk_mods |= RETROFLAT_INPUT_MOD_CTRL;
    +
    2733 break;
    +
    2734
    +
    2735 /* TODO: Alt? */
    +
    2736
    +
    2737 default:
    +
    2738 debug_printf( RETROFLAT_KB_TRACE_LVL, "0x%x", lParam );
    +
    2739 g_retroflat_state->last_key = wParam | ((lParam & 0x800000) >> 8);
    +
    2740 break;
    +
    2741 }
    +
    2742 break;
    +
    2743
    +
    2744 case WM_KEYUP:
    +
    2745 switch( wParam ) {
    +
    2746 case VK_SHIFT:
    +
    2747 g_retroflat_state->vk_mods &= ~RETROFLAT_INPUT_MOD_SHIFT;
    +
    2748 break;
    +
    2749
    +
    2750 case VK_CONTROL:
    +
    2751 g_retroflat_state->vk_mods |= RETROFLAT_INPUT_MOD_CTRL;
    +
    2752 break;
    +
    2753
    +
    2754 /* TODO: Alt? */
    +
    2755
    +
    2756 }
    +
    2757 break;
    +
    2758
    +
    2759 case WM_LBUTTONDOWN:
    +
    2760 case WM_RBUTTONDOWN:
    +
    2761 g_retroflat_state->last_mouse = wParam;
    +
    2762 g_retroflat_state->last_mouse_x = GET_X_LPARAM( lParam );
    +
    2763 g_retroflat_state->last_mouse_y = GET_Y_LPARAM( lParam );
    +
    2764 break;
    +
    2765
    +
    2766 /* TODO: Handle resize message. */
    +
    2767
    +
    2768 case WM_DESTROY:
    +
    2769 if( retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ) {
    +
    2770 DeleteObject( g_retroflat_state->buffer.b );
    +
    2771 }
    +
    2772 PostQuitMessage( 0 );
    +
    2773 break;
    +
    2774
    +
    2775 case WM_SIZE:
    +
    2776 retroflat_on_resize( LOWORD( lParam ), HIWORD( lParam ) );
    +
    2777 if( NULL != g_retroflat_state->on_resize ) {
    +
    2778 g_retroflat_state->on_resize(
    +
    2779 LOWORD( lParam ), HIWORD( lParam ),
    +
    2780 g_retroflat_state->on_resize_data );
    +
    2781 }
    +
    2782 break;
    +
    2783
    +
    2784 case WM_TIMER:
    +
    2785 if(
    +
    2786# ifdef RETROFLAT_OPENGL
    +
    2787 (HGLRC)NULL == g_retroflat_state->hrc_win ||
    +
    2788# else
    +
    2789 !retroflat_bitmap_ok( &(g_retroflat_state->buffer) ) ||
    +
    2790# endif /* !RETROFLAT_OPENGL */
    +
    2791 hWnd != g_retroflat_state->window
    +
    2792 ) {
    +
    2793 /* Timer message was called prematurely. */
    +
    2794 break;
    +
    2795 }
    +
    2796
    +
    2797 if( RETROFLAT_WIN_FRAME_TIMER_ID == wParam ) {
    +
    2798 /* Frame timer has expired. */
    +
    2799 assert( NULL != g_retroflat_state->frame_iter );
    +
    2800 g_retroflat_state->frame_iter( g_retroflat_state->loop_data );
    +
    2801 } else if( RETROFLAT_WIN_LOOP_TIMER_ID == wParam ) {
    +
    2802 /* Loop/tick timer has expired. */
    +
    2803 assert( NULL != g_retroflat_state->loop_iter );
    +
    2804 g_retroflat_state->loop_iter( g_retroflat_state->loop_data );
    +
    2805 }
    +
    2806 break;
    +
    2807
    +
    2808 case WM_COMMAND:
    +
    2809 g_retroflat_state->last_idc = LOWORD( wParam );
    +
    2810 break;
    +
    2811
    +
    2812 default:
    +
    2813 return DefWindowProc( hWnd, message, wParam, lParam );
    +
    2814 }
    +
    2815
    +
    2816 return 0;
    +
    2817}
    +
    2818
    +
    2819LPSTR* retroflat_win_cli( LPSTR cmd_line, int* argc_out ) {
    +
    2820 LPSTR* argv_out = NULL;
    +
    2821 int i = 0,
    +
    2822 arg_iter = 0,
    +
    2823 arg_start = 0,
    +
    2824 arg_idx = 0,
    +
    2825 arg_longest = 10; /* Program name. */
    +
    2826 MERROR_RETVAL retval = MERROR_OK;
    +
    2827
    +
    2828 /* This uses calloc() to simplify things, since this works on Windows, the
    +
    2829 * only platform where this routine is used, anyway. */
    +
    2830
    +
    2831 debug_printf( 1, "retroflat: win cli: %s", cmd_line );
    +
    2832
    +
    2833 /* Get the number of args. */
    +
    2834 *argc_out = 1; /* Program name. */
    +
    2835 for( i = 0 ; '\0' != cmd_line[i - 1] ; i++ ) {
    +
    2836 if( ' ' != cmd_line[i] && '\0' != cmd_line[i] ) {
    +
    2837 arg_iter++;
    +
    2838 } else if( 0 < i ) {
    +
    2839 (*argc_out)++;
    +
    2840 if( arg_iter > arg_longest ) {
    +
    2841 /* This is the new longest arg. */
    +
    2842 arg_longest = arg_iter;
    +
    2843 }
    +
    2844 arg_iter = 0;
    +
    2845 }
    +
    2846 }
    +
    2847
    +
    2848 argv_out = calloc( *argc_out, sizeof( char* ) );
    +
    2849 maug_cleanup_if_null_alloc( char**, argv_out );
    +
    2850
    +
    2851 /* NULL program name. */
    +
    2852 argv_out[0] = calloc( 1, sizeof( char ) );
    +
    2853 maug_cleanup_if_null_alloc( char*, argv_out[0] );
    +
    2854
    +
    2855 /* Copy args into array. */
    +
    2856 arg_idx = 1;
    +
    2857 for( i = 0 ; '\0' != cmd_line[i - 1] ; i++ ) {
    +
    2858 if( ' ' != cmd_line[i] && '\0' != cmd_line[i] ) {
    +
    2859 /* If this isn't a WS char, it's an arg. */
    +
    2860 if( 0 < i && ' ' == cmd_line[i - 1] ) {
    +
    2861 /* If this is first non-WS char, it's start of a new arg. */
    +
    2862 arg_start = i;
    +
    2863 arg_iter = 0;
    +
    2864 }
    +
    2865 arg_iter++;
    +
    2866 continue;
    +
    2867 }
    +
    2868
    +
    2869 if( 0 < i && ' ' != cmd_line[i - 1] ) {
    +
    2870 /* If this is first WS char, it's the end of an arg. */
    +
    2871 assert( NULL == argv_out[arg_idx] );
    +
    2872 argv_out[arg_idx] = calloc( arg_iter + 1, sizeof( char ) );
    +
    2873 maug_cleanup_if_null_alloc( char*, argv_out[arg_idx] );
    +
    2874 strncpy( argv_out[arg_idx], &(cmd_line[arg_start]), arg_iter );
    +
    2875 arg_idx++; /* Start next arg. */
    +
    2876 arg_iter = 0; /* New arg is 0 long. */
    +
    2877 arg_start = i; /* New arg starts here (maybe). */
    +
    2878 }
    +
    2879 }
    +
    2880
    +
    2881cleanup:
    +
    2882
    +
    2883 if( MERROR_OK != retval && NULL != argv_out ) {
    +
    2884 for( i = 0 ; *argc_out > i ; i++ ) {
    +
    2885 free( argv_out[i] );
    +
    2886 argv_out[i] = NULL;
    +
    2887 }
    +
    2888 free( argv_out );
    +
    2889 argv_out = NULL;
    +
    2890 }
    +
    2891
    +
    2892 return argv_out;
    +
    2893}
    +
    2894
    +
    2895# elif defined( RETROFLAT_API_GLUT )
    +
    2896
    +
    2897#ifdef RETROFLAT_OS_OS2
    +
    2898void APIENTRY
    +
    2899#else
    +
    2900void
    +
    2901#endif /* RETROFLAT_OS_OS2 */
    +
    2902retroflat_glut_display( void ) {
    +
    2903 /* TODO: Work in frame_iter if provided. */
    +
    2904 if( NULL != g_retroflat_state->loop_iter ) {
    +
    2905 g_retroflat_state->loop_iter( g_retroflat_state->loop_data );
    +
    2906 }
    +
    2907 if( NULL != g_retroflat_state->frame_iter ) {
    +
    2908 g_retroflat_state->frame_iter( g_retroflat_state->loop_data );
    +
    2909 }
    +
    2910}
    +
    2911
    +
    2912#ifdef RETROFLAT_OS_OS2
    +
    2913void APIENTRY
    +
    2914#else
    +
    2915void
    +
    2916#endif /* RETROFLAT_OS_OS2 */
    +
    2917retroflat_glut_idle( void ) {
    +
    2918 uint32_t now = 0;
    +
    2919
    +
    2920 now = retroflat_get_ms();
    +
    2921 if(
    + +
    2923 (RETROFLAT_FLAGS_UNLOCK_FPS & g_retroflat_state->retroflat_flags) &&
    +
    2924 now < g_retroflat_state->retroflat_next
    +
    2925 ) {
    +
    2926 return;
    +
    2927 }
    +
    2928
    +
    2929 glutPostRedisplay();
    +
    2930
    +
    2931 if( now + retroflat_fps_next() > now ) {
    +
    2932 g_retroflat_state->retroflat_next = now + retroflat_fps_next();
    +
    2933 } else {
    +
    2934 /* Rollover protection. */
    +
    2935 g_retroflat_state->retroflat_next = 0;
    +
    2936 }
    +
    2937}
    +
    2938
    +
    2939# ifdef RETROFLAT_OS_OS2
    +
    2940void APIENTRY
    +
    2941# elif defined( RETROFLAT_OS_WIN )
    +
    2942void
    +
    2943# else
    +
    2944void
    +
    2945# endif /* RETROFLAT_OS_OS2 */
    +
    2946retroflat_glut_key( unsigned char key, int x, int y ) {
    +
    2947# ifdef RETROFLAT_OS_WIN
    +
    2948 /* key -= 109; */
    +
    2949# endif /* RETROFLAT_OS_WIN */
    +
    2950 debug_printf( 0, "key: %c (0x%02x)", key, key );
    +
    2951 g_retroflat_state->retroflat_last_key = key;
    +
    2952}
    +
    2953
    +
    2954# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    2955
    +
    2956/* Still inside RETROFLT_C! */
    +
    2957
    +
    2958/* === */
    +
    2959
    +
    2960int retroflat_loop(
    +
    2961 retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void* data
    +
    2962) {
    +
    2963 int retval = 0;
    +
    2964
    +
    2965# if defined( RETROFLAT_OS_WASM )
    +
    2966
    +
    2967 /* TODO: Work in frame_iter if provided. */
    +
    2968 emscripten_cancel_main_loop();
    +
    2969 emscripten_set_main_loop_arg( frame_iter, data, 0, 0 );
    +
    2970
    +
    2971# elif defined( RETROFLAT_API_ALLEGRO ) || \
    +
    2972 defined( RETROFLAT_API_SDL1 ) || \
    +
    2973 defined( RETROFLAT_API_SDL2 ) || \
    +
    2974 defined( RETROFLAT_API_LIBNDS ) || \
    +
    2975 defined( RETROFLAT_API_PC_BIOS )
    +
    2976
    +
    2977 retroflat_ms_t next = 0,
    +
    2978 now = 0;
    +
    2979
    +
    2980 g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_RUNNING;
    +
    2981 do {
    +
    2982 if(
    + +
    2984 (RETROFLAT_FLAGS_UNLOCK_FPS & g_retroflat_state->retroflat_flags) &&
    +
    2985 retroflat_get_ms() < next
    +
    2986 ) {
    +
    2987 /* Sleep/low power for a bit. */
    +
    2988# ifdef RETROFLAT_API_LIBNDS
    +
    2989 swiWaitForVBlank();
    +
    2990# endif /* RETROFLAT_API_LIBNDS */
    +
    2991 if( NULL != loop_iter ) {
    +
    2992 /* Run the loop iter as many times as possible. */
    +
    2993 loop_iter( data );
    +
    2994 }
    +
    2995 continue;
    +
    2996 }
    +
    2997 if( NULL != frame_iter ) {
    +
    2998 /* Run the frame iterator once per FPS tick. */
    +
    2999 frame_iter( data );
    +
    3000 }
    +
    3001 now = retroflat_get_ms();
    +
    3002 if( now + retroflat_fps_next() > now ) {
    +
    3003 next = now + retroflat_fps_next();
    +
    3004 } else {
    +
    3005 /* Rollover protection. */
    +
    3006 /* TODO: Add difference from now/next to 0 here. */
    +
    3007 next = 0;
    +
    3008 }
    +
    3009 } while(
    + +
    3011 (RETROFLAT_FLAGS_RUNNING & g_retroflat_state->retroflat_flags)
    +
    3012 );
    +
    3013 retval = g_retroflat_state->retval;
    +
    3014
    +
    3015# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3016 int msg_retval = 0;
    +
    3017 MSG msg;
    +
    3018
    +
    3019 /* Set these to be called from WndProc later. */
    +
    3020 g_retroflat_state->loop_iter = (retroflat_loop_iter)loop_iter;
    +
    3021 g_retroflat_state->loop_data = (void*)data;
    +
    3022 g_retroflat_state->frame_iter = (retroflat_loop_iter)frame_iter;
    +
    3023
    +
    3024 if( NULL != frame_iter ) {
    +
    3025 debug_printf( 3, "setting up frame timer %u every %d ms...",
    + +
    3027 if( !SetTimer(
    +
    3028 g_retroflat_state->window, RETROFLAT_WIN_FRAME_TIMER_ID,
    +
    3029 (int)(1000 / RETROFLAT_FPS), NULL )
    +
    3030 ) {
    + +
    3032 "Error", "Could not create frame timer!" );
    +
    3033 retval = RETROFLAT_ERROR_TIMER;
    +
    3034 goto cleanup;
    +
    3035 }
    +
    3036 }
    +
    3037
    +
    3038 if( NULL != loop_iter ) {
    +
    3039 debug_printf( 3, "setting up loop timer %u every 1 ms...",
    + +
    3041 if( !SetTimer(
    +
    3042 g_retroflat_state->window, RETROFLAT_WIN_LOOP_TIMER_ID, 1, NULL )
    +
    3043 ) {
    + +
    3045 "Error", "Could not create loop timer!" );
    +
    3046 retval = RETROFLAT_ERROR_TIMER;
    +
    3047 goto cleanup;
    +
    3048 }
    +
    3049 }
    +
    3050
    +
    3051 /* TODO: loop_iter is artificially slow on Windows! */
    +
    3052
    +
    3053 /* Handle Windows messages until quit. */
    +
    3054 do {
    +
    3055 msg_retval = GetMessage( &msg, 0, 0, 0 );
    +
    3056 TranslateMessage( &msg );
    +
    3057 DispatchMessage( &msg );
    +
    3058 if( WM_QUIT == msg.message ) {
    +
    3059 /* Get retval from PostQuitMessage(). */
    +
    3060 retval = msg.wParam;
    +
    3061 }
    +
    3062 } while( WM_QUIT != msg.message && 0 < msg_retval );
    +
    3063
    +
    3064cleanup:
    +
    3065# elif defined( RETROFLAT_API_GLUT )
    +
    3066
    +
    3067 g_retroflat_state->loop_iter = (retroflat_loop_iter)loop_iter;
    +
    3068 g_retroflat_state->loop_data = (void*)data;
    +
    3069 g_retroflat_state->frame_iter = (retroflat_loop_iter)frame_iter;
    +
    3070 glutMainLoop();
    +
    3071 retval = g_retroflat_state->retval;
    +
    3072
    +
    3073# else
    +
    3074# pragma message( "warning: loop not implemented" )
    +
    3075# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3076
    +
    3077 /* This should be set by retroflat_quit(). */
    +
    3078 return retval;
    +
    3079}
    +
    3080
    +
    3081/* === */
    +
    3082
    +
    3083# if !defined( RETROFLAT_NO_KEYBOARD )
    +
    3084
    +
    3085char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags ) {
    +
    3086 char c = 0;
    +
    3087 char offset_lower = 0;
    +
    3088
    +
    3089 if( RETROFLAT_INPUT_MOD_SHIFT != (RETROFLAT_INPUT_MOD_SHIFT & flags) ) {
    +
    3090 /* Shift is *not* being held down. */
    +
    3091
    +
    3092 if( RETROFLAT_KEY_A <= k && RETROFLAT_KEY_Z >= k ) {
    +
    3093 if(
    +
    3094 RETROFLAT_INPUT_FORCE_UPPER !=
    +
    3095 (RETROFLAT_INPUT_FORCE_UPPER & flags)
    +
    3096 ) {
    +
    3097 /* Key is alphabetical and we're not forcing uppercase. */
    +
    3098 offset_lower = 0x20;
    +
    3099 }
    +
    3100 } else {
    +
    3101 offset_lower = 1;
    +
    3102 }
    +
    3103 }
    +
    3104
    +
    3105 switch( k ) {
    +
    3106 case RETROFLAT_KEY_A: c = 0x41 + offset_lower; break;
    +
    3107 case RETROFLAT_KEY_B: c = 0x42 + offset_lower; break;
    +
    3108 case RETROFLAT_KEY_C: c = 0x43 + offset_lower; break;
    +
    3109 case RETROFLAT_KEY_D: c = 0x44 + offset_lower; break;
    +
    3110 case RETROFLAT_KEY_E: c = 0x45 + offset_lower; break;
    +
    3111 case RETROFLAT_KEY_F: c = 0x46 + offset_lower; break;
    +
    3112 case RETROFLAT_KEY_G: c = 0x47 + offset_lower; break;
    +
    3113 case RETROFLAT_KEY_H: c = 0x48 + offset_lower; break;
    +
    3114 case RETROFLAT_KEY_I: c = 0x49 + offset_lower; break;
    +
    3115 case RETROFLAT_KEY_J: c = 0x4a + offset_lower; break;
    +
    3116 case RETROFLAT_KEY_K: c = 0x4b + offset_lower; break;
    +
    3117 case RETROFLAT_KEY_L: c = 0x4c + offset_lower; break;
    +
    3118 case RETROFLAT_KEY_M: c = 0x4d + offset_lower; break;
    +
    3119 case RETROFLAT_KEY_N: c = 0x4e + offset_lower; break;
    +
    3120 case RETROFLAT_KEY_O: c = 0x4f + offset_lower; break;
    +
    3121 case RETROFLAT_KEY_P: c = 0x50 + offset_lower; break;
    +
    3122 case RETROFLAT_KEY_Q: c = 0x51 + offset_lower; break;
    +
    3123 case RETROFLAT_KEY_R: c = 0x52 + offset_lower; break;
    +
    3124 case RETROFLAT_KEY_S: c = 0x53 + offset_lower; break;
    +
    3125 case RETROFLAT_KEY_T: c = 0x54 + offset_lower; break;
    +
    3126 case RETROFLAT_KEY_U: c = 0x55 + offset_lower; break;
    +
    3127 case RETROFLAT_KEY_V: c = 0x56 + offset_lower; break;
    +
    3128 case RETROFLAT_KEY_W: c = 0x57 + offset_lower; break;
    +
    3129 case RETROFLAT_KEY_X: c = 0x58 + offset_lower; break;
    +
    3130 case RETROFLAT_KEY_Y: c = 0x59 + offset_lower; break;
    +
    3131 case RETROFLAT_KEY_Z: c = 0x60 + offset_lower; break;
    +
    3132 case RETROFLAT_KEY_0: c = offset_lower ? 0x30 : ')'; break;
    +
    3133 case RETROFLAT_KEY_1: c = offset_lower ? 0x31 : '!'; break;
    +
    3134 case RETROFLAT_KEY_2: c = offset_lower ? 0x32 : '@'; break;
    +
    3135 case RETROFLAT_KEY_3: c = offset_lower ? 0x33 : '#'; break;
    +
    3136 case RETROFLAT_KEY_4: c = offset_lower ? 0x34 : '$'; break;
    +
    3137 case RETROFLAT_KEY_5: c = offset_lower ? 0x35 : '%'; break;
    +
    3138 case RETROFLAT_KEY_6: c = offset_lower ? 0x36 : '^'; break;
    +
    3139 case RETROFLAT_KEY_7: c = offset_lower ? 0x37 : '&'; break;
    +
    3140 case RETROFLAT_KEY_8: c = offset_lower ? 0x38 : '*'; break;
    +
    3141 case RETROFLAT_KEY_9: c = offset_lower ? 0x39 : '('; break;
    +
    3142 case RETROFLAT_KEY_SPACE: c = ' '; break;
    +
    3143 case RETROFLAT_KEY_BKSP: c = 0x08; break;
    +
    3144 case RETROFLAT_KEY_ENTER: c = '\n'; break;
    +
    3145 case RETROFLAT_KEY_SEMICOLON: c = offset_lower ? ';' : ':'; break;
    +
    3146 case RETROFLAT_KEY_DASH: c = offset_lower ? '-' : '_'; break;
    +
    3147 case RETROFLAT_KEY_SLASH: c = offset_lower ? '/' : '?'; break;
    +
    3148 case RETROFLAT_KEY_PERIOD: c = offset_lower ? '.' : '>'; break;
    +
    3149 case RETROFLAT_KEY_COMMA: c = offset_lower ? ',' : '<'; break;
    +
    3150 case RETROFLAT_KEY_QUOTE: c = offset_lower ? '\'' : '"'; break;
    +
    3151 case RETROFLAT_KEY_EQUALS: c = offset_lower ? '=' : '+'; break;
    +
    3152 case RETROFLAT_KEY_BACKSLASH: c = offset_lower ? '\\' : '|'; break;
    +
    3153 case RETROFLAT_KEY_BRACKETL: c = offset_lower ? '[' : '{'; break;
    +
    3154 case RETROFLAT_KEY_BRACKETR: c = offset_lower ? ']' : '}'; break;
    +
    3155#ifndef RETROFLAT_API_PC_BIOS
    +
    3156 /* TODO: FIXME in DOS! */
    +
    3157 case RETROFLAT_KEY_GRAVE: c = offset_lower ? '`' : '~'; break;
    +
    3158#endif /* !RETROFLAT_API_PC_BIOS */
    +
    3159 }
    +
    3160
    +
    3161 debug_printf( RETROFLAT_KB_TRACE_LVL, "0x%02x", c );
    +
    3162
    +
    3163 return c;
    +
    3164}
    +
    3165
    +
    3166#endif /* !RETROFLAT_NO_KEYBOARD */
    +
    3167
    +
    3168/* === */
    +
    3169
    + +
    3171 uint8_t flags, const char* title, const char* format, ...
    +
    3172) {
    +
    3173 char msg_out[RETROFLAT_MSG_MAX + 1];
    +
    3174 va_list vargs;
    +
    3175# ifdef RETROFLAT_API_SDL2
    +
    3176 uint32_t sdl_msg_flags = 0;
    +
    3177# elif (defined( RETROFLAT_API_SDL1 ) && defined( RETROFLAT_OS_WIN )) || \
    +
    3178 (defined( RETROFLAT_API_GLUT) && defined( RETROFLAT_OS_WIN )) || \
    +
    3179 defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3180 uint32_t win_msg_flags = 0;
    +
    3181# endif
    +
    3182
    +
    3183 memset( msg_out, '\0', RETROFLAT_MSG_MAX + 1 );
    +
    3184 va_start( vargs, format );
    +
    3185 maug_vsnprintf( msg_out, RETROFLAT_MSG_MAX, format, vargs );
    +
    3186
    +
    3187# if defined( RETROFLAT_API_ALLEGRO )
    +
    3188 allegro_message( "%s", msg_out );
    +
    3189# elif defined( RETROFLAT_API_SDL2 )
    +
    3190 switch( (flags & RETROFLAT_MSG_FLAG_TYPE_MASK) ) {
    + +
    3192 sdl_msg_flags = SDL_MESSAGEBOX_ERROR;
    +
    3193 break;
    +
    3194
    + +
    3196 sdl_msg_flags = SDL_MESSAGEBOX_INFORMATION;
    +
    3197 break;
    +
    3198
    + +
    3200 sdl_msg_flags = SDL_MESSAGEBOX_WARNING;
    +
    3201 break;
    +
    3202 }
    +
    3203
    +
    3204 SDL_ShowSimpleMessageBox(
    +
    3205 sdl_msg_flags, title, msg_out, g_retroflat_state->window );
    +
    3206# elif (defined( RETROFLAT_API_SDL1 ) && defined( RETROFLAT_OS_WIN )) || \
    +
    3207 (defined( RETROFLAT_API_GLUT) && defined( RETROFLAT_OS_WIN )) || \
    +
    3208 defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3209 switch( (flags & RETROFLAT_MSG_FLAG_TYPE_MASK) ) {
    + +
    3211 win_msg_flags |= MB_ICONSTOP;
    +
    3212 break;
    +
    3213
    + +
    3215 win_msg_flags |= MB_ICONINFORMATION;
    +
    3216 break;
    +
    3217
    + +
    3219 win_msg_flags |= MB_ICONEXCLAMATION;
    +
    3220 break;
    +
    3221 }
    +
    3222
    +
    3223 MessageBox( retroflat_root_win(), msg_out, title, win_msg_flags );
    +
    3224# elif (defined( RETROFLAT_API_SDL1 ) && defined( RETROFLAT_OS_UNIX )) || \
    +
    3225 (defined( RETROFLAT_API_GLUT) && defined( RETROFLAT_OS_UNIX ))
    +
    3226
    +
    3227 /* TODO */
    +
    3228 error_printf( "%s", msg_out );
    +
    3229
    +
    3230# elif defined( RETROFLAT_API_PC_BIOS )
    +
    3231
    +
    3232 /* TODO: Display error somehow. */
    +
    3233 error_printf( "%s", msg_out );
    +
    3234
    +
    3235# else
    +
    3236# pragma message( "warning: not implemented" )
    +
    3237# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3238
    +
    3239 va_end( vargs );
    +
    3240}
    +
    3241
    +
    3242# ifndef RETROFLAT_NO_CLI
    +
    3243
    +
    3244# ifdef RETROSND_ARGS
    +
    3245
    +
    3246static int retrosnd_cli_rsl( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3247 if( 0 == strncmp( MAUG_CLI_SIGIL "rsl", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3248 args->snd_flags |= RETROSND_ARGS_FLAG_LIST_DEVS;
    +
    3249 }
    +
    3250 return RETROFLAT_OK;
    +
    3251}
    +
    3252
    +
    3253static int retrosnd_cli_rsd( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3254 if( 0 == strncmp( MAUG_CLI_SIGIL "rsd", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3255 /* The next arg must be the new var. */
    +
    3256 } else {
    +
    3257# ifdef RETROSND_API_PC_BIOS
    +
    3258 /* TODO: Parse device. */
    +
    3259# elif defined( RETROSND_API_ALSA )
    +
    3260 /* TODO: Parse device. */
    +
    3261# elif defined( RETROSND_API_WINMM )
    +
    3262 debug_printf( 3, "setting MIDI device to rsd arg: %s", arg );
    +
    3263 args->snd_dev_id = atoi( arg );
    +
    3264# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    3265 }
    +
    3266 return RETROFLAT_OK;
    +
    3267}
    +
    3268
    +
    3269static int retrosnd_cli_rsd_def(
    +
    3270 const char* arg, struct RETROFLAT_ARGS* args
    +
    3271) {
    +
    3272 char* env_var = NULL;
    +
    3273 MERROR_RETVAL retval = MERROR_OK;
    +
    3274# if defined( RETROSND_API_PC_BIOS ) || defined( RETROSND_API_ALSA )
    +
    3275 size_t i = 0;
    +
    3276# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA */
    +
    3277
    +
    3278# ifdef RETROSND_API_PC_BIOS
    +
    3279 if( NULL != env_var ) {
    +
    3280 env_var = getenv( "MAUG_MIDI_DOS" );
    +
    3281
    +
    3282 /* Return MERROR_OK since this isn't fatal and will just cause sound
    +
    3283 * init to fail later.
    +
    3284 */
    +
    3285 maug_cleanup_if_null_msg(
    +
    3286 char*, env_var, MERROR_OK, "MAUG_MIDI_DOS variable not found!" );
    +
    3287
    +
    3288 debug_printf( 2, "env: MAUG_MIDI_DOS: %s", env_var );
    +
    3289
    +
    3290 /* Turn comma separator into NULL split. */
    +
    3291 for( i = 0 ; strlen( env_var ) > i ; i++ ) {
    +
    3292 if( ',' == env_var[i] ) {
    +
    3293 /* Split into two null-terminated strings. */
    +
    3294 env_var[i] = '\0';
    +
    3295 }
    +
    3296 }
    +
    3297
    +
    3298 if( 0 == strcmp( env_var, "mpu" ) ) {
    +
    3299 debug_printf( 3, "selecting MIDI driver: mpu" );
    +
    3300 args->snd_driver = 2;
    +
    3301 } else if( 0 == strcmp( env_var, "gus" ) ) {
    +
    3302 debug_printf( 3, "selecting MIDI driver: gus" );
    +
    3303 args->snd_driver = 4;
    +
    3304 } else if( 0 == strcmp( env_var, "adlib" ) ) {
    +
    3305 debug_printf( 3, "selecting MIDI driver: adlib" );
    +
    3306 args->snd_driver = 8;
    +
    3307 }
    +
    3308 /* TODO: Maug replacement for C99 crutch. */
    +
    3309 args->snd_io_base = strtoul( &(env_var[i]), NULL, 16 );
    +
    3310 debug_printf( 3, "setting MIDI I/O base: %u", args->snd_io_base );
    +
    3311 } else {
    +
    3312 /* default */
    +
    3313 debug_printf( 3, "default MIDI driver: adlib" );
    +
    3314 args->snd_driver = 8;
    +
    3315 args->snd_io_base = 0x388;
    +
    3316 }
    +
    3317# elif defined( RETROSND_API_ALSA )
    +
    3318 if( 0 == args->snd_client ) {
    +
    3319 env_var = getenv( "MAUG_MIDI_ALSA" );
    +
    3320
    +
    3321 /* Return MERROR_OK since this isn't fatal and will just cause sound
    +
    3322 * init to fail later.
    +
    3323 */
    +
    3324 maug_cleanup_if_null_msg(
    +
    3325 char*, env_var, MERROR_OK, "MAUG_MIDI_ALSA variable not found!" );
    +
    3326
    +
    3327 debug_printf( 2, "env: MAUG_MIDI_ALSA: %s", env_var );
    +
    3328
    +
    3329 for( i = 0 ; strlen( env_var ) > i ; i++ ) {
    +
    3330 if( ':' == env_var[i] ) {
    +
    3331 /* Split into two null-terminated strings. */
    +
    3332 env_var[i] = '\0';
    +
    3333 }
    +
    3334 }
    +
    3335
    +
    3336 args->snd_client = atoi( env_var );
    +
    3337 args->snd_port = atoi( &(env_var[i]) );
    +
    3338 debug_printf( 3, "setting MIDI device to: %u:%u",
    +
    3339 args->snd_client, args->snd_port );
    +
    3340 }
    +
    3341
    +
    3342# elif defined( RETROSND_API_WINMM )
    +
    3343 env_var = getenv( "MAUG_MIDI_WIN" );
    +
    3344
    +
    3345 /* Return MERROR_OK since this isn't fatal and will just cause sound
    +
    3346 * init to fail later.
    +
    3347 */
    +
    3348 maug_cleanup_if_null_msg(
    +
    3349 char*, env_var, MERROR_OK, "MAUG_MIDI_WIN variable not found!" );
    +
    3350
    +
    3351 debug_printf( 2, "env: MAUG_MIDI_WIN: %s", env_var );
    +
    3352
    +
    3353 if( NULL != env_var ) {
    +
    3354 args->snd_dev_id = atoi( env_var );
    +
    3355 } else {
    +
    3356 args->snd_dev_id = 0;
    +
    3357 }
    +
    3358 debug_printf( 3, "setting MIDI device to: %u", args->snd_dev_id );
    +
    3359# endif /* RETROSND_API_PC_BIOS || RETROSND_API_ALSA || RETROSND_API_WINMM */
    +
    3360
    +
    3361cleanup:
    +
    3362 return retval;
    +
    3363}
    +
    3364
    +
    3365# endif /* RETROSND_ARGS */
    +
    3366
    +
    3367# ifdef RETROFLAT_SCREENSAVER
    +
    3368
    +
    3369/* Windows screensaver (.scr) command-line arguments. */
    +
    3370
    +
    3371static int retroflat_cli_p( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3372#ifdef __WIN64__
    +
    3373 /* 64-bit Windows has 64-bit pointers! */
    +
    3374 intptr_t hwnd_long = 0;
    +
    3375#else
    +
    3376 long hwnd_long = 0;
    +
    3377#endif /* __GNUC__ */
    +
    3378 if( 0 == strncmp( MAUG_CLI_SIGIL "p", arg, MAUG_CLI_SIGIL_SZ + 2 ) ) {
    +
    3379 /* The next arg must be the new var. */
    +
    3380 } else {
    +
    3381#ifdef __WIN64__
    +
    3382 hwnd_long = atoll( arg );
    +
    3383#else
    +
    3384 hwnd_long = atol( arg );
    +
    3385#endif /* __GNUC__ */
    +
    3386 g_retroflat_state->parent = (HWND)hwnd_long;
    +
    3387 }
    +
    3388 return RETROFLAT_OK;
    +
    3389}
    +
    3390
    +
    3391static int retroflat_cli_s( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3392 debug_printf( 3, "using screensaver mode..." );
    +
    3393 args->flags |= RETROFLAT_FLAGS_SCREENSAVER;
    +
    3394 return RETROFLAT_OK;
    +
    3395}
    +
    3396
    +
    3397# endif /* RETROFLAT_SCREENSAVER */
    +
    3398
    +
    3399# ifdef RETROFLAT_API_PC_BIOS
    +
    3400
    +
    3401static int retroflat_cli_rfm( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3402 if( 0 == strncmp( MAUG_CLI_SIGIL "rfm", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3403 /* The next arg must be the new var. */
    +
    3404 } else {
    +
    3405 args->screen_mode = atoi( arg );
    +
    3406 debug_printf( 3, "choosing screen mode: %u", args->screen_mode );
    +
    3407 }
    +
    3408 return RETROFLAT_OK;
    +
    3409}
    +
    3410
    +
    3411static int retroflat_cli_rfm_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3412 if( 0 == args->screen_mode ) {
    +
    3413 /* TODO: Autodetect best available? */
    +
    3414 args->screen_mode = RETROFLAT_SCREEN_MODE_VGA;
    +
    3415 }
    +
    3416 return RETROFLAT_OK;
    +
    3417}
    +
    3418
    +
    3419# elif !defined( RETROFLAT_NO_CLI_SZ )
    +
    3420
    +
    3421static int retroflat_cli_rfx( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3422 if( 0 == strncmp( MAUG_CLI_SIGIL "rfx", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3423 /* The next arg must be the new var. */
    +
    3424 } else {
    +
    3425 args->screen_x = atoi( arg );
    +
    3426 }
    +
    3427 return RETROFLAT_OK;
    +
    3428}
    +
    3429
    +
    3430static int retroflat_cli_rfx_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3431 if( 0 == args->screen_w ) {
    +
    3432 args->screen_x = 0;
    +
    3433 }
    +
    3434 return RETROFLAT_OK;
    +
    3435}
    +
    3436
    +
    3437static int retroflat_cli_rfy( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3438 if( 0 == strncmp( MAUG_CLI_SIGIL "rfy", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3439 /* The next arg must be the new var. */
    +
    3440 } else {
    +
    3441 args->screen_y = atoi( arg );
    +
    3442 }
    +
    3443 return RETROFLAT_OK;
    +
    3444}
    +
    3445
    +
    3446static int retroflat_cli_rfy_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3447 if( 0 == args->screen_h ) {
    +
    3448 args->screen_y = 0;
    +
    3449 }
    +
    3450 return RETROFLAT_OK;
    +
    3451}
    +
    3452
    +
    3453static void retroflat_cli_apply_scale( struct RETROFLAT_ARGS* args ) {
    +
    3454#if defined( RETROFLAT_API_SDL2 )
    +
    3455 /*
    +
    3456 if(
    +
    3457 RETROFLAT_FLAGS_SCALE2X == (RETROFLAT_FLAGS_SCALE2X & args->flags)
    +
    3458 ) {
    +
    3459 args->screen_w *= 2;
    +
    3460 debug_printf( 1, "doubling screen_w to: %d", args->screen_w );
    +
    3461 args->screen_h *= 2;
    +
    3462 debug_printf( 1, "doubling screen_h to: %d", args->screen_h );
    +
    3463 }
    +
    3464 */
    +
    3465#endif /* RETROFLAT_API_SDL2 */
    +
    3466}
    +
    3467
    +
    3468static int retroflat_cli_rfw( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3469 if( 0 == strncmp( MAUG_CLI_SIGIL "rfw", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3470 /* The next arg must be the new var. */
    +
    3471 } else {
    +
    3472 args->screen_w = atoi( arg );
    +
    3473 retroflat_cli_apply_scale( args );
    +
    3474 }
    +
    3475 return RETROFLAT_OK;
    +
    3476}
    +
    3477
    +
    3478static int retroflat_cli_rfw_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3479 if( 0 == args->screen_w ) {
    +
    3480 args->screen_w = RETROFLAT_DEFAULT_SCREEN_W;
    +
    3481 }
    +
    3482 retroflat_cli_apply_scale( args );
    +
    3483 return RETROFLAT_OK;
    +
    3484}
    +
    3485
    +
    3486static int retroflat_cli_rfh( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3487 if( 0 == strncmp( MAUG_CLI_SIGIL "rfh", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3488 /* The next arg must be the new var. */
    +
    3489 } else {
    +
    3490 args->screen_h = atoi( arg );
    +
    3491 retroflat_cli_apply_scale( args );
    +
    3492 }
    +
    3493 return RETROFLAT_OK;
    +
    3494}
    +
    3495
    +
    3496static int retroflat_cli_rfh_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3497 if( 0 == args->screen_h ) {
    +
    3498 args->screen_h = RETROFLAT_DEFAULT_SCREEN_H;
    +
    3499 }
    +
    3500 retroflat_cli_apply_scale( args );
    +
    3501 return RETROFLAT_OK;
    +
    3502}
    +
    3503
    +
    3504# endif /* RETROFLAT_API_PC_BIOS || !RETROFLAT_NO_CLI_SZ */
    +
    3505
    +
    3506# ifdef RETROFLAT_VDP
    +
    3507static int retroflat_cli_vdp( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3508 if( 0 == strncmp( MAUG_CLI_SIGIL "vdp", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3509 /* Next arg is VDP args str. */
    +
    3510 } else {
    +
    3511 strncpy( g_retroflat_state->vdp_args, arg, RETROFLAT_VDP_ARGS_SZ_MAX );
    +
    3512 debug_printf( 1, "VDP args: %s", g_retroflat_state->vdp_args );
    +
    3513 }
    +
    3514 return RETROFLAT_OK;
    +
    3515}
    +
    3516# endif /* RETROFLAT_VDP */
    +
    3517
    +
    3518static int retroflat_cli_u( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3519 if( 0 == strncmp( MAUG_CLI_SIGIL "rfu", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
    +
    3520 debug_printf( 1, "unlocking FPS..." );
    +
    3521 args->flags |= RETROFLAT_FLAGS_UNLOCK_FPS;
    +
    3522 }
    +
    3523 return RETROFLAT_OK;
    +
    3524}
    +
    3525
    +
    3526static int retroflat_cli_u_def( const char* arg, struct RETROFLAT_ARGS* args ) {
    +
    3527 args->flags &= ~RETROFLAT_FLAGS_UNLOCK_FPS;
    +
    3528 return RETROFLAT_OK;
    +
    3529}
    +
    3530
    +
    3531#endif /* !RETROFLAT_NO_CLI */
    +
    3532
    +
    3533/* === */
    +
    3534
    +
    3535# ifdef RETROFLAT_API_ALLEGRO
    +
    3536
    +
    3537/* Allegro-specific callbacks for init, below. */
    +
    3538
    +
    3539void retroflat_on_ms_tick() {
    +
    3540 if( NULL == g_retroflat_state ) {
    +
    3541 debug_printf( 1, "no state!" );
    +
    3542 } else {
    +
    3543 g_ms++;
    +
    3544 }
    +
    3545}
    +
    3546
    +
    3547void retroflat_on_close_button() {
    +
    3548 g_retroflat_state->close_button = 1;
    +
    3549}
    +
    3550END_OF_FUNCTION( retroflat_on_close_button )
    +
    3551
    +
    3552# endif /* RETROFLAT_API_ALLEGRO */
    +
    3553
    +
    3554/* === */
    +
    3555
    +
    3556# ifdef RETROFLAT_API_PC_BIOS
    +
    3557
    +
    3558void __interrupt __far retroflat_timer_handler() {
    +
    3559 static unsigned long count = 0;
    +
    3560
    +
    3561 ++g_ms;
    +
    3562 count += RETROFLAT_DOS_TIMER_DIV; /* Original DOS timer in parallel. */
    +
    3563 if( 65536 <= count ) {
    +
    3564 /* Call the original handler. */
    +
    3565 count -= 65536;
    +
    3566 _chain_intr( g_retroflat_state->old_timer_interrupt );
    +
    3567 } else {
    +
    3568 /* Acknowledge interrupt */
    +
    3569 outp( 0x20, 0x20 );
    +
    3570 }
    +
    3571}
    +
    3572
    +
    3573# endif /* RETROFLAT_API_PC_BIOS */
    +
    3574
    +
    3575/* === */
    +
    3576
    +
    3577/* Still inside RETROFLT_C! */
    +
    3578
    +
    3579int retroflat_init( int argc, char* argv[], struct RETROFLAT_ARGS* args ) {
    +
    3580
    +
    3581 /* = Declare Init Vars = */
    +
    3582
    +
    3583 int retval = 0;
    +
    3584# if defined( RETROFLAT_API_ALLEGRO ) && defined( RETROFLAT_OS_DOS )
    +
    3585# if 0
    +
    3586 union REGS regs;
    +
    3587 struct SREGS sregs;
    +
    3588# endif
    +
    3589# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    3590 WNDCLASS wc;
    +
    3591 RECT wr = { 0, 0, 0, 0 };
    +
    3592 DWORD window_style = RETROFLAT_WIN_STYLE;
    +
    3593 DWORD window_style_ex = 0;
    +
    3594 int ww = 0,
    +
    3595 wh = 0;
    +
    3596# elif defined( RETROFLAT_API_SDL1 )
    +
    3597 const SDL_VideoInfo* info = NULL;
    +
    3598 char sdl_video_parms[256] = "";
    +
    3599# if defined( RETROFLAT_OPENGL )
    +
    3600 int gl_retval = 0,
    +
    3601 gl_depth = 16;
    +
    3602# endif /* RETROFLAT_OPENGL */
    +
    3603# elif defined( RETROFLAT_API_LIBNDS )
    +
    3604 int i = 0;
    +
    3605# elif defined( RETROFLAT_API_GLUT )
    +
    3606 unsigned int glut_init_flags = 0;
    +
    3607# elif defined( RETROFLAT_API_PC_BIOS )
    +
    3608 union REGS r;
    +
    3609 struct SREGS s;
    +
    3610# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    3611
    +
    3612 /* = Begin Init Procedure = */
    +
    3613
    +
    3614# if defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    3615# if defined( RETROFLAT_SDL_ICO )
    +
    3616 SDL_Surface* icon = NULL;
    +
    3617# endif /* RETROFLAT_SDL_ICO */
    +
    3618# endif /* RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 */
    +
    3619
    +
    3620# ifdef RETROFLAT_COMMIT_HASH
    +
    3621 debug_printf( 1, "retroflat commit: " RETROFLAT_COMMIT_HASH );
    +
    3622# endif /* RETROFLAT_COMMIT_HASH */
    +
    3623
    +
    3624 debug_printf( 1, "retroflat: initializing..." );
    +
    3625
    +
    3626 /* System sanity checks. */
    +
    3627 assert( 4 == sizeof( uint32_t ) );
    +
    3628 assert( 4 == sizeof( int32_t ) );
    +
    3629 assert( 2 == sizeof( uint16_t ) );
    +
    3630 assert( 2 == sizeof( int16_t ) );
    +
    3631 assert( 1 == sizeof( uint8_t ) );
    +
    3632 assert( 1 == sizeof( int8_t ) );
    +
    3633 assert( NULL != args );
    +
    3634
    +
    3635 debug_printf( 1, "retroflat: allocating state (" SIZE_T_FMT " bytes)...",
    +
    3636 sizeof( struct RETROFLAT_STATE ) );
    +
    3637
    +
    3638 debug_printf( 1, "retroflat: size_t is (" SIZE_T_FMT " bytes)...",
    +
    3639 sizeof( size_t ) );
    +
    3640
    +
    3641 debug_printf( 1, "retroflat: ssize_t is (" SIZE_T_FMT " bytes)...",
    +
    3642 sizeof( ssize_t ) );
    +
    3643
    +
    3644 debug_printf( 1, "retroflat: off_t is (" SIZE_T_FMT " bytes)...",
    +
    3645 sizeof( off_t ) );
    +
    3646
    +
    3647 g_retroflat_state_h = maug_malloc( 1, sizeof( struct RETROFLAT_STATE ) );
    +
    3648 if( (MAUG_MHANDLE)NULL == g_retroflat_state_h ) {
    + +
    3650 "Error", "Could not allocate global state!" );
    +
    3651 retval = MERROR_ALLOC;
    +
    3652 goto cleanup;
    +
    3653 }
    +
    3654
    +
    3655 maug_mlock( g_retroflat_state_h, g_retroflat_state );
    +
    3656 if( (MAUG_MHANDLE)NULL == g_retroflat_state ) {
    + +
    3658 "Error", "Could not lock global state!" );
    +
    3659 retval = MERROR_ALLOC;
    +
    3660 goto cleanup;
    +
    3661 }
    +
    3662 maug_mzero( g_retroflat_state, sizeof( struct RETROFLAT_STATE ) );
    +
    3663
    +
    3664# ifndef RETROFLAT_NO_CLI
    +
    3665
    +
    3666 debug_printf( 1, "retroflat: parsing args..." );
    +
    3667
    +
    3668 /* All platforms: add command-line args based on compile definitons. */
    +
    3669
    +
    3670# ifdef RETROSND_ARGS
    +
    3671 maug_add_arg( MAUG_CLI_SIGIL "rsd", MAUG_CLI_SIGIL_SZ + 4,
    +
    3672 "Select MIDI device", 0, (maug_cli_cb)retrosnd_cli_rsd,
    +
    3673 (maug_cli_cb)retrosnd_cli_rsd_def, args );
    +
    3674 maug_add_arg( MAUG_CLI_SIGIL "rsl", MAUG_CLI_SIGIL_SZ + 4,
    +
    3675 "List MIDI devices", 0, (maug_cli_cb)retrosnd_cli_rsl, NULL, args );
    +
    3676# endif /* RETROSND_ARGS */
    +
    3677
    +
    3678# ifdef RETROFLAT_SCREENSAVER
    +
    3679 maug_add_arg( MAUG_CLI_SIGIL "p", MAUG_CLI_SIGIL_SZ + 2,
    +
    3680 "Preview screensaver", 0, (maug_cli_cb)retroflat_cli_p, NULL, args );
    +
    3681 maug_add_arg( MAUG_CLI_SIGIL "s", MAUG_CLI_SIGIL_SZ + 2,
    +
    3682 "Launch screensaver", 0, (maug_cli_cb)retroflat_cli_s, NULL, args );
    +
    3683# endif /* RETROFLAT_SCREENSAVER */
    +
    3684
    +
    3685# ifdef RETROFLAT_API_PC_BIOS
    +
    3686 maug_add_arg( MAUG_CLI_SIGIL "rfm", MAUG_CLI_SIGIL_SZ + 4,
    +
    3687 "Set the screen mode.", 0,
    +
    3688 (maug_cli_cb)retroflat_cli_rfm,
    +
    3689 (maug_cli_cb)retroflat_cli_rfm_def, args );
    +
    3690# elif !defined( RETROFLAT_NO_CLI_SZ )
    +
    3691 maug_add_arg( MAUG_CLI_SIGIL "rfx", MAUG_CLI_SIGIL_SZ + 4,
    +
    3692 "Set the screen X position.", 0,
    +
    3693 (maug_cli_cb)retroflat_cli_rfx,
    +
    3694 (maug_cli_cb)retroflat_cli_rfx_def, args );
    +
    3695 maug_add_arg( MAUG_CLI_SIGIL "rfy", MAUG_CLI_SIGIL_SZ + 4,
    +
    3696 "Set the screen Y position.", 0,
    +
    3697 (maug_cli_cb)retroflat_cli_rfy,
    +
    3698 (maug_cli_cb)retroflat_cli_rfy_def, args );
    +
    3699 maug_add_arg( MAUG_CLI_SIGIL "rfw", MAUG_CLI_SIGIL_SZ + 4,
    +
    3700 "Set the screen width.", 0,
    +
    3701 (maug_cli_cb)retroflat_cli_rfw,
    +
    3702 (maug_cli_cb)retroflat_cli_rfw_def, args );
    +
    3703 maug_add_arg( MAUG_CLI_SIGIL "rfh", MAUG_CLI_SIGIL_SZ + 4,
    +
    3704 "Set the screen height.", 0,
    +
    3705 (maug_cli_cb)retroflat_cli_rfh,
    +
    3706 (maug_cli_cb)retroflat_cli_rfh_def, args );
    +
    3707# endif /* !RETROFLAT_NO_CLI_SZ */
    +
    3708
    +
    3709# ifdef RETROFLAT_VDP
    +
    3710 maug_add_arg( MAUG_CLI_SIGIL "vdp", MAUG_CLI_SIGIL_SZ + 4,
    +
    3711 "Pass a string of args to the VDP.", 0,
    +
    3712 (maug_cli_cb)retroflat_cli_vdp, NULL, args );
    +
    3713# endif /* RETROFLAT_VDP */
    +
    3714
    +
    3715 maug_add_arg( MAUG_CLI_SIGIL "rfu", MAUG_CLI_SIGIL_SZ + 4,
    +
    3716 "Unlock FPS.", 0,
    +
    3717 (maug_cli_cb)retroflat_cli_u, (maug_cli_cb)retroflat_cli_u_def, args );
    +
    3718
    +
    3719 /* Parse command line args. */
    +
    3720 retval = maug_parse_args( argc, argv );
    +
    3721 if( RETROFLAT_OK != retval ) {
    +
    3722 goto cleanup;
    +
    3723 }
    +
    3724
    +
    3725# endif /* !RETROFLAT_NO_CLI */
    +
    3726
    +
    3727 if(
    + +
    3729 ) {
    +
    3730 g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_UNLOCK_FPS;
    +
    3731 }
    +
    3732
    +
    3733 debug_printf( 1, "retroflat: setting config..." );
    +
    3734
    +
    3735 /* Set the assets path. */
    +
    3736 memset( g_retroflat_state->assets_path, '\0', RETROFLAT_ASSETS_PATH_MAX );
    +
    3737 if( NULL != args->assets_path ) {
    +
    3738 strncpy( g_retroflat_state->assets_path,
    + +
    3740 }
    +
    3741
    +
    3742# if defined( RETROFLAT_SCREENSAVER )
    +
    3743 if(
    + +
    3745 (RETROFLAT_FLAGS_SCREENSAVER & args->flags)
    +
    3746 ) {
    +
    3747 g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_SCREENSAVER;
    +
    3748 }
    +
    3749# endif /* RETROFLAT_SCREENSAVER */
    +
    3750
    +
    3751# if !defined( RETROFLAT_NO_CLI_SZ )
    +
    3752 /* Setup intended screen size. */
    +
    3753 /* TODO: Handle window resizing someday! */
    +
    3754 g_retroflat_state->screen_v_w = args->screen_w;
    +
    3755 g_retroflat_state->screen_v_h = args->screen_h;
    +
    3756 if(
    + +
    3758 ) {
    +
    3759 debug_printf( 1, "setting SDL window scale to 2x..." );
    +
    3760 g_retroflat_state->screen_w = args->screen_w * 2;
    +
    3761 g_retroflat_state->screen_h = args->screen_h * 2;
    +
    3762 } else {
    +
    3763 g_retroflat_state->screen_w = args->screen_w;
    +
    3764 g_retroflat_state->screen_h = args->screen_h;
    +
    3765 }
    +
    3766# endif /* RETROFLAT_NO_CLI_SZ */
    +
    3767
    +
    3768# ifdef RETROFLAT_OPENGL
    +
    3769 debug_printf( 1, "setting up texture palette..." );
    +
    3770# define RETROFLAT_COLOR_TABLE_TEX( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    3771 g_retroflat_state->tex_palette[idx][0] = r; \
    +
    3772 g_retroflat_state->tex_palette[idx][1] = g; \
    +
    3773 g_retroflat_state->tex_palette[idx][2] = b;
    +
    3774 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_TEX )
    +
    3775# endif /* RETROFLAT_OPENGL */
    +
    3776
    +
    3777# ifdef RETROFLAT_API_ALLEGRO
    +
    3778
    +
    3779 /* == Allegro == */
    +
    3780
    +
    3781 srand( time( NULL ) );
    +
    3782
    +
    3783 if( allegro_init() ) {
    +
    3784 allegro_message( "could not setup allegro!" );
    +
    3785 retval = RETROFLAT_ERROR_ENGINE;
    +
    3786 goto cleanup;
    +
    3787 }
    +
    3788
    +
    3789 install_keyboard();
    +
    3790# if !defined( RETROFLAT_OS_DOS )
    +
    3791 /* XXX: Broken in DOS. */
    +
    3792 install_timer();
    +
    3793 install_int( retroflat_on_ms_tick, 1 );
    +
    3794# endif /* RETROFLAT_OS_DOS */
    +
    3795
    +
    3796# ifdef RETROFLAT_OS_DOS
    +
    3797 /* Don't try windowed mode in DOS. */
    +
    3798 if(
    +
    3799 set_gfx_mode( GFX_AUTODETECT, args->screen_w, args->screen_h, 0, 0 )
    +
    3800 ) {
    +
    3801# else
    +
    3802 if(
    +
    3803 /* TODO: Set window position. */
    +
    3804 set_gfx_mode(
    +
    3805 GFX_AUTODETECT_WINDOWED, args->screen_w, args->screen_h, 0, 0 )
    +
    3806 ) {
    +
    3807# endif /* RETROFLAT_OS_DOS */
    +
    3808
    +
    3809 allegro_message( "could not setup graphics!" );
    +
    3810 retval = RETROFLAT_ERROR_GRAPHICS;
    +
    3811 goto cleanup;
    +
    3812 }
    +
    3813
    +
    3814# define RETROFLAT_COLOR_TABLE_ALLEGRO_INIT( i, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    3815 g_retroflat_state->palette[i] = makecol( r, g, b );
    +
    3816
    +
    3817 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_ALLEGRO_INIT )
    +
    3818
    +
    3819 LOCK_FUNCTION( retroflat_on_close_button );
    +
    3820 set_close_button_callback( retroflat_on_close_button );
    +
    3821
    +
    3822# ifndef RETROFLAT_OS_DOS
    +
    3823 if( NULL != args->title ) {
    +
    3824 retroflat_set_title( args->title );
    +
    3825 }
    +
    3826
    +
    3827 /* XXX: Broken in DOS. */
    +
    3828 if( 0 > install_mouse() ) {
    +
    3829 allegro_message( "could not setup mouse!" );
    +
    3830 retval = RETROFLAT_ERROR_MOUSE;
    +
    3831 goto cleanup;
    +
    3832 }
    +
    3833# endif /* !RETROFLAT_OS_DOS */
    +
    3834
    +
    3835# ifdef RETROFLAT_OS_DOS
    +
    3836# if 0
    +
    3837 regs.w.ax = 0x9;
    +
    3838 regs.w.bx = 0x0;
    +
    3839 regs.w.cx = 0x0;
    +
    3840 regs.x.edx = FP_OFF( g_retroflat_state->mouse_cursor );
    +
    3841 sregs.es = FP_SEG( g_retroflat_state->mouse_cursor );
    +
    3842 int386x( 0x33, &regs, &regs, &sregs );
    +
    3843# endif
    +
    3844# endif /* RETROFLAT_OS_DOS */
    +
    3845
    +
    3846 g_retroflat_state->buffer.b =
    +
    3847 create_bitmap( args->screen_w, args->screen_h );
    +
    3848 maug_cleanup_if_null(
    +
    3849 BITMAP*, g_retroflat_state->buffer.b, RETROFLAT_ERROR_GRAPHICS );
    +
    3850
    +
    3851# elif defined( RETROFLAT_API_SDL1 )
    +
    3852
    +
    3853 /* == SDL1 == */
    +
    3854
    +
    3855 /* Random seed. */
    +
    3856 srand( time( NULL ) );
    +
    3857
    +
    3858 /* Startup SDL. */
    +
    3859 if( SDL_Init( SDL_INIT_VIDEO ) ) {
    + +
    3861 "Error", "Error initializing SDL: %s", SDL_GetError() );
    +
    3862 retval = RETROFLAT_ERROR_ENGINE;
    +
    3863 goto cleanup;
    +
    3864 }
    +
    3865
    +
    3866 /* Get info on best available video mode. */
    +
    3867 info = SDL_GetVideoInfo();
    +
    3868 maug_cleanup_if_null_alloc( SDL_VideoInfo*, info );
    +
    3869
    +
    3870 debug_printf( 3, "maximum window size: %ux%u",
    +
    3871 info->current_w, info->current_h );
    +
    3872
    +
    3873# ifndef RETROFLAT_OS_WIN
    +
    3874
    +
    3875 /* TODO: Maximum screen size detection returns bogus values in Windows! */
    +
    3876
    +
    3877 /* Setup default screen position. */
    +
    3878 if( 0 == args->screen_x ) {
    +
    3879 /* Get screen width so we can center! */
    +
    3880 args->screen_x = (info->current_w / 2) -
    +
    3881 (g_retroflat_state->screen_w / 2);
    +
    3882 }
    +
    3883
    +
    3884 if( 0 == args->screen_y ) {
    +
    3885 /* Get screen height so we can center! */
    +
    3886 args->screen_y = (info->current_h / 2) -
    +
    3887 (g_retroflat_state->screen_h / 2);
    +
    3888 }
    +
    3889
    +
    3890 maug_snprintf( sdl_video_parms, 255, "SDL_VIDEO_WINDOW_POS=%d,%d",
    +
    3891 args->screen_x, args->screen_y );
    +
    3892 putenv( sdl_video_parms );
    +
    3893
    +
    3894# endif /* !RETROFLAT_OS_WIN */
    +
    3895
    +
    3896 /* Setup color palettes. */
    +
    3897# ifdef RETROFLAT_OPENGL
    +
    3898# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    3899 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    3900# else
    +
    3901# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, rd, gd, bd, cgac, cgad ) \
    +
    3902 g_retroflat_state->palette[idx].r = rd; \
    +
    3903 g_retroflat_state->palette[idx].g = gd; \
    +
    3904 g_retroflat_state->palette[idx].b = bd;
    +
    3905# endif /* RETROFLAT_OPENGL */
    +
    3906 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_SDL )
    +
    3907
    +
    3908# ifdef RETROFLAT_OPENGL
    +
    3909 if(
    + +
    3911 ) {
    +
    3912 SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 0 );
    +
    3913 }
    +
    3914 SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
    +
    3915 SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
    +
    3916 SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
    +
    3917 do {
    +
    3918 /* Retry with smaller depth buffers if this fails. */
    +
    3919 gl_retval = SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, gl_depth );
    +
    3920 if( gl_retval ) {
    +
    3921 error_printf( "unable to set depth buffer to %d!", gl_depth );
    +
    3922 gl_depth -= 4;
    +
    3923 }
    +
    3924 } while( gl_retval );
    +
    3925 SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
    +
    3926# endif /* RETROFLAT_OPENGL */
    +
    3927
    +
    3928 if( NULL != args->title ) {
    +
    3929 retroflat_set_title( args->title );
    +
    3930 }
    +
    3931
    +
    3932# ifdef RETROFLAT_SDL_ICO
    +
    3933 debug_printf( 1, "setting SDL window icon..." );
    +
    3934 icon = SDL_LoadBMP_RW(
    +
    3935 SDL_RWFromConstMem( obj_ico_sdl_ico_bmp,
    +
    3936 obj_ico_sdl_ico_bmp_len ), 1 );
    +
    3937 maug_cleanup_if_null( SDL_Surface*, icon, RETROFLAT_ERROR_BITMAP );
    +
    3938 SDL_WM_SetIcon( icon, 0 ); /* TODO: Constant mask. */
    +
    3939# endif /* RETROFLAT_SDL_ICO */
    +
    3940
    +
    3941 g_retroflat_state->buffer.surface = SDL_SetVideoMode(
    +
    3942 g_retroflat_state->screen_w, g_retroflat_state->screen_h,
    +
    3943 info->vfmt->BitsPerPixel,
    +
    3944 SDL_DOUBLEBUF | SDL_HWSURFACE | SDL_ANYFORMAT
    +
    3945# ifdef RETROFLAT_OPENGL
    +
    3946 | SDL_OPENGL
    +
    3947# endif /* RETROFLAT_OPENGL */
    +
    3948 );
    +
    3949 maug_cleanup_if_null(
    +
    3950 SDL_Surface*, g_retroflat_state->buffer.surface,
    +
    3951 RETROFLAT_ERROR_GRAPHICS );
    +
    3952
    +
    3953 /* Setup key repeat. */
    +
    3954 if(
    + +
    3956 ) {
    +
    3957 if( 0 != SDL_EnableKeyRepeat(
    +
    3958 1, SDL_DEFAULT_REPEAT_INTERVAL
    +
    3959 ) ) {
    +
    3960 error_printf( "could not enable key repeat!" );
    +
    3961 } else {
    +
    3962 debug_printf( 3, "key repeat enabled" );
    +
    3963 }
    +
    3964 }
    +
    3965
    +
    3966# elif defined( RETROFLAT_API_SDL2 )
    +
    3967
    +
    3968 /* == SDL2 == */
    +
    3969
    +
    3970 srand( time( NULL ) );
    +
    3971
    +
    3972 if( SDL_Init( SDL_INIT_VIDEO ) ) {
    + +
    3974 "Error", "Error initializing SDL: %s", SDL_GetError() );
    +
    3975 retval = RETROFLAT_ERROR_ENGINE;
    +
    3976 goto cleanup;
    +
    3977 }
    +
    3978
    +
    3979 /* Setup color palettes. */
    +
    3980# ifdef RETROFLAT_OPENGL
    +
    3981# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    3982 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    3983# else
    +
    3984# define RETROFLAT_COLOR_TABLE_SDL( idx, name_l, name_u, rd, gd, bd, cgac, cgad ) \
    +
    3985 g_retroflat_state->palette[idx].r = rd; \
    +
    3986 g_retroflat_state->palette[idx].g = gd; \
    +
    3987 g_retroflat_state->palette[idx].b = bd;
    +
    3988# endif /* RETROFLAT_OPENGL */
    +
    3989 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_SDL )
    +
    3990
    +
    3991 /* Create the main window. */
    +
    3992 g_retroflat_state->window = SDL_CreateWindow( args->title,
    +
    3993 SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
    +
    3994 args->screen_w, args->screen_h, RETROFLAT_WIN_FLAGS );
    +
    3995 maug_cleanup_if_null( SDL_Window*, g_retroflat_state->window, RETROFLAT_ERROR_GRAPHICS );
    +
    3996
    +
    3997 /* Create the main renderer. */
    +
    3998 g_retroflat_state->buffer.renderer = SDL_CreateRenderer(
    +
    3999 g_retroflat_state->window, -1,
    +
    4000 SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE );
    +
    4001 maug_cleanup_if_null(
    +
    4002 SDL_Renderer*, g_retroflat_state->buffer.renderer,
    +
    4003 RETROFLAT_ERROR_GRAPHICS );
    +
    4004
    +
    4005 /* Create the buffer texture. */
    +
    4006 g_retroflat_state->buffer.texture =
    +
    4007 SDL_CreateTexture( g_retroflat_state->buffer.renderer,
    +
    4008 SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,
    +
    4009 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    4010
    +
    4011 /* TODO: This doesn't seem to do anything. */
    +
    4012 if(
    + +
    4014 ) {
    +
    4015 debug_printf( 1, "setting SDL window scale to 2x..." );
    +
    4016 SDL_RenderSetScale( g_retroflat_state->buffer.renderer, 2.0f, 2.0f );
    +
    4017 }
    +
    4018
    +
    4019# ifdef RETROFLAT_SDL_ICO
    +
    4020 debug_printf( 1, "setting SDL window icon..." );
    +
    4021 icon = SDL_LoadBMP_RW(
    +
    4022 SDL_RWFromConstMem( obj_ico_sdl_ico_bmp,
    +
    4023 obj_ico_sdl_ico_bmp_len ), 1 );
    +
    4024 maug_cleanup_if_null( SDL_Surface*, icon, RETROFLAT_ERROR_BITMAP );
    +
    4025 SDL_SetWindowIcon( g_retroflat_state->window, icon );
    +
    4026# endif /* RETROFLAT_SDL_ICO */
    +
    4027
    +
    4028# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4029
    +
    4030 /* == Win16/Win32 == */
    +
    4031
    +
    4032# ifdef RETROFLAT_API_WINCE
    +
    4033 srand( GetTickCount() );
    +
    4034# else
    +
    4035 srand( time( NULL ) );
    +
    4036# endif /* RETROFLAT_API_WINCE */
    +
    4037
    +
    4038 /* Setup color palettes. */
    +
    4039 /* TODO: For WinG, try to make the indexes match system palette? */
    +
    4040# ifdef RETROFLAT_OPENGL
    +
    4041# define RETROFLAT_COLOR_TABLE_WIN( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4042 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    4043# else
    +
    4044# define RETROFLAT_COLOR_TABLE_WIN( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4045 g_retroflat_state->palette[idx] = RGB( r, g, b );
    +
    4046# endif /* RETROFLAT_OPENGL */
    +
    4047
    +
    4048 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN )
    +
    4049
    +
    4050# ifdef RETROFLAT_WING
    +
    4051 debug_printf( 3, "attempting to link WinG..." );
    +
    4052 /* Dynamically load the WinG procedures. */
    +
    4053# ifdef RETROFLAT_API_WIN32
    +
    4054 g_w.module = LoadLibrary( "wing32.dll" );
    +
    4055 if( (HMODULE)NULL == g_w.module ) {
    +
    4056# elif defined( RETROFLAT_API_WIN16 )
    +
    4057 g_w.module = LoadLibrary( "wing.dll" );
    +
    4058 if( HINSTANCE_ERROR == g_w.module ) {
    +
    4059# endif
    +
    4060 g_w.success = 0;
    +
    4061 } else {
    +
    4062 g_w.success = 1;
    +
    4063
    +
    4064# ifdef RETROFLAT_API_WIN32
    +
    4065# define RETROFLAT_WING_LLTABLE_LOAD_PROC( retval, proc, ord ) \
    +
    4066 g_w.proc = (proc ## _t)GetProcAddress( g_w.module, #proc ); \
    +
    4067 if( (proc ## _t)NULL == g_w.proc ) { \
    +
    4068 g_w.success = 0; \
    +
    4069 }
    +
    4070# elif defined( RETROFLAT_API_WIN16 )
    +
    4071# define RETROFLAT_WING_LLTABLE_LOAD_PROC( retval, proc, ord ) \
    +
    4072 g_w.proc = (proc ## _t)GetProcAddress( \
    +
    4073 g_w.module, MAKEINTRESOURCE( ord ) ); \
    +
    4074 if( (proc ## _t)NULL == g_w.proc ) { \
    +
    4075 retroflat_message( \
    +
    4076 RETROFLAT_MSG_FLAG_ERROR, "Error", \
    +
    4077 "Unable to link WinG proc: %s", #proc ); \
    +
    4078 g_w.success = 0; \
    +
    4079 }
    +
    4080# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    4081
    +
    4082 RETROFLAT_WING_LLTABLE( RETROFLAT_WING_LLTABLE_LOAD_PROC )
    +
    4083
    +
    4084 }
    +
    4085
    +
    4086 if( !g_w.success ) {
    + +
    4088 "Error", "Unable to link WinG!" );
    +
    4089 }
    +
    4090# endif /* RETROFLAT_WING */
    +
    4091
    +
    4092 /* Get the *real* size of the window, including titlebar. */
    +
    4093 wr.right = g_retroflat_state->screen_w;
    +
    4094 wr.bottom = g_retroflat_state->screen_h;
    +
    4095# ifndef RETROFLAT_API_WINCE
    +
    4096 AdjustWindowRect( &wr, RETROFLAT_WIN_STYLE, FALSE );
    +
    4097# endif /* !RETROFLAT_API_WINCE */
    +
    4098
    +
    4099 memset(
    +
    4100 &(g_retroflat_state->buffer), '\0', sizeof( struct RETROFLAT_BITMAP ) );
    +
    4101
    +
    4102 debug_printf( 1, "retroflat: creating window class..." );
    +
    4103
    +
    4104 memset( &wc, '\0', sizeof( WNDCLASS ) );
    +
    4105
    +
    4106 wc.lpfnWndProc = (WNDPROC)&WndProc;
    +
    4107 wc.hInstance = g_retroflat_instance;
    +
    4108# ifdef RETROFLAT_ICO_RES_ID
    +
    4109 wc.hIcon = LoadIcon(
    +
    4110 g_retroflat_instance, MAKEINTRESOURCE( RETROFLAT_ICO_RES_ID ) );
    +
    4111# endif /* RETROFLAT_ICO_RES_ID */
    +
    4112 wc.hCursor = LoadCursor( 0, IDC_ARROW );
    +
    4113 wc.hbrBackground = (HBRUSH)( COLOR_BTNFACE + 1 );
    +
    4114 /* wc.lpszMenuName = MAKEINTRESOURCE( IDR_MAINMENU ); */
    +
    4115 wc.lpszClassName = RETROFLAT_WINDOW_CLASS;
    +
    4116
    +
    4117 if( !RegisterClass( &wc ) ) {
    + +
    4119 "Error", "Could not register window class!" );
    +
    4120 goto cleanup;
    +
    4121 }
    +
    4122
    +
    4123 debug_printf( 1, "retroflat: creating window..." );
    +
    4124
    +
    4125# ifdef RETROFLAT_SCREENSAVER
    +
    4126 if( (HWND)0 != g_retroflat_state->parent ) {
    +
    4127 /* Shrink the child window into the parent. */
    +
    4128 debug_printf( 1, "retroflat: using window parent: %p",
    +
    4129 g_retroflat_state->parent );
    +
    4130 window_style = WS_CHILD;
    +
    4131 GetClientRect( g_retroflat_state->parent, &wr );
    +
    4132 } else if(
    + +
    4134 (RETROFLAT_FLAGS_SCREENSAVER & g_retroflat_state->retroflat_flags)
    +
    4135 ) {
    +
    4136 /* Make window fullscreen and on top. */
    +
    4137 window_style_ex = WS_EX_TOPMOST;
    +
    4138 window_style = WS_POPUP | WS_VISIBLE;
    +
    4139 /* X/Y are hardcoded to zero below, so just get desired window size. */
    +
    4140 wr.left = 0;
    +
    4141 wr.top = 0;
    +
    4142 wr.right = GetSystemMetrics( SM_CXSCREEN );
    +
    4143 wr.bottom = GetSystemMetrics( SM_CYSCREEN );
    +
    4144 } else {
    +
    4145# endif /* RETROFLAT_SCREENSAVER */
    +
    4146# ifndef RETROFLAT_API_WINCE
    +
    4147 /* Open in a centered window. */
    +
    4148 ww = wr.right - wr.left;
    +
    4149 wh = wr.bottom - wr.top;
    +
    4150 if( 0 == args->screen_x ) {
    +
    4151 args->screen_x = (GetSystemMetrics( SM_CXSCREEN ) / 2) - (ww / 2);
    +
    4152 }
    +
    4153 if( 0 == args->screen_y ) {
    +
    4154 args->screen_y = (GetSystemMetrics( SM_CYSCREEN ) / 2) - (wh / 2);
    +
    4155 }
    +
    4156# endif /* !RETROFLAT_API_WINCE */
    +
    4157# ifdef RETROFLAT_SCREENSAVER
    +
    4158 }
    +
    4159# endif /* RETROFLAT_SCREENSAVER */
    +
    4160
    +
    4161 g_retroflat_state->window = CreateWindowEx(
    +
    4162 window_style_ex, RETROFLAT_WINDOW_CLASS, args->title,
    +
    4163 window_style,
    +
    4164# ifdef RETROFLAT_API_WINCE
    +
    4165 0, 0, CW_USEDEFAULT, CW_USEDEFAULT,
    +
    4166# else
    +
    4167 args->screen_x, args->screen_y, ww, wh,
    +
    4168# endif /* RETROFLAT_API_WINCE */
    +
    4169# ifdef RETROFLAT_SCREENSAVER
    +
    4170 g_retroflat_state->parent
    +
    4171# else
    +
    4172 0
    +
    4173# endif /* RETROFLAT_SCREENSAVER */
    +
    4174 , 0, g_retroflat_instance, 0
    +
    4175 );
    +
    4176
    +
    4177# ifdef RETROFLAT_API_WINCE
    +
    4178 /* Force screen size. */
    +
    4179 GetClientRect( g_retroflat_state->window, &wr );
    +
    4180 g_retroflat_state->screen_w = wr.right - wr.left;
    +
    4181 g_retroflat_state->screen_h = wr.bottom - wr.top;
    +
    4182# endif /* RETROFLAT_API_WINCE */
    +
    4183
    +
    4184 if( !g_retroflat_state->window ) {
    + +
    4186 "Error", "Could not create window!" );
    +
    4187 retval = RETROFLAT_ERROR_GRAPHICS;
    +
    4188 goto cleanup;
    +
    4189 }
    +
    4190
    +
    4191 maug_cleanup_if_null_alloc( HWND, g_retroflat_state->window );
    +
    4192
    +
    4193#ifndef RETROFLAT_OPENGL
    +
    4194 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_BRSET )
    +
    4195 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_PNSET )
    +
    4196#endif /* !RETROFLAT_OPENGL */
    +
    4197
    +
    4198 ShowWindow( g_retroflat_state->window, g_retroflat_cmd_show );
    +
    4199
    +
    4200# elif defined( RETROFLAT_API_LIBNDS )
    +
    4201
    +
    4202 /* == Nintendo DS == */
    +
    4203
    +
    4204 /* Setup color constants. */
    +
    4205# define RETROFLAT_COLOR_TABLE_NDS_RGBS_INIT( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4206 g_retroflat_state->palette[idx] = ARGB16( 1, r, g, b );
    +
    4207 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_NDS_RGBS_INIT )
    +
    4208
    +
    4209 /* Force screen size. */
    +
    4210 args->screen_w = 256;
    +
    4211 args->screen_h = 192;
    +
    4212
    +
    4213 powerOn( POWER_ALL );
    +
    4214
    +
    4215# ifdef RETROFLAT_OPENGL
    +
    4216
    +
    4217 debug_printf( 3, "setting up GL subsystem..." );
    +
    4218
    +
    4219 videoSetMode( MODE_0_3D );
    +
    4220
    +
    4221 vramSetBankA( VRAM_A_TEXTURE );
    +
    4222
    +
    4223 glInit();
    +
    4224
    +
    4225 /* TODO: Setup NDS 3D engine! */
    +
    4226
    +
    4227# else
    +
    4228 videoSetMode( MODE_5_2D );
    +
    4229 videoSetModeSub( MODE_0_2D );
    +
    4230
    +
    4231 /* Setup the upper screen for background and sprites. */
    +
    4232 vramSetBankA( VRAM_A_MAIN_BG );
    +
    4233 vramSetBankB( VRAM_B_MAIN_SPRITE );
    +
    4234
    +
    4235 /* Setup the lower screen for background and sprites. */
    +
    4236 vramSetBankC( VRAM_C_MAIN_BG );
    +
    4237 vramSetBankD( VRAM_D_SUB_SPRITE );
    +
    4238
    +
    4239 bgExtPaletteEnable();
    +
    4240
    +
    4241 /* Setup the background engine. */
    +
    4242
    +
    4243 /* Put map at base 2, but stow tiles up after the bitmap BG at base 7. */
    +
    4244 g_retroflat_state->bg_id =
    +
    4245 bgInit( 0, BgType_Text8bpp, BgSize_T_256x256, 2, 7 );
    +
    4246 dmaFillWords( 0, g_retroflat_state->bg_tiles,
    +
    4247 sizeof( g_retroflat_state->bg_tiles ) );
    +
    4248 bgSetPriority( g_retroflat_state->bg_id, 2 );
    +
    4249
    +
    4250 /* Put map at base 3, and tiles at base 0. */
    +
    4251 g_retroflat_state->window_id =
    +
    4252 bgInit( 1, BgType_Text8bpp, BgSize_T_256x256, 3, 0 );
    +
    4253 dmaFillWords( 0, g_retroflat_state->window_tiles,
    +
    4254 sizeof( g_retroflat_state->window_tiles ) );
    +
    4255 bgSetPriority( g_retroflat_state->window_id, 1 );
    +
    4256
    +
    4257 /* Put bitmap BG at base 1, leaving map-addressable space at base 0. */
    +
    4258 g_retroflat_state->px_id = bgInit( 2, BgType_Bmp16, BgSize_B16_256x256, 1, 0 );
    +
    4259 bgSetPriority( g_retroflat_state->px_id, 0 );
    +
    4260
    +
    4261 /* Setup the sprite engines. */
    +
    4262 oamInit( NDS_OAM_ACTIVE, SpriteMapping_1D_128, 0 );
    +
    4263
    +
    4264 /* Allocate sprite frame memory. */
    +
    4265 for( i = 0 ; NDS_SPRITES_ACTIVE > i ; i++ ) {
    +
    4266 g_retroflat_state->sprite_frames[i] = oamAllocateGfx(
    +
    4267 NDS_OAM_ACTIVE, SpriteSize_16x16, SpriteColorFormat_256Color );
    +
    4268 }
    +
    4269
    +
    4270# endif /* RETROFLAT_OPENGL */
    +
    4271
    +
    4272 /* Setup the timer. */
    +
    4273 TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1024;
    +
    4274 TIMER1_CR = TIMER_ENABLE | TIMER_CASCADE;
    +
    4275
    +
    4276# elif defined( RETROFLAT_API_GLUT )
    +
    4277
    +
    4278 /* == GLUT == */
    +
    4279
    +
    4280# define RETROFLAT_COLOR_TABLE_GLUT( idx, name_l, name_u, rd, gd, bd, cgac, cgad ) \
    +
    4281 g_retroflat_state->palette[idx] = RETROGLU_COLOR_ ## name_u;
    +
    4282 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_GLUT )
    +
    4283
    +
    4284 glutInit( &argc, argv );
    +
    4285 glut_init_flags = GLUT_DEPTH | GLUT_RGBA;
    +
    4286 if(
    + +
    4288 ) {
    +
    4289 glut_init_flags |= GLUT_DOUBLE;
    +
    4290 }
    +
    4291 glutInitDisplayMode( glut_init_flags );
    +
    4292 if( 0 < args->screen_x || 0 < args->screen_y ) {
    +
    4293 glutInitWindowPosition( args->screen_x, args->screen_y );
    +
    4294 }
    +
    4295 /* TODO: Handle screen scaling? */
    +
    4296 glutInitWindowSize(
    +
    4297 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    4298 glutCreateWindow( args->title );
    +
    4299 glutIdleFunc( retroflat_glut_idle );
    +
    4300 glutDisplayFunc( retroflat_glut_display );
    +
    4301 glutKeyboardFunc( retroflat_glut_key );
    +
    4302
    +
    4303 /* TODO: Handle mouse input in GLUT. */
    +
    4304
    +
    4305# elif defined( RETROFLAT_API_PC_BIOS )
    +
    4306
    +
    4307 /* == DOS PC_BIOS == */
    +
    4308
    +
    4309 srand( time( NULL ) );
    +
    4310
    +
    4311 debug_printf( 3, "memory available before growth: %u", _memavl() );
    +
    4312# ifdef MAUG_DOS_MEM_L
    +
    4313 /* TODO: Should this check/init be in mmem.h instead? */
    +
    4314 _fheapgrow();
    +
    4315# else
    +
    4316 _nheapgrow();
    +
    4317# endif /* MAUG_DOS_MEM_L */
    +
    4318 debug_printf( 3, "memory available after growth: %u", _memavl() );
    +
    4319
    +
    4320 /* Setup timer handler. */
    +
    4321
    +
    4322 _disable();
    +
    4323
    +
    4324 /* Backup original handler for later. */
    +
    4325 segread( &s );
    +
    4326 r.h.al = 0x08;
    +
    4327 r.h.ah = 0x35;
    +
    4328 int86x( 0x21, &r, &r, &s );
    +
    4329 g_retroflat_state->old_timer_interrupt =
    +
    4330 (retroflat_intfunc)MK_FP( s.es, r.x.bx );
    +
    4331
    +
    4332 /* Install new interrupt handler. */
    +
    4333 g_ms = 0;
    +
    4334 r.h.al = 0x08;
    +
    4335 r.h.ah = 0x25;
    +
    4336 s.ds = FP_SEG( retroflat_timer_handler );
    +
    4337 r.x.dx = FP_OFF( retroflat_timer_handler );
    +
    4338 int86x( 0x21, &r, &r, &s );
    +
    4339
    +
    4340 /* Set resolution of timer chip to 1ms. */
    +
    4341 outp( 0x43, 0x36 );
    +
    4342 outp( 0x40, (uint8_t)(RETROFLAT_DOS_TIMER_DIV & 0xff) );
    +
    4343 outp( 0x40, (uint8_t)((RETROFLAT_DOS_TIMER_DIV >> 8) & 0xff) );
    +
    4344
    +
    4345 _enable();
    +
    4346
    +
    4347 debug_printf( 3, "timers initialized..." );
    +
    4348
    +
    4349 /* Setup graphics. */
    +
    4350
    +
    4351 memset( &r, 0, sizeof( r ) );
    +
    4352 r.x.ax = 0x0f00; /* Service: Get video mode. */
    +
    4353 int86( 0x10, &r, &r ); /* Call video interrupt. */
    +
    4354 g_retroflat_state->old_video_mode = r.h.al;
    +
    4355 debug_printf( 2, "saved old video mode: 0x%02x",
    +
    4356 g_retroflat_state->old_video_mode );
    +
    4357
    +
    4358 /* TODO: Put all screen mode dimensions in a LUT. */
    +
    4359 g_retroflat_state->screen_mode = args->screen_mode;
    +
    4360 switch( args->screen_mode ) {
    +
    4361 case RETROFLAT_SCREEN_MODE_CGA:
    +
    4362 debug_printf( 3, "using CGA 320x200x4 colors" );
    +
    4363 g_retroflat_state->screen_v_w = 320;
    +
    4364 g_retroflat_state->screen_v_h = 200;
    +
    4365 g_retroflat_state->screen_w = 320;
    +
    4366 g_retroflat_state->screen_h = 200;
    +
    4367 g_retroflat_state->buffer.px = (uint8_t SEG_FAR*)0xB8000000L;
    +
    4368 g_retroflat_state->buffer.w = 320;
    +
    4369 g_retroflat_state->buffer.h = 200;
    +
    4370 break;
    +
    4371
    +
    4372 case RETROFLAT_SCREEN_MODE_VGA:
    +
    4373 debug_printf( 3, "using VGA 320x200x16 colors" );
    +
    4374 g_retroflat_state->screen_v_w = 320;
    +
    4375 g_retroflat_state->screen_v_h = 200;
    +
    4376 g_retroflat_state->screen_w = 320;
    +
    4377 g_retroflat_state->screen_h = 200;
    +
    4378 g_retroflat_state->buffer.px = (uint8_t SEG_FAR*)0xA0000000L;
    +
    4379 g_retroflat_state->buffer.w = 320;
    +
    4380 g_retroflat_state->buffer.h = 200;
    +
    4381 g_retroflat_state->buffer.sz = 320 * 200;
    +
    4382 break;
    +
    4383
    +
    4384 default:
    +
    4385 error_printf( "unsupported video mode: %d", args->screen_mode );
    +
    4386 retval = MERROR_GUI;
    +
    4387 goto cleanup;
    +
    4388 }
    +
    4389
    +
    4390 memset( &r, 0, sizeof( r ) );
    +
    4391 r.h.al = args->screen_mode;
    +
    4392 int86( 0x10, &r, &r ); /* Call video interrupt. */
    +
    4393
    +
    4394 debug_printf(
    +
    4395 3, "graphics initialized (mode 0x%02x)...", args->screen_mode );
    +
    4396
    +
    4397 /* Initialize color table. */
    +
    4398# define RETROFLAT_COLOR_TABLE_CGA_COLORS_INIT( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4399 g_retroflat_state->cga_color_table[idx] = RETROFLAT_CGA_COLOR_ ## cgac;
    +
    4400 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CGA_COLORS_INIT )
    +
    4401
    +
    4402 /* Initialize dither table. */
    +
    4403# define RETROFLAT_COLOR_TABLE_CGA_DITHER_INIT( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    4404 g_retroflat_state->cga_dither_table[idx] = RETROFLAT_CGA_COLOR_ ## cgad;
    +
    4405 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CGA_DITHER_INIT )
    +
    4406
    +
    4407# else
    +
    4408# pragma message( "warning: init not implemented" )
    +
    4409# endif /* RETROFLAT_API_ALLEGRO */
    +
    4410
    +
    4411# if defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES )
    +
    4412 retval = retrosoft_init();
    +
    4413 maug_cleanup_if_not_ok();
    +
    4414# endif /* RETROFLAT_SOFT_SHAPES || RETROFLAT_SOFT_LINES */
    +
    4415
    +
    4416# if defined( RETROFLAT_OPENGL )
    +
    4417 retval = retrosoft_init();
    +
    4418 maug_cleanup_if_not_ok();
    +
    4419 retval = retroglu_init_glyph_tex();
    +
    4420 maug_cleanup_if_not_ok();
    +
    4421# endif /* RETROFLAT_OPENGL */
    +
    4422
    +
    4423# ifdef RETROFLAT_VDP
    +
    4424# if defined( RETROFLAT_OS_UNIX )
    +
    4425 g_retroflat_state->vdp_exe = dlopen(
    +
    4426# ifdef RETROFLAT_API_SDL1
    +
    4427 "./rvdpsdl1.so",
    +
    4428# elif defined( RETROFLAT_API_SDL2 )
    +
    4429 "./rvdpsdl2.so",
    +
    4430# else
    +
    4431# error "rvdp .so undefined!"
    +
    4432# endif
    +
    4433 RTLD_LAZY );
    +
    4434# elif defined( RETROFLAT_OS_WIN )
    +
    4435 g_retroflat_state->vdp_exe = LoadLibrary(
    +
    4436# ifdef RETROFLAT_API_SDL1
    +
    4437 "./rvdpsdl1.dll"
    +
    4438# elif defined( RETROFLAT_API_SDL2 )
    +
    4439 "./rvdpsdl2.dll"
    +
    4440# elif defined( RETROFLAT_API_WIN32 )
    +
    4441 "./rvdpnt.dll"
    +
    4442# else
    +
    4443# error "rvdp .so undefined!"
    +
    4444# endif
    +
    4445 );
    +
    4446# else
    +
    4447# error "dlopen undefined!"
    +
    4448# endif /* RETROFLAT_OS_UNIX */
    +
    4449
    +
    4450 if( !(g_retroflat_state->vdp_exe) ) {
    +
    4451 error_printf( "not loading VDP" );
    +
    4452 /* Skip creating the buffer or trying to run the init proc. */
    +
    4453 goto skip_vdp;
    +
    4454 }
    +
    4455
    +
    4456 /* Create intermediary screen buffer. */
    +
    4457 debug_printf( 1, "creating VDP buffer, %d x %d",
    +
    4458 g_retroflat_state->screen_v_w, g_retroflat_state->screen_v_h );
    +
    4459 g_retroflat_state->vdp_buffer =
    +
    4460 calloc( 1, sizeof( struct RETROFLAT_BITMAP ) );
    +
    4461 maug_cleanup_if_null_alloc(
    +
    4462 struct RETROFLAT_BITMAP*, g_retroflat_state->vdp_buffer );
    +
    4463 retval = retroflat_create_bitmap(
    +
    4464 g_retroflat_state->screen_v_w, g_retroflat_state->screen_v_h,
    +
    4465 g_retroflat_state->vdp_buffer, RETROFLAT_FLAGS_OPAQUE );
    +
    4466 maug_cleanup_if_not_ok();
    +
    4467
    +
    4468 debug_printf( 1, "initializing VDP..." );
    +
    4469 retval = retroflat_vdp_call( "retroflat_vdp_init" );
    +
    4470
    +
    4471skip_vdp:
    +
    4472
    +
    4473# endif /* RETROFLAT_VDP */
    +
    4474
    +
    4475# ifndef RETROFLAT_NO_BLANK_INIT
    +
    4476 retroflat_draw_lock( NULL );
    + +
    4478 NULL, RETROFLAT_COLOR_BLACK, 0, 0,
    + + +
    4481 retroflat_draw_release( NULL );
    +
    4482# endif /* !RETROFLAT_NO_BLANK_INIT */
    +
    4483
    +
    4484cleanup:
    +
    4485
    +
    4486 return retval;
    +
    4487}
    +
    4488
    +
    4489/* === */
    +
    4490
    +
    4491void retroflat_shutdown( int retval ) {
    +
    4492
    +
    4493# if defined( RETROFLAT_API_PC_BIOS )
    +
    4494 union REGS r;
    +
    4495 struct SREGS s;
    +
    4496# endif /* RETROFLAT_API_PC_BIOS */
    +
    4497
    +
    4498 debug_printf( 1, "retroflat shutdown called..." );
    +
    4499
    +
    4500# if defined( RETROFLAT_VDP )
    +
    4501 if( NULL != g_retroflat_state->vdp_exe ) {
    +
    4502 retroflat_vdp_call( "retroflat_vdp_shutdown" );
    +
    4503# ifdef RETROFLAT_OS_UNIX
    +
    4504 dlclose( g_retroflat_state->vdp_exe );
    +
    4505# elif defined( RETROFLAT_OS_WIN )
    +
    4506 FreeLibrary( g_retroflat_state->vdp_exe );
    +
    4507# else
    +
    4508# error "dlclose undefined!"
    +
    4509# endif /* RETROFLAT_OS_UNIX || RETROFLAT_OS_WIN */
    +
    4510 }
    +
    4511
    +
    4512 if( NULL != g_retroflat_state->vdp_buffer ) {
    +
    4513 debug_printf( 1, "destroying VPD buffer..." );
    +
    4514 retroflat_destroy_bitmap( g_retroflat_state->vdp_buffer );
    +
    4515 free( g_retroflat_state->vdp_buffer );
    +
    4516 }
    +
    4517# endif /* RETROFLAT_VDP */
    +
    4518
    +
    4519# if defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES ) || \
    +
    4520defined( RETROFLAT_OPENGL )
    +
    4521 debug_printf( 1, "calling retrosoft shutdown..." );
    +
    4522 retrosoft_shutdown();
    +
    4523# endif /* RETROFLAT_SOFT_SHAPES */
    +
    4524
    +
    4525# ifdef RETROFLAT_OPENGL
    +
    4526 debug_printf( 1, "destroying GL glyphs..." );
    +
    4527 retroglu_destroy_glyph_tex();
    +
    4528# endif /* RETROFLAT_OPENGL */
    +
    4529
    +
    4530 /* === Platform-Specific Shutdown === */
    +
    4531
    +
    4532# if defined( RETROFLAT_OS_WASM )
    +
    4533 /* Do nothing, start the main loop later. */
    +
    4534 return;
    +
    4535
    +
    4536# elif defined( RETROFLAT_API_ALLEGRO )
    +
    4537
    +
    4538 /* == Allegro == */
    +
    4539
    +
    4540 if( RETROFLAT_ERROR_ENGINE != retval ) {
    +
    4541 clear_keybuf();
    +
    4542 }
    +
    4543
    +
    4544 retroflat_destroy_bitmap( &(g_retroflat_state->buffer) );
    +
    4545
    +
    4546# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    4547
    +
    4548 /* == SDL == */
    +
    4549
    +
    4550# ifndef RETROFLAT_API_SDL1
    +
    4551 SDL_DestroyWindow( g_retroflat_state->window );
    +
    4552# endif /* !RETROFLAT_API_SDL1 */
    +
    4553
    +
    4554 SDL_Quit();
    +
    4555
    +
    4556# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4557
    +
    4558 /* TODO: Windows shutdown? */
    +
    4559
    +
    4560 /* Stop frame timer if available. */
    +
    4561 if( NULL != g_retroflat_state->frame_iter ) {
    +
    4562 KillTimer( g_retroflat_state->window, RETROFLAT_WIN_FRAME_TIMER_ID );
    +
    4563 }
    +
    4564
    +
    4565 /* Stop loop timer if available. */
    +
    4566 if( NULL != g_retroflat_state->loop_iter ) {
    +
    4567 KillTimer( g_retroflat_state->window, RETROFLAT_WIN_LOOP_TIMER_ID );
    +
    4568 }
    +
    4569
    +
    4570 if( (HDC)NULL != g_retroflat_state->buffer.hdc_b ) {
    +
    4571 /* Return the default object into the HDC. */
    +
    4572 SelectObject(
    +
    4573 g_retroflat_state->buffer.hdc_b,
    +
    4574 g_retroflat_state->buffer.old_hbm_b );
    +
    4575 DeleteDC( g_retroflat_state->buffer.hdc_b );
    +
    4576 g_retroflat_state->buffer.hdc_b = (HDC)NULL;
    +
    4577
    +
    4578 /* Destroy buffer bitmap! */
    +
    4579 retroflat_destroy_bitmap( &(g_retroflat_state->buffer) );
    +
    4580 }
    +
    4581
    +
    4582# ifndef RETROFLAT_OPENGL
    +
    4583 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_BRRM )
    +
    4584 RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_WIN_PENRM )
    +
    4585# endif /* !RETROFLAT_OPENGL */
    +
    4586
    +
    4587# ifdef RETROFLAT_WING
    +
    4588 if( (HMODULE)NULL != g_w.module ) {
    +
    4589 FreeLibrary( g_w.module );
    +
    4590 }
    +
    4591# endif /* RETROFLAT_WING */
    +
    4592
    +
    4593 if( (HDC)NULL != g_retroflat_state->hdc_win ) {
    +
    4594 ReleaseDC( g_retroflat_state->window, g_retroflat_state->hdc_win );
    +
    4595 }
    +
    4596
    +
    4597# elif defined( RETROFLAT_API_GLUT )
    +
    4598
    +
    4599 /* TODO */
    +
    4600
    +
    4601# elif defined( RETROFLAT_API_PC_BIOS )
    +
    4602
    +
    4603 if( 0 != g_retroflat_state->old_video_mode ) {
    +
    4604 /* Restore old video mode. */
    +
    4605 debug_printf( 3, "restoring video mode 0x%02x...",
    +
    4606 g_retroflat_state->old_video_mode );
    +
    4607
    +
    4608 memset( &r, 0, sizeof( r ) );
    +
    4609 r.x.ax = g_retroflat_state->old_video_mode;
    +
    4610 int86( 0x10, &r, &r ); /* Call video interrupt. */
    +
    4611 }
    +
    4612
    +
    4613 if( NULL != g_retroflat_state->old_timer_interrupt ) {
    +
    4614 /* Re-install original interrupt handler. */
    +
    4615 debug_printf( 3, "restoring timer interrupt..." );
    +
    4616 _disable();
    +
    4617 segread( &s );
    +
    4618 r.h.al = 0x08;
    +
    4619 r.h.ah = 0x25;
    +
    4620 s.ds = FP_SEG( g_retroflat_state->old_timer_interrupt );
    +
    4621 r.x.dx = FP_OFF( g_retroflat_state->old_timer_interrupt );
    +
    4622 int86x( 0x21, &r, &r, &s );
    +
    4623 }
    +
    4624
    +
    4625 /* Reset timer chip resolution to 18.2...ms. */
    +
    4626 outp( 0x43, 0x36 );
    +
    4627 outp( 0x40, 0x00 );
    +
    4628 outp( 0x40, 0x00 );
    +
    4629
    +
    4630 _enable();
    +
    4631
    +
    4632# else
    +
    4633# pragma message( "warning: shutdown not implemented" )
    +
    4634# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 */
    +
    4635
    +
    4636 maug_munlock( g_retroflat_state_h, g_retroflat_state );
    +
    4637 maug_mfree( g_retroflat_state );
    +
    4638
    +
    4639}
    +
    4640
    +
    4641/* === */
    +
    4642
    +
    4643# ifdef RETROFLAT_VDP
    +
    4644
    +
    4645MERROR_RETVAL retroflat_vdp_call( const char* proc_name ) {
    +
    4646 MERROR_RETVAL retval = MERROR_OK;
    + +
    4648# ifdef RETROFLAT_OS_WIN
    +
    4649 char proc_name_ex[256];
    +
    4650# endif /* RETROFLAT_OS_WIN */
    +
    4651
    +
    4652 if( NULL == g_retroflat_state->vdp_exe ) {
    +
    4653 goto cleanup;
    +
    4654 }
    +
    4655
    +
    4656# ifdef RETROFLAT_OS_UNIX
    +
    4657 vdp_proc = dlsym( g_retroflat_state->vdp_exe, proc_name );
    +
    4658# elif defined( RETROFLAT_OS_WIN )
    +
    4659 /* Append a _ to the proc_name because Watcom? Windows? */
    +
    4660 maug_snprintf( proc_name_ex, 255, "%s_", proc_name );
    +
    4661 vdp_proc = (retroflat_vdp_proc_t)GetProcAddress(
    +
    4662 g_retroflat_state->vdp_exe, proc_name_ex );
    +
    4663# else
    +
    4664# error "dlsym undefined!"
    +
    4665# endif
    +
    4666 if( (retroflat_vdp_proc_t)NULL == vdp_proc ) {
    +
    4667 goto cleanup;
    +
    4668 }
    +
    4669
    +
    4670# ifdef RETROFLAT_OS_WIN
    +
    4671 retroflat_draw_lock( g_retroflat_state->vdp_buffer );
    +
    4672# endif /* RETROFLAT_OS_WIN */
    +
    4673
    +
    4674 if(
    +
    4675 /* Don't pxlock before init can set the flag! */
    +
    4676 0 == strcmp( "retroflat_vdp_flip", proc_name ) &&
    + +
    4678 (RETROFLAT_VDP_FLAG_PXLOCK & g_retroflat_state->vdp_flags)
    +
    4679 ) {
    +
    4680 retroflat_vdp_lock( &(g_retroflat_state->buffer) );
    +
    4681 retroflat_vdp_lock( g_retroflat_state->vdp_buffer );
    +
    4682 }
    +
    4683
    +
    4684 retval = vdp_proc( g_retroflat_state );
    +
    4685
    +
    4686 if(
    +
    4687 0 == strcmp( "retroflat_vdp_flip", proc_name ) &&
    + +
    4689 (RETROFLAT_VDP_FLAG_PXLOCK & g_retroflat_state->vdp_flags)
    +
    4690 ) {
    +
    4691 retroflat_vdp_release( &(g_retroflat_state->buffer) );
    +
    4692 retroflat_vdp_release( g_retroflat_state->vdp_buffer );
    +
    4693 }
    +
    4694
    +
    4695# ifdef RETROFLAT_OS_WIN
    +
    4696 retroflat_draw_release( g_retroflat_state->vdp_buffer );
    +
    4697# endif /* RETROFLAT_OS_WIN */
    +
    4698
    +
    4699cleanup:
    +
    4700 return retval;
    +
    4701}
    +
    4702
    +
    4703# endif /* RETROFLAT_VDP */
    +
    4704
    +
    4705/* === */
    +
    4706
    +
    4707void retroflat_set_title( const char* format, ... ) {
    +
    4708 char title[RETROFLAT_TITLE_MAX + 1];
    +
    4709 va_list vargs;
    +
    4710
    +
    4711 /* Build the title. */
    +
    4712 va_start( vargs, format );
    +
    4713 memset( title, '\0', RETROFLAT_TITLE_MAX + 1 );
    +
    4714 maug_vsnprintf( title, RETROFLAT_TITLE_MAX, format, vargs );
    +
    4715
    +
    4716#if defined( RETROFLAT_API_ALLEGRO )
    +
    4717 set_window_title( title );
    +
    4718#elif defined( RETROFLAT_API_SDL1 )
    +
    4719 SDL_WM_SetCaption( title, NULL );
    +
    4720#elif defined( RETROFLAT_API_SDL2 )
    +
    4721 SDL_SetWindowTitle( g_retroflat_state->window, title );
    +
    4722#elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4723 SetWindowText( g_retroflat_state->window, title );
    +
    4724#elif defined( RETROFLAT_API_LIBNDS )
    +
    4725 /* Do nothing. */
    +
    4726#elif defined( RETROFLAT_API_GLUT )
    +
    4727 glutSetWindowTitle( title );
    +
    4728#else
    +
    4729# pragma message( "warning: set title implemented" )
    +
    4730# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL */
    +
    4731
    +
    4732 va_end( vargs );
    +
    4733}
    +
    4734
    +
    4735/* === */
    +
    4736
    +
    4737retroflat_ms_t retroflat_get_ms() {
    +
    4738# if defined( RETROFLAT_API_ALLEGRO )
    +
    4739
    +
    4740 /* == Allegro == */
    +
    4741
    +
    4742 return g_ms;
    +
    4743
    +
    4744# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    4745
    +
    4746 /* == SDL == */
    +
    4747
    +
    4748 return SDL_GetTicks();
    +
    4749
    +
    4750# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4751
    +
    4752 return timeGetTime();
    +
    4753
    +
    4754# elif defined( RETROFLAT_API_LIBNDS )
    +
    4755
    +
    4756 /* == libNDS == */
    +
    4757
    +
    4758 return ((TIMER1_DATA * (1 << 16)) + TIMER0_DATA) / 32;
    +
    4759
    +
    4760# elif defined( RETROFLAT_API_GLUT )
    +
    4761
    +
    4762 /* == GLUT == */
    +
    4763
    +
    4764 return glutGet( GLUT_ELAPSED_TIME );
    +
    4765
    +
    4766# elif defined( RETROFLAT_API_PC_BIOS )
    +
    4767
    +
    4768 return g_ms;
    +
    4769
    +
    4770# else
    +
    4771# pragma message( "warning: get_ms not implemented" )
    +
    4772# endif /* RETROFLAT_API_* */
    +
    4773}
    +
    4774
    +
    4775/* === */
    +
    4776
    +
    4777uint32_t retroflat_get_rand() {
    +
    4778 return rand();
    +
    4779}
    +
    4780
    +
    4781/* === */
    +
    4782
    +
    4783int retroflat_draw_lock( struct RETROFLAT_BITMAP* bmp ) {
    +
    4784 int retval = RETROFLAT_OK;
    +
    4785
    +
    4786# if defined( RETROFLAT_OPENGL )
    +
    4787
    +
    4788 if(
    +
    4789 NULL != bmp &&
    +
    4790 &(g_retroflat_state->buffer) != bmp &&
    +
    4791 (MAUG_MHANDLE)NULL != bmp->tex.bytes_h
    +
    4792 ) {
    +
    4793 bmp->flags |= RETROFLAT_FLAGS_LOCK;
    +
    4794 maug_mlock( bmp->tex.bytes_h, bmp->tex.bytes );
    +
    4795 }
    +
    4796
    +
    4797# elif defined( RETROFLAT_API_ALLEGRO )
    +
    4798
    +
    4799 /* == Allegro == */
    +
    4800
    +
    4801 if( NULL != bmp ) {
    +
    4802 /* Normal bitmaps don't need to be locked in allegro. */
    +
    4803 goto cleanup;
    +
    4804 }
    +
    4805
    +
    4806 /* Lock screen for drawing if bmp is NULL. */
    +
    4807
    +
    4808# ifdef RETROFLAT_MOUSE
    +
    4809 /* XXX: Broken in DOS. */
    +
    4810 show_mouse( NULL ); /* Disable mouse before drawing. */
    +
    4811# endif
    +
    4812 acquire_screen();
    +
    4813
    +
    4814cleanup:
    +
    4815
    +
    4816# elif defined( RETROFLAT_API_SDL1 )
    +
    4817
    +
    4818 /* == SDL1 == */
    +
    4819
    +
    4820 /* SDL locking semantics are the opposite of every other platform. See
    +
    4821 * retroflat_px_lock() for a proxy to SDL_LockSurface().
    +
    4822 */
    +
    4823
    +
    4824 if( NULL == bmp || &(g_retroflat_state->buffer) == bmp ) {
    +
    4825 /* Special case: Attempting to lock the screen. */
    +
    4826 bmp = &(g_retroflat_state->buffer);
    +
    4827
    +
    4828 if(
    +
    4829 RETROFLAT_FLAGS_SCREEN_LOCK !=
    +
    4830 (RETROFLAT_FLAGS_SCREEN_LOCK & bmp->flags)
    +
    4831 ) {
    +
    4832 /* Do a perfunctory "screen lock" since programs are supposed to
    +
    4833 * lock the screen before doing any drawing.
    +
    4834 */
    +
    4835 bmp->flags |= RETROFLAT_FLAGS_SCREEN_LOCK;
    +
    4836
    +
    4837 } else {
    +
    4838 /* We actually want to lock the buffer for pixel manipulation. */
    +
    4839 assert( 0 == (RETROFLAT_FLAGS_LOCK & bmp->flags) );
    +
    4840 bmp->flags |= RETROFLAT_FLAGS_LOCK;
    +
    4841 }
    +
    4842
    +
    4843 } else {
    +
    4844 /* Locking a bitmap for pixel drawing. */
    +
    4845 assert( 0 == (RETROFLAT_FLAGS_LOCK & bmp->flags) );
    +
    4846 bmp->flags |= RETROFLAT_FLAGS_LOCK;
    +
    4847 }
    +
    4848
    +
    4849# elif defined( RETROFLAT_API_SDL2 )
    +
    4850
    +
    4851 /* == SDL2 == */
    +
    4852
    +
    4853 if(
    +
    4854 NULL == bmp
    +
    4855# ifdef RETROFLAT_VDP
    +
    4856 && NULL == g_retroflat_state->vdp_buffer
    +
    4857# endif /* RETROFLAT_VDP */
    +
    4858 ) {
    +
    4859
    +
    4860 /* Target is the screen buffer. */
    +
    4861 SDL_SetRenderTarget(
    +
    4862 g_retroflat_state->buffer.renderer,
    +
    4863 g_retroflat_state->buffer.texture );
    +
    4864
    +
    4865 goto cleanup;
    +
    4866
    +
    4867# ifdef RETROFLAT_VDP
    +
    4868 } else if( NULL == bmp && NULL != g_retroflat_state->vdp_buffer ) {
    +
    4869 /* Lock the VDP buffer for drawing. */
    +
    4870 bmp = g_retroflat_state->vdp_buffer;
    +
    4871# endif /* RETROFLAT_VDP */
    +
    4872 }
    +
    4873
    +
    4874 assert( NULL == bmp->renderer );
    +
    4875 assert( NULL != bmp->surface );
    +
    4876 bmp->renderer = SDL_CreateSoftwareRenderer( bmp->surface );
    +
    4877
    +
    4878cleanup:
    +
    4879
    +
    4880# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4881
    +
    4882 /* == Win16/Win32 == */
    +
    4883
    +
    4884 if( NULL == bmp ) {
    +
    4885# ifdef RETROFLAT_VDP
    +
    4886 if( NULL != g_retroflat_state->vdp_buffer ) {
    +
    4887 bmp = g_retroflat_state->vdp_buffer;
    +
    4888 } else {
    +
    4889# endif
    +
    4890
    +
    4891 /* TODO: Reconcile with VDP! */
    +
    4892 /* The HDC should be created already by WndProc. */
    +
    4893 assert( (HDC)NULL != g_retroflat_state->buffer.hdc_b );
    +
    4894 goto cleanup;
    +
    4895
    +
    4896# ifdef RETROFLAT_VDP
    +
    4897 }
    +
    4898# endif /* RETROFLAT_VDP */
    +
    4899 }
    +
    4900
    +
    4901 /* Sanity check. */
    +
    4902 assert( (HBITMAP)NULL != bmp->b );
    +
    4903 assert( (HDC)NULL == bmp->hdc_b );
    +
    4904
    +
    4905 /* Create HDC for source bitmap compatible with the buffer. */
    +
    4906 bmp->hdc_b = CreateCompatibleDC( (HDC)NULL );
    +
    4907 maug_cleanup_if_null( HDC, bmp->hdc_b, RETROFLAT_ERROR_BITMAP );
    +
    4908
    +
    4909 if( (HBITMAP)NULL != bmp->mask ) {
    +
    4910 /* Create HDC for source mask compatible with the buffer. */
    +
    4911 bmp->hdc_mask = CreateCompatibleDC( (HDC)NULL );
    +
    4912 maug_cleanup_if_null( HDC, bmp->hdc_mask, RETROFLAT_ERROR_BITMAP );
    +
    4913 }
    +
    4914
    +
    4915 /* Select bitmaps into their HDCs. */
    +
    4916 bmp->old_hbm_b = SelectObject( bmp->hdc_b, bmp->b );
    +
    4917 if( (HBITMAP)NULL != bmp->mask ) {
    +
    4918 bmp->old_hbm_mask = SelectObject( bmp->hdc_mask, bmp->mask );
    +
    4919 }
    +
    4920
    +
    4921cleanup:
    +
    4922
    +
    4923# else
    +
    4924# pragma message( "warning: draw lock not implemented" )
    +
    4925# endif /* RETROFLAT_API_ALLEGRO */
    +
    4926
    +
    4927 return retval;
    +
    4928}
    +
    4929
    +
    4930/* === */
    +
    4931
    +
    4932MERROR_RETVAL retroflat_draw_release( struct RETROFLAT_BITMAP* bmp ) {
    +
    4933 MERROR_RETVAL retval = MERROR_OK;
    +
    4934
    +
    4935# ifdef RETROFLAT_OPENGL
    +
    4936 if( NULL == bmp || &(g_retroflat_state->buffer) == bmp ) {
    +
    4937 /* Flush GL buffer and swap screen buffers. */
    +
    4938 glFlush();
    +
    4939
    +
    4940# if defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    4941 SDL_GL_SwapBuffers();
    +
    4942# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    4943 SwapBuffers( g_retroflat_state->hdc_win );
    +
    4944# elif defined( RETROFLAT_API_GLUT )
    +
    4945 glutSwapBuffers();
    +
    4946# endif
    +
    4947 } else if( retroflat_bitmap_locked( bmp ) ) {
    +
    4948 bmp->flags &= ~RETROFLAT_FLAGS_LOCK;
    +
    4949#ifndef RETROGLU_NO_TEXTURES
    +
    4950 assert( 0 < bmp->tex.id );
    +
    4951 assert( NULL != bmp->tex.bytes );
    +
    4952
    +
    4953 /* Update stored texture if it exists. */
    +
    4954 glBindTexture( GL_TEXTURE_2D, bmp->tex.id );
    +
    4955 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, bmp->tex.w, bmp->tex.h, 0,
    +
    4956 GL_RGBA, GL_UNSIGNED_BYTE, bmp->tex.bytes );
    +
    4957 glBindTexture( GL_TEXTURE_2D, 0 );
    +
    4958#endif /* !RETROGLU_NO_TEXTURES */
    +
    4959
    +
    4960 /* Unlock texture bitmap. */
    +
    4961 maug_munlock( bmp->tex.bytes_h, bmp->tex.bytes );
    +
    4962 }
    +
    4963
    +
    4964# elif defined( RETROFLAT_API_ALLEGRO )
    +
    4965
    +
    4966 /* == Allegro == */
    +
    4967
    +
    4968 if( NULL != bmp ) {
    +
    4969 /* Don't need to lock bitmaps in Allegro. */
    +
    4970 goto cleanup;
    +
    4971 }
    +
    4972
    +
    4973 /* Flip the buffer. */
    +
    4974 blit( g_retroflat_state->buffer.b, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H );
    +
    4975
    +
    4976 /* Release the screen. */
    +
    4977 release_screen();
    +
    4978# ifdef RETROFLAT_MOUSE
    +
    4979 /* XXX: Broken in DOS. */
    +
    4980 show_mouse( screen ); /* Enable mouse after drawing. */
    +
    4981# endif /* RETROFLAT_MOUSE */
    +
    4982 vsync();
    +
    4983
    +
    4984cleanup:
    +
    4985# elif defined( RETROFLAT_API_SDL1 )
    +
    4986
    +
    4987 /* == SDL1 == */
    +
    4988
    +
    4989 if( NULL == bmp || &(g_retroflat_state->buffer) == bmp ) {
    +
    4990 /* Special case: Attempting to release the (real, non-VDP) screen. */
    +
    4991 bmp = &(g_retroflat_state->buffer);
    +
    4992
    +
    4993 if(
    +
    4994 RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & bmp->flags)
    +
    4995 ) {
    +
    4996 /* The screen was locked for pixel manipulation. */
    +
    4997 bmp->flags &= ~RETROFLAT_FLAGS_LOCK;
    +
    4998 SDL_UnlockSurface( bmp->surface );
    +
    4999
    +
    5000 } else {
    +
    5001 assert(
    +
    5002 RETROFLAT_FLAGS_SCREEN_LOCK ==
    +
    5003 (RETROFLAT_FLAGS_SCREEN_LOCK & bmp->flags) );
    +
    5004 bmp->flags &= ~RETROFLAT_FLAGS_SCREEN_LOCK;
    +
    5005
    +
    5006# if defined( RETROFLAT_VDP )
    +
    5007 retroflat_vdp_call( "retroflat_vdp_flip" );
    +
    5008# endif /* RETROFLAT_VDP */
    +
    5009
    +
    5010 SDL_Flip( bmp->surface );
    +
    5011 }
    +
    5012
    +
    5013 } else {
    +
    5014 /* Releasing a bitmap. */
    +
    5015 assert( RETROFLAT_FLAGS_LOCK == (RETROFLAT_FLAGS_LOCK & bmp->flags) );
    +
    5016 bmp->flags &= ~RETROFLAT_FLAGS_LOCK;
    +
    5017 SDL_UnlockSurface( bmp->surface );
    +
    5018 }
    +
    5019
    +
    5020# elif defined( RETROFLAT_API_SDL2 )
    +
    5021
    +
    5022 /* == SDL2 == */
    +
    5023
    +
    5024 if(
    +
    5025 NULL == bmp
    +
    5026# ifdef RETROFLAT_VDP
    +
    5027 && NULL == g_retroflat_state->vdp_buffer
    +
    5028# endif /* RETROFLAT_VDP */
    +
    5029 ) {
    +
    5030 /* Flip the screen. */
    +
    5031 SDL_SetRenderTarget( g_retroflat_state->buffer.renderer, NULL );
    +
    5032 SDL_RenderCopyEx(
    +
    5033 g_retroflat_state->buffer.renderer,
    +
    5034 g_retroflat_state->buffer.texture, NULL, NULL, 0, NULL, 0 );
    +
    5035 SDL_RenderPresent( g_retroflat_state->buffer.renderer );
    +
    5036
    +
    5037 goto cleanup;
    +
    5038
    +
    5039# ifdef RETROFLAT_VDP
    +
    5040 } else if( NULL == bmp && NULL != g_retroflat_state->vdp_buffer ) {
    +
    5041 bmp = g_retroflat_state->vdp_buffer;
    +
    5042# endif /* RETROFLAT_VDP */
    +
    5043 }
    +
    5044
    +
    5045 /* It's a bitmap. */
    +
    5046
    +
    5047 /* Scrap the software renderer. */
    +
    5048 SDL_RenderPresent( bmp->renderer );
    +
    5049 SDL_DestroyRenderer( bmp->renderer );
    +
    5050 bmp->renderer = NULL;
    +
    5051
    +
    5052 /* Scrap the old texture and recreate it from the updated surface. */
    +
    5053 /* The renderer should be a software renderer pointing to the surface,
    +
    5054 * created in retroflat_lock() above.
    +
    5055 */
    +
    5056 assert( NULL != bmp->texture );
    +
    5057 SDL_DestroyTexture( bmp->texture );
    +
    5058 bmp->texture = SDL_CreateTextureFromSurface(
    +
    5059 g_retroflat_state->buffer.renderer, bmp->surface );
    +
    5060 maug_cleanup_if_null(
    +
    5061 SDL_Texture*, bmp->texture, RETROFLAT_ERROR_BITMAP );
    +
    5062
    +
    5063cleanup:
    +
    5064# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5065
    +
    5066 /* == Win16/Win32 == */
    +
    5067
    +
    5068 if( NULL == bmp ) {
    +
    5069 /* Trigger a screen refresh if this was a screen lock. */
    +
    5070 if( (HWND)NULL != g_retroflat_state->window ) {
    +
    5071 InvalidateRect( g_retroflat_state->window, 0, TRUE );
    +
    5072 }
    +
    5073
    +
    5074# ifdef RETROFLAT_VDP
    +
    5075 if( NULL != g_retroflat_state->vdp_buffer ) {
    +
    5076 bmp = g_retroflat_state->vdp_buffer;
    +
    5077 } else {
    +
    5078# endif
    +
    5079
    +
    5080 /* TODO: Reconcile with VDP! */
    +
    5081 goto cleanup;
    +
    5082
    +
    5083# ifdef RETROFLAT_VDP
    +
    5084 }
    +
    5085# endif
    +
    5086 }
    +
    5087
    +
    5088 /* Unlock the bitmap. */
    +
    5089 if( (HDC)NULL != bmp->hdc_b ) {
    +
    5090 SelectObject( bmp->hdc_b, bmp->old_hbm_b );
    +
    5091 DeleteDC( bmp->hdc_b );
    +
    5092 bmp->hdc_b = (HDC)NULL;
    +
    5093 bmp->old_hbm_b = (HBITMAP)NULL;
    +
    5094 }
    +
    5095
    +
    5096 /* Unlock the mask. */
    +
    5097 if( (HDC)NULL != bmp->hdc_mask ) {
    +
    5098 SelectObject( bmp->hdc_mask, bmp->old_hbm_mask );
    +
    5099 DeleteDC( bmp->hdc_mask );
    +
    5100 bmp->hdc_mask = (HDC)NULL;
    +
    5101 bmp->old_hbm_mask = (HBITMAP)NULL;
    +
    5102 }
    +
    5103
    +
    5104cleanup:
    +
    5105
    +
    5106# else
    +
    5107# pragma message( "warning: draw release not implemented" )
    +
    5108# endif /* RETROFLAT_API_ALLEGRO */
    +
    5109
    +
    5110 return retval;
    +
    5111}
    +
    5112
    +
    5113/* === */
    +
    5114
    +
    5115# if (defined( RETROFLAT_API_WIN16 ) || \
    +
    5116 defined (RETROFLAT_API_WIN32 )) && \
    +
    5117 !defined( RETROFLAT_OPENGL )
    +
    5118
    +
    5119static int retroflat_bitmap_win_transparency(
    +
    5120 struct RETROFLAT_BITMAP* bmp_out, int16_t w, int16_t h
    +
    5121) {
    +
    5122 int retval = RETROFLAT_OK;
    +
    5123 unsigned long txp_color = 0;
    +
    5124
    +
    5125 /* Setup bitmap transparency mask. */
    +
    5126 bmp_out->mask = CreateBitmap( w, h, 1, 1, NULL );
    +
    5127 maug_cleanup_if_null( HBITMAP, bmp_out->mask, RETROFLAT_ERROR_BITMAP );
    +
    5128
    +
    5129 retval = retroflat_draw_lock( bmp_out );
    +
    5130 maug_cleanup_if_not_ok();
    +
    5131
    +
    5132 /* Convert the color key into bitmap format. */
    +
    5133 txp_color |= (RETROFLAT_TXP_B & 0xff);
    +
    5134 txp_color <<= 8;
    +
    5135 txp_color |= (RETROFLAT_TXP_G & 0xff);
    +
    5136 txp_color <<= 8;
    +
    5137 txp_color |= (RETROFLAT_TXP_R & 0xff);
    +
    5138 SetBkColor( bmp_out->hdc_b, txp_color );
    +
    5139
    +
    5140 /* Create the mask from the color key. */
    +
    5141 BitBlt(
    +
    5142 bmp_out->hdc_mask, 0, 0, w, h, bmp_out->hdc_b, 0, 0, SRCCOPY );
    +
    5143 BitBlt(
    +
    5144 bmp_out->hdc_b, 0, 0, w, h, bmp_out->hdc_mask, 0, 0, SRCINVERT );
    +
    5145
    +
    5146cleanup:
    +
    5147
    +
    5148 if( RETROFLAT_OK == retval ) {
    +
    5149 retroflat_draw_release( bmp_out );
    +
    5150 }
    +
    5151
    +
    5152 return retval;
    +
    5153}
    +
    5154
    +
    5155# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5156
    +
    5157static MERROR_RETVAL retroflat_bitmap_dos_transparency(
    +
    5158 struct RETROFLAT_BITMAP* bmp_out
    +
    5159) {
    +
    5160 MERROR_RETVAL retval = MERROR_OK;
    +
    5161 size_t i = 0;
    +
    5162
    +
    5163 switch( g_retroflat_state->screen_mode ) {
    +
    5164 case RETROFLAT_SCREEN_MODE_VGA:
    +
    5165
    +
    5166 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5167 "creating transparency mask for bitmap..." );
    +
    5168
    +
    5169 /* Create a transparency mask based on palette 0. */
    +
    5170 bmp_out->mask = _fcalloc( bmp_out->w, bmp_out->h );
    +
    5171 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->mask );
    +
    5172 /* XXX: Wrong sz field! */
    +
    5173 for( i = 0 ; bmp_out->sz > i ; i++ ) {
    +
    5174 if( RETROFLAT_TXP_PAL_IDX == bmp_out->px[i] ) {
    +
    5175 bmp_out->mask[i] = 0xff;
    +
    5176 } else {
    +
    5177 bmp_out->mask[i] = 0x00;
    +
    5178 }
    +
    5179 }
    +
    5180 break;
    +
    5181 }
    +
    5182
    +
    5183cleanup:
    +
    5184 return retval;
    +
    5185}
    +
    5186
    +
    5187# endif /* RETROFLAT_API_WIN16 ||
    +
    5188 RETROFLAT_API_WIN32 ||
    +
    5189 RETROFLAT_API_PC_BIOS */
    +
    5190
    + +
    5192 const char* filename, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags
    +
    5193) {
    +
    5194 char filename_path[RETROFLAT_PATH_MAX + 1];
    +
    5195 int retval = MERROR_OK;
    +
    5196# if defined( RETROFLAT_OPENGL )
    +
    5197 mfile_t bmp_file;
    +
    5198 struct MFMT_STRUCT_BMPFILE header_bmp;
    +
    5199 MAUG_MHANDLE bmp_palette_h = (MAUG_MHANDLE)NULL;
    +
    5200 uint32_t bmp_color = 0;
    +
    5201 uint32_t* bmp_palette = NULL;
    +
    5202 MAUG_MHANDLE bmp_px_h = (MAUG_MHANDLE)NULL;
    +
    5203 uint8_t* bmp_px = NULL;
    +
    5204 off_t bmp_px_sz = 0;
    +
    5205 uint8_t bmp_r = 0,
    +
    5206 bmp_g = 0,
    +
    5207 bmp_b = 0,
    +
    5208 bmp_color_idx = 0,
    +
    5209 bmp_flags = 0;
    +
    5210 size_t i = 0;
    +
    5211# elif defined( RETROFLAT_API_SDL1 )
    +
    5212 SDL_Surface* tmp_surface = NULL;
    +
    5213# elif defined( RETROFLAT_API_WIN16 ) || defined (RETROFLAT_API_WIN32 )
    +
    5214# if defined( RETROFLAT_API_WIN16 )
    +
    5215 char* buf = NULL;
    +
    5216 mfile_t bmp_file;
    +
    5217 long int i, x, y, w, h, colors, offset, sz, read;
    +
    5218# elif defined( RETROFLAT_API_WIN32 )
    +
    5219 BITMAP bm;
    +
    5220# endif /* RETROFLAT_API_WIN32 */
    +
    5221# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5222 mfile_t bmp_file;
    +
    5223 struct MFMT_STRUCT_BMPFILE header_bmp;
    +
    5224 MAUG_MHANDLE bmp_palette_h = (MAUG_MHANDLE)NULL;
    +
    5225 uint32_t bmp_color = 0;
    +
    5226 uint8_t bmp_flags = 0;
    +
    5227 off_t bmp_px_sz = 0;
    +
    5228 size_t i = 0;
    +
    5229
    +
    5230# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5231
    +
    5232 assert( NULL != bmp_out );
    +
    5233
    +
    5234 maug_mzero( bmp_out, sizeof( struct RETROFLAT_BITMAP ) );
    +
    5235
    +
    5236 /* Build the path to the bitmap. */
    +
    5237 memset( filename_path, '\0', RETROFLAT_PATH_MAX + 1 );
    +
    5238 if(
    + + +
    5241 ) {
    +
    5242 maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s", filename );
    +
    5243 } else {
    +
    5244 maug_snprintf( filename_path, RETROFLAT_PATH_MAX, "%s%c%s.%s",
    +
    5245 g_retroflat_state->assets_path, RETROFLAT_PATH_SEP,
    +
    5246 filename, RETROFLAT_BITMAP_EXT );
    +
    5247 }
    +
    5248
    +
    5249 debug_printf( 1, "retroflat: loading bitmap: %s", filename_path );
    +
    5250
    +
    5251# ifdef RETROFLAT_OPENGL
    +
    5252
    +
    5253 retval = mfile_open_read( filename_path, &bmp_file );
    +
    5254 maug_cleanup_if_not_ok();
    +
    5255
    +
    5256 /* TODO: mfmt file detection system. */
    +
    5257 header_bmp.magic[0] = 'B';
    +
    5258 header_bmp.magic[1] = 'M';
    +
    5259 header_bmp.info.sz = 40;
    +
    5260
    +
    5261 retval = mfmt_read_bmp_header(
    +
    5262 (struct MFMT_STRUCT*)&header_bmp,
    +
    5263 &bmp_file, 0, mfile_get_sz( &bmp_file ), &bmp_flags );
    +
    5264 maug_cleanup_if_not_ok();
    +
    5265
    +
    5266 assert( 0 < mfile_get_sz( &bmp_file ) );
    +
    5267
    +
    5268 /* Setup bitmap options from header. */
    +
    5269 bmp_out->tex.w = header_bmp.info.width;
    +
    5270 bmp_out->tex.h = header_bmp.info.height;
    +
    5271 bmp_out->tex.sz = bmp_out->tex.w * bmp_out->tex.h * 4;
    +
    5272 bmp_out->tex.bpp = 24;
    +
    5273
    +
    5274 /* Allocate a space for the bitmap palette. */
    +
    5275 bmp_palette_h = maug_malloc( 4, header_bmp.info.palette_ncolors );
    +
    5276 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_palette_h );
    +
    5277
    +
    5278 maug_mlock( bmp_palette_h, bmp_palette );
    +
    5279 maug_cleanup_if_null_alloc( uint32_t*, bmp_palette );
    +
    5280
    +
    5281 retval = mfmt_read_bmp_palette(
    +
    5282 (struct MFMT_STRUCT*)&header_bmp,
    +
    5283 bmp_palette, 4 * header_bmp.info.palette_ncolors,
    +
    5284 &bmp_file, 54 /* TODO */, mfile_get_sz( &bmp_file ) - 54, bmp_flags );
    +
    5285 maug_cleanup_if_not_ok();
    +
    5286
    +
    5287 /* Allocate a space for the bitmap pixels. */
    +
    5288 bmp_px_sz = header_bmp.info.width * header_bmp.info.height;
    +
    5289 bmp_px_h = maug_malloc( 1, bmp_px_sz );
    +
    5290 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_px_h );
    +
    5291
    +
    5292 maug_mlock( bmp_px_h, bmp_px );
    +
    5293 maug_cleanup_if_null_alloc( uint8_t*, bmp_px );
    +
    5294
    +
    5295 retval = mfmt_read_bmp_px(
    +
    5296 (struct MFMT_STRUCT*)&header_bmp,
    +
    5297 bmp_px, bmp_px_sz,
    +
    5298 &bmp_file, header_bmp.px_offset,
    +
    5299 mfile_get_sz( &bmp_file ) - header_bmp.px_offset, bmp_flags );
    +
    5300 maug_cleanup_if_not_ok();
    +
    5301
    +
    5302 /* Allocate buffer for unpacking. */
    +
    5303 debug_printf( 0, "creating bitmap: " SIZE_T_FMT " x " SIZE_T_FMT,
    +
    5304 bmp_out->tex.w, bmp_out->tex.h );
    +
    5305 bmp_out->tex.bytes_h = maug_malloc( bmp_out->tex.w * bmp_out->tex.h, 4 );
    +
    5306 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_out->tex.bytes_h );
    +
    5307
    +
    5308 maug_mlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5309 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->tex.bytes );
    +
    5310
    +
    5311 /* Unpack palletized bitmap into BGRA with color key. */
    +
    5312 for( i = 0 ; bmp_px_sz > i ; i++ ) {
    +
    5313 if( bmp_px_sz - i - 1 > bmp_px_sz ) {
    +
    5314 error_printf(
    +
    5315 "pixel overflow! (" SIZE_T_FMT " of " SIZE_T_FMT " bytes!)",
    +
    5316 bmp_px_sz - i - 1, bmp_px_sz );
    +
    5317 retval = MERROR_OVERFLOW;
    +
    5318 goto cleanup;
    +
    5319 }
    +
    5320
    +
    5321 /* Grab the color from the palette by index. */
    +
    5322 bmp_color_idx = bmp_px[bmp_px_sz - i - 1]; /* Reverse image. */
    +
    5323 if( bmp_color_idx >= header_bmp.info.palette_ncolors ) {
    +
    5324 error_printf(
    +
    5325 "invalid color at px " SIZE_T_FMT ": %02x",
    +
    5326 bmp_px_sz - i - 1, bmp_color_idx );
    +
    5327 continue;
    +
    5328 }
    +
    5329 bmp_color = bmp_palette[bmp_color_idx];
    +
    5330 bmp_r = (bmp_color >> 16) & 0xff;
    +
    5331 bmp_g = (bmp_color >> 8) & 0xff;
    +
    5332 bmp_b = bmp_color & 0xff;
    +
    5333
    +
    5334 bmp_out->tex.bytes[i * 4] = bmp_r;
    +
    5335 bmp_out->tex.bytes[(i * 4) + 1] = bmp_g;
    +
    5336 bmp_out->tex.bytes[(i * 4) + 2] = bmp_b;
    +
    5337 if(
    + +
    5339 RETROFLAT_TXP_R == bmp_r &&
    +
    5340 RETROFLAT_TXP_G == bmp_g &&
    +
    5341 RETROFLAT_TXP_B == bmp_b
    +
    5342 ) {
    +
    5343 /* Transparent pixel found. */
    +
    5344 bmp_out->tex.bytes[(i * 4) + 3] = 0x00;
    +
    5345 } else {
    +
    5346 bmp_out->tex.bytes[(i * 4) + 3] = 0xff;
    +
    5347 }
    +
    5348 }
    +
    5349
    +
    5350#ifndef RETROGLU_NO_TEXTURES
    +
    5351 glGenTextures( 1, (GLuint*)&(bmp_out->tex.id) );
    +
    5352 glBindTexture( GL_TEXTURE_2D, bmp_out->tex.id );
    +
    5353 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, bmp_out->tex.w, bmp_out->tex.h, 0,
    +
    5354 GL_RGBA, GL_UNSIGNED_BYTE, bmp_out->tex.bytes );
    +
    5355 glBindTexture( GL_TEXTURE_2D, 0 );
    +
    5356#endif /* !RETROGLU_NO_TEXTURES */
    +
    5357
    +
    5358cleanup:
    +
    5359
    +
    5360 if( NULL != bmp_out->tex.bytes ) {
    +
    5361 maug_munlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5362 }
    +
    5363
    +
    5364 if( NULL != bmp_px ) {
    +
    5365 maug_munlock( bmp_px_h, bmp_px );
    +
    5366 }
    +
    5367
    +
    5368 if( NULL != bmp_px_h ) {
    +
    5369 maug_mfree( bmp_px_h );
    +
    5370 }
    +
    5371
    +
    5372 if( NULL != bmp_palette ) {
    +
    5373 maug_munlock( bmp_palette_h, bmp_palette );
    +
    5374 }
    +
    5375
    +
    5376 if( NULL != bmp_palette_h ) {
    +
    5377 maug_mfree( bmp_palette_h );
    +
    5378 }
    +
    5379
    +
    5380 mfile_close( &bmp_file );
    +
    5381
    +
    5382# elif defined( RETROFLAT_API_ALLEGRO )
    +
    5383
    +
    5384 /* == Allegro == */
    +
    5385
    +
    5386 bmp_out->b = load_bitmap( filename_path, NULL );
    +
    5387 if( NULL == bmp_out->b ) {
    +
    5388 allegro_message( "unable to load %s", filename_path );
    +
    5389 retval = RETROFLAT_ERROR_BITMAP;
    +
    5390 }
    +
    5391
    +
    5392# elif defined( RETROFLAT_API_SDL1 )
    +
    5393
    +
    5394 /* == SDL1 == */
    +
    5395
    +
    5396 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5397 "loading bitmap: %s", filename_path );
    +
    5398
    +
    5399 tmp_surface = SDL_LoadBMP( filename_path ); /* Free stream on close. */
    +
    5400 if( NULL == tmp_surface ) {
    + +
    5402 "Error", "SDL unable to load bitmap: %s", SDL_GetError() );
    +
    5403 retval = 0;
    +
    5404 goto cleanup;
    +
    5405 }
    +
    5406
    +
    5407 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5408 "loaded bitmap: %d x %d", tmp_surface->w, tmp_surface->h );
    +
    5409
    +
    5410 bmp_out->surface = SDL_DisplayFormat( tmp_surface );
    +
    5411 if( NULL == bmp_out->surface ) {
    + +
    5413 "Error", "SDL unable to load bitmap: %s", SDL_GetError() );
    +
    5414 retval = RETROFLAT_ERROR_BITMAP;
    +
    5415 goto cleanup;
    +
    5416 }
    +
    5417
    +
    5418 debug_printf( RETROFLAT_BITMAP_TRACE_LVL, "converted bitmap: %d x %d",
    +
    5419 bmp_out->surface->w, bmp_out->surface->h );
    +
    5420
    +
    5421 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5422 SDL_MapRGB( bmp_out->surface->format,
    + +
    5424
    +
    5425cleanup:
    +
    5426
    +
    5427 if( NULL != tmp_surface ) {
    +
    5428 SDL_FreeSurface( tmp_surface );
    +
    5429 }
    +
    5430
    +
    5431# elif defined( RETROFLAT_API_SDL2 )
    +
    5432
    +
    5433 /* == SDL2 == */
    +
    5434
    +
    5435 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5436 "loading bitmap: %s", filename_path );
    +
    5437
    +
    5438 bmp_out->renderer = NULL;
    +
    5439
    +
    5440 bmp_out->surface = SDL_LoadBMP( filename_path );
    +
    5441 if( NULL == bmp_out->surface ) {
    + +
    5443 "Error", "SDL unable to load bitmap: %s", SDL_GetError() );
    +
    5444 retval = RETROFLAT_ERROR_BITMAP;
    +
    5445 goto cleanup;
    +
    5446 }
    +
    5447
    + +
    5449 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5450 SDL_MapRGB( bmp_out->surface->format,
    + +
    5452 }
    +
    5453
    +
    5454 bmp_out->texture = SDL_CreateTextureFromSurface(
    +
    5455 g_retroflat_state->buffer.renderer, bmp_out->surface );
    +
    5456 if( NULL == bmp_out->texture ) {
    + +
    5458 "Error", "SDL unable to create texture: %s", SDL_GetError() );
    +
    5459 retval = RETROFLAT_ERROR_BITMAP;
    +
    5460 if( NULL != bmp_out->surface ) {
    +
    5461 SDL_FreeSurface( bmp_out->surface );
    +
    5462 bmp_out->surface = NULL;
    +
    5463 }
    +
    5464 goto cleanup;
    +
    5465 }
    +
    5466
    +
    5467 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5468 "successfully loaded bitmap: %s", filename_path );
    +
    5469
    +
    5470cleanup:
    +
    5471
    +
    5472# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5473
    +
    5474# if defined( RETROFLAT_API_WIN16 )
    +
    5475
    +
    5476 /* Win16 has a bunch of extra involved steps for getting a bitmap from
    +
    5477 * disk. These cause a crash in Win32.
    +
    5478 */
    +
    5479
    +
    5480 /* == Win16 == */
    +
    5481
    +
    5482 /* Load the bitmap file from disk. */
    +
    5483 retval = mfile_open_read( filename_path, &bmp_file );
    +
    5484 maug_cleanup_if_not_ok();
    +
    5485
    +
    5486 buf = calloc( mfile_get_sz( &bmp_file ), 1 );
    +
    5487 maug_cleanup_if_null_alloc( char*, buf );
    +
    5488
    +
    5489 /*
    +
    5490 read = fread( buf, 1, sz, bmp_file );
    +
    5491 assert( read == sz );
    +
    5492 */
    +
    5493 retval = mfile_read_block( &bmp_file, buf, mfile_get_sz( &bmp_file ) );
    +
    5494 maug_cleanup_if_not_ok();
    +
    5495
    +
    5496 /* Read bitmap properties from header offsets. */
    +
    5497 retval = bmp_file.seek( &bmp_file, 10 );
    +
    5498 maug_cleanup_if_not_ok();
    +
    5499 retval = bmp_file.read_int( &bmp_file,
    +
    5500 (uint8_t*)&offset, 4, MFILE_READ_FLAG_LSBF );
    +
    5501 maug_cleanup_if_not_ok();
    +
    5502
    +
    5503 retval = bmp_file.seek( &bmp_file, 46 );
    +
    5504 maug_cleanup_if_not_ok();
    +
    5505 retval = bmp_file.read_int( &bmp_file,
    +
    5506 (uint8_t*)&colors, 4, MFILE_READ_FLAG_LSBF );
    +
    5507 maug_cleanup_if_not_ok();
    +
    5508
    +
    5509 /* Avoid a color overflow. */
    +
    5510 if(
    +
    5511 sizeof( BITMAPFILEHEADER ) +
    +
    5512 sizeof( BITMAPINFOHEADER ) +
    +
    5513 (colors * sizeof( RGBQUAD )) > sz
    +
    5514 ) {
    + +
    5516 "Error",
    +
    5517 "Attempted to load bitmap with too many colors!" );
    +
    5518 retval = MERROR_FILE;
    +
    5519 goto cleanup;
    +
    5520 }
    +
    5521
    +
    5522 memcpy( &(bmp_out->bmi),
    +
    5523 &(buf[sizeof( BITMAPFILEHEADER )]),
    +
    5524 /* SetDIBits needs the color palette! */
    +
    5525 /* TODO: Sync with state palette? */
    +
    5526 sizeof( BITMAPINFOHEADER ) + (colors * sizeof( RGBQUAD )) );
    +
    5527
    +
    5528 /* This never gets the height right? */
    +
    5529 debug_printf( 1, "bitmap w: %08x, h: %08x, colors: %d",
    +
    5530 bmp_out->bmi.header.biWidth, bmp_out->bmi.header.biHeight, colors );
    +
    5531
    +
    5532 assert( 0 < bmp_out->bmi.header.biWidth );
    +
    5533 assert( 0 < bmp_out->bmi.header.biHeight );
    +
    5534 assert( 0 == bmp_out->bmi.header.biWidth % 8 );
    +
    5535 assert( 0 == bmp_out->bmi.header.biHeight % 8 );
    +
    5536
    +
    5537 bmp_out->b = CreateCompatibleBitmap( g_retroflat_state->hdc_win,
    +
    5538 bmp_out->bmi.header.biWidth, bmp_out->bmi.header.biHeight );
    +
    5539 maug_cleanup_if_null( HBITMAP, bmp_out->b, RETROFLAT_ERROR_BITMAP );
    +
    5540
    +
    5541 /* Turn the bits into a bitmap. */
    +
    5542 SetDIBits( g_retroflat_state->hdc_win, bmp_out->b, 0,
    +
    5543 bmp_out->bmi.header.biHeight, &(buf[offset]),
    +
    5544 (BITMAPINFO*)&(bmp_out->bmi),
    +
    5545 DIB_RGB_COLORS );
    +
    5546
    + +
    5548 retval = retroflat_bitmap_win_transparency( bmp_out,
    +
    5549 bmp_out->bmi.header.biWidth, bmp_out->bmi.header.biHeight );
    +
    5550 }
    +
    5551
    +
    5552# else
    +
    5553
    +
    5554 /* Win32 greatly simplifies the loading portion. */
    +
    5555
    +
    5556 /* == Win32 == */
    +
    5557
    +
    5558# ifdef RETROFLAT_API_WINCE
    +
    5559 bmp_out->b = SHLoadDIBitmap( filename_path );
    +
    5560# else
    +
    5561 bmp_out->b = LoadImage(
    +
    5562 NULL, filename_path, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE );
    +
    5563# endif /* RETROFLAT_API_WINCE */
    +
    5564 maug_cleanup_if_null_msg(
    +
    5565 HBITMAP, bmp_out->b, MERROR_FILE, "failed to open FILE!" )
    +
    5566
    +
    5567 GetObject( bmp_out->b, sizeof( BITMAP ), &bm );
    +
    5568
    +
    5569 bmp_out->bmi.header.biSize = sizeof( BITMAPINFOHEADER );
    +
    5570 bmp_out->bmi.header.biCompression = BI_RGB;
    +
    5571 bmp_out->bmi.header.biWidth = bm.bmWidth;
    +
    5572 bmp_out->bmi.header.biHeight = bm.bmHeight;
    +
    5573 bmp_out->bmi.header.biPlanes = bm.bmPlanes;
    +
    5574 bmp_out->bmi.header.biBitCount = bm.bmBitsPixel;
    +
    5575 bmp_out->bmi.header.biSizeImage =
    +
    5576 bmp_out->bmi.header.biWidth *
    +
    5577 bmp_out->bmi.header.biHeight *
    +
    5578 (bm.bmBitsPixel / sizeof( uint8_t ));
    +
    5579
    + +
    5581 retval = retroflat_bitmap_win_transparency(
    +
    5582 bmp_out, bm.bmWidth, bm.bmHeight );
    +
    5583 }
    +
    5584
    +
    5585# endif /* RETROFLAT_API_WIN16 */
    +
    5586
    +
    5587 /* The transparency portion is the same for Win32 and Win16. */
    +
    5588
    +
    5589cleanup:
    +
    5590
    +
    5591# ifdef RETROFLAT_API_WIN16
    +
    5592 if( NULL != buf ) {
    +
    5593 free( buf );
    +
    5594 }
    +
    5595
    +
    5596 mfile_close( &bmp_file );
    +
    5597
    +
    5598# endif /* RETROFLAT_API_WIN16 */
    +
    5599
    +
    5600# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5601
    +
    5602 /* TODO: Rework for CGA bitmaps. */
    +
    5603
    +
    5604 assert( NULL == bmp_out->px );
    +
    5605
    +
    5606 retval = mfile_open_read( filename_path, &bmp_file );
    +
    5607 maug_cleanup_if_not_ok();
    +
    5608
    +
    5609 /* TODO: mfmt file detection system. */
    +
    5610 header_bmp.magic[0] = 'B';
    +
    5611 header_bmp.magic[1] = 'M';
    +
    5612 header_bmp.info.sz = 40;
    +
    5613
    +
    5614 retval = mfmt_read_bmp_header(
    +
    5615 (struct MFMT_STRUCT*)&header_bmp,
    +
    5616 &bmp_file, 0, mfile_get_sz( &bmp_file ), &bmp_flags );
    +
    5617 maug_cleanup_if_not_ok();
    +
    5618
    +
    5619 /* Setup bitmap options from header. */
    +
    5620 bmp_out->w = header_bmp.info.width;
    +
    5621 bmp_out->h = header_bmp.info.height;
    +
    5622
    +
    5623#if 0
    +
    5624 retval = mfmt_read_bmp_palette(
    +
    5625 (struct MFMT_STRUCT*)&header_bmp,
    +
    5626 bmp_palette, 4 * header_bmp.info.palette_ncolors,
    +
    5627 &bmp_file, 54 /* TODO */, mfile_get_sz( &bmp_file ) - 54, bmp_flags );
    +
    5628 maug_cleanup_if_not_ok();
    +
    5629#endif
    +
    5630
    +
    5631 bmp_out->flags = flags;
    +
    5632
    +
    5633 /* Allocate a space for the bitmap pixels. */
    +
    5634 bmp_out->sz = header_bmp.info.width * header_bmp.info.height;
    +
    5635 /* We're on PC BIOS... we don't need to lock pointers in this
    +
    5636 * platform-specific code!
    +
    5637 */
    +
    5638 bmp_out->px = _fcalloc( header_bmp.info.height, header_bmp.info.width );
    +
    5639 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->px );
    +
    5640
    +
    5641 retval = mfmt_read_bmp_px(
    +
    5642 (struct MFMT_STRUCT*)&header_bmp,
    +
    5643 bmp_out->px, bmp_out->sz,
    +
    5644 &bmp_file, header_bmp.px_offset,
    +
    5645 mfile_get_sz( &bmp_file ) - header_bmp.px_offset, bmp_flags );
    +
    5646 maug_cleanup_if_not_ok();
    +
    5647
    + +
    5649 retval = retroflat_bitmap_dos_transparency( bmp_out );
    +
    5650 }
    +
    5651
    +
    5652cleanup:
    +
    5653
    +
    5654# else
    +
    5655# pragma message( "warning: load bitmap not implemented" )
    +
    5656# endif /* RETROFLAT_API_ALLEGRO */
    +
    5657
    +
    5658 return retval;
    +
    5659}
    +
    5660
    +
    5661/* === */
    +
    5662
    +
    5663MERROR_RETVAL retroflat_create_bitmap(
    +
    5664 size_t w, size_t h, struct RETROFLAT_BITMAP* bmp_out, uint8_t flags
    +
    5665) {
    +
    5666 MERROR_RETVAL retval = MERROR_OK;
    +
    5667# if defined( RETROFLAT_OPENGL )
    +
    5668# ifndef RETROGLU_NO_TEXTURES
    +
    5669 GLenum error = GL_NO_ERROR;
    +
    5670# endif /* !RETROGLU_NO_TEXTURES */
    +
    5671# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5672 int i = 0;
    +
    5673 PALETTEENTRY palette[RETROFLAT_BMP_COLORS_SZ_MAX];
    +
    5674# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5675
    +
    5676 maug_mzero( bmp_out, sizeof( struct RETROFLAT_BITMAP ) );
    +
    5677
    +
    5678 bmp_out->sz = sizeof( struct RETROFLAT_BITMAP );
    +
    5679
    +
    5680# if defined( RETROFLAT_OPENGL )
    +
    5681
    +
    5682 if( w > 256 ) {
    +
    5683 error_printf( "warning! attempting to create texture with w > 256 ("
    +
    5684 SIZE_T_FMT "). This may not work on Win32!", w );
    +
    5685 }
    +
    5686
    +
    5687 if( h > 256 ) {
    +
    5688 error_printf( "warning! attempting to create texture with h > 256 ("
    +
    5689 SIZE_T_FMT "). This may not work on Win32!", h );
    +
    5690 }
    +
    5691
    +
    5692 bmp_out->tex.w = w;
    +
    5693 bmp_out->tex.h = h;
    +
    5694 /* TODO: Overflow checking. */
    +
    5695 debug_printf( 0, "creating bitmap: " SIZE_T_FMT " x " SIZE_T_FMT,
    +
    5696 bmp_out->tex.w, bmp_out->tex.h );
    +
    5697 bmp_out->tex.bytes_h =
    +
    5698 maug_malloc( bmp_out->tex.w * bmp_out->tex.h, 4 );
    +
    5699 maug_cleanup_if_null_alloc( MAUG_MHANDLE, bmp_out->tex.bytes_h );
    +
    5700
    +
    5701 maug_mlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5702 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->tex.bytes );
    +
    5703
    +
    5704 /* TODO: Overflow checking. */
    +
    5705 maug_mzero(
    +
    5706 bmp_out->tex.bytes,
    +
    5707 bmp_out->tex.w * bmp_out->tex.h * sizeof( uint32_t ) );
    +
    5708
    +
    5709# ifndef RETROGLU_NO_TEXTURES
    +
    5710 glGenTextures( 1, (GLuint*)&(bmp_out->tex.id) );
    +
    5711 debug_printf( RETROFLAT_BITMAP_TRACE_LVL,
    +
    5712 "assigned bitmap texture: " UPRINTF_U32_FMT, bmp_out->tex.id );
    +
    5713 error = glGetError();
    +
    5714 if( GL_NO_ERROR != error ) {
    +
    5715 error_printf( "error generating texture: %u", error );
    +
    5716 }
    +
    5717# endif /* !RETROGLU_NO_TEXTURES */
    +
    5718
    +
    5719cleanup:
    +
    5720 if( NULL != bmp_out->tex.bytes ) {
    +
    5721 maug_munlock( bmp_out->tex.bytes_h, bmp_out->tex.bytes );
    +
    5722 }
    +
    5723# elif defined( RETROFLAT_API_ALLEGRO )
    +
    5724
    +
    5725 /* == Allegro == */
    +
    5726
    +
    5727 bmp_out->b = create_bitmap( w, h );
    +
    5728 maug_cleanup_if_null( BITMAP*, bmp_out->b, RETROFLAT_ERROR_BITMAP );
    +
    5729 clear_bitmap( bmp_out->b );
    +
    5730
    +
    5731cleanup:
    +
    5732# elif defined( RETROFLAT_API_SDL1 )
    +
    5733
    +
    5734 /* == SDL1 == */
    +
    5735
    +
    5736 bmp_out->surface = SDL_CreateRGBSurface( 0, w, h,
    +
    5737 32, 0, 0, 0, 0 );
    +
    5738 maug_cleanup_if_null(
    +
    5739 SDL_Surface*, bmp_out->surface, RETROFLAT_ERROR_BITMAP );
    + +
    5741 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5742 SDL_MapRGB( bmp_out->surface->format,
    + +
    5744 }
    +
    5745
    +
    5746cleanup:
    +
    5747# elif defined( RETROFLAT_API_SDL2 )
    +
    5748
    +
    5749 /* == SDL2 == */
    +
    5750
    +
    5751 /* Create surface. */
    +
    5752 bmp_out->surface = SDL_CreateRGBSurface( 0, w, h,
    +
    5753 /* TODO: Are these masks right? */
    +
    5754 32, 0, 0, 0, 0 );
    +
    5755 maug_cleanup_if_null(
    +
    5756 SDL_Surface*, bmp_out->surface, RETROFLAT_ERROR_BITMAP );
    + +
    5758 SDL_SetColorKey( bmp_out->surface, RETROFLAT_SDL_CC_FLAGS,
    +
    5759 SDL_MapRGB( bmp_out->surface->format,
    + +
    5761 }
    +
    5762
    +
    5763 /* Convert new surface to texture. */
    +
    5764 bmp_out->texture = SDL_CreateTextureFromSurface(
    +
    5765 g_retroflat_state->buffer.renderer, bmp_out->surface );
    +
    5766 maug_cleanup_if_null(
    +
    5767 SDL_Texture*, bmp_out->texture, RETROFLAT_ERROR_BITMAP );
    +
    5768
    +
    5769cleanup:
    +
    5770# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5771
    +
    5772 /* == Win16 / Win32 == */
    +
    5773
    +
    5774 /* TODO: Handle opaque flag. */
    +
    5775 bmp_out->mask = (HBITMAP)NULL;
    +
    5776
    +
    5777# ifdef RETROFLAT_WING
    +
    5778 /* Put this first because WinGRecommendDIBFormat sets some header props. */
    +
    5779 if(
    + + +
    5782 (WinGCreateDC_t)NULL != g_w.WinGCreateDC &&
    +
    5783 (WinGRecommendDIBFormat_t)NULL != g_w.WinGRecommendDIBFormat
    +
    5784 ) {
    +
    5785 bmp_out->hdc_b = g_w.WinGCreateDC();
    +
    5786
    +
    5787 if(
    +
    5788 !g_w.WinGRecommendDIBFormat( (BITMAPINFO far*)&(bmp_out->bmi) )
    +
    5789 ) {
    + +
    5791 "Error", "Could not determine recommended format!" );
    +
    5792 retval = RETROFLAT_ERROR_GRAPHICS;
    +
    5793 goto cleanup;
    +
    5794 }
    +
    5795 }
    +
    5796# endif /* RETROFLAT_WING */
    +
    5797
    +
    5798 debug_printf( 0, "creating bitmap..." );
    +
    5799
    +
    5800 bmp_out->bmi.header.biSize = sizeof( BITMAPINFOHEADER );
    +
    5801 bmp_out->bmi.header.biPlanes = 1;
    +
    5802 bmp_out->bmi.header.biCompression = BI_RGB;
    +
    5803 bmp_out->bmi.header.biWidth = w;
    +
    5804# ifdef RETROFLAT_WING
    +
    5805 bmp_out->bmi.header.biHeight *= h;
    +
    5806# else
    +
    5807 bmp_out->bmi.header.biHeight = h;
    +
    5808# endif /* RETROFLAT_WING */
    +
    5809 bmp_out->bmi.header.biBitCount = 32;
    +
    5810 bmp_out->bmi.header.biSizeImage = w * h * 4;
    +
    5811
    +
    5812 GetSystemPaletteEntries(
    +
    5813 g_retroflat_state->hdc_win, 0, RETROFLAT_BMP_COLORS_SZ_MAX, palette );
    +
    5814 for( i = 0 ; RETROFLAT_BMP_COLORS_SZ_MAX > i ; i++ ) {
    +
    5815 bmp_out->bmi.colors[i].rgbRed = palette[i].peRed;
    +
    5816 bmp_out->bmi.colors[i].rgbGreen = palette[i].peGreen;
    +
    5817 bmp_out->bmi.colors[i].rgbBlue = palette[i].peBlue;
    +
    5818 bmp_out->bmi.colors[i].rgbReserved = 0;
    +
    5819 }
    +
    5820
    +
    5821# ifdef RETROFLAT_WING
    +
    5822 /* Now try to create the WinG bitmap using the header we've built. */
    +
    5823 if(
    + + +
    5826 (WinGCreateBitmap_t)NULL != g_w.WinGCreateBitmap
    +
    5827 ) {
    +
    5828 /* Setup an optimal WinG hardware screen buffer bitmap. */
    +
    5829 debug_printf( 1, "creating WinG-backed bitmap..." );
    +
    5830
    + +
    5832 bmp_out->b = g_w.WinGCreateBitmap(
    +
    5833 bmp_out->hdc_b,
    +
    5834 (BITMAPINFO far*)(&bmp_out->bmi),
    +
    5835 (void far*)&(bmp_out->bits) );
    +
    5836
    +
    5837 debug_printf( 1, "WinG bitmap bits: %p", bmp_out->bits );
    +
    5838
    +
    5839 } else {
    +
    5840# endif /* RETROFLAT_WING */
    +
    5841
    +
    5842 bmp_out->b = CreateCompatibleBitmap( g_retroflat_state->hdc_win, w, h );
    +
    5843 maug_cleanup_if_null( HBITMAP, bmp_out->b, RETROFLAT_ERROR_BITMAP );
    +
    5844
    +
    5845 if(
    + +
    5847 ) {
    +
    5848 debug_printf( 1, "creating screen device context..." );
    +
    5849 bmp_out->hdc_b = CreateCompatibleDC( g_retroflat_state->hdc_win );
    +
    5850 bmp_out->old_hbm_b = SelectObject( bmp_out->hdc_b, bmp_out->b );
    +
    5851 }
    +
    5852
    +
    5853# ifdef RETROFLAT_WING
    +
    5854 }
    +
    5855# endif /* RETROFLAT_WING */
    +
    5856
    +
    5857cleanup:
    +
    5858
    +
    5859# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5860
    +
    5861 assert( NULL == bmp_out->px );
    +
    5862
    +
    5863 bmp_out->w = w;
    +
    5864 bmp_out->h = h;
    +
    5865 bmp_out->flags = flags;
    +
    5866
    +
    5867 /* Allocate a space for the bitmap pixels. */
    +
    5868 bmp_out->sz = w * h;
    +
    5869 /* We're on PC BIOS... we don't need to lock pointers in this
    +
    5870 * platform-specific code!
    +
    5871 */
    +
    5872 bmp_out->px = _fcalloc( w, h );
    +
    5873 maug_cleanup_if_null_alloc( uint8_t*, bmp_out->px );
    +
    5874
    +
    5875cleanup:
    +
    5876# else
    +
    5877# pragma message( "warning: create bitmap not implemented" )
    +
    5878# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5879
    +
    5880 return retval;
    +
    5881}
    +
    5882
    +
    5883/* === */
    +
    5884
    +
    5885void retroflat_destroy_bitmap( struct RETROFLAT_BITMAP* bmp ) {
    +
    5886
    +
    5887# if defined( RETROFLAT_OPENGL )
    +
    5888
    +
    5889 if( NULL != bmp->tex.bytes_h ) {
    +
    5890 if( NULL != bmp->tex.bytes ) {
    +
    5891 maug_munlock( bmp->tex.bytes_h, bmp->tex.bytes );
    +
    5892 }
    +
    5893
    +
    5894 maug_mfree( bmp->tex.bytes_h );
    +
    5895 }
    +
    5896
    +
    5897#ifndef RETROGLU_NO_TEXTURES
    +
    5898 if( 0 < bmp->tex.id ) {
    +
    5899 debug_printf( 0,
    +
    5900 "destroying bitmap texture: " UPRINTF_U32_FMT, bmp->tex.id );
    +
    5901 glDeleteTextures( 1, (GLuint*)&(bmp->tex.id) );
    +
    5902 }
    +
    5903#endif /* !RETROGLU_NO_TEXTURES */
    +
    5904
    +
    5905# elif defined( RETROFLAT_API_ALLEGRO )
    +
    5906
    +
    5907 /* == Allegro == */
    +
    5908
    +
    5909 if( NULL == bmp->b ) {
    +
    5910 return;
    +
    5911 }
    +
    5912
    +
    5913 destroy_bitmap( bmp->b );
    +
    5914 bmp->b = NULL;
    +
    5915
    +
    5916# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    5917
    +
    5918 assert( NULL != bmp );
    +
    5919 assert( NULL != bmp->surface );
    +
    5920
    +
    5921# ifndef RETROFLAT_API_SDL1
    +
    5922 assert( NULL != bmp->texture );
    +
    5923
    +
    5924 SDL_DestroyTexture( bmp->texture );
    +
    5925 bmp->texture = NULL;
    +
    5926# endif /* !RETROFLAT_API_SDL1 */
    +
    5927
    +
    5928 SDL_FreeSurface( bmp->surface );
    +
    5929 bmp->surface = NULL;
    +
    5930
    +
    5931# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5932
    +
    5933 /* == Win16 == */
    +
    5934
    +
    5935 if( NULL != bmp->old_hbm_b ) {
    +
    5936 SelectObject( bmp->hdc_b, bmp->old_hbm_b );
    +
    5937 bmp->old_hbm_b = (HBITMAP)NULL;
    +
    5938 bmp->old_hbm_b = (HBITMAP)NULL;
    +
    5939 }
    +
    5940
    +
    5941 if( (HBITMAP)NULL != bmp->b ) {
    +
    5942 DeleteObject( bmp->b );
    +
    5943 bmp->b = (HBITMAP)NULL;
    +
    5944 }
    +
    5945
    +
    5946 if( (HBITMAP)NULL != bmp->mask ) {
    +
    5947 DeleteObject( bmp->mask );
    +
    5948 bmp->mask = (HBITMAP)NULL;
    +
    5949 }
    +
    5950
    +
    5951# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5952
    +
    5953 if( NULL != bmp->px ) {
    +
    5954 _ffree( bmp->px );
    +
    5955 bmp->px = NULL;
    +
    5956 }
    +
    5957
    +
    5958 if( NULL != bmp->mask ) {
    +
    5959 _ffree( bmp->mask );
    +
    5960 bmp->mask = NULL;
    +
    5961 }
    +
    5962
    +
    5963# else
    +
    5964# pragma message( "warning: destroy bitmap not implemented" )
    +
    5965# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5966}
    +
    5967
    +
    5968/* === */
    +
    5969
    + +
    5971 struct RETROFLAT_BITMAP* target, struct RETROFLAT_BITMAP* src,
    +
    5972 int s_x, int s_y, int d_x, int d_y, int16_t w, int16_t h
    +
    5973) {
    +
    5974# if defined( RETROFLAT_OPENGL )
    +
    5975 int y_iter = 0;
    +
    5976# elif defined( RETROFLAT_API_SDL1 ) && !defined( RETROFLAT_OPENGL )
    +
    5977 MERROR_RETVAL retval = MERROR_OK;
    +
    5978 SDL_Rect src_rect;
    +
    5979 SDL_Rect dest_rect;
    +
    5980# elif defined( RETROFLAT_API_SDL2 )
    +
    5981 MERROR_RETVAL retval = MERROR_OK;
    +
    5982 SDL_Rect src_rect = { s_x, s_y, w, h };
    +
    5983 SDL_Rect dest_rect = { d_x, d_y, w, h };
    +
    5984# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    5985 MERROR_RETVAL retval = MERROR_OK;
    +
    5986 int locked_src_internal = 0;
    +
    5987# elif defined( RETROFLAT_API_PC_BIOS )
    +
    5988 int16_t y_iter = 0,
    +
    5989 x_iter = 0;
    +
    5990 uint16_t target_line_offset = 0;
    +
    5991 int16_t src_line_offset = 0;
    +
    5992 MERROR_RETVAL retval = MERROR_OK;
    +
    5993# endif /* RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    5994
    +
    5995# ifndef RETROFLAT_OPENGL
    +
    5996 if( NULL == target ) {
    +
    5997 target = retroflat_screen_buffer();
    +
    5998 }
    +
    5999# endif /* RETROFLAT_OPENGL */
    +
    6000
    +
    6001 assert( NULL != src );
    +
    6002
    +
    6003# if defined( RETROFLAT_OPENGL )
    +
    6004
    +
    6005 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6006 /* TODO: Create ortho sprite on screen. */
    +
    6007
    +
    6008 } else {
    +
    6009 /* Blit to texture. */
    +
    6010
    +
    6011 assert( NULL != target->tex.bytes );
    +
    6012
    +
    6013 /* TODO: Some kind of source-autolock? */
    +
    6014 assert( !retroflat_bitmap_locked( src ) );
    +
    6015 maug_mlock( src->tex.bytes_h, src->tex.bytes );
    +
    6016 for( y_iter = 0 ; h > y_iter ; y_iter++ ) {
    +
    6017 /* TODO: Handle transparency! */
    +
    6018 memcpy(
    +
    6019 &(target->tex.bytes[(((y_iter * target->tex.w) + d_x) * 4)]),
    +
    6020 &(src->tex.bytes[(((y_iter * src->tex.w) + s_x) * 4)]),
    +
    6021 w * 4 );
    +
    6022 }
    +
    6023 maug_munlock( src->tex.bytes_h, src->tex.bytes );
    +
    6024
    +
    6025 }
    +
    6026
    +
    6027# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6028
    +
    6029 /* == Allegro == */
    +
    6030
    +
    6031 assert( NULL != target->b );
    +
    6032 assert( NULL != src->b );
    +
    6033
    +
    6034 if(
    +
    6035 0 == s_x && 0 == s_y &&
    +
    6036 ((-1 == w && -1 == h ) || (src->b->w == w && src->b->h == h))
    +
    6037 ) {
    +
    6038 draw_sprite( target->b, src->b, d_x, d_y );
    +
    6039 } else {
    +
    6040 /* Handle partial blit. */
    +
    6041 blit( src->b, target->b, s_x, s_y, d_x, d_y, w, h );
    +
    6042 }
    +
    6043
    +
    6044# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    6045
    +
    6046 /* == SDL == */
    +
    6047
    +
    6048 src_rect.x = s_x;
    +
    6049 src_rect.y = s_y;
    +
    6050 src_rect.w = w;
    +
    6051 src_rect.h = h;
    +
    6052 dest_rect.x = d_x;
    +
    6053 dest_rect.y = d_y;
    +
    6054 dest_rect.w = w;
    +
    6055 dest_rect.h = h;
    +
    6056
    +
    6057# ifdef RETROFLAT_API_SDL1
    +
    6058 assert( 0 == src->autolock_refs );
    +
    6059 assert( 0 == target->autolock_refs );
    +
    6060 retval =
    +
    6061 SDL_BlitSurface( src->surface, &src_rect, target->surface, &dest_rect );
    +
    6062 if( 0 != retval ) {
    +
    6063 error_printf( "could not blit surface: %s", SDL_GetError() );
    +
    6064 }
    +
    6065# else
    +
    6066
    +
    6067 assert( retroflat_bitmap_locked( target ) );
    +
    6068 retval = SDL_RenderCopy(
    +
    6069 target->renderer, src->texture, &src_rect, &dest_rect );
    +
    6070 if( 0 != retval ) {
    +
    6071 error_printf( "could not blit surface: %s", SDL_GetError() );
    +
    6072 }
    +
    6073
    +
    6074# endif /* !RETROFLAT_API_SDL1 */
    +
    6075
    +
    6076# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6077
    +
    6078 /* == Win16/Win32 == */
    +
    6079
    +
    6080 assert( (HBITMAP)NULL != target->b );
    +
    6081 assert( (HBITMAP)NULL != src->b );
    +
    6082
    +
    6083 retroflat_internal_autolock_bitmap( src, locked_src_internal );
    +
    6084 assert( retroflat_bitmap_locked( target ) );
    +
    6085
    +
    6086 if( (HBITMAP)NULL != src->mask ) {
    +
    6087 /* Use mask to blit transparency. */
    +
    6088 BitBlt(
    +
    6089 target->hdc_b, d_x, d_y, w, h, src->hdc_mask, s_x, s_y, SRCAND );
    +
    6090
    +
    6091 /* Do actual blit. */
    +
    6092 BitBlt(
    +
    6093 target->hdc_b, d_x, d_y, w, h, src->hdc_b, s_x, s_y, SRCPAINT );
    +
    6094 } else {
    +
    6095 /* Just overwrite entire rect. */
    +
    6096 BitBlt(
    +
    6097 target->hdc_b, d_x, d_y, w, h, src->hdc_b, s_x, s_y, SRCCOPY );
    +
    6098 }
    +
    6099
    +
    6100cleanup:
    +
    6101
    +
    6102 if( locked_src_internal ) {
    +
    6103 retroflat_draw_release( src );
    +
    6104 }
    +
    6105
    +
    6106# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6107
    +
    6108 if( NULL == target ) {
    +
    6109 target = &(g_retroflat_state->buffer);
    +
    6110 }
    +
    6111
    +
    6112 switch( g_retroflat_state->screen_mode ) {
    +
    6113 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6114 for( y_iter = 0 ; h > y_iter ; y_iter++ ) {
    +
    6115 target_line_offset = ((d_y + y_iter) * (target->w)) + d_x;
    +
    6116 src_line_offset = ((s_y + y_iter) * src->w) + s_x;
    +
    6117 if( target->sz <= target_line_offset + w ) {
    +
    6118 continue;
    +
    6119 }
    +
    6120 /* Blit the line. */
    +
    6121 if(
    + + +
    6124 ) {
    +
    6125 /* Copy line-by-line for speed. */
    +
    6126 _fmemcpy(
    +
    6127 &(target->px[target_line_offset]),
    +
    6128 &(src->px[src_line_offset]), w );
    +
    6129 } else {
    +
    6130 for( x_iter = 0 ; w > x_iter ; x_iter++ ) {
    +
    6131 /* AND with mask for transparency cutout. */
    +
    6132 target->px[target_line_offset + x_iter] &=
    +
    6133 src->mask[src_line_offset + x_iter];
    +
    6134 /* Draw into cutout with OR. */
    +
    6135 target->px[target_line_offset + x_iter] |=
    +
    6136 src->px[src_line_offset + x_iter];
    +
    6137 }
    +
    6138 }
    +
    6139 }
    +
    6140 break;
    +
    6141
    +
    6142 default:
    +
    6143 error_printf( "bitmap blit unsupported in video mode: %d",
    +
    6144 g_retroflat_state->screen_mode );
    +
    6145 break;
    +
    6146 }
    +
    6147
    +
    6148# else
    +
    6149# pragma message( "warning: blit bitmap not implemented" )
    +
    6150# endif /* RETROFLAT_API_ALLEGRO */
    +
    6151 return;
    +
    6152}
    +
    6153
    +
    6154/* === */
    +
    6155
    +
    6156void retroflat_px(
    +
    6157 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    6158 int16_t x, int16_t y, uint8_t flags
    +
    6159) {
    +
    6160# if defined( RETROFLAT_OPENGL )
    +
    6161# elif defined( RETROFLAT_API_SDL1 )
    +
    6162 int offset = 0;
    +
    6163 uint8_t* px_1 = NULL;
    +
    6164 uint16_t* px_2 = NULL;
    +
    6165 uint32_t* px_4 = NULL;
    +
    6166 RETROFLAT_COLOR_DEF* color = &(g_retroflat_state->palette[color_idx]);
    +
    6167# elif defined( RETROFLAT_API_SDL2 )
    +
    6168 RETROFLAT_COLOR_DEF* color = &(g_retroflat_state->palette[color_idx]);
    +
    6169# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6170 uint16_t screen_byte_offset = 0,
    +
    6171 screen_bit_offset = 0;
    +
    6172 uint8_t color = 0;
    +
    6173# endif /* RETROFLAT_API_SDL1 */
    +
    6174
    +
    6175 if( RETROFLAT_COLOR_NULL == color_idx ) {
    +
    6176 return;
    +
    6177 }
    +
    6178
    +
    6179 if( NULL == target ) {
    +
    6180 target = retroflat_screen_buffer();
    +
    6181 }
    +
    6182
    +
    6183 if(
    +
    6184 x < 0 || x >= retroflat_screen_w() ||
    +
    6185 y < 0 || y >= retroflat_screen_h()
    +
    6186 ) {
    +
    6187 return;
    +
    6188 }
    +
    6189
    +
    6190# if defined( RETROFLAT_OPENGL )
    +
    6191
    +
    6192 assert( NULL != target->tex.bytes );
    +
    6193 assert( retroflat_bitmap_locked( target ) );
    +
    6194
    +
    6195# if !defined( RETROFLAT_NO_BOUNDSC )
    +
    6196 if( (size_t)x >= target->tex.w ) {
    +
    6197 return;
    +
    6198 }
    +
    6199
    +
    6200 if( (size_t)y >= target->tex.h ) {
    +
    6201 return;
    +
    6202 }
    +
    6203# endif /* !RETROFLAT_NO_BOUNDSC */
    +
    6204
    +
    6205 /* Draw pixel colors from texture palette. */
    +
    6206 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 0] =
    +
    6207 g_retroflat_state->tex_palette[color_idx][0];
    +
    6208 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 1] =
    +
    6209 g_retroflat_state->tex_palette[color_idx][1];
    +
    6210 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 2] =
    +
    6211 g_retroflat_state->tex_palette[color_idx][2];
    +
    6212
    +
    6213 /* Set pixel as opaque. */
    +
    6214 target->tex.bytes[(((y * target->tex.w) + x) * 4) + 3] = 0xff;
    +
    6215
    +
    6216# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6217
    +
    6218 /* == Allegro == */
    +
    6219
    +
    6220 putpixel( target->b, x, y, g_retroflat_state->palette[color_idx] );
    +
    6221
    +
    6222# elif defined( RETROFLAT_API_SDL1 )
    +
    6223
    +
    6224 /* == SDL1 == */
    +
    6225
    +
    6226 retroflat_px_lock( target );
    +
    6227
    +
    6228 assert( 0 < target->autolock_refs );
    +
    6229
    +
    6230 offset = (y * target->surface->pitch) +
    +
    6231 (x * target->surface->format->BytesPerPixel);
    +
    6232
    +
    6233 switch( target->surface->format->BytesPerPixel ) {
    +
    6234 case 4:
    +
    6235 px_4 = (uint32_t*)&(((uint8_t*)(target->surface->pixels))[offset]);
    +
    6236 *px_4 =
    +
    6237 SDL_MapRGB( target->surface->format, color->r, color->g, color->b );
    +
    6238 break;
    +
    6239
    +
    6240 case 2:
    +
    6241 px_2 = (uint16_t*)&(((uint8_t*)(target->surface->pixels))[offset]);
    +
    6242 *px_2 =
    +
    6243 SDL_MapRGB( target->surface->format, color->r, color->g, color->b );
    +
    6244 break;
    +
    6245
    +
    6246 case 1:
    +
    6247 px_1 = (uint8_t*)&(((uint8_t*)(target->surface->pixels))[offset]);
    +
    6248 *px_1 =
    +
    6249 SDL_MapRGB( target->surface->format, color->r, color->g, color->b );
    +
    6250 break;
    +
    6251 }
    +
    6252
    +
    6253 retroflat_px_release( target );
    +
    6254
    +
    6255# elif defined( RETROFLAT_API_SDL2 )
    +
    6256
    +
    6257 /* == SDL2 == */
    +
    6258
    +
    6259 assert( retroflat_bitmap_locked( target ) );
    +
    6260
    +
    6261 SDL_SetRenderDrawColor(
    +
    6262 target->renderer, color->r, color->g, color->b, 255 );
    +
    6263 SDL_RenderDrawPoint( target->renderer, x, y );
    +
    6264
    +
    6265# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6266
    +
    6267 /* == Win16/Win32 == */
    +
    6268
    +
    6269 assert( retroflat_bitmap_locked( target ) );
    +
    6270
    +
    6271# ifdef RETROFLAT_WING
    +
    6272 if( NULL != target->bits ) {
    +
    6273 /* Modify target bits directly (faster) if available! */
    +
    6274 /* WinG bitmaps are 8-bit palettized, so use the index directly. */
    +
    6275 if( 0 > target->h ) {
    +
    6276 target->bits[((target->h - 1 - y) * target->tex.w) + x] =
    +
    6277 color_idx;
    +
    6278 } else {
    +
    6279 target->bits[(y * target->tex.w) + x] =
    +
    6280 color_idx;
    +
    6281 }
    +
    6282 } else {
    +
    6283 /* Use slow Windows GDI. */
    +
    6284 SetPixel( target->hdc_b, x, y,
    +
    6285 g_retroflat_state->palette[color_idx] );
    +
    6286 }
    +
    6287# else
    +
    6288 SetPixel( target->hdc_b, x, y,
    +
    6289 g_retroflat_state->palette[color_idx] );
    +
    6290# endif /* RETROFLAT_WING */
    +
    6291
    +
    6292# elif defined( RETROFLAT_API_LIBNDS )
    +
    6293
    +
    6294 /* == Nintendo DS == */
    +
    6295
    +
    6296 uint16_t* px_ptr = NULL;
    +
    6297
    +
    6298 px_ptr = bgGetGfxPtr( g_retroflat_state->px_id );
    +
    6299 px_ptr[(y * 256) + x] = g_retroflat_state->palette[color_idx];
    +
    6300
    +
    6301# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6302
    +
    6303 /* == DOS PC_BIOS == */
    +
    6304
    +
    6305 /* TODO: Determine if we're drawing on-screen or on a bitmap. */
    +
    6306 if( NULL == target ) {
    +
    6307 target = &(g_retroflat_state->buffer);
    +
    6308 }
    +
    6309
    +
    6310 switch( g_retroflat_state->screen_mode ) {
    +
    6311 case RETROFLAT_SCREEN_MODE_CGA:
    +
    6312 /* Divide y by 2 since both planes are SCREEN_H / 2 high. */
    +
    6313 /* Divide result by 4 since it's 2 bits per pixel. */
    +
    6314 screen_byte_offset = (((y >> 1) * target->w) + x) >> 2;
    +
    6315 /* Shift the bits over by the remainder. */
    +
    6316 /* TODO: Factor out this modulo to shift/and. */
    +
    6317 screen_bit_offset = 6 - (((((y >> 1) * target->w) + x) % 4) << 1);
    +
    6318
    +
    6319 /* Dither colors on odd/even squares. */
    +
    6320 if( (x & 0x01 && y & 0x01) || (!(x & 0x01) && !(y & 0x01)) ) {
    +
    6321 color = g_retroflat_state->cga_color_table[color_idx];
    +
    6322 } else {
    +
    6323 color = g_retroflat_state->cga_dither_table[color_idx];
    +
    6324 }
    +
    6325
    +
    6326 if( target != &(g_retroflat_state->buffer) ) {
    +
    6327 /* TODO: Memory bitmap. */
    +
    6328
    +
    6329 } else if( y & 0x01 ) {
    +
    6330 /* 0x2000 = difference between even/odd CGA planes. */
    +
    6331 g_retroflat_state->buffer.px[0x2000 + screen_byte_offset] &=
    +
    6332 /* 0x03 = 2-bit pixel mask. */
    +
    6333 ~(0x03 << screen_bit_offset);
    +
    6334 g_retroflat_state->buffer.px[0x2000 + screen_byte_offset] |=
    +
    6335 ((color & 0x03) << screen_bit_offset);
    +
    6336 } else {
    +
    6337 /* 0x03 = 2-bit pixel mask. */
    +
    6338 g_retroflat_state->buffer.px[screen_byte_offset] &=
    +
    6339 ~(0x03 << screen_bit_offset);
    +
    6340 g_retroflat_state->buffer.px[screen_byte_offset] |=
    +
    6341 /* 0x03 = 2-bit pixel mask. */
    +
    6342 ((color & 0x03) << screen_bit_offset);
    +
    6343 }
    +
    6344 break;
    +
    6345
    +
    6346 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6347 screen_byte_offset = ((y * target->w) + x);
    +
    6348 if( target->sz <= screen_byte_offset ) {
    +
    6349 break;
    +
    6350 }
    +
    6351 target->px[screen_byte_offset] = color_idx;
    +
    6352 break;
    +
    6353
    +
    6354 default:
    +
    6355 error_printf( "pixel blit unsupported in video mode: %d",
    +
    6356 g_retroflat_state->screen_mode );
    +
    6357 break;
    +
    6358 }
    +
    6359
    +
    6360# else
    +
    6361# pragma message( "warning: px not implemented" )
    +
    6362# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6363
    +
    6364}
    +
    6365
    +
    6366/* === */
    +
    6367
    +
    6368void retroflat_rect(
    +
    6369 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    6370 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags
    +
    6371) {
    +
    6372# if defined( RETROFLAT_OPENGL )
    +
    6373 float aspect_ratio = 0,
    +
    6374 screen_x = 0,
    +
    6375 screen_y = 0,
    +
    6376 screen_w = 0,
    +
    6377 screen_h = 0;
    +
    6378# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6379# elif defined( RETROFLAT_API_SDL2 )
    +
    6380# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6381 HBRUSH old_brush = (HBRUSH)NULL;
    +
    6382 HPEN old_pen = (HPEN)NULL;
    +
    6383# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6384
    +
    6385 if( RETROFLAT_COLOR_NULL == color_idx ) {
    +
    6386 return;
    +
    6387 }
    +
    6388
    +
    6389# ifndef RETROFLAT_OPENGL
    +
    6390 if( NULL == target ) {
    +
    6391 target = retroflat_screen_buffer();
    +
    6392 }
    +
    6393# endif /* !RETROFLAT_OPENGL */
    +
    6394
    +
    6395# if defined( RETROFLAT_OPENGL )
    +
    6396
    +
    6397 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6398
    +
    6399 /* Push new overlay projection parms before we create a new overlay. */
    +
    6400 retroglu_push_overlay( x, y, screen_x, screen_y, aspect_ratio );
    +
    6401 retroglu_whf( w, h, screen_w, screen_h, aspect_ratio );
    +
    6402
    +
    6403 /* Create the overlay poly with a solid color. */
    +
    6404 glBegin( GL_TRIANGLES );
    +
    6405 glColor3fv( g_retroflat_state->palette[color_idx] );
    +
    6406 glVertex3f( screen_x, screen_y, RETROFLAT_GL_Z );
    +
    6407 glVertex3f( screen_x, screen_y - screen_h, RETROFLAT_GL_Z );
    +
    6408 glVertex3f( screen_x + screen_w, screen_y - screen_h, RETROFLAT_GL_Z );
    +
    6409
    +
    6410 glVertex3f( screen_x + screen_w, screen_y - screen_h, RETROFLAT_GL_Z );
    +
    6411 glVertex3f( screen_x + screen_w, screen_y, RETROFLAT_GL_Z );
    +
    6412 glVertex3f( screen_x, screen_y, RETROFLAT_GL_Z );
    +
    6413 glEnd();
    +
    6414
    + +
    6416 } else {
    +
    6417 /* Draw the rect onto the given 2D texture. */
    +
    6418 retrosoft_rect( target, color_idx, x, y, w, h, flags );
    +
    6419 }
    +
    6420
    +
    6421# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6422
    +
    6423 retrosoft_rect( target, color_idx, x, y, w, h, flags );
    +
    6424
    +
    6425# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6426
    +
    6427 /* == Allegro == */
    +
    6428
    +
    6429 assert( NULL != target->b );
    + +
    6431 rectfill( target->b, x, y, x + w, y + h,
    +
    6432 g_retroflat_state->palette[color_idx] );
    +
    6433 } else {
    +
    6434 rect( target->b, x, y, x + w, y + h,
    +
    6435 g_retroflat_state->palette[color_idx] );
    +
    6436 }
    +
    6437
    +
    6438# elif defined( RETROFLAT_API_SDL2 )
    +
    6439
    +
    6440 assert( retroflat_bitmap_locked( target ) );
    +
    6441
    +
    6442 area.x = x;
    +
    6443 area.y = y;
    +
    6444 area.w = w;
    +
    6445 area.h = h;
    +
    6446
    +
    6447 SDL_SetRenderDrawColor(
    +
    6448 target->renderer, color->r, color->g, color->b, 255 );
    +
    6449
    + +
    6451 SDL_RenderFillRect( target->renderer, &area );
    +
    6452 } else {
    +
    6453 SDL_RenderDrawRect( target->renderer, &area );
    +
    6454 }
    +
    6455
    +
    6456# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6457
    +
    6458 /* == Win16/Win32 == */
    +
    6459
    +
    6460 assert( (HBITMAP)NULL != target->b );
    +
    6461
    +
    6462 assert( retroflat_bitmap_locked( target ) );
    +
    6463
    +
    6464 retroflat_win_setup_brush( old_brush, target, color_idx, flags );
    +
    6465 retroflat_win_setup_pen( old_pen, target, color_idx, flags );
    +
    6466
    +
    6467 Rectangle( target->hdc_b, x, y, x + w, y + h );
    +
    6468
    +
    6469/* cleanup: */
    +
    6470
    +
    6471 retroflat_win_cleanup_brush( old_brush, target )
    +
    6472 retroflat_win_cleanup_pen( old_pen, target )
    +
    6473
    +
    6474# else
    +
    6475# pragma message( "warning: rect not implemented" )
    +
    6476# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6477}
    +
    6478
    +
    6479/* === */
    +
    6480
    +
    6481void retroflat_line(
    +
    6482 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color_idx,
    +
    6483 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags
    +
    6484) {
    +
    6485# if defined( RETROFLAT_OPENGL )
    +
    6486# elif defined( RETROFLAT_SOFT_LINES )
    +
    6487# elif defined( RETROFLAT_API_SDL2 )
    +
    6488 MERROR_RETVAL retval = MERROR_OK;
    +
    6489 RETROFLAT_COLOR_DEF color = g_retroflat_state->palette[color_idx];
    +
    6490# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6491 HPEN pen = (HPEN)NULL;
    +
    6492 HPEN old_pen = (HPEN)NULL;
    +
    6493 POINT points[2];
    +
    6494# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6495
    +
    6496 if( RETROFLAT_COLOR_NULL == color_idx ) {
    +
    6497 return;
    +
    6498 }
    +
    6499
    +
    6500# ifndef RETROFLAT_OPENGL
    +
    6501 if( NULL == target ) {
    +
    6502 target = retroflat_screen_buffer();
    +
    6503 }
    +
    6504# endif /* !RETROFLAT_OPENGL */
    +
    6505
    +
    6506# if defined( RETROFLAT_OPENGL )
    +
    6507
    +
    6508 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6509 /* TODO: Draw line in ortho. */
    +
    6510 } else {
    +
    6511 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6512 }
    +
    6513
    +
    6514# elif defined( RETROFLAT_SOFT_LINES )
    +
    6515
    +
    6516 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6517
    +
    6518# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6519
    +
    6520 /* == Allegro == */
    +
    6521
    +
    6522 assert( NULL != target->b );
    +
    6523 line( target->b, x1, y1, x2, y2, color_idx );
    +
    6524
    +
    6525# elif defined( RETROFLAT_API_SDL2 )
    +
    6526
    +
    6527 /* == SDL2 == */
    +
    6528
    +
    6529 assert( retroflat_bitmap_locked( target ) );
    +
    6530
    +
    6531 SDL_SetRenderDrawColor(
    +
    6532 target->renderer, color->r, color->g, color->b, 255 );
    +
    6533 SDL_RenderDrawLine( target->renderer, x1, y1, x2, y2 );
    +
    6534
    +
    6535# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6536
    +
    6537 /* == Win16/Win32 == */
    +
    6538
    +
    6539 assert( NULL != target->b );
    +
    6540
    +
    6541 assert( retroflat_bitmap_locked( target ) );
    +
    6542
    +
    6543 retroflat_win_setup_pen( old_pen, target, color_idx, flags );
    +
    6544
    +
    6545 /* Create the line points. */
    +
    6546 points[0].x = x1;
    +
    6547 points[0].y = y1;
    +
    6548 points[1].x = x2;
    +
    6549 points[1].y = y2;
    +
    6550
    +
    6551 Polyline( target->hdc_b, points, 2 );
    +
    6552
    +
    6553/* cleanup: */
    +
    6554
    +
    6555 if( (HPEN)NULL != pen ) {
    +
    6556 SelectObject( target->hdc_b, old_pen );
    +
    6557 DeleteObject( pen );
    +
    6558 }
    +
    6559
    +
    6560# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6561
    +
    6562 /* == DOS PC_BIOS == */
    +
    6563
    +
    6564 switch( g_retroflat_state->screen_mode ) {
    +
    6565 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6566 /* TODO: Try accelerated 2D. */
    +
    6567 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6568 break;
    +
    6569
    +
    6570 default:
    +
    6571 retrosoft_line( target, color_idx, x1, y1, x2, y2, flags );
    +
    6572 break;
    +
    6573 }
    +
    6574
    +
    6575# else
    +
    6576# pragma message( "warning: line not implemented" )
    +
    6577# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6578}
    +
    6579
    +
    6580/* === */
    +
    6581
    + +
    6583 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    6584 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags
    +
    6585) {
    +
    6586# if defined( RETROFLAT_OPENGL )
    +
    6587# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6588# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6589 HPEN old_pen = (HPEN)NULL;
    +
    6590 HBRUSH old_brush = (HBRUSH)NULL;
    +
    6591# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6592
    +
    6593 if( RETROFLAT_COLOR_NULL == color ) {
    +
    6594 return;
    +
    6595 }
    +
    6596
    +
    6597# ifndef RETROFLAT_OPENGL
    +
    6598 if( NULL == target ) {
    +
    6599 target = retroflat_screen_buffer();
    +
    6600 }
    +
    6601# endif /* !RETROFLAT_OPENGL */
    +
    6602
    +
    6603# if defined( RETROFLAT_OPENGL )
    +
    6604
    +
    6605 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6606 /* TODO: Draw ellipse in ortho. */
    +
    6607 } else {
    +
    6608 retrosoft_ellipse( target, color, x, y, w, h, flags );
    +
    6609 }
    +
    6610
    +
    6611# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6612
    +
    6613 retrosoft_ellipse( target, color, x, y, w, h, flags );
    +
    6614
    +
    6615# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6616
    +
    6617 /* == Allegro == */
    +
    6618
    +
    6619 assert( NULL != target->b );
    +
    6620
    + +
    6622 /* >> 1 performs better than / 2 on lousy old DOS compilers. */
    +
    6623 ellipsefill(
    +
    6624 target->b, x + (w >> 1), y + (h >> 1), w >> 1, h >> 1, color );
    +
    6625 } else {
    +
    6626 /* >> 1 performs better than / 2 on lousy old DOS compilers. */
    +
    6627 ellipse( target->b, x + (w >> 1), y + (h >> 1), w >> 1, h >> 1, color );
    +
    6628 }
    +
    6629
    +
    6630# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6631
    +
    6632 /* == Win16/Win32 == */
    +
    6633
    +
    6634 assert( NULL != target->b );
    +
    6635 assert( retroflat_bitmap_locked( target ) );
    +
    6636
    +
    6637 retroflat_win_setup_brush( old_brush, target, color, flags );
    +
    6638 retroflat_win_setup_pen( old_pen, target, color, flags );
    +
    6639
    +
    6640 Ellipse( target->hdc_b, x, y, x + w, y + h );
    +
    6641
    +
    6642/* cleanup: */
    +
    6643
    +
    6644 retroflat_win_cleanup_brush( old_brush, target )
    +
    6645 retroflat_win_cleanup_pen( old_pen, target )
    +
    6646
    +
    6647# else
    +
    6648# pragma message( "warning: ellipse not implemented" )
    +
    6649# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6650}
    +
    6651
    +
    6652/* === */
    +
    6653
    +
    6654void retroflat_cursor( struct RETROFLAT_BITMAP* target, uint8_t flags ) {
    +
    6655#if 0
    +
    6656 char mouse_str[11] = "";
    +
    6657
    +
    6658 maug_snprintf(
    +
    6659 mouse_str, 10, "%02d, %02d", g_retroflat_state->last_mouse_x, g_retroflat_state->last_mouse_y );
    +
    6660
    + +
    6662 target, RETROFLAT_COLOR_BLACK,
    +
    6663 mouse_str, 10, NULL, 0, 0, 0 );
    + +
    6665 target, RETROFLAT_COLOR_BLACK,
    +
    6666 g_retroflat_state->last_mouse_x - 5, g_retroflat_state->last_mouse_y - 5, 10, 10, 0 );
    +
    6667#endif
    +
    6668}
    +
    6669
    +
    6670/* === */
    +
    6671
    +
    6672# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6673
    +
    6674# define retroflat_win_create_font( flags, font_str ) \
    +
    6675 CreateFont( 10, 0, 0, 0, FW_BOLD, FALSE, FALSE, FALSE, \
    +
    6676 DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, \
    +
    6677 DEFAULT_QUALITY, DEFAULT_PITCH, \
    +
    6678 (NULL == font_str || '\0' == font_str[0] ? "Arial" : font_str) );
    +
    6679
    +
    6680# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6681
    + +
    6683 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    6684 const char* font_str, size_t* w_out, size_t* h_out, uint8_t flags
    +
    6685) {
    +
    6686# if defined( RETROFLAT_OPENGL )
    +
    6687# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6688# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6689 FONT* font_data = NULL;
    +
    6690 int font_loaded = 0;
    +
    6691# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6692 SIZE sz;
    +
    6693 HFONT font;
    +
    6694 HFONT old_font;
    +
    6695# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6696
    +
    6697 if( NULL == target ) {
    +
    6698 target = retroflat_screen_buffer();
    +
    6699 }
    +
    6700
    +
    6701# if defined( RETROFLAT_OPENGL )
    +
    6702
    +
    6703 retrosoft_string_sz( target, str, str_sz, font_str, w_out, h_out, flags );
    +
    6704
    +
    6705# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6706
    +
    6707 retrosoft_string_sz( target, str, str_sz, font_str, w_out, h_out, flags );
    +
    6708
    +
    6709# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6710
    +
    6711 /* == Allegro == */
    +
    6712
    +
    6713 if( NULL == font_str || '\0' == font_str[0] ) {
    +
    6714 font_data = font;
    +
    6715 } else {
    +
    6716 /* TODO: Cache loaded fonts for later use. */
    +
    6717 font_data = load_font( font_str, NULL, NULL );
    +
    6718 }
    +
    6719 if( NULL == font_data ) {
    + +
    6721 "Error", "Unable to load font: %s", font_str );
    +
    6722 goto cleanup;
    +
    6723 }
    +
    6724
    +
    6725 *w_out = text_length( font_data, str );
    +
    6726 *h_out = text_height( font_data );
    +
    6727
    +
    6728cleanup:
    +
    6729
    +
    6730 if( font_loaded && NULL != font_data ) {
    +
    6731 destroy_font( font_data );
    +
    6732 }
    +
    6733
    +
    6734# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6735
    +
    6736 /* == Win16/Win32 == */
    +
    6737
    +
    6738 assert( NULL != target->b );
    +
    6739 assert( retroflat_bitmap_locked( target ) );
    +
    6740
    +
    6741 font = retroflat_win_create_font( flags, font_str );
    +
    6742 old_font = SelectObject( target->hdc_b, font );
    +
    6743
    +
    6744 GetTextExtentPoint( target->hdc_b, str, str_sz, &sz );
    +
    6745 *w_out = sz.cx;
    +
    6746 *h_out = sz.cy;
    +
    6747
    +
    6748/* cleanup: */
    +
    6749
    +
    6750 SelectObject( target->hdc_b, old_font );
    +
    6751
    +
    6752# else
    +
    6753# pragma message( "warning: string sz not implemented" )
    +
    6754# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6755}
    +
    6756
    +
    6757/* === */
    +
    6758
    +
    6759void retroflat_string(
    +
    6760 struct RETROFLAT_BITMAP* target, const RETROFLAT_COLOR color,
    +
    6761 const char* str, int str_sz, const char* font_str, int16_t x_orig, int16_t y_orig,
    +
    6762 uint8_t flags
    +
    6763) {
    +
    6764# if defined( RETROFLAT_OPENGL )
    +
    6765 float aspect_ratio = 0,
    +
    6766 screen_x = 0,
    +
    6767 screen_y = 0;
    +
    6768# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6769# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6770 FONT* font_data = NULL;
    +
    6771 int font_loaded = 0;
    +
    6772# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6773 RECT rect;
    +
    6774 SIZE sz;
    +
    6775 HFONT font;
    +
    6776 HFONT old_font;
    +
    6777# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6778
    +
    6779 if( RETROFLAT_COLOR_NULL == color ) {
    +
    6780 return;
    +
    6781 }
    +
    6782
    +
    6783# if !defined( RETROFLAT_OPENGL )
    +
    6784 if( NULL == target ) {
    +
    6785 target = retroflat_screen_buffer();
    +
    6786 }
    +
    6787# endif /* !RETROFLAT_OPENGL */
    +
    6788
    +
    6789 if( 0 == str_sz ) {
    +
    6790 str_sz = strlen( str );
    +
    6791 }
    +
    6792
    +
    6793# if defined( RETROFLAT_OPENGL )
    +
    6794
    +
    6795 if( NULL == target || retroflat_screen_buffer() == target ) {
    +
    6796 /* Push new overlay projection parms before we create a new overlay. */
    +
    6797 retroglu_push_overlay( x_orig, y_orig, screen_x, screen_y, aspect_ratio );
    +
    6798
    +
    6799 retroglu_string(
    +
    6800 screen_x, screen_y, 0,
    +
    6801 g_retroflat_state->palette[color], str, str_sz, font_str, flags );
    +
    6802
    + +
    6804 } else {
    +
    6805 /* Assume drawing surface is already configured inside a push_overlay()
    +
    6806 * call and draw to its texture. */
    +
    6807 retrosoft_string(
    +
    6808 target, color, str, str_sz, font_str, x_orig, y_orig, flags );
    +
    6809 }
    +
    6810
    +
    6811# elif defined( RETROFLAT_SOFT_SHAPES )
    +
    6812
    +
    6813 retrosoft_string(
    +
    6814 target, color, str, str_sz, font_str, x_orig, y_orig, flags );
    +
    6815
    +
    6816# elif defined( RETROFLAT_API_ALLEGRO )
    +
    6817
    +
    6818 /* == Allegro == */
    +
    6819
    +
    6820 if( NULL == font_str || '\0' == font_str[0] ) {
    +
    6821 font_data = font;
    +
    6822 } else {
    +
    6823 /* TODO: Cache loaded fonts for later use. */
    +
    6824 font_data = load_font( font_str, NULL, NULL );
    +
    6825 }
    +
    6826 if( NULL == font_data ) {
    + +
    6828 "Error", "Unable to load font: %s", font_str );
    +
    6829 goto cleanup;
    +
    6830 }
    +
    6831
    +
    6832 textout_ex( target->b, font_data, str, x_orig, y_orig, color, -1 );
    +
    6833
    +
    6834cleanup:
    +
    6835 if( font_loaded && NULL != font_data ) {
    +
    6836 destroy_font( font_data );
    +
    6837 }
    +
    6838
    +
    6839# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    6840
    +
    6841 /* == Win16/Win32 == */
    +
    6842
    +
    6843 assert( NULL != target->b );
    +
    6844
    +
    6845 assert( retroflat_bitmap_locked( target ) );
    +
    6846
    +
    6847 /* DrawText will draw gibberish even if the string is null-terminated! */
    +
    6848 str_sz = strlen( str );
    +
    6849
    +
    6850 memset( &sz, '\0', sizeof( SIZE ) );
    +
    6851
    +
    6852 font = retroflat_win_create_font( flags, font_str );
    +
    6853 old_font = SelectObject( target->hdc_b, font );
    +
    6854
    +
    6855 GetTextExtentPoint( target->hdc_b, str, str_sz, &sz );
    +
    6856 rect.left = x_orig;
    +
    6857 rect.top = y_orig;
    +
    6858 rect.right = (x_orig + sz.cx);
    +
    6859 rect.bottom = (y_orig + sz.cy);
    +
    6860
    +
    6861 SetTextColor( target->hdc_b, g_retroflat_state->palette[color] );
    +
    6862 SetBkMode( target->hdc_b, TRANSPARENT );
    +
    6863
    +
    6864 DrawText( target->hdc_b, str, str_sz, &rect, 0 );
    +
    6865
    +
    6866/* cleanup: */
    +
    6867
    +
    6868 SelectObject( target->hdc_b, old_font );
    +
    6869
    +
    6870 SetBkMode( target->hdc_b, OPAQUE );
    +
    6871 SetTextColor( target->hdc_b,
    +
    6872 g_retroflat_state->palette[RETROFLAT_COLOR_BLACK] );
    +
    6873
    +
    6874# else
    +
    6875# pragma message( "warning: string not implemented" )
    +
    6876# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    6877}
    +
    6878
    +
    6879/* === */
    +
    6880
    +
    6881void retroflat_get_palette( uint8_t idx, uint32_t* p_rgb ) {
    +
    6882
    +
    6883# ifdef RETROFLAT_OPENGL
    +
    6884
    +
    6885 *p_rgb = 0;
    +
    6886 *p_rgb |= g_retroflat_state->tex_palette[idx][0] & 0xff;
    +
    6887 *p_rgb |= (g_retroflat_state->tex_palette[idx][1] & 0xff) << 8;
    +
    6888 *p_rgb |= (g_retroflat_state->tex_palette[idx][2] & 0xff) << 16;
    +
    6889
    +
    6890# elif defined( RETROFLAT_API_SDL2 )
    +
    6891
    +
    6892 *p_rgb = 0;
    +
    6893 *p_rgb |= g_retroflat_state->palette[idx].b & 0xff;
    +
    6894 *p_rgb |= ((g_retroflat_state->palette[idx].g & 0xff) << 8);
    +
    6895 *p_rgb |= ((g_retroflat_state->palette[idx].r & 0xff) << 16);
    +
    6896
    +
    6897# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6898
    +
    6899 /* Set VGA mask register. */
    +
    6900 switch( g_retroflat_state->screen_mode ) {
    +
    6901 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6902 outp( 0x3c6, 0xff );
    +
    6903 outp( 0x3c7, idx );
    +
    6904 *p_rgb = 0;
    +
    6905 *p_rgb |= ((uint32_t)(inp( 0x3c9 ) & 0xff) << 16);
    +
    6906 *p_rgb |= ((uint32_t)(inp( 0x3c9 ) & 0xff) << 8);
    +
    6907 *p_rgb |= (inp( 0x3c9 ) & 0xff);
    +
    6908 break;
    +
    6909
    +
    6910 default:
    +
    6911 error_printf( "could not set palette index %d in screen mode %d!",
    +
    6912 idx, g_retroflat_state->screen_mode );
    +
    6913 break;
    +
    6914 }
    +
    6915
    +
    6916# else
    +
    6917# pragma message( "warning: get palette not implemented" )
    +
    6918# endif
    +
    6919
    +
    6920}
    +
    6921
    +
    6922/* === */
    +
    6923
    +
    6924MERROR_RETVAL retroflat_set_palette( uint8_t idx, uint32_t rgb ) {
    +
    6925 MERROR_RETVAL retval = MERROR_OK;
    +
    6926# if defined( RETROFLAT_API_PC_BIOS )
    +
    6927 uint8_t byte_buffer = 0;
    +
    6928# endif /* RETROFLAT_API_PC_BIOS */
    +
    6929
    +
    6930 debug_printf( 3,
    +
    6931 "setting texture palette #%u to " UPRINTF_X32_FMT "...",
    +
    6932 idx, rgb );
    +
    6933
    +
    6934# ifdef RETROFLAT_OPENGL
    +
    6935
    +
    6936 g_retroflat_state->tex_palette[idx][0] = rgb & 0xff;
    +
    6937 g_retroflat_state->tex_palette[idx][1] = (rgb & 0xff00) >> 8;
    +
    6938 g_retroflat_state->tex_palette[idx][2] = (rgb & 0xff0000) >> 16;
    +
    6939
    +
    6940# elif defined( RETROFLAT_API_SDL2 )
    +
    6941
    +
    6942 g_retroflat_state->palette[idx].b = rgb & 0xff;
    +
    6943 g_retroflat_state->palette[idx].g = (rgb & 0xff00) >> 8;
    +
    6944 g_retroflat_state->palette[idx].r = (rgb & 0xff0000) >> 16;
    +
    6945
    +
    6946# elif defined( RETROFLAT_API_PC_BIOS )
    +
    6947
    +
    6948 /* Set VGA mask register. */
    +
    6949 switch( g_retroflat_state->screen_mode ) {
    +
    6950 case RETROFLAT_SCREEN_MODE_VGA:
    +
    6951 /* TODO: This doesn't seem to be working in DOSBox? */
    +
    6952 outp( 0x3c6, 0xff );
    +
    6953 outp( 0x3c8, idx );
    +
    6954
    +
    6955 byte_buffer = (rgb >> 16) & 0x3f;
    +
    6956 debug_printf( 1, "r: %u", byte_buffer );
    +
    6957 outp( 0x3c9, byte_buffer );
    +
    6958
    +
    6959 byte_buffer = (rgb >> 8) & 0x3f;
    +
    6960 debug_printf( 1, "g: %u", byte_buffer );
    +
    6961 outp( 0x3c9, byte_buffer );
    +
    6962
    +
    6963 byte_buffer = rgb & 0x3f;
    +
    6964 debug_printf( 1, "b: %u", byte_buffer );
    +
    6965 outp( 0x3c9, byte_buffer );
    +
    6966 break;
    +
    6967
    +
    6968 default:
    +
    6969 error_printf( "could not set palette index %d in screen mode %d!",
    +
    6970 idx, g_retroflat_state->screen_mode );
    +
    6971 break;
    +
    6972 }
    +
    6973
    +
    6974# else
    +
    6975# pragma message( "warning: set palette not implemented" )
    +
    6976# endif
    +
    6977
    +
    6978 return retval;
    +
    6979}
    +
    6980
    +
    6981/* === */
    +
    6982
    +
    6983void retroflat_set_proc_resize(
    +
    6984 retroflat_proc_resize_t on_resize_in, void* data_in
    +
    6985) {
    +
    6986 g_retroflat_state->on_resize = on_resize_in;
    +
    6987 g_retroflat_state->on_resize_data = data_in;
    +
    6988}
    +
    6989
    +
    6990/* === */
    +
    6991
    +
    6992void retroflat_resize_v() {
    +
    6993# if defined( RETROFLAT_API_SDL2 )
    +
    6994
    +
    6995 g_retroflat_state->screen_v_w = g_retroflat_state->screen_w;
    +
    6996 g_retroflat_state->screen_v_h = g_retroflat_state->screen_h;
    +
    6997
    +
    6998 assert( NULL != g_retroflat_state->buffer.texture );
    +
    6999 SDL_DestroyTexture( g_retroflat_state->buffer.texture );
    +
    7000
    +
    7001 /* Create the buffer texture. */
    +
    7002 g_retroflat_state->buffer.texture =
    +
    7003 SDL_CreateTexture( g_retroflat_state->buffer.renderer,
    +
    7004 SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,
    +
    7005 g_retroflat_state->screen_w, g_retroflat_state->screen_h );
    +
    7006
    +
    7007# endif /* RETROFLAT_API_SDL2 */
    +
    7008}
    +
    7009
    +
    7010/* === */
    +
    7011
    +
    7012RETROFLAT_IN_KEY retroflat_poll_input( struct RETROFLAT_INPUT* input ) {
    +
    7013# if defined( RETROFLAT_OS_DOS ) || defined( RETROFLAT_OS_DOS_REAL )
    +
    7014 union REGS inregs;
    +
    7015 union REGS outregs;
    +
    7016# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    7017 int eres = 0;
    +
    7018 SDL_Event event;
    +
    7019# endif /* RETROFLAT_API_ALLEGRO && RETROFLAT_OS_DOS */
    +
    7020 RETROFLAT_IN_KEY key_out = 0;
    +
    7021
    +
    7022 assert( NULL != input );
    +
    7023
    +
    7024 input->key_flags = 0;
    +
    7025
    +
    7026# if defined( RETROFLAT_API_ALLEGRO )
    +
    7027
    +
    7028 /* == Allegro == */
    +
    7029
    +
    7030 if( g_retroflat_state->close_button ) {
    +
    7031 retroflat_quit( 0 );
    +
    7032 return 0;
    +
    7033 }
    +
    7034
    +
    7035# ifdef RETROFLAT_OS_DOS
    +
    7036
    +
    7037 /* Poll the mouse. */
    +
    7038 inregs.w.ax = 3;
    +
    7039 int386( 0x33, &inregs, &outregs );
    +
    7040
    +
    7041 if(
    +
    7042 1 == outregs.x.ebx && /* Left button clicked. */
    +
    7043 outregs.w.cx != g_retroflat_state->last_mouse_x &&
    +
    7044 outregs.w.dx != g_retroflat_state->last_mouse_y
    +
    7045 ) {
    +
    7046 input->mouse_x = outregs.w.cx;
    +
    7047 input->mouse_y = outregs.w.dx;
    +
    7048
    +
    7049 /* Prevent repeated clicks. */
    +
    7050 g_retroflat_state->last_mouse_x = input->mouse_x;
    +
    7051 g_retroflat_state->last_mouse_y = input->mouse_y;
    +
    7052
    +
    7053 return RETROFLAT_MOUSE_B_LEFT;
    +
    7054 } else {
    +
    7055 g_retroflat_state->last_mouse_x = outregs.w.cx;
    +
    7056 g_retroflat_state->last_mouse_y = outregs.w.dx;
    +
    7057 }
    +
    7058
    +
    7059# else
    +
    7060 /* Allegro mouse is broken in DOS. */
    +
    7061 poll_mouse();
    +
    7062 if( mouse_b & 0x01 ) {
    +
    7063 input->mouse_x = mouse_x;
    +
    7064 input->mouse_y = mouse_y;
    +
    7065 return RETROFLAT_MOUSE_B_LEFT;
    +
    7066 } else if( mouse_b & 0x02 ) {
    +
    7067 input->mouse_x = mouse_x;
    +
    7068 input->mouse_y = mouse_y;
    +
    7069 return RETROFLAT_MOUSE_B_RIGHT;
    +
    7070 }
    +
    7071# endif /* RETROFLAT_OS_DOS */
    +
    7072
    +
    7073 poll_keyboard();
    +
    7074 if( keypressed() ) {
    +
    7075 /* TODO: ??? */
    +
    7076 if( KB_SHIFT_FLAG == (KB_SHIFT_FLAG & key_shifts) ) {
    +
    7077 input->key_flags |= RETROFLAT_INPUT_MOD_SHIFT;
    +
    7078 }
    +
    7079
    +
    7080 if( KB_CTRL_FLAG == (KB_CTRL_FLAG & key_shifts) ) {
    +
    7081 input->key_flags |= RETROFLAT_INPUT_MOD_CTRL;
    +
    7082 }
    +
    7083
    +
    7084 if( KB_ALT_FLAG == (KB_ALT_FLAG & key_shifts) ) {
    +
    7085 input->key_flags |= RETROFLAT_INPUT_MOD_ALT;
    +
    7086 }
    +
    7087
    +
    7088 return (readkey() >> 8);
    +
    7089 }
    +
    7090
    +
    7091# elif defined( RETROFLAT_API_SDL1 ) || defined( RETROFLAT_API_SDL2 )
    +
    7092
    +
    7093 /* == SDL == */
    +
    7094
    +
    7095 SDL_PollEvent( &event );
    +
    7096
    +
    7097 switch( event.type ) {
    +
    7098 case SDL_QUIT:
    +
    7099 /* Handle SDL window close. */
    +
    7100 retroflat_quit( 0 );
    +
    7101 break;
    +
    7102
    +
    7103 case SDL_KEYDOWN:
    +
    7104 key_out = event.key.keysym.sym;
    +
    7105
    +
    7106 if(
    +
    7107 KMOD_RSHIFT == (KMOD_RSHIFT & event.key.keysym.mod) ||
    +
    7108 KMOD_LSHIFT == (KMOD_LSHIFT & event.key.keysym.mod)
    +
    7109 ) {
    +
    7110 input->key_flags |= RETROFLAT_INPUT_MOD_SHIFT;
    +
    7111 }
    +
    7112
    +
    7113 if( KMOD_CTRL == (KMOD_CTRL & event.key.keysym.mod) ) {
    +
    7114 input->key_flags |= RETROFLAT_INPUT_MOD_CTRL;
    +
    7115 }
    +
    7116
    +
    7117 if( KMOD_ALT == (KMOD_ALT & event.key.keysym.mod) ) {
    +
    7118 input->key_flags |= RETROFLAT_INPUT_MOD_ALT;
    +
    7119 }
    +
    7120
    +
    7121 /* Flush key buffer to improve responsiveness. */
    +
    7122 if(
    + +
    7124 (RETROFLAT_FLAGS_KEY_REPEAT & g_retroflat_state->retroflat_flags)
    +
    7125 ) {
    +
    7126 while( (eres = SDL_PollEvent( &event )) );
    +
    7127 }
    +
    7128 break;
    +
    7129
    +
    7130 case SDL_MOUSEBUTTONUP:
    +
    7131 /* Stop dragging. */
    +
    7132 g_retroflat_state->mouse_state = 0;
    +
    7133 break;
    +
    7134
    +
    7135 case SDL_MOUSEBUTTONDOWN:
    +
    7136
    +
    7137 /* Begin dragging. */
    +
    7138
    +
    7139 input->mouse_x = event.button.x;
    +
    7140 input->mouse_y = event.button.y;
    +
    7141
    +
    7142 /* Differentiate which button was clicked. */
    +
    7143 if( SDL_BUTTON_LEFT == event.button.button ) {
    +
    7144 key_out = RETROFLAT_MOUSE_B_LEFT;
    +
    7145 g_retroflat_state->mouse_state = RETROFLAT_MOUSE_B_LEFT;
    +
    7146 } else if( SDL_BUTTON_RIGHT == event.button.button ) {
    +
    7147 key_out = RETROFLAT_MOUSE_B_RIGHT;
    +
    7148 g_retroflat_state->mouse_state = RETROFLAT_MOUSE_B_RIGHT;
    +
    7149 }
    +
    7150
    +
    7151 /* Flush key buffer to improve responsiveness. */
    +
    7152 /*while( (eres = SDL_PollEvent( &event )) );*/
    +
    7153 break;
    +
    7154
    +
    7155# if !defined( RETROFLAT_API_SDL1 )
    +
    7156 case SDL_WINDOWEVENT:
    +
    7157 switch( event.window.event ) {
    +
    7158 case SDL_WINDOWEVENT_RESIZED:
    +
    7159 retroflat_on_resize( event.window.data1, event.window.data2 );
    +
    7160 if( NULL != g_retroflat_state->on_resize ) {
    +
    7161 g_retroflat_state->on_resize(
    +
    7162 event.window.data1, event.window.data2,
    +
    7163 g_retroflat_state->on_resize_data );
    +
    7164 }
    +
    7165 break;
    +
    7166 }
    +
    7167 break;
    +
    7168# endif /* !RETROFLAT_API_SDL1 */
    +
    7169
    +
    7170 default:
    +
    7171 /* Check for mouse dragging if mouse was previously held down. */
    +
    7172 if( 0 != g_retroflat_state->mouse_state ) {
    +
    7173 /* Update coordinates and keep dragging. */
    +
    7174 SDL_GetMouseState( &(input->mouse_x), &(input->mouse_y) );
    +
    7175 key_out = g_retroflat_state->mouse_state;
    +
    7176 }
    +
    7177 break;
    +
    7178 }
    +
    7179
    +
    7180# elif defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    7181
    +
    7182 /* == Win16/Win32 == */
    +
    7183
    +
    7184 if( g_retroflat_state->last_key ) {
    +
    7185 /* Return g_retroflat_state->last_key, which is set in WndProc when a keypress msg is
    +
    7186 * received.
    +
    7187 */
    +
    7188 key_out = g_retroflat_state->last_key;
    +
    7189 input->key_flags = g_retroflat_state->vk_mods;
    +
    7190
    +
    7191 debug_printf( RETROFLAT_KB_TRACE_LVL, "raw key: 0x%04x", key_out );
    +
    7192
    +
    7193 /* Reset pressed key. */
    +
    7194 g_retroflat_state->last_key = 0;
    +
    7195
    +
    7196 } else if( g_retroflat_state->last_mouse ) {
    +
    7197 if( MK_LBUTTON == (MK_LBUTTON & g_retroflat_state->last_mouse) ) {
    +
    7198 input->mouse_x = g_retroflat_state->last_mouse_x;
    +
    7199 input->mouse_y = g_retroflat_state->last_mouse_y;
    +
    7200 key_out = RETROFLAT_MOUSE_B_LEFT;
    +
    7201 } else if( MK_RBUTTON == (MK_RBUTTON & g_retroflat_state->last_mouse) ) {
    +
    7202 input->mouse_x = g_retroflat_state->last_mouse_x;
    +
    7203 input->mouse_y = g_retroflat_state->last_mouse_y;
    +
    7204 key_out = RETROFLAT_MOUSE_B_RIGHT;
    +
    7205 }
    +
    7206 g_retroflat_state->last_mouse = 0;
    +
    7207 g_retroflat_state->last_mouse_x = 0;
    +
    7208 g_retroflat_state->last_mouse_y = 0;
    +
    7209 }
    +
    7210
    +
    7211# ifdef RETROFLAT_SCREENSAVER
    +
    7212 if(
    + +
    7214 (RETROFLAT_FLAGS_SCREENSAVER & g_retroflat_state->retroflat_flags))
    +
    7215 && 0 != key_out
    +
    7216 ) {
    +
    7217 /* retroflat_quit( 0 ); */
    +
    7218 }
    +
    7219# endif /* RETROFLAT_SCREENSAVER */
    +
    7220
    +
    7221# elif defined( RETROFLAT_API_GLUT )
    +
    7222
    +
    7223 /* TODO: Implement RETROFLAT_MOD_SHIFT. */
    +
    7224
    +
    7225 key_out = g_retroflat_state->retroflat_last_key;
    +
    7226 g_retroflat_state->retroflat_last_key = 0;
    +
    7227
    +
    7228 /* TODO: Handle mouse. */
    +
    7229
    +
    7230# elif defined( RETROFLAT_API_PC_BIOS )
    +
    7231
    +
    7232 /* TODO: Poll the mouse. */
    +
    7233
    +
    7234 /* TODO: Implement RETROFLAT_MOD_SHIFT. */
    +
    7235
    +
    7236 if( kbhit() ) {
    +
    7237 /* Poll the keyboard. */
    +
    7238 key_out = getch();
    +
    7239 debug_printf( 2, "key: 0x%02x", key_out );
    +
    7240 if( 0 == key_out ) {
    +
    7241 /* Special key was pressed that returns two scan codes. */
    +
    7242 key_out = getch();
    +
    7243 switch( key_out ) {
    +
    7244 case 0x48: key_out = RETROFLAT_KEY_UP; break;
    +
    7245 case 0x4b: key_out = RETROFLAT_KEY_LEFT; break;
    +
    7246 case 0x4d: key_out = RETROFLAT_KEY_RIGHT; break;
    +
    7247 case 0x50: key_out = RETROFLAT_KEY_DOWN; break;
    +
    7248 case 0x4f: key_out = RETROFLAT_KEY_HOME; break;
    +
    7249 case 0x47: key_out = RETROFLAT_KEY_END; break;
    +
    7250 case 0x51: key_out = RETROFLAT_KEY_PGDN; break;
    +
    7251 case 0x49: key_out = RETROFLAT_KEY_PGUP; break;
    +
    7252 case 0x53: key_out = RETROFLAT_KEY_DELETE; break;
    +
    7253 }
    +
    7254 }
    +
    7255 if(
    + +
    7257 (RETROFLAT_FLAGS_KEY_REPEAT & g_retroflat_state->retroflat_flags)
    +
    7258 ) {
    +
    7259 while( kbhit() ) {
    +
    7260 getch();
    +
    7261 }
    +
    7262 }
    +
    7263 }
    +
    7264
    +
    7265# else
    +
    7266# pragma message( "warning: poll input not implemented" )
    +
    7267# endif /* RETROFLAT_API_ALLEGRO || RETROFLAT_API_SDL1 || RETROFLAT_API_SDL2 || RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    7268
    +
    7269 /* TODO: Handle NDS input! */
    +
    7270
    +
    7271 return key_out;
    +
    7272}
    +
    7273
    +
    7274/* === */
    +
    7275
    +
    7276#elif !defined( RETROVDP_C ) /* End of RETROFLT_C */
    +
    7277
    +
    7278#define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
    +
    7279 extern MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u;
    +
    7280
    +
    7281RETROFLAT_COLOR_TABLE( RETROFLAT_COLOR_TABLE_CONSTS )
    +
    7282
    +
    7283extern MAUG_CONST char* SEG_MCONST gc_retroflat_color_names[];
    +
    7284
    +
    7285 extern struct RETROFLAT_STATE* g_retroflat_state;
    +
    7286# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
    +
    7287 extern HINSTANCE g_retroflat_instance;
    +
    7288 extern int g_retroflat_cmd_show;
    +
    7289# endif /* RETROFLAT_API_WIN16 || RETROFLAT_API_WIN32 */
    +
    7290
    +
    7291# include <uprintf.h>
    +
    7292
    +
    7293# if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES)) \
    +
    7294 && !defined( MAUG_NO_AUTO_C )
    +
    7295# include <retrofp.h>
    +
    7296# include <retrosft.h>
    +
    7297# endif /* RETROFLAT_SOFT_SHAPES || RETROFLAT_SOFT_LINES */
    +
    7298
    +
    7299# if defined( RETROFLAT_OPENGL ) && !defined( MAUG_NO_AUTO_C )
    +
    7300# include <retroglu.h>
    +
    7301# include <retrofp.h>
    +
    7302# include <retrosft.h>
    +
    7303# endif /* RETROFLAT_OPENGL */
    +
    7304
    +
    7305#endif /* RETROFLT_C */
    +
    7306
    +
    7307#ifdef RETROFLAT_XPM
    +
    7308#include <retroxpm.h>
    +
    7309#endif /* RETROFLAT_XPM */
    +
    7310
    +
    7311#ifdef RETROVDP_C
    +
    7312
    +
    7313/* Declarations for VDP sources. */
    +
    7314
    +
    7315#endif /* RETROVDP_C */
    +
    7316
    +
    7317 /* maug_retroflt */
    +
    7318
    +
    7319#endif /* RETROFLT_H */
    +
    7320
    +
    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:756
    +
    #define RETROFLAT_BITMAP_EXT
    The filename suffix to be appended with a "." to filenames passed to retroflat_load_bitmap()....
    Definition retroflt.h:559
    +
    #define RETROFLAT_TXP_G
    Compiler-define-overridable constant indicating the Green value of the transparency color on platform...
    Definition retroflt.h:582
    +
    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:591
    +
    #define retroflat_bitmap_ok(bitmap)
    Check to see if a bitmap is loaded.
    Definition retroflt.h:1962
    +
    #define RETROFLAT_TXP_R
    Compiler-define-overridable constant indicating the Red value of the transparency color on platforms ...
    Definition retroflt.h:573
    +
    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:669
    +
    #define NDS_SPRITES_ACTIVE
    Maximum number of sprites active on-screen on Nintendo DS.
    Definition retroflt.h:737
    +
    #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:661
    +
    #define RETROFLAT_VDP_ARGS_SZ_MAX
    Definition retroflt.h:693
    +
    #define RETROFLAT_MSG_MAX
    Maximum number of characters possible in a message using retroflat_message(). Is a RetroFlat Compiler...
    Definition retroflt.h:677
    +
    #define RETROFLAT_WINDOW_CLASS
    Unique window class to use on some platforms (e.g. Win32). Is a RetroFlat Compiler Definitions.
    Definition retroflt.h:653
    +
    #define RETROFLAT_FPS
    Target Frames Per Second.
    Definition retroflt.h:643
    +
    #define RETROFLAT_ASSETS_PATH_MAX
    Maximum size of the assets path, to allow room for appending.
    Definition retroflt.h:728
    +
    #define NDS_OAM_ACTIVE
    Active sprite engine screen on Nintendo DS.
    Definition retroflt.h:732
    +
    #define RETROFLAT_PATH_MAX
    Maximum size allocated for asset paths.
    Definition retroflt.h:682
    +
    #define RETROFLAT_PATH_SEP
    The valid path separator on the target platform.
    Definition retroflt.h:724
    +
    #define RETROFLAT_FLAGS_LITERAL_PATH
    Flag for retroflat_load_bitmap() to not use assets path.
    Definition retroflt.h:381
    +
    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:368
    +
    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:362
    +
    #define RETROFLAT_FLAGS_SCREEN_BUFFER
    Flag for retroflat_create_bitmap() to create a WinG-backed bitmap.
    Definition retroflt.h:397
    +
    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:430
    +
    #define RETROFLAT_FLAGS_UNLOCK_FPS
    Flag indicating FPS should not be capped.
    Definition retroflt.h:418
    +
    #define RETROFLAT_FLAGS_SCALE2X
    Only supported on some platforms: Attempt to scale screen by 2X.
    Definition retroflt.h:435
    +
    #define RETROFLAT_FLAGS_RUNNING
    Flag indicating that retroflat_loop() should continue executing.
    Definition retroflt.h:412
    +
    #define RETROFLAT_FLAGS_KEY_REPEAT
    Flag indicating keyboard repeat is enabled.
    Definition retroflt.h:424
    +
    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:467
    +
    #define RETROFLAT_MSG_FLAG_TYPE_MASK
    This mask covers all possible icon/type flags.
    Definition retroflt.h:447
    +
    #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:460
    +
    #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:453
    +
    #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:505
    +
    #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:492
    +
    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:1970
    +
    #define retroflat_quit(retval_in)
    This should be called in order to quit a program using RetroFlat.
    Definition retroflt.h:1979
    +
    #define retroflat_screen_buffer()
    Get the direct screen buffer or the VDP buffer if a VDP is loaded.
    Definition retroflt.h:1973
    +
    void(* retroflat_loop_iter)(void *data)
    Prototype for the main loop function passed to retroflat_loop().
    Definition retroflt.h:768
    +
    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:1967
    +
    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:53
    +
    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:2095
    +
    char * config_path
    Relative path of local config file (if not using registry).
    Definition retroflt.h:2105
    +
    char * assets_path
    Relative path under which bitmap assets are stored.
    Definition retroflt.h:2102
    +
    int screen_h
    Desired screen or window height in pixels.
    Definition retroflt.h:2112
    +
    char * title
    Title to set for the main program Window if applicable on the target platform.
    Definition retroflt.h:2100
    +
    int screen_y
    Desired window Y position in pixels.
    Definition retroflt.h:2116
    +
    int screen_x
    Desired window X position in pixels.
    Definition retroflt.h:2114
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:1953
    +
    size_t sz
    Size of the bitmap structure, used to check VDP compatibility.
    Definition retroflt.h:1955
    +
    uint8_t flags
    Platform-specific bitmap flags.
    Definition retroflt.h:1957
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:818
    +
    int mouse_y
    Y-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:828
    +
    int mouse_x
    X-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:823
    +
    Global singleton containing state for the current platform.
    Definition retroflt.h:2133
    +
    int screen_w
    The screen width as seen by the system, after scaling.
    Definition retroflt.h:2186
    +
    char vdp_args[RETROFLAT_VDP_ARGS_SZ_MAX]
    CLI args passed with -vdp to the RetroFlat VDP API.
    Definition retroflt.h:2164
    +
    uint8_t vdp_flags
    Flags set by the RetroFlat VDP API.
    Definition retroflt.h:2166
    +
    int screen_h
    The screen height as seen by the system, after scaling.
    Definition retroflt.h:2188
    +
    uint8_t retroflat_flags
    Global Flags indicating current system status.
    Definition retroflt.h:2137
    +
    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:2151
    +
    int screen_v_h
    The screen height as seen by our program, before scaling.
    Definition retroflt.h:2184
    +
    struct RETROFLAT_BITMAP buffer
    Off-screen buffer bitmap.
    Definition retroflt.h:2143
    +
    void * vdp_exe
    A handle for the loaded RetroFlat VDP API module.
    Definition retroflt.h:2156
    +
    RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ]
    Index of available colors, initialized on platform init.
    Definition retroflt.h:2141
    +
    void * vdp_data
    Pointer to data defined by the RetroFlat VDP API for its use.
    Definition retroflt.h:2162
    +
    int screen_v_w
    The screen width as seen by our program, before scaling.
    Definition retroflt.h:2177
    + +
    + + +
    + + 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..8fc493a4 --- /dev/null +++ b/retrofnt_8h_source.html @@ -0,0 +1,535 @@ + + + + + + + +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
    +
    73static size_t retrofont_sz_from_filename( const char* font_name ) {
    +
    74 const char* p_c = NULL;
    +
    75 size_t glyph_h = 0;
    +
    76 size_t i = 0;
    +
    77 char glyph_h_buf[10];
    +
    78
    +
    79 maug_mzero( glyph_h_buf, 10 );
    +
    80
    +
    81 p_c = strrchr( font_name, '.' );
    +
    82 while( p_c - 1 > font_name ) {
    +
    83 /* Start at the char before the '.' and work backwords until a '-'. */
    +
    84 p_c--;
    +
    85 if( '-' == *p_c ) {
    +
    86 break;
    +
    87 }
    +
    88
    +
    89 /* TODO: Break if not a digit! */
    +
    90
    +
    91 /* Shift existing numbers up by one. */
    +
    92 for( i = 9 ; 0 < i ; i-- ) {
    +
    93 glyph_h_buf[i] = glyph_h_buf[i - 1];
    +
    94 }
    +
    95
    +
    96 /* Add the most recent number to the beginning. */
    +
    97 glyph_h_buf[0] = *p_c;
    +
    98 }
    +
    99
    +
    100 glyph_h = atoi( glyph_h_buf );
    +
    101
    +
    102 debug_printf( 1, "detected glyph height: " SIZE_T_FMT, glyph_h );
    +
    103
    +
    104 return glyph_h;
    +
    105}
    +
    106
    +
    107MERROR_RETVAL retrofont_load(
    +
    108 const char* font_name, MAUG_MHANDLE* p_font_h,
    +
    109 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count
    +
    110) {
    +
    111 MERROR_RETVAL retval = MERROR_OK;
    +
    112 mfile_t font_file;
    +
    113 char line[RETROFONT_LINE_SZ];
    +
    114 struct RETROFONT* font = NULL;
    +
    115 char* line_bytes = NULL;
    +
    116 uint16_t glyph_idx = 0;
    +
    117 uint8_t* p_glyph = NULL;
    +
    118 size_t i = 0;
    +
    119 uint8_t glyph_w_bytes = 0;
    +
    120 uint8_t glyph_w = 0;
    +
    121
    +
    122 maug_mzero( &font_file, sizeof( mfile_t ) );
    +
    123
    +
    124 /* TODO: Font loading seems to be very slow on a 486. This needs
    +
    125 * investigation.
    +
    126 */
    +
    127
    +
    128 if( 0 == glyph_h ) {
    +
    129 glyph_h = retrofont_sz_from_filename( font_name );
    +
    130 }
    +
    131 if( 0 == glyph_h ) {
    +
    132 error_printf( "unable to determine font height!" );
    +
    133 retval = MERROR_GUI;
    +
    134 goto cleanup;
    +
    135 }
    +
    136
    +
    137 /* Try to separate the string into index:glyph bytes. */
    +
    138 #define retrofont_split_glyph_line( line, line_bytes ) \
    +
    139 line_bytes = strchr( line, ':' ); \
    +
    140 if( NULL == line_bytes ) { \
    +
    141 error_printf( "invalid line: %s", line ); \
    +
    142 retval = MERROR_PARSE; \
    +
    143 } \
    +
    144 line_bytes[0] = '\0'; \
    +
    145 line_bytes++;
    +
    146
    +
    147 retval = mfile_open_read( font_name, &font_file );
    +
    148 maug_cleanup_if_not_ok();
    +
    149
    +
    150 /* Figure out font width from file and alloc just enough. */
    +
    151 retval = mfile_read_line( &font_file, line, RETROFONT_LINE_SZ );
    +
    152 maug_cleanup_if_not_ok();
    +
    153 retrofont_split_glyph_line( line, line_bytes );
    +
    154 maug_cleanup_if_not_ok();
    +
    155 glyph_w_bytes = (strlen( line_bytes ) / glyph_h) >> 1; /* 2 hex per byte */
    +
    156 debug_printf( RETROFONT_TRACE_LVL, "glyph_w_bytes: %u", glyph_w_bytes );
    +
    157 glyph_w = glyph_w_bytes * 8;
    +
    158
    +
    159#if 0 < RETROFONT_TRACE_LVL
    +
    160 debug_printf( RETROFONT_TRACE_LVL, "glyph_w: %u, glyph_sz: %u",
    +
    161 glyph_w, glyph_h * glyph_w_bytes );
    +
    162#endif
    +
    163
    +
    164 /* Alloc enough for each glyph, plus the size of the font header. */
    +
    165 *p_font_h = maug_malloc( 1,
    +
    166 sizeof( struct RETROFONT ) +
    +
    167 (glyph_h * glyph_w_bytes * (1 + glyphs_count)) );
    +
    168 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *p_font_h );
    +
    169
    +
    170#if 0 < RETROFONT_TRACE_LVL
    +
    171 debug_printf( RETROFONT_TRACE_LVL, "allocated font %s: " SIZE_T_FMT " bytes",
    +
    172 font_name, (glyph_h * glyph_w_bytes * (1 + glyphs_count)) +
    +
    173 sizeof( struct RETROFONT ) );
    +
    174#endif
    +
    175
    +
    176 maug_mlock( *p_font_h, font );
    +
    177 maug_cleanup_if_null_alloc( struct RETROFONT*, font );
    +
    178
    +
    179 /* Set initial font parameters. */
    +
    180 font->sz = sizeof( struct RETROFONT );
    +
    181 font->first_glyph = first_glyph;
    +
    182 font->glyph_w = glyph_w;
    +
    183 font->glyph_h = glyph_h;
    +
    184 font->glyph_sz = glyph_h * glyph_w_bytes;
    +
    185
    +
    186 while( mfile_has_bytes( &font_file ) ) {
    +
    187 retval = mfile_read_line( &font_file, line, RETROFONT_LINE_SZ );
    +
    188
    +
    189 retrofont_split_glyph_line( line, line_bytes );
    +
    190 if( MERROR_PARSE == retval ) {
    +
    191 /* The line couldn't parse, so skip it, but don't give up entirely and
    +
    192 * keep going to the next line.
    +
    193 */
    +
    194 retval = MERROR_OK;
    +
    195 continue;
    +
    196 }
    +
    197
    +
    198 /* Figure out the index of this glyph. */
    +
    199 /* TODO: Maug replacement for C99 crutch. */
    +
    200 glyph_idx = strtoul( line, NULL, 16 );
    +
    201 if( glyph_idx < first_glyph || glyph_idx > first_glyph + glyphs_count ) {
    +
    202 /* Skip glyph out of range. */
    +
    203 continue;
    +
    204 }
    +
    205
    +
    206 /* Find where to put the decoded glyph. */
    +
    207 p_glyph = retrofont_glyph_at( font, glyph_idx );
    +
    208
    +
    209 for( i = 0 ; font->glyph_h > i ; i++ ) {
    +
    210 switch( font->glyph_w ) {
    +
    211 case 8:
    +
    212 p_glyph[i] = 0;
    +
    213 p_glyph[i] |= maug_hctoi( line_bytes[i << 1] ) << 4;
    +
    214 p_glyph[i] |= maug_hctoi( line_bytes[(i << 1) + 1] );
    +
    215 break;
    +
    216
    +
    217 case 16:
    +
    218 /* TODO */
    +
    219 break;
    +
    220
    +
    221 case 32:
    +
    222 /* TODO */
    +
    223 break;
    +
    224
    +
    225 default:
    +
    226 error_printf( "invalid font width: %u", font->glyph_w );
    +
    227 retval = MERROR_PARSE;
    +
    228 goto cleanup;
    +
    229 }
    +
    230 }
    +
    231
    +
    232#if 0 < RETROFONT_TRACE_LVL
    +
    233 /* Test dump to verify glyph integrity. */
    +
    234 if( glyph_idx == 'B' ) {
    +
    235 retrofont_dump_glyph( p_glyph, glyph_w, glyph_h );
    +
    236 }
    +
    237#endif
    +
    238
    +
    239 font->glyphs_count++;
    +
    240
    +
    241 /* If we're not tracing, try to omit printfs from the inner loop! */
    +
    242#if 0 < RETROFONT_TRACE_LVL
    +
    243 debug_printf( RETROFONT_TRACE_LVL,
    +
    244 "%u %s (" SIZE_T_FMT " hbytes)", glyph_idx - first_glyph, line_bytes,
    +
    245 strlen( line_bytes ) );
    +
    246#endif
    +
    247 }
    +
    248
    +
    249cleanup:
    +
    250
    +
    251 if( NULL != font ) {
    +
    252 maug_munlock( *p_font_h, font );
    +
    253 }
    +
    254
    +
    255 mfile_close( &font_file );
    +
    256
    +
    257 return retval;
    +
    258}
    +
    259
    +
    260void retrofont_blit_glyph(
    +
    261 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    262 char c, struct RETROFONT* font, size_t x, size_t y, uint8_t flags
    +
    263) {
    +
    264 uint8_t* glyph = retrofont_glyph_at( font, c );
    +
    265 int16_t x_iter, y_iter;
    +
    266
    +
    267 debug_printf( RETROFONT_TRACE_LVL, "blit glyph: %c", c );
    +
    268
    +
    269 for( y_iter = 0 ; font->glyph_h > y_iter ; y_iter++ ) {
    +
    270 for( x_iter = 0 ; font->glyph_w > x_iter ; x_iter++ ) {
    +
    271 if(
    +
    272 1 << (font->glyph_w - x_iter) ==
    +
    273 (glyph[y_iter] & (1 << (font->glyph_w - x_iter)))
    +
    274 ) {
    +
    275 retroflat_px( target, color, x + x_iter, y + y_iter, 0 );
    +
    276 }
    +
    277 }
    +
    278 }
    +
    279}
    +
    280
    +
    281void retrofont_string(
    +
    282 struct RETROFLAT_BITMAP* target, RETROFLAT_COLOR color,
    +
    283 const char* str, size_t str_sz,
    +
    284 MAUG_MHANDLE font_h, size_t x, size_t y,
    +
    285 size_t max_w, size_t max_h, uint8_t flags
    +
    286) {
    +
    287 size_t i = 0;
    +
    288 size_t x_iter = x;
    +
    289 size_t y_iter = y;
    +
    290 struct RETROFONT* font = NULL;
    +
    291
    +
    292 if( (MAUG_MHANDLE)NULL == font_h ) {
    +
    293 error_printf( "NULL font specified!" );
    +
    294 goto cleanup;
    +
    295 }
    +
    296
    +
    297 if( 0 == str_sz ) {
    +
    298 str_sz = strlen( str );
    +
    299 }
    +
    300
    +
    301 maug_mlock( font_h, font );
    +
    302 if( NULL == font ) {
    +
    303 error_printf( "could not lock font!" );
    +
    304 goto cleanup;
    +
    305 }
    +
    306
    +
    307 /* TODO: Stop at max_w/max_h */
    +
    308
    +
    309 for( i = 0 ; str_sz > i ; i++ ) {
    +
    310 /* Terminate prematurely at null. */
    +
    311 if( '\0' == str[i] ) {
    +
    312 break;
    +
    313 }
    +
    314
    +
    315 /* Handle forced newline. */
    +
    316 if( '\r' == str[i] || '\n' == str[i] ) {
    +
    317 x_iter = x;
    +
    318 y_iter += font->glyph_h;
    +
    319 debug_printf(
    +
    320 RETROFONT_TRACE_LVL,
    +
    321 "newline: " SIZE_T_FMT ", " SIZE_T_FMT, x_iter, y_iter );
    +
    322 continue;
    +
    323 }
    +
    324
    +
    325 /* Filter out characters not present in this font. */
    +
    326 if(
    +
    327 ' ' != str[i] && (
    +
    328 str[i] < font->first_glyph ||
    +
    329 str[i] >= font->first_glyph + font->glyphs_count
    +
    330 )
    +
    331 ) {
    +
    332 error_printf( "invalid character: 0x%02x", str[i] );
    +
    333 continue;
    +
    334 }
    +
    335
    +
    336 /* TODO: More dynamic way to determine space character? */
    +
    337 if( ' ' != str[i] ) {
    +
    338 retrofont_blit_glyph(
    +
    339 target, color, str[i], font, x_iter, y_iter, flags );
    +
    340 }
    +
    341
    +
    342 x_iter += font->glyph_w;
    +
    343 if( 0 < max_w && (x + max_w) <= x_iter + font->glyph_w ) {
    +
    344 x_iter = x;
    +
    345 y_iter += font->glyph_h;
    +
    346 }
    +
    347 }
    +
    348
    +
    349cleanup:
    +
    350
    +
    351 if( NULL != font ) {
    +
    352 maug_munlock( font_h, font );
    +
    353 }
    +
    354}
    +
    355
    +
    356MERROR_RETVAL retrofont_string_sz(
    +
    357 struct RETROFLAT_BITMAP* target, const char* str, size_t str_sz,
    +
    358 MAUG_MHANDLE font_h, size_t max_w, size_t max_h,
    +
    359 size_t* out_w_p, size_t* out_h_p, uint8_t flags
    +
    360) {
    +
    361 size_t x_iter = 0;
    +
    362 size_t i = 0;
    +
    363 MERROR_RETVAL retval = MERROR_OK;
    +
    364 struct RETROFONT* font = NULL;
    +
    365
    +
    366 if( (MAUG_MHANDLE)NULL == font_h ) {
    +
    367 error_printf( "NULL font specified!" );
    +
    368 retval = MERROR_GUI;
    +
    369 goto cleanup;
    +
    370 }
    +
    371
    +
    372 if( 0 == str_sz ) {
    +
    373 str_sz = strlen( str );
    +
    374 }
    +
    375
    +
    376 maug_mlock( font_h, font );
    +
    377 maug_cleanup_if_null_alloc( struct RETROFONT*, font );
    +
    378
    +
    379 for( i = 0 ; str_sz > i ; i++ ) {
    +
    380 /* Terminate prematurely at null. */
    +
    381 if( '\0' == str[i] ) {
    +
    382 break;
    +
    383 }
    +
    384
    +
    385 /* Handle forced newline. */
    +
    386 if( '\r' == str[i] || '\n' == str[i] ) {
    +
    387 x_iter = 0;
    +
    388 *out_h_p += font->glyph_h;
    +
    389 continue;
    +
    390 }
    +
    391
    +
    392 x_iter += font->glyph_w;
    +
    393
    +
    394 if( *out_w_p <= x_iter ) {
    +
    395 *out_w_p = x_iter;
    +
    396 }
    +
    397 if( 0 < max_w && max_w < x_iter + font->glyph_w ) {
    +
    398 x_iter = 0;
    +
    399 *out_h_p += font->glyph_h;
    +
    400 if( 0 < max_h && *out_h_p + font->glyph_h >= max_h && i < str_sz ) {
    +
    401 error_printf( "string will not fit!" );
    +
    402
    +
    403 /* Do not quit; just make a note and keep going. */
    +
    404 retval = MERROR_GUI;
    +
    405 }
    +
    406 }
    +
    407 }
    +
    408
    +
    409 /* Add the height of the last line. */
    +
    410 *out_h_p += font->glyph_h;
    +
    411 *out_w_p += 1;
    +
    412
    +
    413cleanup:
    +
    414
    +
    415 if( NULL != font ) {
    +
    416 maug_munlock( font_h, font );
    +
    417 }
    +
    418
    +
    419 return retval;
    +
    420}
    +
    421
    +
    422#endif /* RETROFNT_C */
    +
    423
    +
    424/* \} */ /* retrofnt */
    +
    425
    +
    426#endif /* !RETROFNT_H */
    +
    427
    +
    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.
    +
    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:53
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:1953
    +
    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..12631a22 --- /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:682
    +
    #define RETROFLAT_PATH_SEP
    The valid path separator on the target platform.
    Definition retroflt.h:724
    +
    #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:1970
    +
    #define retroflat_screen_w()
    Get the current screen width in pixels.
    Definition retroflt.h:1967
    +
    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:1953
    +
    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..4d0daa53 --- /dev/null +++ b/retrogui_8h.html @@ -0,0 +1,233 @@ + + + + + + + +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_BTN_LBL_PADDED_X   8
     
    +#define RETROGUI_BTN_LBL_PADDED_Y   8
     
    +#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_copy_label(ctl, ctl_type)
     
    +#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_sz_ctl (struct RETROGUI *gui, union RETROGUI_CTL *ctl, size_t *p_w, size_t *p_h, size_t max_w, size_t max_h)
     
    +MERROR_RETVAL retrogui_pos_ctl (struct RETROGUI *gui, union RETROGUI_CTL *ctl, size_t x, size_t y, size_t w, size_t h)
     
    +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..726db40f --- /dev/null +++ b/retrogui_8h_source.html @@ -0,0 +1,1699 @@ + + + + + + + +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_BTN_LBL_PADDED_X
    +
    39# define RETROGUI_BTN_LBL_PADDED_X 8
    +
    40#endif /* !RETROGUI_BTN_LBL_PADDED_X */
    +
    41
    +
    42#ifndef RETROGUI_BTN_LBL_PADDED_Y
    +
    43# define RETROGUI_BTN_LBL_PADDED_Y 8
    +
    44#endif /* !RETROGUI_BTN_LBL_PADDED_Y */
    +
    45
    +
    46#ifndef RETROGUI_CTL_TEXT_BLINK_FRAMES
    +
    47# define RETROGUI_CTL_TEXT_BLINK_FRAMES 15
    +
    48#endif /* !RETROGUI_CTL_TEXT_BLINK_FRAMES */
    +
    49
    +
    50#define retrogui_lock( gui ) \
    +
    51 if( NULL == (gui)->ctls ) { \
    +
    52 maug_mlock( (gui)->ctls_h, (gui)->ctls ); \
    +
    53 maug_cleanup_if_null_alloc( union RETROGUI_CTL*, (gui)->ctls ); \
    +
    54 }
    +
    55
    +
    56#define retrogui_unlock( gui ) \
    +
    57 if( NULL != (gui)->ctls ) { \
    +
    58 maug_munlock( (gui)->ctls_h, (gui)->ctls ); \
    +
    59 }
    +
    60
    +
    61#define retrogui_is_locked( gui ) (NULL != (gui)->ctls)
    +
    62
    +
    63#define retrogui_copy_label( ctl, ctl_type ) \
    +
    64 size_t label_sz = 0; \
    +
    65 char* label_tmp = NULL; \
    +
    66 \
    +
    67 /* Sanity checking. */ \
    +
    68 assert( NULL != ctl->ctl_type.label ); \
    +
    69 label_sz = strlen( ctl->ctl_type.label ); \
    +
    70 assert( 0 < label_sz ); \
    +
    71 assert( (MAUG_MHANDLE)NULL == ctl->ctl_type.label_h ); \
    +
    72 \
    +
    73 /* Allocate new label space. */ \
    +
    74 ctl->ctl_type.label_h = maug_malloc( label_sz + 1, 1 ); \
    +
    75 maug_cleanup_if_null_alloc( MAUG_MHANDLE, ctl->ctl_type.label_h ); \
    +
    76 maug_mlock( ctl->ctl_type.label_h, label_tmp ); \
    +
    77 maug_cleanup_if_null_alloc( char*, label_tmp ); \
    +
    78 \
    +
    79 /* Copy the label text over. */ \
    +
    80 maug_mzero( label_tmp, label_sz + 1 ); \
    +
    81 strncpy( label_tmp, ctl->ctl_type.label, label_sz ); \
    +
    82 maug_munlock( ctl->ctl_type.label_h, label_tmp ); \
    +
    83 ctl->ctl_type.label = NULL;
    +
    84
    +
    86typedef size_t RETROGUI_IDC;
    +
    87
    +
    88#define RETROGUI_IDC_NONE 0
    +
    89
    +
    +
    104#define RETROGUI_CTL_TABLE( f ) \
    +
    105 f( 0, NONE, void* none; ) \
    +
    106 f( 1, LISTBOX, MAUG_MHANDLE list_h; char* list; size_t list_sz; size_t list_sz_max; size_t sel_idx; ) \
    +
    107 f( 2, BUTTON, MAUG_MHANDLE label_h; char* label; size_t label_sz; int16_t push_frames; ) \
    +
    108 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; ) \
    +
    109 f( 4, LABEL, MAUG_MHANDLE label_h; char* label; size_t label_sz; )
    +
    +
    110
    +
    111#if 0
    +
    112 f( 5, SCROLLBAR, size_t min; size_t max; size_t value; )
    +
    113#endif
    +
    114
    +
    + +
    117 uint8_t type;
    +
    118 RETROGUI_IDC idc;
    +
    119 size_t x;
    +
    120 size_t y;
    +
    121 size_t w;
    +
    122 size_t h;
    +
    123 RETROFLAT_COLOR bg_color;
    +
    124 RETROFLAT_COLOR fg_color;
    +
    125#if defined( RETROGUI_NATIVE_WIN )
    +
    126 HWND hwnd;
    +
    127#endif
    +
    128};
    +
    +
    129
    +
    +
    134#define RETROGUI_CTL_TABLE_FIELDS( idx, c_name, c_fields ) \
    +
    135 struct RETROGUI_CTL_ ## c_name { \
    +
    136 struct RETROGUI_CTL_BASE base; \
    +
    137 c_fields \
    +
    138 };
    +
    +
    139
    + +
    141
    +
    142
    +
    +
    146#define RETROGUI_CTL_TABLE_TYPES( idx, c_name, c_fields ) \
    +
    147 struct RETROGUI_CTL_ ## c_name c_name;
    +
    +
    148
    +
    + +
    150 struct RETROGUI_CTL_BASE base;
    + +
    152};
    +
    +
    153
    +
    154 /* maug_retrogui_ctl */
    +
    155
    +
    156typedef void (*retrogui_xy_cb)( size_t* x, size_t* y, void* data );
    +
    157
    +
    +
    158struct RETROGUI {
    +
    159 uint8_t flags;
    +
    160 size_t x;
    +
    161 size_t y;
    +
    162 RETROGUI_IDC idc_prev;
    +
    163 MAUG_MHANDLE ctls_h;
    +
    164 union RETROGUI_CTL* ctls;
    +
    165 size_t ctls_sz;
    +
    166 size_t ctls_sz_max;
    +
    167 RETROGUI_IDC focus;
    +
    168 struct RETROFLAT_BITMAP* draw_bmp;
    +
    169#ifdef RETROGXC_PRESENT
    +
    170 ssize_t font_idx;
    +
    171#else
    +
    172 MAUG_MHANDLE font_h;
    +
    173#endif /* RETROGXC_PRESENT */
    +
    174};
    +
    +
    175
    +
    176MERROR_RETVAL retrogui_push_listbox_item(
    +
    177 struct RETROGUI* gui, RETROGUI_IDC idc, const char* item, size_t item_sz );
    +
    178
    +
    179union RETROGUI_CTL* retrogui_get_ctl_by_idc( struct RETROGUI* gui, size_t idc );
    +
    180
    + +
    190 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
    +
    191 struct RETROFLAT_INPUT* input_evt );
    +
    192
    +
    193void retrogui_redraw_ctls( struct RETROGUI* gui );
    +
    194
    +
    195MERROR_RETVAL retrogui_sz_ctl(
    +
    196 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    197 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h );
    +
    198
    +
    199MERROR_RETVAL retrogui_pos_ctl(
    +
    200 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    201 size_t x, size_t y, size_t w, size_t h );
    +
    202
    +
    203MERROR_RETVAL retrogui_push_ctl(
    +
    204 struct RETROGUI* gui, union RETROGUI_CTL* ctl );
    +
    205
    +
    206MERROR_RETVAL retrogui_get_ctl_text(
    +
    207 struct RETROGUI* gui, RETROGUI_IDC idc, char* buffer, size_t buffer_sz );
    +
    208
    +
    209size_t retrogui_get_ctl_sel_idx( struct RETROGUI* gui, size_t idc );
    +
    210
    +
    211MERROR_RETVAL retrogui_init_ctl(
    +
    212 union RETROGUI_CTL* ctl, uint8_t type, size_t idc );
    +
    213
    +
    214MERROR_RETVAL retrogui_init( struct RETROGUI* gui );
    +
    215
    +
    216void retrogui_free( struct RETROGUI* gui );
    +
    217
    +
    218#ifdef RETROGUI_C
    +
    219
    +
    220#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
    +
    221 MAUG_CONST uint8_t RETROGUI_CTL_TYPE_ ## c_name = idx;
    +
    222
    +
    223RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
    +
    224
    +
    225#define RETROGUI_CTL_TABLE_NAMES( idx, c_name, f_fields ) \
    +
    226 #c_name,
    +
    227
    +
    228MAUG_CONST char* gc_retrogui_ctl_names[] = {
    +
    229 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_NAMES )
    +
    230 ""
    +
    231};
    +
    232
    +
    233/* === Control: NONE === */
    +
    234
    +
    235static RETROGUI_IDC retrogui_click_NONE(
    +
    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
    +
    242 return idc_out;
    +
    243}
    +
    244
    +
    245static RETROGUI_IDC retrogui_key_NONE(
    +
    246 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    247 struct RETROFLAT_INPUT* input_evt
    +
    248) {
    +
    249 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    250
    +
    251 return idc_out;
    +
    252}
    +
    253
    +
    254void retrogui_redraw_NONE( struct RETROGUI* gui, union RETROGUI_CTL* ctl ) {
    +
    255}
    +
    256
    +
    257static MERROR_RETVAL retrogui_push_NONE( union RETROGUI_CTL* ctl ) {
    +
    258 MERROR_RETVAL retval = MERROR_GUI;
    +
    259
    +
    260 return retval;
    +
    261}
    +
    262
    +
    263static MERROR_RETVAL retrogui_sz_NONE(
    +
    264 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    265 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h
    +
    266) {
    +
    267 return MERROR_OK;
    +
    268}
    +
    269
    +
    270static MERROR_RETVAL retrogui_pos_NONE(
    +
    271 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    272 size_t x, size_t y, size_t w, size_t h
    +
    273) {
    +
    274 return MERROR_OK;
    +
    275}
    +
    276
    +
    277static void retrogui_free_NONE( union RETROGUI_CTL* ctl ) {
    +
    278}
    +
    279
    +
    280static MERROR_RETVAL retrogui_init_NONE( union RETROGUI_CTL* ctl ) {
    +
    281 MERROR_RETVAL retval = MERROR_GUI;
    +
    282
    +
    283 return retval;
    +
    284}
    +
    285
    +
    286/* === Control: LISTBOX === */
    +
    287
    +
    288static RETROGUI_IDC retrogui_click_LISTBOX(
    +
    289 struct RETROGUI* gui,
    +
    290 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    291 struct RETROFLAT_INPUT* input_evt
    +
    292) {
    +
    293 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    294 size_t i = 0,
    +
    295 j = 0,
    +
    296 w = 0,
    +
    297 h = 0;
    +
    298
    +
    299# if defined( RETROGUI_NATIVE_WIN )
    +
    300 /* Do nothing. */
    +
    301# else
    +
    302
    +
    303 assert( NULL == ctl->LISTBOX.list );
    +
    304 maug_mlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    305
    +
    306 /* Figure out the item clicked. */
    +
    307 while( i < ctl->LISTBOX.list_sz ) {
    +
    308#ifdef RETROGXC_PRESENT
    +
    309 retrogxc_string_sz(
    +
    310 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_idx,
    +
    311 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    312#else
    +
    313 retrofont_string_sz(
    +
    314 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_h,
    +
    315 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    316#endif /* RETROGXC_PRESENT */
    +
    317
    +
    318 if(
    +
    319 (size_t)(input_evt->mouse_y) <
    +
    320 ctl->base.y + ((j + 1) * (h + RETROGUI_PADDING))
    +
    321 ) {
    +
    322 ctl->LISTBOX.sel_idx = j;
    +
    323 break;
    +
    324 }
    +
    325
    +
    326 /* Try next variable-length string. */
    +
    327 i += strlen( &(ctl->LISTBOX.list[i]) ) + 1;
    +
    328 assert( i <= ctl->LISTBOX.list_sz );
    +
    329 j++;
    +
    330 }
    +
    331
    +
    332 if( NULL != ctl->LISTBOX.list ) {
    +
    333 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    334 }
    +
    335
    +
    336#endif
    +
    337
    +
    338 return idc_out;
    +
    339}
    +
    340
    +
    341static RETROGUI_IDC retrogui_key_LISTBOX(
    +
    342 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    343 struct RETROFLAT_INPUT* input_evt
    +
    344) {
    +
    345 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    346
    +
    347 /* TODO: Move up or down to next/prev item. */
    +
    348
    +
    349 return idc_out;
    +
    350}
    +
    351
    +
    352static void retrogui_redraw_LISTBOX(
    +
    353 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    354) {
    +
    355 size_t i = 0,
    +
    356 j = 0,
    +
    357 w = 0,
    +
    358 h = 0;
    +
    359
    +
    360 assert( NULL == ctl->LISTBOX.list );
    +
    361
    +
    362# if defined( RETROGUI_NATIVE_WIN )
    +
    363 /* TODO: InvalidateRect()? */
    +
    364# else
    +
    365
    +
    366 maug_mlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    367 if( NULL == ctl->LISTBOX.list ) {
    +
    368 goto cleanup;
    +
    369 }
    +
    370
    +
    371 retroflat_rect( NULL, ctl->base.bg_color, ctl->base.x, ctl->base.y,
    +
    372 ctl->base.w, ctl->base.h, RETROFLAT_FLAGS_FILL );
    +
    373
    +
    374 /* Parse out variable-length strings. */
    +
    375 while( i < ctl->LISTBOX.list_sz ) {
    +
    376#ifdef RETROGXC_PRESENT
    +
    377 retrogxc_string_sz(
    +
    378 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_idx,
    +
    379 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    380#else
    +
    381 retrofont_string_sz(
    +
    382 gui->draw_bmp, &(ctl->LISTBOX.list[i]), 0, gui->font_h,
    +
    383 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    384#endif /* RETROGXC_PRESENT */
    +
    385 if( j == ctl->LISTBOX.sel_idx ) {
    +
    386 /* TODO: Configurable selection colors. */
    +
    387 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLUE,
    +
    388 ctl->base.x, ctl->base.y + (j * (h + RETROGUI_PADDING)),
    +
    389 ctl->base.w, h, RETROFLAT_FLAGS_FILL );
    +
    390
    +
    391 }
    +
    392#ifdef RETROGXC_PRESENT
    +
    393 retrogxc_string(
    +
    394 gui->draw_bmp, ctl->base.fg_color, &(ctl->LISTBOX.list[i]), 0,
    +
    395 gui->font_idx, ctl->base.x, ctl->base.y + (j * (h + RETROGUI_PADDING)),
    +
    396 0, 0, 0 );
    +
    397#else
    +
    398 retrofont_string(
    +
    399 gui->draw_bmp, ctl->base.fg_color, &(ctl->LISTBOX.list[i]), 0,
    +
    400 gui->font_h, ctl->base.x, ctl->base.y + (j * (h + RETROGUI_PADDING)),
    +
    401 0, 0, 0 );
    +
    402#endif /* RETROGXC_PRESENT */
    +
    403
    +
    404 /* Move to next variable-length string. */
    +
    405 i += strlen( &(ctl->LISTBOX.list[i]) ) + 1;
    +
    406 assert( i <= ctl->LISTBOX.list_sz );
    +
    407 j++;
    +
    408 }
    +
    409
    +
    410cleanup:
    +
    411
    +
    412 if( NULL != ctl->LISTBOX.list ) {
    +
    413 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    414 }
    +
    415
    +
    416# endif
    +
    417
    +
    418}
    +
    419
    +
    420MERROR_RETVAL retrogui_select_listbox_item(
    +
    421 union RETROGUI_CTL* ctl, size_t item_idx
    +
    422) {
    +
    423 MERROR_RETVAL retval = MERROR_OK;
    +
    424
    +
    425# if defined( RETROGUI_NATIVE_WIN )
    +
    426
    +
    427 /* Select sel_idx. */
    +
    428 SendMessage( ctl->base.hwnd, LB_SETCURSEL, item_idx, 0 );
    +
    429
    +
    430# else
    +
    431
    +
    432 ctl->LISTBOX.sel_idx = item_idx;
    +
    433
    +
    434# endif
    +
    435
    +
    436 return retval;
    +
    437}
    +
    438
    +
    439MERROR_RETVAL retrogui_push_listbox_item(
    +
    440 struct RETROGUI* gui, RETROGUI_IDC idc, const char* item, size_t item_sz
    +
    441) {
    +
    442 MERROR_RETVAL retval = MERROR_OK;
    +
    443 union RETROGUI_CTL* ctl = NULL;
    +
    444 MAUG_MHANDLE listbox_h_new = (MAUG_MHANDLE)NULL;
    +
    445
    +
    446 retrogui_lock( gui );
    +
    447
    +
    448 debug_printf( RETROGUI_TRACE_LVL,
    +
    449 "pushing item \"%s\" to listbox " SIZE_T_FMT "...", item, idc );
    +
    450
    +
    451 ctl = retrogui_get_ctl_by_idc( gui, idc );
    +
    452 if( NULL == ctl ) {
    + +
    454 "Adding item \"%s\" failed: Control missing!", item );
    +
    455 retval = MERROR_GUI;
    +
    456 goto cleanup;
    +
    457 }
    +
    458
    +
    459# if defined( RETROGUI_NATIVE_WIN )
    +
    460
    +
    461 SendMessage( ctl->LISTBOX.base.hwnd, LB_ADDSTRING, 0, (LPARAM)item );
    +
    462
    +
    463# else
    +
    464
    +
    465 if( 0 == ctl->LISTBOX.list_sz ) {
    +
    466 ctl->LISTBOX.list_h = maug_malloc( 255, sizeof( char ) );
    +
    467 maug_cleanup_if_null_alloc( MAUG_MHANDLE, ctl->LISTBOX.list_h );
    +
    468 ctl->LISTBOX.list_sz_max = 255;
    +
    469 }
    +
    470
    +
    471 if( NULL != ctl->LISTBOX.list ) {
    +
    472 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    473 }
    +
    474
    +
    475 while( ctl->LISTBOX.list_sz + item_sz + 1 >= ctl->LISTBOX.list_sz_max ) {
    +
    476 debug_printf( RETROGUI_TRACE_LVL,
    +
    477 "resizing listbox items to " SIZE_T_FMT "...",
    +
    478 ctl->LISTBOX.list_sz );
    +
    479 maug_mrealloc_test(
    +
    480 listbox_h_new, ctl->LISTBOX.list_h,
    +
    481 ctl->LISTBOX.list_sz_max * 2, sizeof( char ) );
    +
    482 ctl->LISTBOX.list_sz_max *= 2;
    +
    483 }
    +
    484
    +
    485 maug_mlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    486 maug_cleanup_if_null_alloc( char*, ctl->LISTBOX.list );
    +
    487
    +
    488 strncpy( &(ctl->LISTBOX.list[ctl->LISTBOX.list_sz]), item, item_sz );
    +
    489 ctl->LISTBOX.list[ctl->LISTBOX.list_sz + item_sz] = '\0';
    +
    490 ctl->LISTBOX.list_sz += item_sz + 1;
    +
    491
    +
    492#endif
    +
    493
    +
    494cleanup:
    +
    495
    +
    496 if( NULL != ctl->LISTBOX.list ) {
    +
    497 maug_munlock( ctl->LISTBOX.list_h, ctl->LISTBOX.list );
    +
    498 }
    +
    499
    +
    500 return retval;
    +
    501}
    +
    502
    +
    503static MERROR_RETVAL retrogui_push_LISTBOX( union RETROGUI_CTL* ctl ) {
    +
    504 MERROR_RETVAL retval = MERROR_OK;
    +
    505
    +
    506# if defined( RETROGUI_NATIVE_WIN )
    +
    507
    +
    508 ctl->base.hwnd = CreateWindow(
    +
    509 "LISTBOX", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD,
    +
    510 ctl->base.x, ctl->base.y, ctl->base.w, ctl->base.h,
    +
    511 g_retroflat_state->window, (HMENU)(ctl->base.idc),
    +
    512 g_retroflat_instance, NULL );
    +
    513 debug_printf( RETROGUI_TRACE_LVL,
    +
    514 "listbox hwnd: %p", ctl->LISTBOX.base.hwnd );
    +
    515 if( (HWND)NULL == ctl->base.hwnd ) {
    +
    516 error_printf( "could not create listbox" );
    +
    517 retval = MERROR_GUI;
    +
    518 goto cleanup;
    +
    519 }
    +
    520
    +
    521cleanup:
    +
    522
    +
    523# else
    +
    524
    +
    525 /* TODO? */
    +
    526
    +
    527# endif
    +
    528
    +
    529 return retval;
    +
    530}
    +
    531
    +
    532static MERROR_RETVAL retrogui_sz_LISTBOX(
    +
    533 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    534 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h
    +
    535) {
    +
    536 MERROR_RETVAL retval = MERROR_GUI;
    +
    537 /* TODO */
    +
    538 return retval;
    +
    539}
    +
    540
    +
    541static MERROR_RETVAL retrogui_pos_LISTBOX(
    +
    542 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    543 size_t x, size_t y, size_t w, size_t h
    +
    544) {
    +
    545 MERROR_RETVAL retval = MERROR_GUI;
    +
    546 /* TODO */
    +
    547 return retval;
    +
    548}
    +
    549
    +
    550static void retrogui_free_LISTBOX( union RETROGUI_CTL* ctl ) {
    +
    551 assert( NULL == ctl->LISTBOX.list );
    +
    552 maug_mfree( ctl->LISTBOX.list_h );
    +
    553}
    +
    554
    +
    555static MERROR_RETVAL retrogui_init_LISTBOX( union RETROGUI_CTL* ctl ) {
    +
    556 MERROR_RETVAL retval = MERROR_OK;
    +
    557
    +
    558 debug_printf( RETROGUI_TRACE_LVL,
    +
    559 "initializing listbox " SIZE_T_FMT "...", ctl->base.idc );
    +
    560
    +
    561 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    562 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
    +
    563
    +
    564 return retval;
    +
    565}
    +
    566
    +
    567/* === Control: BUTTON === */
    +
    568
    +
    569static RETROGUI_IDC retrogui_click_BUTTON(
    +
    570 struct RETROGUI* gui,
    +
    571 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    572 struct RETROFLAT_INPUT* input_evt
    +
    573) {
    +
    574 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    575
    +
    576 if( 0 < ctl->BUTTON.push_frames ) {
    +
    577 goto cleanup;
    +
    578 }
    +
    579
    +
    580 /* Set the last button clicked. */
    +
    581 idc_out = ctl->base.idc;
    +
    582
    +
    583 /* Set the frames to show the pushed-in view. */
    +
    584 /* TODO: Use a constant, here. */
    +
    585 ctl->BUTTON.push_frames = 3;
    +
    586
    +
    587cleanup:
    +
    588
    +
    589 return idc_out;
    +
    590}
    +
    591
    +
    592static RETROGUI_IDC retrogui_key_BUTTON(
    +
    593 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    594 struct RETROFLAT_INPUT* input_evt
    +
    595) {
    +
    596 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    597
    +
    598 /* Set the last button clicked. */
    +
    599 /* TODO: Only set out on ENTER/SPACE. */
    +
    600 /* idc_out = ctl->base.idc; */
    +
    601
    +
    602 return idc_out;
    +
    603}
    +
    604
    +
    605static void retrogui_redraw_BUTTON(
    +
    606 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    607) {
    +
    608 size_t w = 0,
    +
    609 h = 0,
    +
    610 text_offset = 0;
    +
    611
    +
    612 retroflat_rect( gui->draw_bmp, ctl->base.bg_color, ctl->base.x, ctl->base.y,
    +
    613 ctl->base.w, ctl->base.h, RETROFLAT_FLAGS_FILL );
    +
    614
    +
    615 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLACK,
    +
    616 ctl->base.x, ctl->base.y,
    +
    617 ctl->base.w, ctl->base.h, 0 );
    +
    618
    +
    619 if( 0 < ctl->BUTTON.push_frames ) {
    + +
    621 gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    622 ctl->base.x + 1, ctl->base.y + 1,
    +
    623 ctl->base.x + ctl->base.w - 2, ctl->base.y + 1, 0 );
    + +
    625 gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    626 ctl->base.x + 1, ctl->base.y + 2,
    +
    627 ctl->base.x + 1, ctl->base.y + ctl->base.h - 3, 0 );
    +
    628
    +
    629 gui->flags |= RETROGUI_FLAGS_DIRTY; /* Mark dirty for push animation. */
    +
    630 ctl->BUTTON.push_frames--;
    +
    631 text_offset = 1;
    +
    632 } else {
    +
    633 /* Button is not pushed. */
    + +
    635 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
    +
    636 ctl->base.x + 1, ctl->base.y + 1,
    +
    637 ctl->base.x + ctl->base.w - 2, ctl->base.y + 1, 0 );
    + +
    639 gui->draw_bmp, RETROFLAT_COLOR_WHITE,
    +
    640 ctl->base.x + 1, ctl->base.y + 2,
    +
    641 ctl->base.x + 1, ctl->base.y + ctl->base.h - 3, 0 );
    +
    642 }
    +
    643
    +
    644 maug_mlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
    +
    645 if( NULL == ctl->BUTTON.label ) {
    +
    646 error_printf( "could not lock BUTTON label!" );
    +
    647 goto cleanup;
    +
    648 }
    +
    649
    +
    650 /* Grab the string size and use it to center the text in the control. */
    +
    651#ifdef RETROGXC_PRESENT
    +
    652 retrogxc_string_sz(
    +
    653#else
    +
    654 retrofont_string_sz(
    +
    655#endif /* RETROGXC_PRESENT */
    +
    656 gui->draw_bmp, ctl->BUTTON.label, 0,
    +
    657#ifdef RETROGXC_PRESENT
    +
    658 gui->font_idx,
    +
    659#else
    +
    660 gui->font_h,
    +
    661#endif /* RETROGXC_PRESENT */
    +
    662 /* TODO: Pad max client area. */
    +
    663 ctl->base.w, ctl->base.h, &w, &h, 0 );
    +
    664
    +
    665#ifdef RETROGXC_PRESENT
    +
    666 retrogxc_string(
    +
    667#else
    +
    668 retrofont_string(
    +
    669#endif /* RETROGXC_PRESENT */
    +
    670 gui->draw_bmp, ctl->base.fg_color, ctl->BUTTON.label, 0,
    +
    671#ifdef RETROGXC_PRESENT
    +
    672 gui->font_idx,
    +
    673#else
    +
    674 gui->font_h,
    +
    675#endif /* RETROGXC_PRESENT */
    +
    676 ctl->base.x + ((ctl->base.w >> 1) - (w >> 1)) + text_offset,
    +
    677 ctl->base.y + ((ctl->base.h >> 1) - (h >> 1)) + text_offset,
    +
    678 /* TODO: Pad max client area. */
    +
    679 ctl->base.w, ctl->base.h, 0 );
    +
    680
    +
    681 maug_munlock( ctl->BUTTON.label_h, ctl->BUTTON.label );
    +
    682
    +
    683cleanup:
    +
    684
    +
    685 return;
    +
    686}
    +
    687
    +
    688static MERROR_RETVAL retrogui_push_BUTTON( union RETROGUI_CTL* ctl ) {
    +
    689 MERROR_RETVAL retval = MERROR_OK;
    +
    690
    +
    691# if defined( RETROGUI_NATIVE_WIN )
    +
    692
    +
    693 ctl->base.hwnd = CreateWindow(
    +
    694 "BUTTON", ctl->BUTTON.label, WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON,
    +
    695 ctl->base.x, ctl->base.y, ctl->base.w, ctl->base.h,
    +
    696 g_retroflat_state->window, (HMENU)(ctl->base.idc),
    +
    697 g_retroflat_instance, NULL );
    +
    698 if( (HWND)NULL == ctl->base.hwnd ) {
    + +
    700 "Could not create button " SIZE_T_FMT ": %s",
    +
    701 ctl->base.idc, ctl->BUTTON.label );
    +
    702 retval = MERROR_GUI;
    +
    703 goto cleanup;
    +
    704 }
    +
    705
    +
    706# else
    +
    707 retrogui_copy_label( ctl, BUTTON );
    +
    708# endif
    +
    709
    +
    710cleanup:
    +
    711
    +
    712 return retval;
    +
    713}
    +
    714
    +
    715static MERROR_RETVAL retrogui_sz_BUTTON(
    +
    716 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    717 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h
    +
    718) {
    +
    719 MERROR_RETVAL retval = MERROR_OK;
    +
    720
    +
    721 /* Get the size of the text-based GUI item. */
    +
    722#ifdef RETROGXC_PRESENT
    +
    723 retrogxc_string_sz(
    +
    724#else
    +
    725 retrofont_string_sz(
    +
    726#endif /* RETROGXC_PRESENT */
    +
    727 NULL,
    +
    728 ctl->BUTTON.label,
    +
    729 0,
    +
    730#ifdef RETROGXC_PRESENT
    +
    731 gui->font_idx,
    +
    732#else
    +
    733 gui->font_h,
    +
    734#endif /* RETROGXC_PRESENT */
    +
    735 max_w - 8,
    +
    736 max_h - 8,
    +
    737 p_w,
    +
    738 p_h, 0 );
    +
    739
    +
    740 /* Add space for borders and stuff. */
    +
    741 *p_w += RETROGUI_BTN_LBL_PADDED_X;
    +
    742 *p_h += RETROGUI_BTN_LBL_PADDED_Y;
    +
    743
    +
    744 return retval;
    +
    745}
    +
    746
    +
    747static MERROR_RETVAL retrogui_pos_BUTTON(
    +
    748 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    749 size_t x, size_t y, size_t w, size_t h
    +
    750) {
    +
    751 MERROR_RETVAL retval = MERROR_OK;
    +
    752
    +
    753# if defined( RETROGUI_NATIVE_WIN )
    +
    754 /* TODO */
    +
    755# else
    +
    756 ctl->base.x = x;
    +
    757 ctl->base.y = y;
    +
    758 if( 0 < w ) {
    +
    759 ctl->base.w = w;
    +
    760 }
    +
    761 if( 0 < h ) {
    +
    762 ctl->base.h = h;
    +
    763 }
    +
    764# endif /* RETROGUI_NATIVE_WIN */
    +
    765
    +
    766 return retval;
    +
    767}
    +
    768
    +
    769static void retrogui_free_BUTTON( union RETROGUI_CTL* ctl ) {
    +
    770 if( NULL != ctl->BUTTON.label_h ) {
    +
    771 maug_mfree( ctl->BUTTON.label_h );
    +
    772 }
    +
    773}
    +
    774
    +
    775static MERROR_RETVAL retrogui_init_BUTTON( union RETROGUI_CTL* ctl ) {
    +
    776 MERROR_RETVAL retval = MERROR_OK;
    +
    777
    +
    778 debug_printf( RETROGUI_TRACE_LVL,
    +
    779 "initializing button " SIZE_T_FMT "...", ctl->base.idc );
    +
    780
    +
    781 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    782 ctl->base.bg_color = RETROFLAT_COLOR_GRAY;
    +
    783
    +
    784 return retval;
    +
    785}
    +
    786
    +
    787/* === Control: TEXTBOX === */
    +
    788
    +
    789static RETROGUI_IDC retrogui_click_TEXTBOX(
    +
    790 struct RETROGUI* gui,
    +
    791 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    792 struct RETROFLAT_INPUT* input_evt
    +
    793) {
    +
    794 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    795
    +
    796 return idc_out;
    +
    797}
    +
    798
    +
    799static RETROGUI_IDC retrogui_key_TEXTBOX(
    +
    800 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    801 struct RETROFLAT_INPUT* input_evt
    +
    802) {
    +
    803 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    804 char c = '\0';
    +
    805
    +
    806# if defined( RETROGUI_NATIVE_WIN )
    +
    807 /* Do nothing. */
    +
    808# else
    +
    809
    +
    810 c = retroflat_vk_to_ascii( *p_input, input_evt->key_flags );
    +
    811
    +
    812 /* Ignore non-printable characters. */
    +
    813 if(
    +
    814 0 == c &&
    +
    815 RETROFLAT_KEY_RIGHT != *p_input &&
    +
    816 RETROFLAT_KEY_LEFT != *p_input
    +
    817 ) {
    +
    818 goto cleanup;
    +
    819 }
    +
    820
    +
    821 /* Lock text field. */
    +
    822 assert( NULL == ctl->TEXTBOX.text );
    +
    823 assert( (MAUG_MHANDLE)NULL != ctl->TEXTBOX.text_h );
    +
    824 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    825 if( NULL == ctl->TEXTBOX.text ) {
    +
    826 error_printf( "could not lock TEXTBOX text handle!" );
    +
    827 goto cleanup;
    +
    828 }
    +
    829
    +
    830 switch( *p_input ) {
    +
    831 case RETROFLAT_KEY_BKSP:
    + +
    833 ctl->TEXTBOX.text, ctl->TEXTBOX.text_cur, ctl->TEXTBOX.text_sz )
    +
    834 break;
    +
    835
    +
    836 case RETROFLAT_KEY_ENTER:
    +
    837 idc_out = ctl->base.idc;
    +
    838 break;
    +
    839
    +
    840 case RETROFLAT_KEY_LEFT:
    +
    841 if( 0 < ctl->TEXTBOX.text_cur ) {
    +
    842 ctl->TEXTBOX.text_cur--;
    +
    843 }
    +
    844 break;
    +
    845
    +
    846 case RETROFLAT_KEY_RIGHT:
    +
    847 if( ctl->TEXTBOX.text_sz > ctl->TEXTBOX.text_cur ) {
    +
    848 ctl->TEXTBOX.text_cur++;
    +
    849 }
    +
    850 break;
    +
    851
    +
    852 default:
    +
    853 assert( ctl->TEXTBOX.text_sz < ctl->TEXTBOX.text_sz_max );
    + +
    855 ctl->TEXTBOX.text,
    +
    856 ctl->TEXTBOX.text_cur,
    +
    857 ctl->TEXTBOX.text_sz,
    +
    858 ctl->TEXTBOX.text_sz_max );
    +
    859 break;
    +
    860 }
    +
    861
    +
    862 /* TODO: Remove input from queue? */
    +
    863
    +
    864cleanup:
    +
    865
    +
    866 if( NULL != ctl->TEXTBOX.text ) {
    +
    867 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    868 }
    +
    869
    +
    870# endif
    +
    871
    +
    872 return idc_out;
    +
    873}
    +
    874
    +
    875static void retrogui_redraw_TEXTBOX(
    +
    876 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    877) {
    +
    878
    +
    879# if defined( RETROGUI_NATIVE_WIN )
    +
    880 /* Do nothing. */
    +
    881# else
    +
    882
    +
    883 retroflat_rect( gui->draw_bmp, ctl->base.bg_color, ctl->base.x, ctl->base.y,
    +
    884 ctl->base.w, ctl->base.h, RETROFLAT_FLAGS_FILL );
    +
    885
    +
    886 /* Draw chiselled inset border. */
    +
    887
    +
    888 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLACK,
    +
    889 ctl->base.x, ctl->base.y, ctl->base.w, 2,
    + +
    891
    +
    892 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLACK,
    +
    893 ctl->base.x, ctl->base.y, 2, ctl->base.h,
    + +
    895
    +
    896 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    897 ctl->base.x, ctl->base.y + ctl->base.h - 1,
    +
    898 ctl->base.w, 2,
    + +
    900
    +
    901 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_DARKGRAY,
    +
    902 ctl->base.x + ctl->base.w - 1, ctl->base.y, 2, ctl->base.h,
    + +
    904
    +
    905 /* Draw text. */
    +
    906
    +
    907 assert( NULL == ctl->TEXTBOX.text );
    +
    908 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    909 if( NULL == ctl->TEXTBOX.text ) {
    +
    910 goto cleanup;
    +
    911 }
    +
    912
    +
    913#ifdef RETROGXC_PRESENT
    +
    914 retrogxc_string(
    +
    915 gui->draw_bmp, ctl->base.fg_color, ctl->TEXTBOX.text, 0, gui->font_idx,
    +
    916 ctl->base.x + RETROGUI_PADDING,
    +
    917 ctl->base.y + RETROGUI_PADDING, ctl->base.w, ctl->base.h, 0 );
    +
    918#else
    +
    919 retrofont_string(
    +
    920 gui->draw_bmp, ctl->base.fg_color, ctl->TEXTBOX.text, 0, gui->font_h,
    +
    921 ctl->base.x + RETROGUI_PADDING,
    +
    922 ctl->base.y + RETROGUI_PADDING, ctl->base.w, ctl->base.h, 0 );
    +
    923#endif /* RETROGXC_PRESENT */
    +
    924
    +
    925cleanup:
    +
    926
    +
    927 if( NULL != ctl->TEXTBOX.text ) {
    +
    928 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    929 }
    +
    930
    +
    931 /* TODO: Get cursor color from GUI. */
    +
    932 retroflat_rect( gui->draw_bmp, RETROFLAT_COLOR_BLUE,
    +
    933 ctl->base.x + RETROGUI_PADDING + (8 * ctl->TEXTBOX.text_cur),
    +
    934 ctl->base.y + RETROGUI_PADDING,
    +
    935 8, 8,
    +
    936 /* Draw blinking cursor. */
    +
    937 /* TODO: Use a global timer to mark this field dirty. */
    +
    938 gui->focus == ctl->base.idc &&
    +
    939 0 < ctl->TEXTBOX.blink_frames ? RETROFLAT_FLAGS_FILL : 0 );
    +
    940
    +
    941 if( (-1 * RETROGUI_CTL_TEXT_BLINK_FRAMES) > --(ctl->TEXTBOX.blink_frames) ) {
    +
    942 ctl->TEXTBOX.blink_frames = RETROGUI_CTL_TEXT_BLINK_FRAMES;
    +
    943 }
    +
    944
    +
    945 gui->flags |= RETROGUI_FLAGS_DIRTY; /* Mark dirty for blink animation. */
    +
    946
    +
    947# endif
    +
    948
    +
    949 return;
    +
    950}
    +
    951
    +
    952static MERROR_RETVAL retrogui_push_TEXTBOX( union RETROGUI_CTL* ctl ) {
    +
    953 MERROR_RETVAL retval = MERROR_OK;
    +
    954
    +
    955# if defined( RETROGUI_NATIVE_WIN )
    +
    956
    +
    957 ctl->base.hwnd = CreateWindow(
    +
    958 "EDIT", 0, WS_CHILD | WS_VISIBLE | WS_BORDER,
    +
    959 ctl->base.x, ctl->base.y, ctl->base.w, ctl->base.h,
    +
    960 g_retroflat_state->window, (HMENU)(ctl->base.idc),
    +
    961 g_retroflat_instance, NULL );
    +
    962 if( (HWND)NULL == ctl->base.hwnd ) {
    + +
    964 "Could not create textbox: " SIZE_T_FMT, ctl->base.idc );
    +
    965 retval = MERROR_GUI;
    +
    966 goto cleanup;
    +
    967 }
    +
    968
    +
    969# else
    +
    970
    +
    971 debug_printf( RETROGUI_TRACE_LVL,
    +
    972 "clearing textbox " SIZE_T_FMT " buffer...", ctl->base.idc );
    +
    973 assert( NULL == ctl->TEXTBOX.text_h );
    +
    974 ctl->TEXTBOX.text_h = maug_malloc( RETROGUI_CTL_TEXT_SZ_MAX, 1 );
    +
    975 maug_cleanup_if_null_alloc( MAUG_MHANDLE, ctl->TEXTBOX.text_h );
    +
    976 ctl->TEXTBOX.text_sz_max = RETROGUI_CTL_TEXT_SZ_MAX;
    +
    977
    +
    978 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    979 maug_cleanup_if_null_alloc( char*, ctl->TEXTBOX.text );
    +
    980 debug_printf( RETROGUI_TRACE_LVL,
    +
    981 "clearing textbox " SIZE_T_FMT " buffer...", ctl->base.idc );
    +
    982 maug_mzero( ctl->TEXTBOX.text, RETROGUI_CTL_TEXT_SZ_MAX );
    +
    983 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    984
    +
    985# endif
    +
    986
    +
    987cleanup:
    +
    988
    +
    989 return retval;
    +
    990}
    +
    991
    +
    992static MERROR_RETVAL retrogui_sz_TEXTBOX(
    +
    993 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    994 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h
    +
    995) {
    +
    996 MERROR_RETVAL retval = MERROR_GUI;
    +
    997 /* TODO */
    +
    998 return retval;
    +
    999}
    +
    1000
    +
    1001static MERROR_RETVAL retrogui_pos_TEXTBOX(
    +
    1002 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    1003 size_t x, size_t y, size_t w, size_t h
    +
    1004) {
    +
    1005 MERROR_RETVAL retval = MERROR_GUI;
    +
    1006 /* TODO */
    +
    1007 return retval;
    +
    1008}
    +
    1009
    +
    1010static void retrogui_free_TEXTBOX( union RETROGUI_CTL* ctl ) {
    +
    1011 if( NULL != ctl->TEXTBOX.text_h ) {
    +
    1012 maug_mfree( ctl->TEXTBOX.text_h );
    +
    1013 }
    +
    1014}
    +
    1015
    +
    1016static MERROR_RETVAL retrogui_init_TEXTBOX( union RETROGUI_CTL* ctl ) {
    +
    1017 MERROR_RETVAL retval = MERROR_OK;
    +
    1018
    +
    1019 debug_printf( RETROGUI_TRACE_LVL,
    +
    1020 "initializing textbox " SIZE_T_FMT "...", ctl->base.idc );
    +
    1021
    +
    1022 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    1023 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
    +
    1024
    +
    1025 return retval;
    +
    1026}
    +
    1027
    +
    1028/* === Control: LABEL === */
    +
    1029
    +
    1030static RETROGUI_IDC retrogui_click_LABEL(
    +
    1031 struct RETROGUI* gui,
    +
    1032 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    1033 struct RETROFLAT_INPUT* input_evt
    +
    1034) {
    +
    1035 return RETROGUI_IDC_NONE;
    +
    1036}
    +
    1037
    +
    1038static RETROGUI_IDC retrogui_key_LABEL(
    +
    1039 union RETROGUI_CTL* ctl, RETROFLAT_IN_KEY* p_input,
    +
    1040 struct RETROFLAT_INPUT* input_evt
    +
    1041) {
    +
    1042 return RETROGUI_IDC_NONE;
    +
    1043}
    +
    1044
    +
    1045static void retrogui_redraw_LABEL(
    +
    1046 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    1047) {
    +
    1048
    +
    1049# if defined( RETROGUI_NATIVE_WIN )
    +
    1050 /* Do nothing. */
    +
    1051# else
    +
    1052
    +
    1053 /* Draw text. */
    +
    1054
    +
    1055#ifdef RETROGXC_PRESENT
    +
    1056 assert( 0 <= gui->font_idx );
    +
    1057#else
    +
    1058 assert( (MAUG_MHANDLE)NULL != gui->font_h );
    +
    1059#endif /* RETROGXC_PRESENT */
    +
    1060
    +
    1061 assert( NULL == ctl->LABEL.label );
    +
    1062 maug_mlock( ctl->LABEL.label_h, ctl->LABEL.label );
    +
    1063 if( NULL == ctl->LABEL.label ) {
    +
    1064 error_printf( "could not lock LABEL text!" );
    +
    1065 goto cleanup;
    +
    1066 }
    +
    1067
    +
    1068#ifdef RETROGXC_PRESENT
    +
    1069 retrogxc_string(
    +
    1070#else
    +
    1071 retrofont_string(
    +
    1072#endif /* RETROGXC_PRESENT */
    +
    1073 gui->draw_bmp, ctl->base.fg_color, ctl->LABEL.label,
    +
    1074 ctl->LABEL.label_sz,
    +
    1075#ifdef RETROGXC_PRESENT
    +
    1076 gui->font_idx,
    +
    1077#else
    +
    1078 gui->font_h,
    +
    1079#endif /* RETROGXC_PRESENT */
    +
    1080 ctl->base.x + RETROGUI_PADDING,
    +
    1081 ctl->base.y + RETROGUI_PADDING, ctl->base.w, ctl->base.h, 0 );
    +
    1082
    +
    1083cleanup:
    +
    1084
    +
    1085 if( NULL != ctl->LABEL.label ) {
    +
    1086 maug_munlock( ctl->LABEL.label_h, ctl->LABEL.label );
    +
    1087 }
    +
    1088
    +
    1089# endif
    +
    1090
    +
    1091 return;
    +
    1092}
    +
    1093
    +
    1094static MERROR_RETVAL retrogui_push_LABEL( union RETROGUI_CTL* ctl ) {
    +
    1095 MERROR_RETVAL retval = MERROR_OK;
    +
    1096
    +
    1097# if defined( RETROGUI_NATIVE_WIN )
    +
    1098
    +
    1099 /* TODO */
    +
    1100
    +
    1101# else
    +
    1102 retrogui_copy_label( ctl, LABEL );
    +
    1103# endif
    +
    1104
    +
    1105cleanup:
    +
    1106
    +
    1107 return retval;
    +
    1108}
    +
    1109
    +
    1110static MERROR_RETVAL retrogui_sz_LABEL(
    +
    1111 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    1112 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h
    +
    1113) {
    +
    1114 MERROR_RETVAL retval = MERROR_GUI;
    +
    1115 /* TODO */
    +
    1116 return retval;
    +
    1117}
    +
    1118
    +
    1119static MERROR_RETVAL retrogui_pos_LABEL(
    +
    1120 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    1121 size_t x, size_t y, size_t w, size_t h
    +
    1122) {
    +
    1123 MERROR_RETVAL retval = MERROR_GUI;
    +
    1124 /* TODO */
    +
    1125 return retval;
    +
    1126}
    +
    1127
    +
    1128static void retrogui_free_LABEL( union RETROGUI_CTL* ctl ) {
    +
    1129 if( NULL != ctl->LABEL.label_h ) {
    +
    1130 maug_mfree( ctl->LABEL.label_h );
    +
    1131 }
    +
    1132}
    +
    1133
    +
    1134static MERROR_RETVAL retrogui_init_LABEL( union RETROGUI_CTL* ctl ) {
    +
    1135 MERROR_RETVAL retval = MERROR_OK;
    +
    1136
    +
    1137 debug_printf( RETROGUI_TRACE_LVL,
    +
    1138 "initializing textbox " SIZE_T_FMT "...", ctl->base.idc );
    +
    1139
    +
    1140 ctl->base.fg_color = RETROFLAT_COLOR_BLACK;
    +
    1141 ctl->base.bg_color = RETROFLAT_COLOR_WHITE;
    +
    1142
    +
    1143 return retval;
    +
    1144}
    +
    1145
    +
    1146/* === Generic Functions === */
    +
    1147
    +
    1148union RETROGUI_CTL* retrogui_get_ctl_by_idc(
    +
    1149 struct RETROGUI* gui, size_t idc
    +
    1150) {
    +
    1151 size_t i = 0;
    +
    1152 union RETROGUI_CTL* ctl = NULL;
    +
    1153
    +
    1154 if( !retrogui_is_locked( gui ) ) {
    +
    1155 error_printf( "GUI is not locked!" );
    +
    1156 goto cleanup;
    +
    1157 }
    +
    1158
    +
    1159 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    1160 if( idc == gui->ctls[i].base.idc ) {
    +
    1161 ctl = &(gui->ctls[i]);
    +
    1162 break;
    +
    1163 }
    +
    1164 }
    +
    1165
    +
    1166 if( NULL == ctl ) {
    + +
    1168 "Could not find GUI item: " SIZE_T_FMT, idc );
    +
    1169 }
    +
    1170
    +
    1171cleanup:
    +
    1172
    +
    1173 return ctl;
    +
    1174}
    +
    1175
    + +
    1177 struct RETROGUI* gui, RETROFLAT_IN_KEY* p_input,
    +
    1178 struct RETROFLAT_INPUT* input_evt
    +
    1179) {
    +
    1180 size_t i = 0,
    +
    1181 mouse_x = 0,
    +
    1182 mouse_y = 0;
    +
    1183 RETROGUI_IDC idc_out = RETROGUI_IDC_NONE;
    +
    1184 union RETROGUI_CTL* ctl = NULL;
    +
    1185
    +
    1186 assert( NULL != gui->ctls );
    +
    1187
    +
    1188# if defined( RETROGUI_NATIVE_WIN )
    +
    1189
    +
    1190 if( 0 == g_retroflat_state->last_idc ) {
    +
    1191 /* No WM_COMMAND to process. */
    +
    1192 goto cleanup;
    +
    1193 }
    +
    1194
    +
    1195 ctl = retrogui_get_ctl_by_idc( gui, g_retroflat_state->last_idc );
    +
    1196 g_retroflat_state->last_idc = 0;
    +
    1197 if( NULL == ctl ) {
    +
    1198 debug_printf( RETROGUI_TRACE_LVL,
    +
    1199 "invalid IDC: " SIZE_T_FMT, gui->focus );
    +
    1200 }
    +
    1201
    +
    1202 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
    +
    1203 if( SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) ) {
    +
    1204 SendMessage( ctl->base.hwnd, EM_SETMODIFY, 0, 0 );
    +
    1205 debug_printf( RETROGUI_TRACE_LVL, "mod: %d",
    +
    1206 SendMessage( ctl->base.hwnd, EM_GETMODIFY, 0, 0 ) );
    +
    1207 }
    +
    1208 }
    +
    1209
    +
    1210# else
    +
    1211
    +
    1212 /* Use our cross-platform controls. */
    +
    1213
    +
    1214 #define RETROGUI_CTL_TABLE_CLICK( idx, c_name, c_fields ) \
    +
    1215 } else if( RETROGUI_CTL_TYPE_ ## c_name == gui->ctls[i].base.type ) { \
    +
    1216 gui->flags |= RETROGUI_FLAGS_DIRTY; \
    +
    1217 idc_out = \
    +
    1218 retrogui_click_ ## c_name( \
    +
    1219 gui, &(gui->ctls[i]), p_input, input_evt );
    +
    1220
    +
    1221 #define RETROGUI_CTL_TABLE_KEY( idx, c_name, c_fields ) \
    +
    1222 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1223 gui->flags |= RETROGUI_FLAGS_DIRTY; \
    +
    1224 idc_out = retrogui_key_ ## c_name( ctl, p_input, input_evt );
    +
    1225
    +
    1226 if( 0 == *p_input ) {
    +
    1227 goto reset_debounce;
    +
    1228
    +
    1229# ifndef RETROGUI_NO_MOUSE
    +
    1230 } else if(
    +
    1231 RETROFLAT_MOUSE_B_LEFT == *p_input ||
    +
    1232 RETROFLAT_MOUSE_B_RIGHT == *p_input
    +
    1233 ) {
    +
    1234 /* Remove all focus before testing if a new control has focus. */
    +
    1235 gui->focus = RETROGUI_IDC_NONE;
    +
    1236
    +
    1237 mouse_x = input_evt->mouse_x - gui->x;
    +
    1238 mouse_y = input_evt->mouse_y - gui->y;
    +
    1239
    +
    1240 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    1241 if(
    +
    1242 mouse_x < gui->ctls[i].base.x ||
    +
    1243 mouse_y < gui->ctls[i].base.y ||
    +
    1244 mouse_x > gui->ctls[i].base.x + gui->ctls[i].base.w ||
    +
    1245 mouse_y > gui->ctls[i].base.y + gui->ctls[i].base.h
    +
    1246 ) {
    +
    1247 continue;
    +
    1248 }
    +
    1249
    +
    1250 if( gui->idc_prev == gui->ctls[i].base.idc ) {
    +
    1251 /* No repeated clicks! */
    +
    1252 /* TODO: Allow exceptions for e.g. scrollbars. */
    +
    1253 idc_out = RETROGUI_IDC_NONE;
    +
    1254 goto cleanup;
    +
    1255 }
    +
    1256
    +
    1257 gui->idc_prev = gui->ctls[i].base.idc;
    +
    1258
    +
    1259 gui->focus = gui->ctls[i].base.idc;
    +
    1260
    +
    1261 if( 0 ) {
    +
    1262 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CLICK )
    +
    1263 }
    +
    1264 break;
    +
    1265 }
    +
    1266# endif /* !RETROGUI_NO_MOUSE */
    +
    1267
    +
    1268 } else {
    +
    1269
    +
    1270 if( RETROGUI_IDC_NONE == gui->focus ) {
    +
    1271 goto reset_debounce;
    +
    1272 }
    +
    1273
    +
    1274 /* Send keystrokes to control that has focus. */
    +
    1275
    +
    1276 ctl = retrogui_get_ctl_by_idc( gui, gui->focus );
    +
    1277 if( NULL == ctl ) {
    +
    1278 debug_printf( RETROGUI_TRACE_LVL,
    +
    1279 "invalid IDC: " SIZE_T_FMT, gui->focus );
    +
    1280 goto reset_debounce;
    +
    1281 }
    +
    1282
    +
    1283 if( 0 ) {
    +
    1284 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_KEY )
    +
    1285 }
    +
    1286 }
    +
    1287
    +
    1288reset_debounce:
    +
    1289
    +
    1290 /* Reset repeat detector. */
    +
    1291 gui->idc_prev = RETROGUI_IDC_NONE;
    +
    1292
    +
    1293# endif
    +
    1294
    +
    1295cleanup:
    +
    1296
    +
    1297 return idc_out;
    +
    1298}
    +
    1299
    +
    1300void retrogui_redraw_ctls( struct RETROGUI* gui ) {
    +
    1301 size_t i = 0;
    +
    1302
    +
    1303 assert( NULL != gui->ctls );
    +
    1304
    +
    1305 if(
    + +
    1307 (RETROGUI_FLAGS_DIRTY & gui->flags)
    +
    1308 ) {
    +
    1309 return;
    +
    1310 }
    +
    1311
    +
    1312 #define RETROGUI_CTL_TABLE_REDRAW( idx, c_name, c_fields ) \
    +
    1313 } else if( RETROGUI_CTL_TYPE_ ## c_name == gui->ctls[i].base.type ) { \
    +
    1314 /* Mark dirty first so redraw can unmark it for animation! */ \
    +
    1315 gui->flags &= ~RETROGUI_FLAGS_DIRTY; \
    +
    1316 retrogui_redraw_ ## c_name( gui, &(gui->ctls[i]) );
    +
    1317
    +
    1318 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    1319 if( 0 ) {
    +
    1320 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_REDRAW )
    +
    1321 }
    +
    1322 }
    +
    1323}
    +
    1324
    +
    1325MERROR_RETVAL retrogui_sz_ctl(
    +
    1326 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    1327 size_t* p_w, size_t* p_h, size_t max_w, size_t max_h
    +
    1328) {
    +
    1329 MERROR_RETVAL retval = MERROR_OK;
    +
    1330
    +
    1331 #define RETROGUI_CTL_TABLE_SZ( idx, c_name, c_fields ) \
    +
    1332 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1333 /* Mark dirty first so redraw can unmark it for animation! */ \
    +
    1334 retval = retrogui_sz_ ## c_name( gui, ctl, p_w, p_h, max_w, max_h ); \
    +
    1335 maug_cleanup_if_not_ok();
    +
    1336
    +
    1337 if( 0 ) {
    +
    1338 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_SZ )
    +
    1339 }
    +
    1340
    +
    1341 debug_printf( 1,
    +
    1342 "sized control " SIZE_T_FMT " at " SIZE_T_FMT "x" SIZE_T_FMT "...",
    +
    1343 ctl->base.idc, ctl->base.w, ctl->base.h );
    +
    1344
    +
    1345cleanup:
    +
    1346
    +
    1347 return retval;
    +
    1348}
    +
    1349
    +
    1350MERROR_RETVAL retrogui_pos_ctl(
    +
    1351 struct RETROGUI* gui, union RETROGUI_CTL* ctl,
    +
    1352 size_t x, size_t y, size_t w, size_t h
    +
    1353) {
    +
    1354 MERROR_RETVAL retval = MERROR_OK;
    +
    1355
    +
    1356 #define RETROGUI_CTL_TABLE_POS( idx, c_name, c_fields ) \
    +
    1357 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1358 /* Mark dirty first so redraw can unmark it for animation! */ \
    +
    1359 retval = retrogui_pos_ ## c_name( gui, ctl, x, y, w, h ); \
    +
    1360 maug_cleanup_if_not_ok();
    +
    1361
    +
    1362 if( 0 ) {
    +
    1363 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_POS )
    +
    1364 }
    +
    1365
    +
    1366 debug_printf( 1,
    +
    1367 "moved control " SIZE_T_FMT " to " SIZE_T_FMT "x" SIZE_T_FMT "...",
    +
    1368 ctl->base.idc, ctl->base.x, ctl->base.y );
    +
    1369
    +
    1370cleanup:
    +
    1371
    +
    1372 return retval;
    +
    1373
    +
    1374}
    +
    1375
    +
    1376MERROR_RETVAL retrogui_push_ctl(
    +
    1377 struct RETROGUI* gui, union RETROGUI_CTL* ctl
    +
    1378) {
    +
    1379 MERROR_RETVAL retval = MERROR_OK;
    +
    1380
    +
    1381 assert( 0 < ctl->base.idc );
    +
    1382
    +
    1383#ifdef RETROGXC_PRESENT
    +
    1384 if( 0 > gui->font_idx ) {
    +
    1385#else
    +
    1386 if( (MAUG_MHANDLE)NULL == gui->font_h ) {
    +
    1387#endif /* RETROGXC_PRESENT */
    + +
    1389 RETROFLAT_MSG_FLAG_ERROR, "Error", "GUI font not loaded!" );
    +
    1390 retval = MERROR_GUI;
    +
    1391 goto cleanup;
    +
    1392 }
    +
    1393
    +
    1394 assert( NULL != gui->ctls );
    +
    1395
    +
    1396 /* TODO: Hunt for control IDC and fail if duplicate found! */
    +
    1397
    +
    1398 /* TODO: Grow controls if needed. */
    +
    1399 assert( gui->ctls_sz + 1 < gui->ctls_sz_max );
    +
    1400
    +
    1401 if( RETROFLAT_COLOR_NULL == ctl->base.bg_color ) {
    + +
    1403 "invalid background color specified for control " SIZE_T_FMT "!",
    +
    1404 ctl->base.idc );
    +
    1405 retval = MERROR_GUI;
    +
    1406 goto cleanup;
    +
    1407
    +
    1408 }
    +
    1409
    +
    1410 if( RETROFLAT_COLOR_NULL == ctl->base.fg_color ) {
    + +
    1412 "invalid foreground color specified for control " SIZE_T_FMT "!",
    +
    1413 ctl->base.idc );
    +
    1414 retval = MERROR_GUI;
    +
    1415 goto cleanup;
    +
    1416 }
    +
    1417
    +
    1418 /* Ensure physical size of control. */
    +
    1419
    +
    1420 if( 0 == ctl->base.w || 0 == ctl->base.h ) {
    +
    1421 debug_printf( RETROGUI_TRACE_LVL,
    +
    1422 "determining size for new %s control " SIZE_T_FMT "...",
    +
    1423 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc );
    +
    1424 retval = retrogui_sz_ctl(
    +
    1425 gui, ctl, &(ctl->base.w), &(ctl->base.h), 0, 0 );
    +
    1426 maug_cleanup_if_not_ok();
    +
    1427 }
    +
    1428
    +
    1429 /* Perform the actual push. */
    +
    1430
    +
    1431 debug_printf( RETROGUI_TRACE_LVL,
    +
    1432 "pushing %s " SIZE_T_FMT " to slot " SIZE_T_FMT "...",
    +
    1433 gc_retrogui_ctl_names[ctl->base.type], ctl->base.idc, gui->ctls_sz );
    +
    1434
    +
    1435 memcpy(
    +
    1436 &(gui->ctls[gui->ctls_sz]),
    +
    1437 ctl,
    +
    1438 sizeof( union RETROGUI_CTL ) );
    +
    1439 gui->ctls_sz++;
    +
    1440
    +
    1441 gui->flags |= RETROGUI_FLAGS_DIRTY;
    +
    1442
    +
    1443 #define RETROGUI_CTL_TABLE_PUSH( idx, c_name, c_fields ) \
    +
    1444 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1445 retval = retrogui_push_ ## c_name( &(gui->ctls[gui->ctls_sz - 1]) ); \
    +
    1446 maug_cleanup_if_not_ok();
    +
    1447
    +
    1448 if( 0 ) {
    +
    1449 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_PUSH )
    +
    1450 }
    +
    1451
    +
    1452cleanup:
    +
    1453
    +
    1454 return retval;
    +
    1455}
    +
    1456
    +
    1457MERROR_RETVAL retrogui_get_ctl_text(
    +
    1458 struct RETROGUI* gui, RETROGUI_IDC idc, char* buffer, size_t buffer_sz
    +
    1459) {
    +
    1460 MERROR_RETVAL retval = MERROR_OK;
    +
    1461 union RETROGUI_CTL* ctl = NULL;
    +
    1462
    +
    1463 ctl = retrogui_get_ctl_by_idc( gui, idc );
    +
    1464 if( NULL == ctl ) {
    +
    1465 goto cleanup;
    +
    1466 }
    +
    1467
    +
    1468 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
    +
    1469# if defined( RETROGUI_NATIVE_WIN )
    +
    1470 /* TODO */
    +
    1471#else
    +
    1472 maug_mlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    1473 maug_cleanup_if_null_alloc( char*, ctl->TEXTBOX.text );
    +
    1474
    +
    1475 strncpy( buffer, ctl->TEXTBOX.text, buffer_sz );
    +
    1476# endif
    +
    1477 }
    +
    1478
    +
    1479cleanup:
    +
    1480
    +
    1481 if( RETROGUI_CTL_TYPE_TEXTBOX == ctl->base.type ) {
    +
    1482 if( NULL != ctl->TEXTBOX.text ) {
    +
    1483 maug_munlock( ctl->TEXTBOX.text_h, ctl->TEXTBOX.text );
    +
    1484 }
    +
    1485 }
    +
    1486
    +
    1487 return retval;
    +
    1488}
    +
    1489
    +
    1490size_t retrogui_get_ctl_sel_idx( struct RETROGUI* gui, RETROGUI_IDC idc ) {
    +
    1491 size_t idx = -1;
    +
    1492 union RETROGUI_CTL* ctl = NULL;
    +
    1493
    +
    1494 ctl = retrogui_get_ctl_by_idc( gui, idc );
    +
    1495 if( NULL == ctl ) {
    +
    1496 goto cleanup;
    +
    1497 }
    +
    1498
    +
    1499 assert( RETROGUI_CTL_TYPE_LISTBOX == ctl->base.type );
    +
    1500
    +
    1501# if defined( RETROGUI_NATIVE_WIN )
    +
    1502 idx = SendMessage( ctl->base.hwnd, LB_GETCARETINDEX, 0, 0 );
    +
    1503# else
    +
    1504 idx = ctl->LISTBOX.sel_idx;
    +
    1505# endif
    +
    1506
    +
    1507cleanup:
    +
    1508
    +
    1509 return idx;
    +
    1510}
    +
    1511
    +
    1512MERROR_RETVAL retrogui_init_ctl(
    +
    1513 union RETROGUI_CTL* ctl, uint8_t type, size_t idc
    +
    1514) {
    +
    1515 MERROR_RETVAL retval = MERROR_OK;
    +
    1516
    +
    1517 debug_printf( RETROGUI_TRACE_LVL,
    +
    1518 "initializing control base " SIZE_T_FMT "...", idc );
    +
    1519
    +
    1520 maug_mzero( ctl, sizeof( union RETROGUI_CTL ) );
    +
    1521
    +
    1522 ctl->base.type = type;
    +
    1523 ctl->base.idc = idc;
    +
    1524 ctl->base.fg_color = RETROFLAT_COLOR_NULL;
    +
    1525 ctl->base.bg_color = RETROFLAT_COLOR_NULL;
    +
    1526
    +
    1527 #define RETROGUI_CTL_TABLE_INITS( idx, c_name, c_fields ) \
    +
    1528 } else if( RETROGUI_CTL_TYPE_ ## c_name == ctl->base.type ) { \
    +
    1529 retrogui_init_ ## c_name( ctl );
    +
    1530
    +
    1531 if( 0 ) {
    +
    1532 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_INITS )
    +
    1533 }
    +
    1534
    +
    1535 return retval;
    +
    1536}
    +
    1537
    +
    1538void retrogui_free( struct RETROGUI* gui ) {
    +
    1539 size_t i = 0;
    +
    1540
    +
    1541 if( NULL == gui->ctls && (MAUG_MHANDLE)NULL != gui->ctls_h ) {
    +
    1542 maug_mlock( gui->ctls_h, gui->ctls );
    +
    1543 if( NULL == gui->ctls ) {
    +
    1544 goto cleanup;
    +
    1545 }
    +
    1546 }
    +
    1547
    +
    1548 #define RETROGUI_CTL_TABLE_FREE( idx, c_name, c_fields ) \
    +
    1549 } else if( RETROGUI_CTL_TYPE_ ## c_name == gui->ctls[i].base.type ) { \
    +
    1550 retrogui_free_ ## c_name( &(gui->ctls[i]) );
    +
    1551
    +
    1552 for( i = 0 ; gui->ctls_sz > i ; i++ ) {
    +
    1553 if( 0 ) {
    +
    1554 RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_FREE )
    +
    1555 }
    +
    1556 }
    +
    1557
    +
    1558 maug_munlock( gui->ctls_h, gui->ctls );
    +
    1559
    +
    1560cleanup:
    +
    1561
    +
    1562 if( NULL != gui->ctls ) {
    +
    1563 maug_munlock( gui->ctls_h, gui->ctls );
    +
    1564 }
    +
    1565
    +
    1566 maug_mfree( gui->ctls_h );
    +
    1567
    +
    1568}
    +
    1569
    +
    1570MERROR_RETVAL retrogui_init( struct RETROGUI* gui ) {
    +
    1571 MERROR_RETVAL retval = MERROR_OK;
    +
    1572
    +
    1573 maug_mzero( gui, sizeof( struct RETROGUI ) );
    +
    1574
    +
    1575 gui->ctls_h = maug_malloc(
    +
    1576 RETROGUI_CTL_SZ_MAX_INIT, sizeof( struct RETROGUI ) );
    +
    1577 maug_cleanup_if_null_alloc( MAUG_MHANDLE, gui );
    +
    1578 gui->ctls_sz_max = RETROGUI_CTL_SZ_MAX_INIT;
    +
    1579
    +
    1580cleanup:
    +
    1581
    +
    1582 return retval;
    +
    1583}
    +
    1584
    +
    1585#else
    +
    1586
    +
    1587#define RETROGUI_CTL_TABLE_CONSTS( idx, c_name, c_fields ) \
    +
    1588 extern MAUG_CONST uint8_t RETROGUI_CTL_TYPE_ ## c_name;
    +
    1589
    +
    1590RETROGUI_CTL_TABLE( RETROGUI_CTL_TABLE_CONSTS )
    +
    1591
    +
    1592extern MAUG_CONST char* gc_retrogui_ctl_names[];
    +
    1593
    +
    1594#endif /* RETROGUI_C */
    +
    1595
    +
    1596 /* maug_retrogui */
    +
    1597
    +
    1598#endif /* !RETROGUI_H */
    +
    1599
    +
    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:362
    +
    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:795
    +
    #define retroflat_buffer_bksp(buffer, buffer_cur, buffer_sz)
    Remove a character from a text buffer before cursor position.
    Definition retroflt.h:779
    +
    #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:453
    +
    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:134
    +
    #define RETROGUI_CTL_TABLE(f)
    Table defining all control types and their specific fields in RETROGUI_CTL.
    Definition retrogui.h:104
    +
    #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:146
    +
    #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:86
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:1953
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:818
    +
    int mouse_y
    Y-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:828
    +
    int mouse_x
    X-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
    Definition retroflt.h:823
    +
    Fields common to ALL RETROGUI_CTL types.
    Definition retrogui.h:116
    +
    Definition retrogui.h:158
    +
    Definition retrogui.h:149
    +
    + + +
    + + diff --git a/retrogxc_8h_source.html b/retrogxc_8h_source.html new file mode 100644 index 00000000..c373f3c7 --- /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:761
    +
    char retroflat_asset_path[RETROFLAT_PATH_MAX]
    Path/name used to load an asset from disk.
    Definition retroflt.h:756
    +
    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:728
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:1953
    +
    uint8_t flags
    Platform-specific bitmap flags.
    Definition retroflt.h:1957
    +
    Definition retrogxc.h:35
    +
    Definition retrogxc.h:41
    +
    + + +
    + + diff --git a/retrohtr_8h.html b/retrohtr_8h.html new file mode 100644 index 00000000..554d693b --- /dev/null +++ b/retrohtr_8h.html @@ -0,0 +1,189 @@ + + + + + + + +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_TREE_FLAG_GUI_ACTIVE   1
     
    +#define RETROHTR_NODE_FLAG_DIRTY   2
     
    +#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..65883f56 --- /dev/null +++ b/retrohtr_8h_source.html @@ -0,0 +1,1653 @@ + + + + + + + +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#define RETROHTR_TREE_FLAG_GUI_ACTIVE 1
    +
    12
    +
    13#define RETROHTR_NODE_FLAG_DIRTY 2
    +
    14
    +
    15#ifndef RETROHTR_RENDER_NODES_INIT_SZ
    +
    16# define RETROHTR_RENDER_NODES_INIT_SZ 10
    +
    17#endif /* !RETROHTR_RENDER_NODES_INIT_SZ */
    +
    18
    +
    19#ifndef RETROHTR_TRACE_LVL
    +
    20# define RETROHTR_TRACE_LVL 0
    +
    21#endif /* !RETROHTR_TRACE_LVL */
    +
    22
    +
    23#define RETROHTR_EDGE_UNKNOWN 0
    +
    24#define RETROHTR_EDGE_LEFT 1
    +
    25#define RETROHTR_EDGE_TOP 2
    +
    26#define RETROHTR_EDGE_INSIDE 4
    +
    27
    +
    + +
    29 uint8_t flags;
    +
    30 /* TODO: Maybe get rid of these and replace them with MCSS_STYLE node? */
    +
    31 ssize_t x;
    +
    32 ssize_t y;
    +
    33 size_t w;
    +
    34 size_t h;
    +
    35 size_t m_l;
    +
    36 size_t m_r;
    +
    37 size_t m_t;
    +
    38 size_t m_b;
    +
    39 uint8_t pos;
    +
    40 uint8_t pos_flags;
    +
    41 uint8_t edge;
    + + +
    44#ifdef RETROGXC_PRESENT
    +
    45 ssize_t font_idx;
    +
    46#else
    +
    47 MAUG_MHANDLE font_h;
    +
    48#endif /* RETROGXC_PRESENT */
    +
    49 ssize_t tag;
    +
    51 ssize_t parent;
    +
    53 ssize_t first_child;
    +
    55 ssize_t next_sibling;
    +
    56 struct RETROFLAT_BITMAP bitmap;
    +
    57};
    +
    +
    58
    +
    + +
    60 uint8_t flags;
    +
    61 MAUG_MHANDLE nodes_h;
    + +
    65 size_t nodes_sz;
    + +
    68 struct RETROGUI gui;
    +
    69};
    +
    +
    70
    +
    71/* TODO: Function names should be verb_noun! */
    +
    72
    +
    73#define retrohtr_node( tree, idx ) (0 <= idx ? &((tree)->nodes[idx]) : NULL)
    +
    74
    +
    75#define retrohtr_node_parent( tree, idx ) \
    +
    76 (0 <= idx && 0 <= (tree)->nodes[idx].parent ? \
    +
    77 &((tree)->nodes[(tree)->nodes[idx].parent]) : NULL)
    +
    78
    +
    79#define retrohtr_tree_lock( tree ) \
    +
    80 if( NULL == (tree)->nodes ) { \
    +
    81 maug_mlock( (tree)->nodes_h, (tree)->nodes ); \
    +
    82 maug_cleanup_if_null_alloc( struct RETROHTR_RENDER_NODE*, (tree)->nodes ); \
    +
    83 }
    +
    84
    +
    85#define retrohtr_tree_unlock( tree ) \
    +
    86 if( NULL != (tree)->nodes ) { \
    +
    87 maug_munlock( (tree)->nodes_h, (tree)->nodes ); \
    +
    88 }
    +
    89
    +
    90#define retrohtr_tree_is_locked( tree ) (NULL != (tree)->nodes)
    +
    91
    +
    92/* TODO: Make these offset by element scroll on screen. */
    +
    93
    +
    94#define retrohtr_node_screen_x( tree, node_idx ) \
    +
    95 ((tree)->nodes[node_idx].x)
    +
    96
    +
    97#define retrohtr_node_screen_y( tree, node_idx ) \
    +
    98 ((tree)->nodes[node_idx].y)
    +
    99
    +
    100MERROR_RETVAL retrohtr_tree_create(
    +
    101 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    102 size_t x, size_t y, size_t w, size_t h,
    +
    103 ssize_t tag_idx, ssize_t node_idx, size_t d );
    +
    104
    + +
    117 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    118 struct MCSS_STYLE* parent_style, struct MCSS_STYLE* effect_style,
    +
    119 ssize_t tag_idx );
    +
    120
    +
    121MERROR_RETVAL retrohtr_tree_size(
    +
    122 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    123 struct MCSS_STYLE* prev_sibling_style,
    +
    124 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d );
    +
    125
    +
    126MERROR_RETVAL retrohtr_tree_pos(
    +
    127 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    128 struct MCSS_STYLE* prev_sibling_style,
    +
    129 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d );
    +
    130
    +
    131void retrohtr_tree_draw(
    +
    132 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    133 ssize_t node_idx, size_t d );
    +
    134
    +
    135void retrohtr_tree_dump(
    +
    136 struct RETROHTR_RENDER_TREE* tree, struct MHTML_PARSER* parser,
    +
    137 ssize_t iter, size_t d );
    +
    138
    +
    139void retrohtr_tree_free( struct RETROHTR_RENDER_TREE* tree );
    +
    140
    +
    141MERROR_RETVAL retrohtr_tree_init( struct RETROHTR_RENDER_TREE* tree );
    +
    142
    +
    143#ifdef RETROHTR_C
    +
    144
    +
    145static void mhtml_merge_styles(
    +
    146 struct MCSS_STYLE* effect_style,
    +
    147 struct MCSS_STYLE* parent_style,
    +
    148 struct MCSS_STYLE* tag_style,
    +
    149 size_t tag_type
    +
    150) {
    +
    151
    +
    152 if(
    +
    153 MCSS_STYLE_FLAG_ACTIVE !=
    +
    154 (MCSS_STYLE_FLAG_ACTIVE & effect_style->flags)
    +
    155 ) {
    +
    156 mcss_style_init( effect_style );
    +
    157 }
    +
    158
    +
    159 /* Perform inheritence of special cases. */
    +
    160
    +
    161 #define MCSS_PROP_TABLE_MERGE( p_id, prop_n, prop_t, prop_p, def ) \
    +
    162 if( \
    +
    163 ( \
    +
    164 /* Only do inheritence for some special cases.
    +
    165 * e.g. We don't want to inherit width/height/X/etc! */ \
    +
    166 mcss_prop_is_heritable( p_id ) \
    +
    167 ) && (NULL != parent_style && ( \
    +
    168 ( \
    +
    169 NULL != tag_style && \
    +
    170 /* Parent is important and new property isn't. */ \
    +
    171 mcss_prop_is_active_flag( parent_style->prop_n, IMPORTANT ) && \
    +
    172 /* TODO: Is not active OR important? */ \
    +
    173 !mcss_prop_is_important( tag_style->prop_n ) && \
    +
    174 !mcss_prop_is_important( effect_style->prop_n ) \
    +
    175 ) || ( \
    +
    176 NULL != tag_style && \
    +
    177 /* New property is not active. */ \
    +
    178 !mcss_prop_is_active( tag_style->prop_n ) && \
    +
    179 !mcss_prop_is_active( effect_style->prop_n ) \
    +
    180 ) || (\
    +
    181 /* No competition. */ \
    +
    182 NULL == tag_style && \
    +
    183 !mcss_prop_is_active( effect_style->prop_n ) \
    +
    184 ) \
    +
    185 )) \
    +
    186 ) { \
    +
    187 /* Inherit parent property. */ \
    +
    188 if( MCSS_PROP_BACKGROUND_COLOR == p_id ) { \
    +
    189 debug_printf( RETROHTR_TRACE_LVL, "background color was %s", \
    +
    190 0 <= effect_style->prop_n ? \
    +
    191 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    192 } else if( MCSS_PROP_COLOR == p_id ) { \
    +
    193 debug_printf( RETROHTR_TRACE_LVL, "color was %s", \
    +
    194 0 <= effect_style->prop_n ? \
    +
    195 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    196 } \
    +
    197 debug_printf( RETROHTR_TRACE_LVL, "%s using parent %s", \
    +
    198 gc_mhtml_tag_names[tag_type], #prop_n ); \
    +
    199 effect_style->prop_n = parent_style->prop_n; \
    +
    200 effect_style->prop_n ## _flags = parent_style->prop_n ## _flags; \
    +
    201 if( MCSS_PROP_BACKGROUND_COLOR == p_id ) { \
    +
    202 debug_printf( RETROHTR_TRACE_LVL, "background color %s", \
    +
    203 0 <= effect_style->prop_n ? \
    +
    204 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    205 } else if( MCSS_PROP_COLOR == p_id ) { \
    +
    206 debug_printf( RETROHTR_TRACE_LVL, "color %s", \
    +
    207 0 <= effect_style->prop_n ? \
    +
    208 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    209 } \
    +
    210 } else if( \
    +
    211 NULL != tag_style && \
    +
    212 mcss_prop_is_active( tag_style->prop_n ) \
    +
    213 ) { \
    +
    214 /* Use new property. */ \
    +
    215 debug_printf( RETROHTR_TRACE_LVL, "%s using style %s", \
    +
    216 gc_mhtml_tag_names[tag_type], #prop_n ); \
    +
    217 if( MCSS_PROP_COLOR == p_id ) { \
    +
    218 debug_printf( RETROHTR_TRACE_LVL, "color %s", \
    +
    219 0 <= effect_style->prop_n ? \
    +
    220 gc_retroflat_color_names[effect_style->prop_n] : "NULL" ); \
    +
    221 } \
    +
    222 effect_style->prop_n = tag_style->prop_n; \
    +
    223 effect_style->prop_n ## _flags = tag_style->prop_n ## _flags; \
    +
    224 }
    +
    225
    +
    226 MCSS_PROP_TABLE( MCSS_PROP_TABLE_MERGE )
    +
    227
    +
    228 /* Apply defaults for display. */
    +
    229
    +
    230 if(
    +
    231 MCSS_PROP_FLAG_ACTIVE !=
    +
    232 (MCSS_PROP_FLAG_ACTIVE & effect_style->DISPLAY_flags)
    +
    233 ) {
    +
    234 /* Set the display property based on the tag's default. */
    +
    235
    +
    236 #define MHTML_TAG_TABLE_DISP( tag_id, tag_name, fields, disp ) \
    +
    237 } else if( tag_id == tag_type ) { \
    +
    238 effect_style->DISPLAY = MCSS_DISPLAY_ ## disp; \
    +
    239 debug_printf( RETROHTR_TRACE_LVL, "%s defaulting to %s DISPLAY", \
    +
    240 gc_mhtml_tag_names[tag_type], \
    +
    241 gc_mcss_display_names[effect_style->DISPLAY] );
    +
    242
    +
    243 if( 0 ) {
    +
    244 MHTML_TAG_TABLE( MHTML_TAG_TABLE_DISP )
    +
    245 }
    +
    246
    +
    247 }
    +
    248
    +
    249 return;
    +
    250}
    +
    251
    +
    252ssize_t retrohtr_get_next_free_node( struct RETROHTR_RENDER_TREE* tree ) {
    +
    253 uint8_t auto_unlocked = 0;
    +
    254 ssize_t retidx = -1;
    +
    255 MAUG_MHANDLE new_nodes_h = (MAUG_MHANDLE)NULL;
    +
    256
    +
    257 if( NULL != tree->nodes ) {
    +
    258 debug_printf( RETROHTR_TRACE_LVL, "auto-unlocking nodes..." );
    +
    259 maug_munlock( tree->nodes_h, tree->nodes );
    +
    260 auto_unlocked = 1;
    +
    261 }
    +
    262
    +
    263 assert( 0 < tree->nodes_sz_max );
    +
    264 assert( NULL == tree->nodes );
    +
    265 assert( (MAUG_MHANDLE)NULL != tree->nodes_h );
    +
    266 if( tree->nodes_sz_max <= tree->nodes_sz + 1 ) {
    +
    267 /* We've run out of nodes, so double the available number. */
    +
    268 /* TODO: Check for sz overflow. */
    +
    269 new_nodes_h = maug_mrealloc( tree->nodes_h, tree->nodes_sz_max * 2,
    +
    270 sizeof( struct RETROHTR_RENDER_NODE ) );
    +
    271 if( (MAUG_MHANDLE)NULL == new_nodes_h ) {
    +
    272 error_printf(
    +
    273 "unable to reallocate " SIZE_T_FMT " nodes!",
    +
    274 tree->nodes_sz_max * 2 );
    +
    275 goto cleanup;
    +
    276 }
    +
    277 tree->nodes_h = new_nodes_h;
    +
    278 tree->nodes_sz_max *= 2;
    +
    279 }
    +
    280
    +
    281 /* Assume handle is unlocked. */
    +
    282 assert( NULL == tree->nodes );
    +
    283 maug_mlock( tree->nodes_h, tree->nodes );
    +
    284 if( NULL == tree->nodes ) {
    +
    285 error_printf( "unable to lock nodes!" );
    +
    286 goto cleanup;
    +
    287 }
    +
    288
    +
    289 /* Zero out the last node, add it to the list, and return its index. */
    +
    290 debug_printf( RETROHTR_TRACE_LVL,
    +
    291 "zeroing node " SIZE_T_FMT " (of " SIZE_T_FMT ")...",
    +
    292 tree->nodes_sz, tree->nodes_sz_max );
    +
    293 maug_mzero( &(tree->nodes[tree->nodes_sz]),
    +
    294 sizeof( struct RETROHTR_RENDER_NODE ) );
    +
    295 retidx = tree->nodes_sz;
    +
    296 tree->nodes_sz++;
    +
    297
    +
    298 /* Compensate for cleanup below. */
    +
    299 maug_munlock( tree->nodes_h, tree->nodes );
    +
    300
    +
    301cleanup:
    +
    302
    +
    303 if( auto_unlocked ) {
    +
    304 debug_printf( RETROHTR_TRACE_LVL, "auto-locking nodes..." );
    +
    305 maug_mlock( tree->nodes_h, tree->nodes );
    +
    306 }
    +
    307
    +
    308 return retidx;
    +
    309}
    +
    310
    +
    311ssize_t retrohtr_add_node_child(
    +
    312 struct RETROHTR_RENDER_TREE* tree, ssize_t node_parent_idx
    +
    313) {
    +
    314 ssize_t node_new_idx = -1,
    +
    315 node_sibling_idx = -1;
    +
    316
    +
    317 node_new_idx = retrohtr_get_next_free_node( tree );
    +
    318 if( 0 > node_new_idx ) {
    +
    319 goto cleanup;
    +
    320 }
    +
    321
    +
    322#ifdef RETROGXC_PRESENT
    +
    323 retrohtr_node( tree, node_new_idx )->font_idx = -1;
    +
    324#endif /* RETROGXC_PRESENT */
    +
    325 retrohtr_node( tree, node_new_idx )->parent = node_parent_idx;
    +
    326 retrohtr_node( tree, node_new_idx )->first_child = -1;
    +
    327 retrohtr_node( tree, node_new_idx )->next_sibling = -1;
    +
    328
    +
    329 if( 0 > node_parent_idx ) {
    +
    330 debug_printf(
    +
    331 1, "adding root node under " SSIZE_T_FMT "...", node_parent_idx );
    +
    332 goto cleanup;
    +
    333 } else {
    +
    334 debug_printf(
    +
    335 1, "adding node " SSIZE_T_FMT " under " SSIZE_T_FMT,
    +
    336 node_new_idx, node_parent_idx );
    +
    337 }
    +
    338
    +
    339 /* Add new child under current node. */
    +
    340 if( 0 > retrohtr_node( tree, node_parent_idx )->first_child ) {
    +
    341 debug_printf( RETROHTR_TRACE_LVL, "adding first child..." );
    +
    342 assert( -1 == retrohtr_node( tree, node_parent_idx )->first_child );
    +
    343 retrohtr_node( tree, node_parent_idx )->first_child = node_new_idx;
    +
    344 } else {
    +
    345 assert( NULL != retrohtr_node( tree, node_parent_idx ) );
    +
    346 node_sibling_idx = retrohtr_node( tree, node_parent_idx )->first_child;
    +
    347 assert( NULL != retrohtr_node( tree, node_sibling_idx ) );
    +
    348 while( 0 <= retrohtr_node( tree, node_sibling_idx )->next_sibling ) {
    +
    349 node_sibling_idx =
    +
    350 retrohtr_node( tree, node_sibling_idx )->next_sibling;
    +
    351 }
    +
    352 retrohtr_node( tree, node_sibling_idx )->next_sibling = node_new_idx;
    +
    353 }
    +
    354
    +
    355cleanup:
    +
    356
    +
    357 return node_new_idx;
    +
    358}
    +
    359
    +
    360MERROR_RETVAL retrohtr_tree_create(
    +
    361 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    362 size_t x, size_t y, size_t w, size_t h,
    +
    363 ssize_t tag_idx, ssize_t node_idx, size_t d
    +
    364) {
    +
    365 ssize_t node_new_idx = -1;
    +
    366 ssize_t tag_iter_idx = -1;
    +
    367 MERROR_RETVAL retval = MERROR_OK;
    +
    368
    +
    369 if( NULL == mhtml_tag( parser, tag_idx ) ) {
    +
    370 goto cleanup;
    +
    371 }
    +
    372
    +
    373 /* Make sure we have a single root node. */
    +
    374 if( 0 > node_idx ) {
    +
    375 assert( MHTML_TAG_TYPE_BODY == mhtml_tag( parser, tag_idx )->base.type );
    +
    376
    +
    377 node_new_idx = retrohtr_add_node_child( tree, node_idx );
    +
    378 if( 0 > node_new_idx ) {
    +
    379 goto cleanup;
    +
    380 }
    +
    381 debug_printf( RETROHTR_TRACE_LVL,
    +
    382 "created initial root node: " SIZE_T_FMT, node_new_idx );
    +
    383
    +
    384 node_idx = node_new_idx;
    +
    385
    +
    386 /* The common root is the body tag. */
    +
    387 retrohtr_node( tree, node_idx )->tag = tag_idx;
    +
    388
    +
    389 retrohtr_node( tree, node_idx )->x = x;
    +
    390 retrohtr_node( tree, node_idx )->y = y;
    +
    391 retrohtr_node( tree, node_idx )->w = w;
    +
    392 retrohtr_node( tree, node_idx )->h = h;
    +
    393 }
    +
    394
    +
    395 tag_iter_idx = mhtml_tag( parser, tag_idx )->base.first_child;
    +
    396 while( 0 <= tag_iter_idx ) {
    +
    397 node_new_idx = retrohtr_add_node_child( tree, node_idx );
    +
    398 if( 0 > node_new_idx ) {
    +
    399 goto cleanup;
    +
    400 }
    +
    401
    +
    402 retrohtr_node( tree, node_new_idx )->tag = tag_iter_idx;
    +
    403
    +
    404 debug_printf( RETROHTR_TRACE_LVL,
    +
    405 "rendering node " SSIZE_T_FMT " (%s) under node " SSIZE_T_FMT,
    +
    406 node_new_idx,
    +
    407 gc_mhtml_tag_names[mhtml_tag( parser, tag_iter_idx )->base.type],
    +
    408 node_idx );
    +
    409
    +
    410 /* Tag-specific rendering preparations. */
    +
    411 if( MHTML_TAG_TYPE_IMG == mhtml_tag( parser, tag_iter_idx )->base.type ) {
    +
    412 /* Load the image for rendering later. */
    +
    413 retval = retroflat_load_bitmap(
    +
    414 mhtml_tag( parser, tag_iter_idx )->IMG.src,
    +
    415 &(retrohtr_node( tree, node_new_idx )->bitmap),
    + +
    417 if( MERROR_OK == retval ) {
    +
    418 debug_printf( RETROHTR_TRACE_LVL, "loaded img: %s",
    +
    419 mhtml_tag( parser, tag_iter_idx )->IMG.src );
    +
    420 } else {
    +
    421 error_printf( "could not load img: %s",
    +
    422 mhtml_tag( parser, tag_iter_idx )->IMG.src );
    +
    423 }
    +
    424 }
    +
    425
    +
    426 retrohtr_tree_create( parser, tree, x, y, w, h,
    +
    427 tag_iter_idx, node_new_idx, d + 1 );
    +
    428
    +
    429 tag_iter_idx = mhtml_tag( parser, tag_iter_idx )->base.next_sibling;
    +
    430 }
    +
    431
    +
    432cleanup:
    +
    433
    +
    434 return retval;
    +
    435}
    +
    436
    + +
    438 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    439 struct MCSS_STYLE* parent_style, struct MCSS_STYLE* effect_style,
    +
    440 ssize_t tag_idx
    +
    441) {
    +
    442 MERROR_RETVAL retval = MERROR_OK;
    +
    443 ssize_t tag_style_idx = -1;
    +
    444 size_t tag_type = 0,
    +
    445 i = 0;
    +
    446
    +
    447 maug_mzero( effect_style, sizeof( struct MCSS_STYLE ) );
    +
    448
    +
    449 if( 0 >= tag_idx ) {
    +
    450 goto cleanup;
    +
    451 }
    +
    452
    +
    453 tag_type = mhtml_tag( parser, tag_idx )->base.type;
    +
    454
    +
    455 /* Try to apply class/ID styles. */
    +
    456 if( 0 < mhtml_tag( parser, tag_idx )->base.classes_sz ) {
    +
    457 for( i = 0 ; parser->styler.styles_sz > i ; i++ ) {
    +
    458 if(
    +
    459 0 == strncmp(
    +
    460 mhtml_tag( parser, tag_idx )->base.classes,
    +
    461 parser->styler.styles[i].class,
    +
    462 mhtml_tag( parser, tag_idx )->base.classes_sz
    +
    463 )
    +
    464 ) {
    +
    465 debug_printf( RETROHTR_TRACE_LVL, "found style for tag class: %s",
    +
    466 parser->styler.styles[i].class );
    +
    467
    +
    468 mhtml_merge_styles(
    +
    469 effect_style,
    +
    470 parent_style,
    +
    471 &(parser->styler.styles[i]),
    +
    472 tag_type );
    +
    473 }
    +
    474 }
    +
    475 }
    +
    476 if( 0 < mhtml_tag( parser, tag_idx )->base.id_sz ) {
    +
    477 for( i = 0 ; parser->styler.styles_sz > i ; i++ ) {
    +
    478 if(
    +
    479 0 == strncmp(
    +
    480 mhtml_tag( parser, tag_idx )->base.id,
    +
    481 parser->styler.styles[i].id,
    +
    482 mhtml_tag( parser, tag_idx )->base.id_sz
    +
    483 )
    +
    484 ) {
    +
    485 debug_printf( RETROHTR_TRACE_LVL, "found style for tag ID: %s",
    +
    486 parser->styler.styles[i].id );
    +
    487
    +
    488 mhtml_merge_styles(
    +
    489 effect_style,
    +
    490 parent_style,
    +
    491 &(parser->styler.styles[i]),
    +
    492 tag_type );
    +
    493 }
    +
    494 }
    +
    495 }
    +
    496
    +
    497 /* Grab element-specific style last. */
    +
    498 tag_style_idx = mhtml_tag( parser, tag_idx )->base.style;
    +
    499
    +
    500cleanup:
    +
    501
    +
    502 /* Make sure we have a root style. */
    +
    503 mhtml_merge_styles(
    +
    504 effect_style,
    +
    505 parent_style,
    +
    506 0 <= tag_style_idx ? &(parser->styler.styles[tag_style_idx]) : NULL,
    +
    507 tag_type );
    +
    508
    +
    509 return retval;
    +
    510}
    +
    511
    +
    512static MERROR_RETVAL retrohtr_load_font(
    +
    513 struct MCSS_PARSER* styler,
    +
    514#ifdef RETROGXC_PRESENT
    +
    515 ssize_t* font_idx_p,
    +
    516#else
    +
    517 MAUG_MHANDLE* font_h_p,
    +
    518#endif /* RETROGXC_PRESENT */
    +
    519 struct MCSS_STYLE* effect_style
    +
    520) {
    +
    521 MERROR_RETVAL retval = MERROR_OK;
    +
    522 char* str_table = NULL;
    +
    523
    +
    524#ifdef RETROGXC_PRESENT
    +
    525 if( 0 <= *font_idx_p ) {
    +
    526 error_printf( "tried to load font but font already loaded, idx: "
    +
    527 SSIZE_T_FMT, *font_idx_p );
    +
    528#else
    +
    529 if( (MAUG_MHANDLE)NULL != *font_h_p ) {
    +
    530 error_printf( "tried to load font but font already loaded, p: %p",
    +
    531 *font_h_p );
    +
    532#endif /* RETROGXC_PRESENT */
    +
    533 goto cleanup;
    +
    534 }
    +
    535
    +
    536 maug_mlock( styler->str_table_h, str_table );
    +
    537 maug_cleanup_if_null_alloc( char*, str_table );
    +
    538
    +
    539 if( 0 > effect_style->FONT_FAMILY ) {
    +
    540 error_printf( "style has no font associated!" );
    +
    541 /* TODO: Load fallback font? */
    +
    542 retval = MERROR_GUI;
    +
    543 goto cleanup;
    +
    544 }
    +
    545
    +
    546 /* Load the font into the cache. */
    +
    547#ifdef RETROGXC_PRESENT
    +
    548 *font_idx_p =
    +
    549 retrogxc_load_font( &(str_table[effect_style->FONT_FAMILY]), 0, 33, 93 );
    +
    550#else
    +
    551 retval = retrofont_load(
    +
    552 &(str_table[effect_style->FONT_FAMILY]), font_h_p, 0, 33, 93 );
    +
    553#endif /* RETROGXC_PRESENT */
    +
    554
    +
    555cleanup:
    +
    556
    +
    557 if( NULL != str_table ) {
    +
    558 maug_munlock( styler->str_table_h, str_table );
    +
    559 }
    +
    560
    +
    561 return retval;
    +
    562}
    +
    563
    +
    564MERROR_RETVAL retrohtr_tree_gui(
    +
    565 struct RETROHTR_RENDER_TREE* tree, struct MCSS_PARSER* styler,
    +
    566 struct MCSS_STYLE* effect_style
    +
    567) {
    +
    568 MERROR_RETVAL retval = MERROR_OK;
    +
    569
    +
    570 /* Create a GUI handler just for this tree. */
    +
    571 if(
    +
    572 RETROHTR_TREE_FLAG_GUI_ACTIVE ==
    +
    573 (RETROHTR_TREE_FLAG_GUI_ACTIVE & tree->flags)
    +
    574 ) {
    +
    575 debug_printf( RETROHTR_TRACE_LVL, "tree GUI already active!" );
    +
    576 goto cleanup;
    +
    577 }
    +
    578
    +
    579 /* This means all GUI items will use the font from the first node
    +
    580 * loaded with a GUI item!
    +
    581 */
    +
    582 retval = retrogui_init( &(tree->gui) );
    +
    583 maug_cleanup_if_not_ok();
    +
    584
    +
    585 retval = retrohtr_load_font(
    +
    586 styler,
    +
    587#ifdef RETROGXC_PRESENT
    +
    588 &(tree->gui.font_idx),
    +
    589#else
    +
    590 &(tree->gui.font_h),
    +
    591#endif /* RETROGXC_PRESENT */
    +
    592 effect_style );
    +
    593 maug_cleanup_if_not_ok();
    +
    594
    +
    595 tree->flags |= RETROHTR_TREE_FLAG_GUI_ACTIVE;
    +
    596
    +
    597 debug_printf( RETROHTR_TRACE_LVL, "tree GUI initialized!" );
    +
    598
    +
    599cleanup:
    +
    600 return retval;
    +
    601}
    +
    602
    +
    603MERROR_RETVAL retrohtr_tree_size(
    +
    604 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    605 struct MCSS_STYLE* prev_sibling_style,
    +
    606 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d
    +
    607) {
    +
    608 struct MCSS_STYLE effect_style;
    +
    609 struct MCSS_STYLE child_prev_sibling_style;
    +
    610 struct MCSS_STYLE child_style;
    +
    611 char* tag_content = NULL;
    +
    612 ssize_t child_iter_idx = -1;
    +
    613 ssize_t tag_idx = -1;
    +
    614 ssize_t node_iter_idx = -1;
    +
    615 size_t this_line_w = 0;
    +
    616 size_t this_line_h = 0;
    +
    617 MERROR_RETVAL retval = MERROR_OK;
    +
    618 union RETROGUI_CTL ctl;
    +
    619
    +
    620 if( NULL == retrohtr_node( tree, node_idx ) ) {
    +
    621 goto cleanup;
    +
    622 }
    +
    623
    +
    624 tag_idx = retrohtr_node( tree, node_idx )->tag;
    +
    625
    + +
    627 parser, tree, parent_style, &effect_style, tag_idx );
    +
    628
    +
    629 /* position */
    +
    630
    +
    631 if( mcss_prop_is_active( effect_style.POSITION ) ) {
    +
    632 debug_printf( RETROHTR_TRACE_LVL,
    +
    633 "node " SSIZE_T_FMT ": applying %s positioning",
    +
    634 node_idx, gc_mcss_position_names[effect_style.POSITION] );
    +
    635 /* TODO: MCSS_POS_NOTE: We'd like to get rid of this so all positioning
    +
    636 * is done through CSS... unfortunately, we only track the current
    +
    637 * and previous effective styles while working that out later, so
    +
    638 * we need to pin this to the element directly so we can rule it
    +
    639 * out of the box model e.g. when determining x/y coords of its
    +
    640 * neighbors.
    +
    641 */
    +
    642 retrohtr_node( tree, node_idx )->pos = effect_style.POSITION;
    +
    643 retrohtr_node( tree, node_idx )->pos_flags = effect_style.POSITION_flags;
    +
    644 }
    +
    645
    +
    646 /* Grab fixed dimensions before content-based calculations of children, so
    +
    647 * we know if there are constraints. If these aren't set, then we'll size
    +
    648 * based on childrens' sizes after we determine childrens' sizes below.
    +
    649 */
    +
    650
    +
    651 if( mcss_prop_is_active_NOT_flag( effect_style.WIDTH, AUTO ) ) {
    +
    652 retrohtr_node( tree, node_idx )->w = effect_style.WIDTH;
    +
    653 }
    +
    654
    +
    655 if( mcss_prop_is_active_NOT_flag( effect_style.HEIGHT, AUTO ) ) {
    +
    656 retrohtr_node( tree, node_idx )->h = effect_style.HEIGHT;
    +
    657 }
    +
    658
    +
    659 /* Figure out how big the contents of this node are. */
    +
    660
    +
    661 if(
    +
    662 0 <= tag_idx &&
    +
    663 MHTML_TAG_TYPE_TEXT == mhtml_tag( parser, tag_idx )->base.type
    +
    664 ) {
    +
    665 /* Get text size to use in calculations below. */
    +
    666
    +
    667 retval = retrohtr_load_font(
    +
    668 &(parser->styler),
    +
    669#ifdef RETROGXC_PRESENT
    +
    670 &(retrohtr_node( tree, node_idx )->font_idx),
    +
    671#else
    +
    672 &(retrohtr_node( tree, node_idx )->font_h),
    +
    673#endif /* RETROGXC_PRESENT */
    +
    674 &effect_style );
    +
    675 maug_cleanup_if_not_ok();
    +
    676
    +
    677 maug_mlock( mhtml_tag( parser, tag_idx )->TEXT.content, tag_content );
    +
    678 maug_cleanup_if_null_alloc( char*, tag_content );
    +
    679
    +
    680#ifdef RETROGXC_PRESENT
    +
    681 retrogxc_string_sz(
    +
    682#else
    +
    683 retrofont_string_sz(
    +
    684#endif /* RETROGXC_PRESENT */
    +
    685 NULL, tag_content, mhtml_tag( parser, tag_idx )->TEXT.content_sz,
    +
    686#ifdef RETROGXC_PRESENT
    +
    687 retrohtr_node( tree, node_idx )->font_idx,
    +
    688#else
    +
    689 retrohtr_node( tree, node_idx )->font_h,
    +
    690#endif /* RETROGXC_PRESENT */
    +
    691 /* Constrain node text size to parent size. */
    +
    692 retrohtr_node_parent( tree, node_idx )->w,
    +
    693 retrohtr_node_parent( tree, node_idx )->h,
    +
    694 &(retrohtr_node( tree, node_idx )->w),
    +
    695 &(retrohtr_node( tree, node_idx )->h), 0 );
    +
    696
    +
    697 debug_printf( RETROHTR_TRACE_LVL, "TEXT w: " SIZE_T_FMT,
    +
    698 retrohtr_node( tree, node_idx )->w );
    +
    699
    +
    700 maug_munlock( mhtml_tag( parser, tag_idx )->TEXT.content, tag_content );
    +
    701
    +
    702 } else if(
    +
    703 0 <= tag_idx &&
    +
    704 MHTML_TAG_TYPE_INPUT == mhtml_tag( parser, tag_idx )->base.type
    +
    705 ) {
    +
    706 /* Push the control (for the client renderer to redraw later). */
    +
    707
    +
    708 retval = retrohtr_tree_gui( tree, &(parser->styler), &effect_style );
    +
    709
    +
    710 retrogui_lock( &(tree->gui) );
    +
    711
    +
    712 if(
    +
    713 /* Use the same ID for the node and control it creates. */
    +
    714 MERROR_OK != retrogui_init_ctl(
    +
    715 &ctl, RETROGUI_CTL_TYPE_BUTTON, node_idx )
    +
    716 ) {
    +
    717 error_printf( "could not initialize control!" );
    +
    718 retrogui_unlock( &(tree->gui) );
    +
    719 goto cleanup;
    +
    720 }
    +
    721
    +
    722 ctl.base.x = retrohtr_node( tree, node_idx )->x;
    +
    723 ctl.base.y = retrohtr_node( tree, node_idx )->y;
    +
    724 ctl.base.w = 0;
    +
    725 ctl.base.h = 0;
    +
    726 ctl.BUTTON.label = mhtml_tag( parser,
    +
    727 retrohtr_node( tree, node_idx )->tag )->INPUT.value;
    +
    728
    +
    729 /* Grab determined size back from control. */
    +
    730 retrohtr_node( tree, node_idx )->w = ctl.base.w;
    +
    731 retrohtr_node( tree, node_idx )->h = ctl.base.h;
    +
    732
    +
    733 debug_printf( RETROHTR_TRACE_LVL, "initialized control for INPUT..." );
    +
    734
    +
    735 retrogui_push_ctl( &(tree->gui), &ctl );
    +
    736
    +
    737 retrogui_unlock( &(tree->gui) );
    +
    738
    +
    739 } else if(
    +
    740 0 <= tag_idx &&
    +
    741 MHTML_TAG_TYPE_IMG == mhtml_tag( parser, tag_idx )->base.type
    +
    742 ) {
    +
    743
    +
    744 if( retroflat_bitmap_ok( &(retrohtr_node( tree, node_idx )->bitmap) ) ) {
    +
    745 retrohtr_node( tree, node_idx )->w =
    +
    746 retroflat_bitmap_w( &(retrohtr_node( tree, node_idx )->bitmap) );
    +
    747 retrohtr_node( tree, node_idx )->h =
    +
    748 retroflat_bitmap_h( &(retrohtr_node( tree, node_idx )->bitmap) );
    +
    749 }
    +
    750
    +
    751 debug_printf( RETROHTR_TRACE_LVL, "TEXT w: " SIZE_T_FMT,
    +
    752 retrohtr_node( tree, node_idx )->w );
    +
    753
    +
    754 } else {
    +
    755 /* Get sizing of child nodes. */
    +
    756
    +
    757 maug_mzero( &child_prev_sibling_style, sizeof( struct MCSS_STYLE ) );
    +
    758 node_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    759 while( 0 <= node_iter_idx ) {
    +
    760 retrohtr_tree_size(
    +
    761 parser, tree, &child_prev_sibling_style, &effect_style,
    +
    762 node_iter_idx, d + 1 );
    +
    763
    +
    764 node_iter_idx = retrohtr_node( tree, node_iter_idx )->next_sibling;
    +
    765 }
    +
    766 }
    +
    767
    +
    768 /* If our width is still zero, then size based on children. */
    +
    769 if( 0 == retrohtr_node( tree, node_idx )->w ) {
    +
    770 if(
    +
    771 MCSS_DISPLAY_BLOCK == effect_style.DISPLAY &&
    +
    772 0 <= retrohtr_node( tree, node_idx )->parent
    +
    773 ) {
    +
    774 /* Use parent width. */
    +
    775 /* TODO: Subtract parent padding! */
    +
    776 retrohtr_node( tree, node_idx )->w =
    +
    777 retrohtr_node_parent( tree, node_idx )->w;
    +
    778 }
    +
    779
    +
    780 /* Cycle through children and use greatest width. */
    +
    781 child_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    782 while( 0 <= child_iter_idx ) {
    + +
    784 parser, tree, &effect_style, &child_style,
    +
    785 retrohtr_node( tree, child_iter_idx )->tag );
    +
    786
    +
    787 /* Skip ABSOLUTE nodes. */
    +
    788 if( MCSS_POSITION_ABSOLUTE == child_style.POSITION ) {
    +
    789 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    790 continue;
    +
    791 }
    +
    792
    +
    793 if( MCSS_DISPLAY_BLOCK == child_style.DISPLAY ) {
    +
    794 /* Reset the line width counter for coming BLOCK node. */
    +
    795 this_line_w = 0;
    +
    796
    +
    797 if(
    +
    798 retrohtr_node( tree, child_iter_idx )->w >
    +
    799 retrohtr_node( tree, node_idx )->w
    +
    800 ) {
    +
    801 /* This BLOCK node is the longest yet! */
    +
    802 retrohtr_node( tree, node_idx )->w =
    +
    803 retrohtr_node( tree, child_iter_idx )->w;
    +
    804 }
    +
    805 } else {
    +
    806 /* Add inline node to this node line's width. */
    +
    807 this_line_w += retrohtr_node( tree, child_iter_idx )->w;
    +
    808
    +
    809 if( this_line_w > retrohtr_node( tree, node_idx )->w ) {
    +
    810 /* The line of nodes we've been adding up is the longest yet! */
    +
    811 retrohtr_node( tree, node_idx )->w = this_line_w;
    +
    812 }
    +
    813 }
    +
    814 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    815 }
    +
    816 }
    +
    817
    +
    818 /* If our height is still zero, then size based on children. */
    +
    819 if( 0 == retrohtr_node( tree, node_idx )->h ) {
    +
    820 /* Cycle through children and add heights. */
    +
    821 child_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    822 while( 0 <= child_iter_idx ) {
    + +
    824 parser, tree, &effect_style, &child_style,
    +
    825 retrohtr_node( tree, child_iter_idx )->tag );
    +
    826
    +
    827 /* Skip ABSOLUTE nodes. */
    +
    828 if( MCSS_POSITION_ABSOLUTE == child_style.POSITION ) {
    +
    829 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    830 continue;
    +
    831 }
    +
    832
    +
    833 if( MCSS_DISPLAY_BLOCK == child_style.DISPLAY ) {
    +
    834 /* Add the last line to the running height. */
    +
    835 retrohtr_node( tree, node_idx )->h += this_line_h;
    +
    836
    +
    837 /* Start a new running line height with this BLOCK node. */
    +
    838 this_line_h = retrohtr_node( tree, child_iter_idx )->h;
    +
    839 } else {
    +
    840 /* Make sure this line is at least as tall as this INLINE node. */
    +
    841 if( this_line_h < retrohtr_node( tree, child_iter_idx )->h ) {
    +
    842 this_line_h = retrohtr_node( tree, child_iter_idx )->h;
    +
    843 }
    +
    844 }
    +
    845
    +
    846 child_iter_idx = retrohtr_node( tree, child_iter_idx )->next_sibling;
    +
    847 }
    +
    848
    +
    849 /* Add the last line height the node height. */
    +
    850 retrohtr_node( tree, node_idx )->h += this_line_h;
    +
    851 this_line_h = 0;
    +
    852 }
    +
    853
    +
    854 /* Apply additional modifiers (padding, etc) after children have all been
    +
    855 * calculated.
    +
    856 */
    +
    857
    +
    858 /* Try specific left padding first, then try general padding. */
    +
    859 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_LEFT, AUTO ) ) {
    +
    860 retrohtr_node( tree, node_idx )->w += effect_style.PADDING_LEFT;
    +
    861 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    862 retrohtr_node( tree, node_idx )->w += effect_style.PADDING;
    +
    863 }
    +
    864
    +
    865 /* Try specific right padding first, then try general padding. */
    +
    866 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_RIGHT, AUTO ) ) {
    +
    867 retrohtr_node( tree, node_idx )->w += effect_style.PADDING_RIGHT;
    +
    868 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    869 retrohtr_node( tree, node_idx )->w += effect_style.PADDING;
    +
    870 }
    +
    871
    +
    872 /* Try specific top padding first, then try general padding. */
    +
    873 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_TOP, AUTO ) ) {
    +
    874 retrohtr_node( tree, node_idx )->h += effect_style.PADDING_TOP;
    +
    875 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    876 retrohtr_node( tree, node_idx )->h += effect_style.PADDING;
    +
    877 }
    +
    878
    +
    879 /* Try specific bottom padding first, then try general padding. */
    +
    880 if( mcss_prop_is_active_NOT_flag( effect_style.PADDING_BOTTOM, AUTO ) ) {
    +
    881 retrohtr_node( tree, node_idx )->h += effect_style.PADDING_BOTTOM;
    +
    882 } else if( mcss_prop_is_active_NOT_flag( effect_style.PADDING, AUTO ) ) {
    +
    883 retrohtr_node( tree, node_idx )->h += effect_style.PADDING;
    +
    884 }
    +
    885
    +
    886 debug_printf( RETROHTR_TRACE_LVL,
    +
    887 "setting node " SIZE_T_FMT " dirty...", node_idx );
    +
    888 retrohtr_node( tree, node_idx )->flags |= RETROHTR_NODE_FLAG_DIRTY;
    +
    889
    +
    890cleanup:
    +
    891
    +
    892 /* We're done with the prev_sibling_style for this iter, so prepare it for
    +
    893 * the next called by the parent!
    +
    894 */
    +
    895 if( NULL != prev_sibling_style ) {
    +
    896 maug_mcpy(
    +
    897 prev_sibling_style, &effect_style,
    +
    898 sizeof( struct MCSS_STYLE ) );
    +
    899 }
    +
    900
    +
    901 return retval;
    +
    902}
    +
    903
    +
    904/* TODO: See MCSS_POS_NOTE. */
    +
    906#define retrohtr_break_on_active_pos( iter_idx ) \
    +
    907 if( mcss_prop_is_active( retrohtr_node( tree, iter_idx )->pos ) ) { \
    +
    908 break; \
    +
    909 }
    +
    910
    +
    911static ssize_t retrohtr_find_prev_sibling_in_box_model(
    +
    912 struct RETROHTR_RENDER_TREE* tree,
    +
    913 ssize_t node_idx
    +
    914) {
    +
    915 ssize_t sibling_iter_idx = -1;
    +
    916 ssize_t sibling_found_idx = -1;
    +
    917
    +
    918 if( 0 > retrohtr_node( tree, node_idx )->parent ) {
    +
    919 /* Can't determine sibling! */
    +
    920 goto cleanup;
    +
    921 }
    +
    922
    +
    923 sibling_iter_idx = retrohtr_node_parent( tree, node_idx )->first_child;
    +
    924
    +
    925 if( sibling_iter_idx == node_idx ) {
    +
    926 /* No previous siblings! */
    +
    927 goto cleanup;
    +
    928 }
    +
    929
    +
    930 while( 0 <= sibling_iter_idx && node_idx != sibling_iter_idx ) {
    +
    931 if(
    +
    932 /* TODO: See MCSS_POS_NOTE. This is what we were talking about. */
    +
    933 MCSS_POSITION_ABSOLUTE != retrohtr_node( tree, sibling_iter_idx )->pos
    +
    934 ) {
    +
    935 sibling_found_idx = sibling_iter_idx;
    +
    936 }
    +
    937
    +
    938 /* TODO: Reset on <br />? */
    +
    939
    +
    940 sibling_iter_idx = retrohtr_node( tree, sibling_iter_idx )->next_sibling;
    +
    941 }
    +
    942
    +
    943cleanup:
    +
    944 return sibling_found_idx;
    +
    945}
    +
    946
    +
    947static MERROR_RETVAL retrohtr_mark_edge_child_nodes(
    +
    948 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    949 ssize_t node_parent_idx
    +
    950) {
    +
    951 ssize_t node_sibling_idx = -1;
    +
    952 MERROR_RETVAL retval = MERROR_OK;
    +
    953 struct MCSS_STYLE effect_style;
    +
    954 size_t col_idx = 0; /* How many nodes right (X)? */
    +
    955 size_t row_idx = 0; /* How many nodes down (Y)? */
    +
    956
    +
    957 node_sibling_idx = retrohtr_node( tree, node_parent_idx )->first_child;
    +
    958 while( 0 <= node_sibling_idx ) {
    +
    959 maug_mzero( &effect_style, sizeof( struct MCSS_STYLE ) );
    + +
    961 parser, tree, NULL, &effect_style,
    +
    962 retrohtr_node( tree, node_sibling_idx )->tag );
    +
    963
    +
    964 if( MCSS_POSITION_ABSOLUTE == effect_style.POSITION ) {
    +
    965 /* Absolute nodes are never on the edge. */
    +
    966 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_INSIDE;
    +
    967
    +
    968 } else if( MCSS_DISPLAY_INLINE == effect_style.DISPLAY ) {
    +
    969 /* Inline, or something that follows previous column. */
    +
    970 if( 0 == col_idx ) {
    +
    971 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_LEFT;
    +
    972 }
    +
    973 if( 0 == row_idx ) {
    +
    974 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_TOP;
    +
    975 }
    +
    976 if( 0 < row_idx && 0 < col_idx ) {
    +
    977 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_INSIDE;
    +
    978 }
    +
    979 col_idx++;
    +
    980
    +
    981 } else {
    +
    982 /* Block element will be on the next line, so take that into account
    +
    983 * when deciding the edge below.
    +
    984 */
    +
    985 row_idx++;
    +
    986 col_idx = 0;
    +
    987
    +
    988 /* Block, or something else in a new row. */
    +
    989 if( 0 == row_idx ) {
    +
    990 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_TOP;
    +
    991 }
    +
    992
    +
    993 /* Assume block is always on a new line. */
    +
    994 retrohtr_node( tree, node_sibling_idx )->edge |= RETROHTR_EDGE_LEFT;
    +
    995 }
    +
    996
    +
    997 debug_printf( 1, "marking node " SIZE_T_FMT " (%s) edge: %u",
    +
    998 node_sibling_idx,
    +
    999 gc_mhtml_tag_names[parser->tags[
    +
    1000 retrohtr_node( tree, node_sibling_idx )->tag].base.type],
    +
    1001 retrohtr_node( tree, node_sibling_idx )->edge );
    +
    1002
    +
    1003 node_sibling_idx =
    +
    1004 retrohtr_node( tree, node_sibling_idx )->next_sibling;
    +
    1005 }
    +
    1006
    +
    1007 return retval;
    +
    1008}
    +
    1009
    +
    1010MERROR_RETVAL retrohtr_tree_pos(
    +
    1011 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    1012 struct MCSS_STYLE* prev_sibling_style,
    +
    1013 struct MCSS_STYLE* parent_style, ssize_t node_idx, size_t d
    +
    1014) {
    +
    1015 struct MCSS_STYLE child_prev_sibling_style;
    +
    1016 struct MCSS_STYLE effect_style;
    +
    1017 ssize_t child_iter_idx = -1;
    +
    1018 ssize_t tag_idx = -1;
    +
    1019 ssize_t node_iter_idx = -1;
    +
    1020 ssize_t prev_sibling_idx = -1;
    +
    1021 MERROR_RETVAL retval = MERROR_OK;
    +
    1022 union RETROGUI_CTL* ctl = NULL;
    +
    1023
    +
    1024 if( NULL == retrohtr_node( tree, node_idx ) ) {
    +
    1025 goto cleanup;
    +
    1026 }
    +
    1027
    +
    1028 tag_idx = retrohtr_node( tree, node_idx )->tag;
    +
    1029
    + +
    1031 parser, tree, parent_style, &effect_style, tag_idx );
    +
    1032
    +
    1033 prev_sibling_idx = retrohtr_find_prev_sibling_in_box_model( tree, node_idx );
    +
    1034
    +
    1035 /* x */
    +
    1036
    +
    1037 if( MCSS_POSITION_ABSOLUTE == effect_style.POSITION ) {
    +
    1038 /* This node is positioned absolutely. (Relatively) simple! */
    +
    1039
    +
    1040 if( mcss_prop_is_active_NOT_flag( effect_style.LEFT, AUTO ) ) {
    +
    1041
    +
    1042 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    1043 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    1044 retrohtr_break_on_active_pos( child_iter_idx );
    +
    1045 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    1046 }
    +
    1047
    +
    1048 /* Set X to highest non-explicit ancestor. */
    +
    1049 retrohtr_node( tree, node_idx )->x =
    +
    1050 retrohtr_node( tree, child_iter_idx )->x + effect_style.LEFT;
    +
    1051 }
    +
    1052 if( mcss_prop_is_active_NOT_flag( effect_style.RIGHT, AUTO ) ) {
    +
    1053
    +
    1054 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    1055 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    1056 retrohtr_break_on_active_pos( child_iter_idx );
    +
    1057 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    1058 }
    +
    1059
    +
    1060 /* Set X to highest non-explicit ancestor. */
    +
    1061 retrohtr_node( tree, node_idx )->x =
    +
    1062 retrohtr_node( tree, child_iter_idx )->w -
    +
    1063 retrohtr_node( tree, node_idx )->w -
    +
    1064 effect_style.RIGHT;
    +
    1065 }
    +
    1066
    +
    1067 } else if(
    +
    1068 MCSS_DISPLAY_INLINE == effect_style.DISPLAY &&
    +
    1069 MCSS_DISPLAY_INLINE == prev_sibling_style->DISPLAY &&
    +
    1070 0 <= prev_sibling_idx
    +
    1071 ) {
    +
    1072 /* Place to the right of the previous sibling. */
    +
    1073 retrohtr_node( tree, node_idx )->x =
    +
    1074 retrohtr_node( tree, prev_sibling_idx )->x +
    +
    1075 retrohtr_node( tree, prev_sibling_idx )->w;
    +
    1076
    +
    1077 } else if( 0 <= retrohtr_node( tree, node_idx )->parent ) {
    +
    1078 retrohtr_node( tree, node_idx )->x = retrohtr_node_parent( tree, node_idx )->x;
    +
    1079 }
    +
    1080
    +
    1081 /* y */
    +
    1082
    +
    1083 /* TODO: Add margins of children? */
    +
    1084
    +
    1085 if( MCSS_POSITION_ABSOLUTE == effect_style.POSITION ) {
    +
    1086 /* This node is positioned absolutely. (Relatively) simple! */
    +
    1087
    +
    1088 if( mcss_prop_is_active_NOT_flag( effect_style.TOP, AUTO ) ) {
    +
    1089
    +
    1090 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    1091 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    1092 retrohtr_break_on_active_pos( child_iter_idx );
    +
    1093 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    1094 }
    +
    1095
    +
    1096 /* Set Y to highest non-explicit ancestor. */
    +
    1097 retrohtr_node( tree, node_idx )->y =
    +
    1098 retrohtr_node( tree, child_iter_idx )->y + effect_style.TOP;
    +
    1099 }
    +
    1100 if( mcss_prop_is_active_NOT_flag( effect_style.BOTTOM, AUTO ) ) {
    +
    1101
    +
    1102 child_iter_idx = retrohtr_node( tree, node_idx )->parent;
    +
    1103 while( 0 <= retrohtr_node( tree, child_iter_idx )->parent ) {
    +
    1104 retrohtr_break_on_active_pos( child_iter_idx );
    +
    1105 child_iter_idx = retrohtr_node( tree, child_iter_idx )->parent;
    +
    1106 }
    +
    1107
    +
    1108 /* Set Y to highest non-explicit ancestor. */
    +
    1109 retrohtr_node( tree, node_idx )->y =
    +
    1110 retrohtr_node( tree, child_iter_idx )->h -
    +
    1111 retrohtr_node( tree, node_idx )->h -
    +
    1112 effect_style.BOTTOM;
    +
    1113 }
    +
    1114
    +
    1115 } else if(
    +
    1116 MCSS_DISPLAY_INLINE == effect_style.DISPLAY &&
    +
    1117 MCSS_DISPLAY_INLINE == prev_sibling_style->DISPLAY &&
    +
    1118 0 <= prev_sibling_idx
    +
    1119 ) {
    +
    1120 /* Place to the right of the previous sibling. */
    +
    1121 retrohtr_node( tree, node_idx )->y = retrohtr_node( tree, prev_sibling_idx )->y;
    +
    1122
    +
    1123 } else if( 0 <= prev_sibling_idx ) {
    +
    1124 /* Place below the previous block sibling. */
    +
    1125
    +
    1126 /* TODO: We should probably use the tallest element on the prev sibling's
    +
    1127 * line, but that seems hard...
    +
    1128 */
    +
    1129
    +
    1130 retrohtr_node( tree, node_idx )->y =
    +
    1131 retrohtr_node( tree, prev_sibling_idx )->y +
    +
    1132 retrohtr_node( tree, prev_sibling_idx )->h;
    +
    1133
    +
    1134 } else if( 0 <= retrohtr_node( tree, node_idx )->parent ) {
    +
    1135 /* Position relative to other nodes. */
    +
    1136
    +
    1137 retrohtr_node( tree, node_idx )->y = retrohtr_node_parent( tree, node_idx )->y;
    +
    1138 }
    +
    1139
    +
    1140 /* margin-left, margin-right */
    +
    1141
    +
    1142 if(
    +
    1143 MCSS_POSITION_ABSOLUTE != retrohtr_node( tree, node_idx )->pos &&
    +
    1144 0 <= retrohtr_node( tree, node_idx )->parent &&
    +
    1145 mcss_prop_is_active_flag( effect_style.MARGIN_LEFT, AUTO ) &&
    +
    1146 mcss_prop_is_active_flag( effect_style.MARGIN_RIGHT, AUTO )
    +
    1147 ) {
    +
    1148 /* Center */
    +
    1149 retrohtr_node( tree, node_idx )->x =
    +
    1150 retrohtr_node_parent( tree, node_idx )->x +
    +
    1151 (retrohtr_node_parent( tree, node_idx )->w >> 1) -
    +
    1152 (retrohtr_node( tree, node_idx )->w >> 1);
    +
    1153
    +
    1154 } else if(
    +
    1155 0 <= retrohtr_node( tree, node_idx )->parent &&
    +
    1156 mcss_prop_is_active_flag( effect_style.MARGIN_LEFT, AUTO ) &&
    +
    1157 mcss_prop_is_active_NOT_flag( effect_style.MARGIN_RIGHT, AUTO )
    +
    1158 ) {
    +
    1159 /* Justify right. */
    +
    1160 /* TODO: Subtract padding below, as well. */
    +
    1161 retrohtr_node( tree, node_idx )->x =
    +
    1162 retrohtr_node_parent( tree, node_idx )->w -
    +
    1163 retrohtr_node( tree, node_idx )->w;
    +
    1164
    +
    1165 } else if( mcss_prop_is_active( effect_style.MARGIN_LEFT ) ) {
    +
    1166 /* Justify left. */
    +
    1167 retrohtr_node( tree, node_idx )->x += effect_style.MARGIN_LEFT;
    +
    1168 }
    +
    1169
    +
    1170 /* padding */
    +
    1171
    +
    1172 /* TODO: Padding is still broken. Needs more involved understanding of
    +
    1173 * where elements are in their container.
    +
    1174 */
    +
    1175
    +
    1176 debug_printf( 1, "(d: " SIZE_T_FMT ") node " SIZE_T_FMT " is on edge: %u",
    +
    1177 d, node_idx, retrohtr_node( tree, node_idx )->edge );
    +
    1178
    +
    1179 assert(
    +
    1180 0 == node_idx ||
    +
    1181 RETROHTR_EDGE_UNKNOWN != retrohtr_node( tree, node_idx )->edge );
    +
    1182
    +
    1183 if(
    +
    1184 RETROHTR_EDGE_LEFT ==
    +
    1185 (RETROHTR_EDGE_LEFT & retrohtr_node( tree, node_idx )->edge)
    +
    1186 ) {
    +
    1187 /* Try specific left padding first, then try general padding. */
    +
    1188 if( mcss_prop_is_active_NOT_flag( parent_style->PADDING_LEFT, AUTO ) ) {
    +
    1189 retrohtr_node( tree, node_idx )->x += parent_style->PADDING_LEFT;
    +
    1190 } else if( mcss_prop_is_active_NOT_flag( parent_style->PADDING, AUTO ) ) {
    +
    1191 retrohtr_node( tree, node_idx )->x += parent_style->PADDING;
    +
    1192 }
    +
    1193 }
    +
    1194
    +
    1195 if(
    +
    1196 RETROHTR_EDGE_TOP ==
    +
    1197 (RETROHTR_EDGE_TOP & retrohtr_node( tree, node_idx )->edge) &&
    +
    1198 /* Only apply padding to first node in line. The rest will pick it up. */
    +
    1199 RETROHTR_EDGE_LEFT ==
    +
    1200 (RETROHTR_EDGE_LEFT & retrohtr_node( tree, node_idx )->edge)
    +
    1201 ) {
    +
    1202 /* Try specific top padding first, then try general padding. */
    +
    1203 if( mcss_prop_is_active_NOT_flag( parent_style->PADDING_TOP, AUTO ) ) {
    +
    1204 retrohtr_node( tree, node_idx )->y += parent_style->PADDING_TOP;
    +
    1205 } else if( mcss_prop_is_active_NOT_flag( parent_style->PADDING, AUTO ) ) {
    +
    1206 retrohtr_node( tree, node_idx )->y += parent_style->PADDING;
    +
    1207 }
    +
    1208 }
    +
    1209
    +
    1210 /* color */
    +
    1211
    +
    1212 if( mcss_prop_is_active( effect_style.COLOR ) ) {
    +
    1213 retrohtr_node( tree, node_idx )->fg = effect_style.COLOR;
    +
    1214 }
    +
    1215
    +
    1216 if( mcss_prop_is_active( effect_style.BACKGROUND_COLOR ) ) {
    +
    1217 retrohtr_node( tree, node_idx )->bg = effect_style.BACKGROUND_COLOR;
    +
    1218 }
    +
    1219
    +
    1220 /* Figure out child positions. */
    +
    1221
    +
    1222 retrohtr_mark_edge_child_nodes( parser, tree, node_idx );
    +
    1223
    +
    1224 maug_mzero( &child_prev_sibling_style, sizeof( struct MCSS_STYLE ) );
    +
    1225 node_iter_idx = retrohtr_node( tree, node_idx )->first_child;
    +
    1226 while( 0 <= node_iter_idx ) {
    +
    1227 /* Mark child nodes on the edge so applying padding can be done. */
    +
    1228
    +
    1229 /* Figure out child node positioning. */
    +
    1230 retrohtr_tree_pos(
    +
    1231 parser, tree, &child_prev_sibling_style, &effect_style,
    +
    1232 node_iter_idx, d + 1 );
    +
    1233
    +
    1234 node_iter_idx = retrohtr_node( tree, node_iter_idx )->next_sibling;
    +
    1235 }
    +
    1236
    +
    1237 if( MHTML_TAG_TYPE_INPUT == mhtml_tag( parser, tag_idx )->base.type ) {
    +
    1238 /* Feed the position back to the GUI control created during tree_size. */
    +
    1239 retrogui_lock( &(tree->gui) );
    +
    1240 ctl = retrogui_get_ctl_by_idc( &(tree->gui), node_idx );
    +
    1241 retrogui_pos_ctl( &(tree->gui), ctl,
    +
    1242 retrohtr_node_screen_x( tree, node_idx ),
    +
    1243 retrohtr_node_screen_y( tree, node_idx ),
    +
    1244 retrohtr_node( tree, node_idx )->w,
    +
    1245 retrohtr_node( tree, node_idx )->h );
    +
    1246 retrogui_unlock( &(tree->gui) );
    +
    1247 }
    +
    1248
    +
    1249 debug_printf( RETROHTR_TRACE_LVL,
    +
    1250 "setting node " SIZE_T_FMT " dirty...", node_idx );
    +
    1251 retrohtr_node( tree, node_idx )->flags |= RETROHTR_NODE_FLAG_DIRTY;
    +
    1252
    +
    1253cleanup:
    +
    1254
    +
    1255 /* We're done with the prev_sibling_style for this iter, so prepare it for
    +
    1256 * the next called by the parent!
    +
    1257 */
    +
    1258 if( NULL != prev_sibling_style ) {
    +
    1259 maug_mcpy(
    +
    1260 prev_sibling_style, &effect_style,
    +
    1261 sizeof( struct MCSS_STYLE ) );
    +
    1262 }
    +
    1263
    +
    1264 return retval;
    +
    1265}
    +
    1266
    +
    1267void retrohtr_tree_draw(
    +
    1268 struct MHTML_PARSER* parser, struct RETROHTR_RENDER_TREE* tree,
    +
    1269 ssize_t node_idx, size_t d
    +
    1270) {
    +
    1271 char* tag_content = NULL;
    +
    1272 union MHTML_TAG* tag = NULL;
    +
    1273 struct RETROHTR_RENDER_NODE* node = NULL;
    +
    1274 MERROR_RETVAL retval = MERROR_OK;
    +
    1275
    +
    1276 node = retrohtr_node( tree, node_idx );
    +
    1277
    +
    1278 if( NULL == node ) {
    +
    1279 return;
    +
    1280 }
    +
    1281
    +
    1282 /* TODO: Multi-pass, draw absolute pos afterwards. */
    +
    1283
    +
    1284 if( 0 > node->tag ) {
    +
    1285 goto cleanup;
    +
    1286 }
    +
    1287
    +
    1288 if( RETROHTR_NODE_FLAG_DIRTY != (RETROHTR_NODE_FLAG_DIRTY & node->flags) ) {
    +
    1289 goto cleanup;
    +
    1290 }
    +
    1291
    +
    1292 /* Perform drawing. */
    +
    1293 tag = mhtml_tag( parser, node->tag );
    +
    1294
    +
    1295 if( MHTML_TAG_TYPE_TEXT == tag->base.type ) {
    +
    1296 maug_mlock( tag->TEXT.content, tag_content );
    +
    1297 if( NULL == tag_content ) {
    +
    1298 error_printf( "could not lock tag content!" );
    +
    1299 return;
    +
    1300 }
    +
    1301
    +
    1302#ifdef RETROGXC_PRESENT
    +
    1303 maug_cleanup_if_lt(
    +
    1304 node->font_idx, (ssize_t)0, SSIZE_T_FMT, MERROR_GUI );
    +
    1305
    +
    1306 retrogxc_string(
    +
    1307 NULL, node->fg, tag_content, 0, node->font_idx,
    +
    1308 retrohtr_node_screen_x( tree, node_idx ),
    +
    1309 retrohtr_node_screen_y( tree, node_idx ),
    +
    1310 node->w, node->h, 0 );
    +
    1311#else
    +
    1312 maug_cleanup_if_not_null( MAUG_MHANDLE, node->font_h, MERROR_GUI );
    +
    1313
    +
    1314 retrofont_string(
    +
    1315 NULL, node->fg, tag_content, 0, node->font_h,
    +
    1316 retrohtr_node_screen_x( tree, node_idx ),
    +
    1317 retrohtr_node_screen_y( tree, node_idx ),
    +
    1318 node->w, node->h, 0 );
    +
    1319#endif /* RETROGXC_PRESENT */
    +
    1320
    +
    1321 maug_munlock( tag->TEXT.content, tag_content );
    +
    1322
    +
    1323 } else if( MHTML_TAG_TYPE_BODY == tag->base.type ) {
    +
    1324
    +
    1325 debug_printf(
    +
    1326 RETROHTR_TRACE_LVL, "drawing BODY node " SIZE_T_FMT "...", node_idx );
    +
    1327
    +
    1328 /* Draw body BG. */
    +
    1329 if( RETROFLAT_COLOR_NULL != node->bg ) {
    + +
    1331 NULL, node->bg,
    +
    1332 retrohtr_node_screen_x( tree, node_idx ),
    +
    1333 retrohtr_node_screen_y( tree, node_idx ),
    +
    1334 retrohtr_node( tree, node_idx )->w,
    +
    1335 retrohtr_node( tree, node_idx )->h,
    + +
    1337 }
    +
    1338
    +
    1339 } else if( MHTML_TAG_TYPE_IMG == tag->base.type ) {
    +
    1340 /* Blit the image. */
    +
    1341
    +
    1342 if( !retroflat_bitmap_ok( &(retrohtr_node( tree, node_idx )->bitmap) ) ) {
    +
    1343 goto cleanup;
    +
    1344 }
    +
    1345
    +
    1346 debug_printf(
    +
    1347 RETROHTR_TRACE_LVL, "drawing IMG node " SIZE_T_FMT "...", node_idx );
    +
    1348
    + +
    1350 NULL, &(retrohtr_node( tree, node_idx )->bitmap),
    +
    1351 0, 0,
    +
    1352 retrohtr_node_screen_x( tree, node_idx ),
    +
    1353 retrohtr_node_screen_y( tree, node_idx ),
    +
    1354 retroflat_bitmap_w( &(retrohtr_node( tree, node_idx )->bitmap) ),
    +
    1355 retroflat_bitmap_h( &(retrohtr_node( tree, node_idx )->bitmap) )
    +
    1356 /* retrohtr_node( tree, node_idx )->w,
    +
    1357 retrohtr_node( tree, node_idx )->h */ );
    +
    1358
    +
    1359 } else if( MHTML_TAG_TYPE_INPUT == tag->base.type ) {
    +
    1360
    +
    1361 debug_printf(
    +
    1362 RETROHTR_TRACE_LVL, "setting tree GUI dirty..." );
    +
    1363
    +
    1364 tree->gui.flags |= RETROGUI_FLAGS_DIRTY;
    +
    1365
    +
    1366 } else {
    +
    1367 if( RETROFLAT_COLOR_NULL == node->bg ) {
    +
    1368 goto cleanup;
    +
    1369 }
    +
    1370
    +
    1371 debug_printf(
    +
    1372 RETROHTR_TRACE_LVL, "drawing %s node " SIZE_T_FMT "...",
    +
    1373 gc_mhtml_tag_names[parser->tags[
    +
    1374 retrohtr_node( tree, node_idx )->tag].base.type],
    +
    1375 node_idx );
    +
    1376
    + +
    1378 NULL, node->bg,
    +
    1379 retrohtr_node_screen_x( tree, node_idx ),
    +
    1380 retrohtr_node_screen_y( tree, node_idx ),
    +
    1381 node->w, node->h,
    + +
    1383 }
    +
    1384
    +
    1385 node->flags &= ~RETROHTR_NODE_FLAG_DIRTY;
    +
    1386
    +
    1387cleanup:
    +
    1388
    +
    1389 if( retrogui_is_locked( &(tree->gui) ) ) {
    +
    1390 retrogui_unlock( &(tree->gui) );
    +
    1391 }
    +
    1392
    +
    1393 if( MERROR_OK != retval ) {
    +
    1394 error_printf( "failed drawing node: " SIZE_T_FMT, node_idx );
    +
    1395 }
    +
    1396
    +
    1397 /* Keep trying to render children, tho. */
    +
    1398
    +
    1399 retrohtr_tree_draw( parser, tree, node->first_child, d + 1 );
    +
    1400
    +
    1401 retrohtr_tree_draw( parser, tree, node->next_sibling, d );
    +
    1402
    +
    1403 /* If this is the root redraw call, redraw GUI elements. */
    +
    1404 if(
    +
    1405 0 == d &&
    +
    1406 RETROHTR_TREE_FLAG_GUI_ACTIVE ==
    +
    1407 (tree->flags & RETROHTR_TREE_FLAG_GUI_ACTIVE)
    +
    1408 ) {
    +
    1409 retrogui_lock( &(tree->gui) );
    +
    1410 retrogui_redraw_ctls( &(tree->gui) );
    +
    1411 retrogui_unlock( &(tree->gui) );
    +
    1412 }
    +
    1413}
    +
    1414
    +
    1415RETROGUI_IDC retrohtr_tree_poll_ctls(
    +
    1416 struct RETROHTR_RENDER_TREE* tree,
    +
    1417 RETROFLAT_IN_KEY* input,
    +
    1418 struct RETROFLAT_INPUT* input_evt
    +
    1419) {
    +
    1420 RETROGUI_IDC idc = 0;
    +
    1421 MERROR_RETVAL retval = MERROR_OK;
    +
    1422
    +
    1423 assert( retrohtr_tree_is_locked( tree ) );
    +
    1424
    +
    1425 if(
    +
    1426 RETROHTR_TREE_FLAG_GUI_ACTIVE !=
    +
    1427 (RETROHTR_TREE_FLAG_GUI_ACTIVE & tree->flags)
    +
    1428 ) {
    +
    1429 /* No GUI, so exit without even unlocking. */
    +
    1430 return 0;
    +
    1431 }
    +
    1432
    +
    1433 retrogui_lock( &(tree->gui) );
    +
    1434
    +
    1435 idc = retrogui_poll_ctls( &(tree->gui), input, input_evt );
    +
    1436
    +
    1437 if( 0 < idc ) {
    +
    1438 debug_printf(
    +
    1439 RETROHTR_TRACE_LVL, "setting node " SIZE_T_FMT " dirty...", idc );
    +
    1440 retrohtr_node( tree, idc )->flags |= RETROHTR_NODE_FLAG_DIRTY;
    +
    1441 }
    +
    1442
    +
    1443cleanup:
    +
    1444
    +
    1445 if( retrogui_is_locked( &(tree->gui) ) ) {
    +
    1446 retrogui_unlock( &(tree->gui) );
    +
    1447 }
    +
    1448
    +
    1449 if( MERROR_OK != retval ) {
    +
    1450 idc = 0;
    +
    1451 }
    +
    1452
    +
    1453 return idc;
    +
    1454}
    +
    1455
    +
    1456void retrohtr_tree_dump(
    +
    1457 struct RETROHTR_RENDER_TREE* tree, struct MHTML_PARSER* parser,
    +
    1458 ssize_t iter, size_t d
    +
    1459) {
    +
    1460 size_t i = 0;
    +
    1461 char indents[31];
    +
    1462
    +
    1463 if( 0 > iter ) {
    +
    1464 return;
    +
    1465 }
    +
    1466
    +
    1467 /* Generate the indentation. */
    +
    1468 maug_mzero( indents, 30 );
    +
    1469 for( i = 0 ; d > i ; i++ ) {
    +
    1470 if( strlen( indents ) >= 30 ) {
    +
    1471 break;
    +
    1472 }
    +
    1473 strcat( indents, " " );
    +
    1474 }
    +
    1475
    +
    1476 /* Print the debug line. */
    +
    1477 debug_printf(
    +
    1478 1,
    +
    1479 "%s" SSIZE_T_FMT " (tag %s): x: " SSIZE_T_FMT ", y: " SSIZE_T_FMT
    +
    1480 " (" SSIZE_T_FMT " x " SSIZE_T_FMT ")",
    +
    1481 indents, iter,
    +
    1482 0 <= tree->nodes[iter].tag ?
    +
    1483 gc_mhtml_tag_names[parser->tags[tree->nodes[iter].tag].base.type]
    +
    1484 : "ROOT",
    +
    1485 tree->nodes[iter].x, tree->nodes[iter].y,
    +
    1486 tree->nodes[iter].w, tree->nodes[iter].h );
    +
    1487
    +
    1488 retrohtr_tree_dump( tree, parser, tree->nodes[iter].first_child, d + 1 );
    +
    1489
    +
    1490 retrohtr_tree_dump( tree, parser, tree->nodes[iter].next_sibling, d );
    +
    1491}
    +
    1492
    +
    1493void retrohtr_tree_free( struct RETROHTR_RENDER_TREE* tree ) {
    +
    1494
    +
    1495 debug_printf( RETROHTR_TRACE_LVL, "freeing render nodes..." );
    +
    1496
    +
    1497 /* TODO: Free bitmaps from img! */
    +
    1498
    +
    1499 /* TODO: Free node->font_h! */
    +
    1500
    +
    1501 /* Free GUI if present. */
    +
    1502 if(
    +
    1503 RETROHTR_TREE_FLAG_GUI_ACTIVE ==
    +
    1504 (tree->flags & RETROHTR_TREE_FLAG_GUI_ACTIVE)
    +
    1505 ) {
    +
    1506 retrogui_free( &(tree->gui) );
    +
    1507 }
    +
    1508
    +
    1509 /* Unlock nodes before trying to free them. */
    +
    1510 retrohtr_tree_unlock( tree );
    +
    1511
    +
    1512 if( NULL != tree->nodes_h ) {
    +
    1513 maug_mfree( tree->nodes_h );
    +
    1514 }
    +
    1515}
    +
    1516
    +
    1517MERROR_RETVAL retrohtr_tree_init( struct RETROHTR_RENDER_TREE* tree ) {
    +
    1518 MERROR_RETVAL retval = MERROR_OK;
    +
    1519
    +
    1520 maug_mzero( tree, sizeof( struct RETROHTR_RENDER_TREE ) );
    +
    1521
    +
    1522 /* Perform initial node allocation. */
    +
    1523 tree->nodes_sz_max = MHTML_PARSER_TAGS_INIT_SZ;
    +
    1524 debug_printf( RETROHTR_TRACE_LVL,
    +
    1525 "allocating " SIZE_T_FMT " nodes...", tree->nodes_sz_max );
    +
    1526 tree->nodes_h = maug_malloc(
    +
    1527 tree->nodes_sz_max, sizeof( struct RETROHTR_RENDER_NODE ) );
    +
    1528 maug_cleanup_if_null_alloc( struct RETROHTR_RENDER_NODE*, tree->nodes_h );
    +
    1529
    +
    1530 /* XXX
    +
    1531 r.w_max = retroflat_screen_w();
    +
    1532 r.h_max = retroflat_screen_h(); */
    +
    1533
    +
    1534cleanup:
    +
    1535
    +
    1536 return retval;
    +
    1537}
    +
    1538
    +
    1539#endif /* RETROHTR_C */
    +
    1540
    +
    1541#endif /* !RETROHTR_H */
    +
    1542
    +
    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:1962
    +
    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:381
    +
    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:362
    +
    #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:86
    +
    size_t nodes_sz_max
    Current alloc'd number of nodes in RETROHTR_RENDER_NODE::nodes_h.
    Definition retrohtr.h:67
    +
    ssize_t parent
    Index of container's render node in RETROHTR_RENDER_TREE.
    Definition retrohtr.h:51
    +
    ssize_t first_child
    Index of first child's render node in RETROHTR_RENDER_TREE.
    Definition retrohtr.h:53
    +
    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:55
    +
    size_t nodes_sz
    Current active number of nodes in RETROHTR_RENDER_NODE::nodes_h.
    Definition retrohtr.h:65
    +
    struct RETROHTR_RENDER_NODE * nodes
    Locked pointer to nodes when locked with retrohtr_tree_lock().
    Definition retrohtr.h:63
    +
    Definition mhtml.h:148
    +
    Platform-specific bitmap structure. retroflat_bitmap_ok() can be used on a pointer to it to determine...
    Definition retroflt.h:1953
    +
    Struct passed to retroflat_poll_input() to hold return data.
    Definition retroflt.h:818
    +
    Definition retrogui.h:158
    +
    Definition retrohtr.h:28
    +
    Definition retrohtr.h:59
    +
    Definition mhtml.h:143
    +
    Definition retrogui.h:149
    +
    + + +
    + + diff --git a/retrosft_8h_source.html b/retrosft_8h_source.html new file mode 100644 index 00000000..a78fe145 --- /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:362
    +
    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:1970
    +
    #define retroflat_screen_w()
    Get the current screen width in pixels.
    Definition retroflt.h:1967
    +
    #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:1953
    +
    uint8_t flags
    Platform-specific bitmap flags.
    Definition retroflt.h:1957
    +
    struct RETROFLAT_BITMAP buffer
    Off-screen buffer bitmap.
    Definition retroflt.h:2143
    +
    RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ]
    Index of available colors, initialized on platform init.
    Definition retroflt.h:2141
    +
    + + +
    + + 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..16798de2 --- /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:460
    +
    #define retroflat_quit(retval_in)
    This should be called in order to quit a program using RetroFlat.
    Definition retroflt.h:1979
    +
    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:53
    +
    Struct containing configuration values for a RetroFlat program.
    Definition retroflt.h:2095
    +
    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..f74b0bd0 --- /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 buffer.read_int( &buffer, (uint8_t*)&c, 1, 0 );
    +
    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:682
    +
    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:53
    +
    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..191468d3 --- /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__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..46b38c49 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,7 @@ +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']]] +]; 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..ae61bdf7 --- /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__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..331716e6 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,13 @@ +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_5fpath_6',['config_path',['../structRETROFLAT__ARGS.html#a1364997cebaa4deb17008e4d9a5d0627',1,'RETROFLAT_ARGS']]], + ['console_20api_7',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['controls_8',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['custom_20property_20types_9',['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..73a54b3f --- /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__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..c0f280bf --- /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#gac13df68934cfc9433fbbc057802eefec',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..e232caee --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,171 @@ +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_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_20project_20makefiles_19',['RetroFlat Project Makefiles',['../group__maug__retroflt__compiling.html',1,'']]], + ['retroflat_20vdp_20api_20',['RetroFlat VDP API',['../group__maug__retroflt__vdp.html',1,'']]], + ['retroflat_5fargs_21',['RETROFLAT_ARGS',['../structRETROFLAT__ARGS.html',1,'']]], + ['retroflat_5fasset_5fpath_22',['retroflat_asset_path',['../group__maug__retroflt__assets.html#gab661d4bb88b3a50ac5a3f729d3c0afe0',1,'retroflt.h']]], + ['retroflat_5fassets_5fpath_5fmax_23',['RETROFLAT_ASSETS_PATH_MAX',['../group__maug__retroflt__compiling.html#ga96145c651f78202c11af0d0a46e7e0d3',1,'retroflt.h']]], + ['retroflat_5fbitmap_24',['RETROFLAT_BITMAP',['../structRETROFLAT__BITMAP.html',1,'']]], + ['retroflat_5fbitmap_5fext_25',['RETROFLAT_BITMAP_EXT',['../group__maug__retroflt__bitmap.html#ga01ab983271322476f577e166c9e2ef23',1,'retroflt.h']]], + ['retroflat_5fbitmap_5fok_26',['retroflat_bitmap_ok',['../group__maug__retroflt__bitmap.html#gac186ac5bd220b956357a037e981d2afc',1,'retroflt.h']]], + ['retroflat_5fblit_5fbitmap_27',['retroflat_blit_bitmap',['../group__maug__retroflt__bitmap.html#ga30f6d28030b3437f85a22b0bd7e04669',1,'retroflt.h']]], + ['retroflat_5fbuffer_5fbksp_28',['retroflat_buffer_bksp',['../group__maug__retroflt__input.html#ga846438a73de18eec54ef2e7f8a69f771',1,'retroflt.h']]], + ['retroflat_5fbuffer_5finsert_29',['retroflat_buffer_insert',['../group__maug__retroflt__input.html#ga5a2fcfef94c1074d7402a0862d836e08',1,'retroflt.h']]], + ['retroflat_5fcache_5fasset_30',['RETROFLAT_CACHE_ASSET',['../structRETROFLAT__CACHE__ASSET.html',1,'']]], + ['retroflat_5fcmp_5fasset_5fpath_31',['retroflat_cmp_asset_path',['../group__maug__retroflt__assets.html#ga64e8b195c12c64e3b58550951c296808',1,'retroflt.h']]], + ['retroflat_5fcolor_32',['RETROFLAT_COLOR',['../group__maug__retroflt__color.html#ga64674353770a68f722cb4d5fc90db90d',1,'retroflt.h']]], + ['retroflat_5fcolor_5ftable_33',['RETROFLAT_COLOR_TABLE',['../group__maug__retroflt__color.html#gab6f9cfee4957a67690073b10cbeaf032',1,'retroflt.h']]], + ['retroflat_5fdestroy_5fbitmap_34',['retroflat_destroy_bitmap',['../group__maug__retroflt__bitmap.html#gaa52e04cfe54ba6ea1985c8dfc2dccbbe',1,'retroflt.h']]], + ['retroflat_5fdraw_5flock_35',['retroflat_draw_lock',['../group__maug__retroflt__drawing.html#ga78766b119670a0ceb6fd84ec6c4cb52d',1,'retroflt.h']]], + ['retroflat_5fellipse_36',['retroflat_ellipse',['../group__maug__retroflt__drawing.html#ga17237a3b9c734c7fe023a3813d687947',1,'retroflt.h']]], + ['retroflat_5ferror_5fbitmap_37',['RETROFLAT_ERROR_BITMAP',['../group__maug__retroflt__retval.html#gaa1bde95ee44dcf6883dc70b9e8e52088',1,'retroflt.h']]], + ['retroflat_5fflags_38',['retroflat_flags',['../structRETROFLAT__STATE.html#a3bd7778cbc80a7807ce47767d0d52289',1,'RETROFLAT_STATE']]], + ['retroflat_5fflags_5fall_5fcaps_39',['RETROFLAT_FLAGS_ALL_CAPS',['../group__maug__retroflt__drawing.html#gaff8825f09c5e2b17c10e0c15c5c0d0c1',1,'retroflt.h']]], + ['retroflat_5fflags_5ffill_40',['RETROFLAT_FLAGS_FILL',['../group__maug__retroflt__drawing.html#gad545331d61095df978213f1285ec1d64',1,'retroflt.h']]], + ['retroflat_5fflags_5fkey_5frepeat_41',['RETROFLAT_FLAGS_KEY_REPEAT',['../group__maug__retroflt__flags.html#gafc12f18f1e586526fe6608fb3e292ef8',1,'retroflt.h']]], + ['retroflat_5fflags_5fliteral_5fpath_42',['RETROFLAT_FLAGS_LITERAL_PATH',['../group__maug__retroflt__drawing.html#ga0a8d5557c6ab08140541029000e76143',1,'retroflt.h']]], + ['retroflat_5fflags_5fopaque_43',['RETROFLAT_FLAGS_OPAQUE',['../group__maug__retroflt__drawing.html#ga35e38063df298bfa2552f58b580b027f',1,'retroflt.h']]], + ['retroflat_5fflags_5foutline_44',['RETROFLAT_FLAGS_OUTLINE',['../group__maug__retroflt__drawing.html#gab2873bd65e121dedda45a6774a33906d',1,'retroflt.h']]], + ['retroflat_5fflags_5frunning_45',['RETROFLAT_FLAGS_RUNNING',['../group__maug__retroflt__flags.html#gad0ea2a78b6a6fda15cfe101005e5ff2e',1,'retroflt.h']]], + ['retroflat_5fflags_5fscale2x_46',['RETROFLAT_FLAGS_SCALE2X',['../group__maug__retroflt__flags.html#ga5bc38a5f63b02f085c6981e8dca63a61',1,'retroflt.h']]], + ['retroflat_5fflags_5fscreen_5fbuffer_47',['RETROFLAT_FLAGS_SCREEN_BUFFER',['../group__maug__retroflt__drawing.html#gadef5b619c4f3c9a99c665e74cb86f43b',1,'retroflt.h']]], + ['retroflat_5fflags_5fscreensaver_48',['RETROFLAT_FLAGS_SCREENSAVER',['../group__maug__retroflt__flags.html#ga0317bb9f6c90b276f909678caef9aeeb',1,'retroflt.h']]], + ['retroflat_5fflags_5funlock_5ffps_49',['RETROFLAT_FLAGS_UNLOCK_FPS',['../group__maug__retroflt__flags.html#ga3de3558eb684a4168f6bb313d1b05375',1,'retroflt.h']]], + ['retroflat_5ffps_50',['RETROFLAT_FPS',['../group__maug__retroflt__compiling.html#ga8b2233a41d03a2444621a8b8788c6c16',1,'retroflt.h']]], + ['retroflat_5finit_51',['retroflat_init',['../group__maug__retroflt.html#gac5511e72055cff916e5f494f8d6fd5f5',1,'retroflt.h']]], + ['retroflat_5finput_52',['RETROFLAT_INPUT',['../structRETROFLAT__INPUT.html',1,'']]], + ['retroflat_5fline_53',['retroflat_line',['../group__maug__retroflt__drawing.html#gaff3354123bc01e143245dbd949597493',1,'retroflt.h']]], + ['retroflat_5fline_5fthickness_54',['RETROFLAT_LINE_THICKNESS',['../group__maug__retroflt__drawing.html#ga109f1a69c0cd8f4ce8f5ba5cca10b80d',1,'retroflt.h']]], + ['retroflat_5fload_5fbitmap_55',['retroflat_load_bitmap',['../group__maug__retroflt__bitmap.html#gab1cb406967afc4fbd36454a1ba481b9f',1,'retroflt.h']]], + ['retroflat_5floop_56',['retroflat_loop',['../group__maug__retroflt.html#gaa796a8098764c38861bec1f0aec2da77',1,'retroflt.h']]], + ['retroflat_5floop_5fiter_57',['retroflat_loop_iter',['../group__maug__retroflt.html#ga7f16b39955b5f77e5535e2198e9e0faa',1,'retroflt.h']]], + ['retroflat_5fmessage_58',['retroflat_message',['../group__maug__retroflt.html#gab2d5a69aa8e2f401b8d38b62dc11c674',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5ferror_59',['RETROFLAT_MSG_FLAG_ERROR',['../group__maug__retroflt__msg__api.html#gacd4b5c7d3be34b2ee30a1158af5bdc94',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5finfo_60',['RETROFLAT_MSG_FLAG_INFO',['../group__maug__retroflt__msg__api.html#gac5610ae1cf0ec3c7817349d51cb3c780',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5ftype_5fmask_61',['RETROFLAT_MSG_FLAG_TYPE_MASK',['../group__maug__retroflt__msg__api.html#ga8ab8ffa1d6e1ddaef12f8bcf92dc522f',1,'retroflt.h']]], + ['retroflat_5fmsg_5fflag_5fwarning_62',['RETROFLAT_MSG_FLAG_WARNING',['../group__maug__retroflt__msg__api.html#ga77ca553e9750bea8b5b77f4b73c868d0',1,'retroflt.h']]], + ['retroflat_5fmsg_5fmax_63',['RETROFLAT_MSG_MAX',['../group__maug__retroflt__compiling.html#ga772947dbdd87d20dff6043e6d4007dea',1,'retroflt.h']]], + ['retroflat_5fok_64',['RETROFLAT_OK',['../group__maug__retroflt__retval.html#ga55abadeca55977b642ab9010e4e6fc76',1,'retroflt.h']]], + ['retroflat_5fpath_5fmax_65',['RETROFLAT_PATH_MAX',['../group__maug__retroflt__compiling.html#gad072a3180e7d50481e2f39babb9077b4',1,'retroflt.h']]], + ['retroflat_5fpath_5fsep_66',['RETROFLAT_PATH_SEP',['../group__maug__retroflt__compiling.html#gafc62d3bd105fa19582ade03d97dc606a',1,'retroflt.h']]], + ['retroflat_5fpoll_5finput_67',['retroflat_poll_input',['../group__maug__retroflt__input.html#gaf8c19bfe4b8e31b84e71ffb6d00de561',1,'retroflt.h']]], + ['retroflat_5fquit_68',['retroflat_quit',['../group__maug__retroflt.html#ga4e588e9b7626bb8ae7e3ce50e6f6ff94',1,'retroflt.h']]], + ['retroflat_5frect_69',['retroflat_rect',['../group__maug__retroflt__drawing.html#ga7f4e8bd5781843624e1b5639724b598d',1,'retroflt.h']]], + ['retroflat_5fscreen_5fbuffer_70',['retroflat_screen_buffer',['../group__maug__retroflt.html#ga5b8ae4b55653cffa196778a9e467ff71',1,'retroflt.h']]], + ['retroflat_5fscreen_5fh_71',['retroflat_screen_h',['../group__maug__retroflt.html#ga2570fa6b56eb033b40e51f9dd7c522cc',1,'retroflt.h']]], + ['retroflat_5fscreen_5fw_72',['retroflat_screen_w',['../group__maug__retroflt.html#gabc0ba97788cdb8fd3d1a651776fad028',1,'retroflt.h']]], + ['retroflat_5fshutdown_73',['retroflat_shutdown',['../group__maug__retroflt.html#ga1f9b2b82622f45623739891838904c24',1,'retroflt.h']]], + ['retroflat_5fstate_74',['RETROFLAT_STATE',['../structRETROFLAT__STATE.html',1,'']]], + ['retroflat_5fstring_75',['retroflat_string',['../group__maug__retroflt__drawing.html#gaeb607b42158ab8cae02230ca472da297',1,'retroflt.h']]], + ['retroflat_5fstring_5fsz_76',['retroflat_string_sz',['../group__maug__retroflt__drawing.html#ga7edf53d278ef709ca5d3ec3e054070e8',1,'retroflt.h']]], + ['retroflat_5ftxp_5fb_77',['RETROFLAT_TXP_B',['../group__maug__retroflt__bitmap.html#gab5d43506739bd0b166fc32358d39e359',1,'retroflt.h']]], + ['retroflat_5ftxp_5fg_78',['RETROFLAT_TXP_G',['../group__maug__retroflt__bitmap.html#ga0a14b581204c9b3f6a06bcba588d6727',1,'retroflt.h']]], + ['retroflat_5ftxp_5fr_79',['RETROFLAT_TXP_R',['../group__maug__retroflt__bitmap.html#gaeb61b7d84a676502e1758bffc92b8a9e',1,'retroflt.h']]], + ['retroflat_5fvdp_5fargs_5fsz_5fmax_80',['RETROFLAT_VDP_ARGS_SZ_MAX',['../group__maug__retroflt__compiling.html#ga6930d8c4d64485eefcdf16130d1302b9',1,'retroflt.h']]], + ['retroflat_5fvdp_5fcall_81',['retroflat_vdp_call',['../group__maug__retroflt__vdp.html#ga686ecce68daf9fd1d2c32656243f6c8d',1,'retroflt.h']]], + ['retroflat_5fvdp_5fflag_5fpxlock_82',['RETROFLAT_VDP_FLAG_PXLOCK',['../group__maug__retroflt__vdp.html#gaf6ed7032fdee9a785610b6c0419d75da',1,'retroflt.h']]], + ['retroflat_5fvdp_5fproc_5ft_83',['retroflat_vdp_proc_t',['../group__maug__retroflt__vdp.html#gac542ec7b64f30a2d19bdbbbc7ef0aaa3',1,'retroflt.h']]], + ['retroflat_5fwin_5fframe_5ftimer_5fid_84',['RETROFLAT_WIN_FRAME_TIMER_ID',['../group__maug__retroflt__compiling.html#ga61c99e23e27fa7a1d3edbe8b5b4cffde',1,'retroflt.h']]], + ['retroflat_5fwin_5floop_5ftimer_5fid_85',['RETROFLAT_WIN_LOOP_TIMER_ID',['../group__maug__retroflt__compiling.html#ga4350389f2ddf28fbd89214a8370b1602',1,'retroflt.h']]], + ['retroflat_5fwindow_5fclass_86',['RETROFLAT_WINDOW_CLASS',['../group__maug__retroflt__compiling.html#ga784d1bd93d86f7dde45c07aa3067584c',1,'retroflt.h']]], + ['retroflt_2eh_87',['retroflt.h',['../retroflt_8h.html',1,'']]], + ['retrofnt_2eh_88',['retrofnt.h',['../retrofnt_8h.html',1,'']]], + ['retrofont_89',['RETROFONT',['../structRETROFONT.html',1,'']]], + ['retrofont_20api_90',['RetroFont API',['../group__retrofont.html',1,'']]], + ['retrofont_5fglyph_5fat_91',['retrofont_glyph_at',['../group__retrofont.html#gabbd2687ed303061f65fb4ad1391408dd',1,'retrofnt.h']]], + ['retrofp_2eh_92',['retrofp.h',['../retrofp_8h.html',1,'']]], + ['retrofp_5flut_93',['retrofp_lut',['../group__maug__retrofp.html#gaf466c8888ec2d28795ed52221ca2b811',1,'retrofp.h']]], + ['retrofp_5fpi_94',['RETROFP_PI',['../group__maug__retrofp.html#ga8c4600c661c79d7f31e5375ce606c51c',1,'retrofp.h']]], + ['retroglu_20api_95',['RetroGLU API',['../group__maug__retroglu.html',1,'']]], + ['retroglu_20obj_20parser_96',['RetroGLU OBJ Parser',['../group__maug__retroglu__obj__fsm.html',1,'']]], + ['retroglu_20obj_20parser_20states_97',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['retroglu_20overlay_20api_98',['RetroGLU Overlay API',['../group__maug__retroglu__overlay.html',1,'']]], + ['retroglu_20sprites_99',['RetroGLU Sprites',['../group__maug__retroglu__sprite.html',1,'']]], + ['retroglu_2eh_100',['retroglu.h',['../retroglu_8h.html',1,'']]], + ['retroglu_5fdraw_5fsprite_101',['retroglu_draw_sprite',['../group__maug__retroglu.html#gaa7f8818844f102a07c3606c9fbdc8702',1,'retroglu.h']]], + ['retroglu_5fface_102',['RETROGLU_FACE',['../structRETROGLU__FACE.html',1,'']]], + ['retroglu_5finit_5fsprite_5fvertices_103',['retroglu_init_sprite_vertices',['../group__maug__retroglu.html#gaa9a7b68018140cc307db23ba5c224ba0',1,'retroglu.h']]], + ['retroglu_5fjitrender_5fsprite_104',['retroglu_jitrender_sprite',['../group__maug__retroglu.html#gad0dbc4a89753c37cdfb03b7b3ff79e10',1,'retroglu.h']]], + ['retroglu_5fmaterial_105',['RETROGLU_MATERIAL',['../structRETROGLU__MATERIAL.html',1,'']]], + ['retroglu_5fmtl_5fcb_106',['retroglu_mtl_cb',['../group__maug__retroglu__obj__fsm.html#gac3fbadc0d5212c1d69830e5a387875cd',1,'retroglu.h']]], + ['retroglu_5fobj_107',['RETROGLU_OBJ',['../structRETROGLU__OBJ.html',1,'']]], + ['retroglu_5fobj_5ftokens_108',['RETROGLU_OBJ_TOKENS',['../group__maug__retroglu__obj__fsm.html#gae2b6f15fcc47afe2ee485f1d95911a6c',1,'retroglu.h']]], + ['retroglu_5fparse_5finit_109',['retroglu_parse_init',['../group__maug__retroglu__obj__fsm.html#ga1eea89882f6c548411ddbbfa11187d27',1,'RETROGLU_PARSER']]], + ['retroglu_5fparse_5fobj_5fc_110',['retroglu_parse_obj_c',['../group__maug__retroglu__obj__fsm.html#ga5198ebd5a2c5c8210f6feee3db63cb06',1,'RETROGLU_PARSER']]], + ['retroglu_5fparser_111',['RETROGLU_PARSER',['../structRETROGLU__PARSER.html',1,'']]], + ['retroglu_5fparser_5fstate_112',['retroglu_parser_state',['../group__maug__retroglu__obj__fsm.html#ga3f52a16418ba7581219ca6adf9680794',1,'retroglu.h']]], + ['retroglu_5fpop_5foverlay_113',['retroglu_pop_overlay',['../group__maug__retroglu__overlay.html#gaf613a50fb2d3e71cc9608492616b9a4d',1,'retroglu.h']]], + ['retroglu_5fprerender_5fsprite_114',['retroglu_prerender_sprite',['../group__maug__retroglu.html#ga8729fd6d63620a3dccaa4b199bfdf958',1,'retroglu.h']]], + ['retroglu_5fproj_5fargs_115',['RETROGLU_PROJ_ARGS',['../structRETROGLU__PROJ__ARGS.html',1,'']]], + ['retroglu_5fpush_5foverlay_116',['retroglu_push_overlay',['../group__maug__retroglu__overlay.html#gab3aecc424f6ad71b7d4c36a2c82105e9',1,'retroglu.h']]], + ['retroglu_5fsprite_117',['RETROGLU_SPRITE',['../structRETROGLU__SPRITE.html',1,'']]], + ['retroglu_5fsprite_5fparms_118',['RETROGLU_SPRITE_PARMS',['../structRETROGLU__SPRITE__PARMS.html',1,'']]], + ['retroglu_5ftile_119',['RETROGLU_TILE',['../structRETROGLU__TILE.html',1,'']]], + ['retroglu_5fvertex_120',['RETROGLU_VERTEX',['../structRETROGLU__VERTEX.html',1,'']]], + ['retroglu_5fvtexture_121',['RETROGLU_VTEXTURE',['../structRETROGLU__VTEXTURE.html',1,'']]], + ['retroglu_5fwhf_122',['retroglu_whf',['../group__maug__retroglu__overlay.html#ga9854c331bc40bfff518131f9026c7799',1,'retroglu.h']]], + ['retrogui_123',['RETROGUI',['../structRETROGUI.html',1,'']]], + ['retrogui_20api_124',['RetroGUI API',['../group__maug__retrogui.html',1,'']]], + ['retrogui_20controls_125',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['retrogui_2eh_126',['retrogui.h',['../retrogui_8h.html',1,'']]], + ['retrogui_5fctl_127',['RETROGUI_CTL',['../unionRETROGUI__CTL.html',1,'']]], + ['retrogui_5fctl_5fbase_128',['RETROGUI_CTL_BASE',['../structRETROGUI__CTL__BASE.html',1,'']]], + ['retrogui_5fctl_5ftable_129',['RETROGUI_CTL_TABLE',['../group__maug__retrogui__ctl.html#ga951c36a0e2f67d88cf7d0d1bd1a94b19',1,'retrogui.h']]], + ['retrogui_5fctl_5ftable_5ffields_130',['RETROGUI_CTL_TABLE_FIELDS',['../group__maug__retrogui__ctl.html#ga35333592fffe3d008ddf81628f6cb99e',1,'retrogui.h']]], + ['retrogui_5fctl_5ftable_5ftypes_131',['RETROGUI_CTL_TABLE_TYPES',['../group__maug__retrogui__ctl.html#gac65a09732f82d950d2366b7d3878f570',1,'retrogui.h']]], + ['retrogui_5fflags_5fdirty_132',['RETROGUI_FLAGS_DIRTY',['../group__maug__retrogui.html#ga15a4e92c3002b66ab24f29f5c6fc00ab',1,'retrogui.h']]], + ['retrogui_5fidc_133',['RETROGUI_IDC',['../group__maug__retrogui.html#ga824281a18362aabc8d033ddb9f9f9466',1,'retrogui.h']]], + ['retrogui_5fpoll_5fctls_134',['retrogui_poll_ctls',['../group__maug__retrogui.html#ga28a19a6657104e0ee65c1a922fb26f3d',1,'retrogui.h']]], + ['retrogxc_5ffont_5fparms_135',['RETROGXC_FONT_PARMS',['../structRETROGXC__FONT__PARMS.html',1,'']]], + ['retrohtr_2eh_136',['retrohtr.h',['../retrohtr_8h.html',1,'']]], + ['retrohtr_5fapply_5fstyles_137',['retrohtr_apply_styles',['../group__retrohtr.html#ga756e78931bdc19906a83678a9e750b58',1,'retrohtr.h']]], + ['retrohtr_5frender_5fnode_138',['RETROHTR_RENDER_NODE',['../structRETROHTR__RENDER__NODE.html',1,'']]], + ['retrohtr_5frender_5ftree_139',['RETROHTR_RENDER_TREE',['../structRETROHTR__RENDER__TREE.html',1,'']]], + ['retrosnd_2eh_140',['retrosnd.h',['../retrosnd_8h.html',1,'']]], + ['retrosnd_5fflag_5finit_141',['RETROSND_FLAG_INIT',['../group__maug__retrosnd__flags.html#gaff1ae784024934bb487989f25f894c8b',1,'retrosnd.h']]], + ['retrosnd_5finit_142',['retrosnd_init',['../group__maug__retrosnd.html#ga70b59655e231c9e908b1824bc4c06c25',1,'retrosnd.h']]], + ['retrosnd_5fset_5fsf_5fbank_143',['retrosnd_set_sf_bank',['../group__maug__retrosnd.html#ga4ca2c3662be36a491dd4ff3e02e343aa',1,'retrosnd.h']]], + ['retrosnd_5fstate_144',['RETROSND_STATE',['../structRETROSND__STATE.html',1,'']]], + ['retrosnd_5fvoice_5fgunshot_145',['RETROSND_VOICE_GUNSHOT',['../group__maug__retrosnd.html#gafa2e56ef134b1f9b79602df7bc31b7d5',1,'retrosnd.h']]], + ['retrosound_20api_146',['RetroSound API',['../group__maug__retrosnd.html',1,'']]], + ['retrosound_20state_20flags_147',['RetroSound State Flags',['../group__maug__retrosnd__flags.html',1,'']]], + ['retrotile_148',['RETROTILE',['../structRETROTILE.html',1,'']]], + ['retrotile_20api_149',['RetroTile API',['../group__retrotile.html',1,'']]], + ['retrotile_20custom_20property_20types_150',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]], + ['retrotile_20generators_151',['RetroTile Generators',['../group__retrotile__gen.html',1,'']]], + ['retrotile_20parser_152',['RetroTile Parser',['../group__retrotile__parser.html',1,'']]], + ['retrotile_20tile_20definitions_153',['RetroTile Tile Definitions',['../group__retrotile__defs.html',1,'']]], + ['retrotile_5fdata_5fborder_154',['RETROTILE_DATA_BORDER',['../structRETROTILE__DATA__BORDER.html',1,'']]], + ['retrotile_5fdata_5fds_155',['RETROTILE_DATA_DS',['../structRETROTILE__DATA__DS.html',1,'']]], + ['retrotile_5fgen_5fborders_5fiter_156',['retrotile_gen_borders_iter',['../group__retrotile__gen.html#ga95759485c058dc9a57711975f9fe526e',1,'retrotil.h']]], + ['retrotile_5fgen_5fdiamond_5fsquare_5fiter_157',['retrotile_gen_diamond_square_iter',['../group__retrotile__gen.html#ga9dda506910b27a778cb9d0b012658f39',1,'retrotil.h']]], + ['retrotile_5fgen_5fsmooth_5fiter_158',['retrotile_gen_smooth_iter',['../group__retrotile__gen.html#ga0a052a4858fcf067bc7e37561078a220',1,'retrotil.h']]], + ['retrotile_5fgen_5fvoronoi_5fiter_159',['retrotile_gen_voronoi_iter',['../group__retrotile__gen.html#ga9de8d41e6a0e46406a480bfbebb7edb9',1,'retrotil.h']]], + ['retrotile_5flayer_160',['RETROTILE_LAYER',['../structRETROTILE__LAYER.html',1,'']]], + ['retrotile_5fname_5fsz_5fmax_161',['RETROTILE_NAME_SZ_MAX',['../group__retrotile.html#gaedb5e962682c52467550f4de3722a251',1,'retrotil.h']]], + ['retrotile_5fparser_162',['RETROTILE_PARSER',['../structRETROTILE__PARSER.html',1,'']]], + ['retrotile_5ftile_5fdef_163',['RETROTILE_TILE_DEF',['../structRETROTILE__TILE__DEF.html',1,'']]], + ['retrotile_5ftile_5fscale_5fdefault_164',['RETROTILE_TILE_SCALE_DEFAULT',['../group__retrotile.html#ga1e45c2ca1266f669fc035275002c44b4',1,'retrotil.h']]], + ['retrotile_5ftileset_5fimage_5fstr_5fsz_5fmax_165',['RETROTILE_TILESET_IMAGE_STR_SZ_MAX',['../group__retrotile.html#ga1d021b8ccd25e5c9081654d942a9938d',1,'retrotil.h']]], + ['retrotile_5ftrace_5flvl_166',['RETROTILE_TRACE_LVL',['../group__retrotile.html#ga7fd3fd4b05cd3fead0d9a624173088b4',1,'retrotil.h']]], + ['return_20values_167',['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..e88efde2 --- /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#gac13df68934cfc9433fbbc057802eefec',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..0b81ddf3 --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,34 @@ +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_5fdestroy_5fbitmap_2',['retroflat_destroy_bitmap',['../group__maug__retroflt__bitmap.html#gaa52e04cfe54ba6ea1985c8dfc2dccbbe',1,'retroflt.h']]], + ['retroflat_5fdraw_5flock_3',['retroflat_draw_lock',['../group__maug__retroflt__drawing.html#ga78766b119670a0ceb6fd84ec6c4cb52d',1,'retroflt.h']]], + ['retroflat_5fellipse_4',['retroflat_ellipse',['../group__maug__retroflt__drawing.html#ga17237a3b9c734c7fe023a3813d687947',1,'retroflt.h']]], + ['retroflat_5finit_5',['retroflat_init',['../group__maug__retroflt.html#gac5511e72055cff916e5f494f8d6fd5f5',1,'retroflt.h']]], + ['retroflat_5fline_6',['retroflat_line',['../group__maug__retroflt__drawing.html#gaff3354123bc01e143245dbd949597493',1,'retroflt.h']]], + ['retroflat_5fload_5fbitmap_7',['retroflat_load_bitmap',['../group__maug__retroflt__bitmap.html#gab1cb406967afc4fbd36454a1ba481b9f',1,'retroflt.h']]], + ['retroflat_5floop_8',['retroflat_loop',['../group__maug__retroflt.html#gaa796a8098764c38861bec1f0aec2da77',1,'retroflt.h']]], + ['retroflat_5fmessage_9',['retroflat_message',['../group__maug__retroflt.html#gab2d5a69aa8e2f401b8d38b62dc11c674',1,'retroflt.h']]], + ['retroflat_5fpoll_5finput_10',['retroflat_poll_input',['../group__maug__retroflt__input.html#gaf8c19bfe4b8e31b84e71ffb6d00de561',1,'retroflt.h']]], + ['retroflat_5frect_11',['retroflat_rect',['../group__maug__retroflt__drawing.html#ga7f4e8bd5781843624e1b5639724b598d',1,'retroflt.h']]], + ['retroflat_5fshutdown_12',['retroflat_shutdown',['../group__maug__retroflt.html#ga1f9b2b82622f45623739891838904c24',1,'retroflt.h']]], + ['retroflat_5fstring_13',['retroflat_string',['../group__maug__retroflt__drawing.html#gaeb607b42158ab8cae02230ca472da297',1,'retroflt.h']]], + ['retroflat_5fstring_5fsz_14',['retroflat_string_sz',['../group__maug__retroflt__drawing.html#ga7edf53d278ef709ca5d3ec3e054070e8',1,'retroflt.h']]], + ['retroflat_5fvdp_5fcall_15',['retroflat_vdp_call',['../group__maug__retroflt__vdp.html#ga686ecce68daf9fd1d2c32656243f6c8d',1,'retroflt.h']]], + ['retrofp_5flut_16',['retrofp_lut',['../group__maug__retrofp.html#gaf466c8888ec2d28795ed52221ca2b811',1,'retrofp.h']]], + ['retroglu_5fdraw_5fsprite_17',['retroglu_draw_sprite',['../group__maug__retroglu.html#gaa7f8818844f102a07c3606c9fbdc8702',1,'retroglu.h']]], + ['retroglu_5finit_5fsprite_5fvertices_18',['retroglu_init_sprite_vertices',['../group__maug__retroglu.html#gaa9a7b68018140cc307db23ba5c224ba0',1,'retroglu.h']]], + ['retroglu_5fjitrender_5fsprite_19',['retroglu_jitrender_sprite',['../group__maug__retroglu.html#gad0dbc4a89753c37cdfb03b7b3ff79e10',1,'retroglu.h']]], + ['retroglu_5fparse_5finit_20',['retroglu_parse_init',['../group__maug__retroglu__obj__fsm.html#ga1eea89882f6c548411ddbbfa11187d27',1,'RETROGLU_PARSER']]], + ['retroglu_5fparse_5fobj_5fc_21',['retroglu_parse_obj_c',['../group__maug__retroglu__obj__fsm.html#ga5198ebd5a2c5c8210f6feee3db63cb06',1,'RETROGLU_PARSER']]], + ['retroglu_5fprerender_5fsprite_22',['retroglu_prerender_sprite',['../group__maug__retroglu.html#ga8729fd6d63620a3dccaa4b199bfdf958',1,'retroglu.h']]], + ['retrogui_5fpoll_5fctls_23',['retrogui_poll_ctls',['../group__maug__retrogui.html#ga28a19a6657104e0ee65c1a922fb26f3d',1,'retrogui.h']]], + ['retrohtr_5fapply_5fstyles_24',['retrohtr_apply_styles',['../group__retrohtr.html#ga756e78931bdc19906a83678a9e750b58',1,'retrohtr.h']]], + ['retrosnd_5finit_25',['retrosnd_init',['../group__maug__retrosnd.html#ga70b59655e231c9e908b1824bc4c06c25',1,'retrosnd.h']]], + ['retrosnd_5fset_5fsf_5fbank_26',['retrosnd_set_sf_bank',['../group__maug__retrosnd.html#ga4ca2c3662be36a491dd4ff3e02e343aa',1,'retrosnd.h']]], + ['retrotile_5fgen_5fborders_5fiter_27',['retrotile_gen_borders_iter',['../group__retrotile__gen.html#ga95759485c058dc9a57711975f9fe526e',1,'retrotil.h']]], + ['retrotile_5fgen_5fdiamond_5fsquare_5fiter_28',['retrotile_gen_diamond_square_iter',['../group__retrotile__gen.html#ga9dda506910b27a778cb9d0b012658f39',1,'retrotil.h']]], + ['retrotile_5fgen_5fsmooth_5fiter_29',['retrotile_gen_smooth_iter',['../group__retrotile__gen.html#ga0a052a4858fcf067bc7e37561078a220',1,'retrotil.h']]], + ['retrotile_5fgen_5fvoronoi_5fiter_30',['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..3383b01c --- /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__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..83769f62 --- /dev/null +++ b/search/groups_1.js @@ -0,0 +1,5 @@ +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,'']]] +]; diff --git a/search/groups_10.js b/search/groups_10.js new file mode 100644 index 00000000..9b0aee83 --- /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__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..de516ec2 --- /dev/null +++ b/search/groups_2.js @@ -0,0 +1,9 @@ +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,'']]], + ['console_20api_3',['In-Situ Console API',['../group__maug__console.html',1,'']]], + ['controls_4',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['custom_20property_20types_5',['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..c6dd3467 --- /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__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..cc8eb367 --- /dev/null +++ b/search/groups_e.js @@ -0,0 +1,36 @@ +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_20drawing_20api_11',['RetroFlat Drawing API',['../group__maug__retroflt__drawing.html',1,'']]], + ['retroflat_20example_12',['RetroFlat Example',['../group__maug__retroflt__example.html',1,'']]], + ['retroflat_20input_20api_13',['RetroFlat Input API',['../group__maug__retroflt__input.html',1,'']]], + ['retroflat_20key_20definitions_14',['RetroFlat Key Definitions',['../group__maug__retroflt__keydefs.html',1,'']]], + ['retroflat_20message_20api_15',['RetroFlat Message API',['../group__maug__retroflt__msg__api.html',1,'']]], + ['retroflat_20vdp_20api_16',['RetroFlat VDP API',['../group__maug__retroflt__vdp.html',1,'']]], + ['retrofont_20api_17',['RetroFont API',['../group__retrofont.html',1,'']]], + ['retroglu_20api_18',['RetroGLU API',['../group__maug__retroglu.html',1,'']]], + ['retroglu_20obj_20parser_19',['RetroGLU OBJ Parser',['../group__maug__retroglu__obj__fsm.html',1,'']]], + ['retroglu_20obj_20parser_20states_20',['RetroGLU OBJ Parser States',['../group__maug__retroglu__obj__fsm__states.html',1,'']]], + ['retroglu_20overlay_20api_21',['RetroGLU Overlay API',['../group__maug__retroglu__overlay.html',1,'']]], + ['retroglu_20sprites_22',['RetroGLU Sprites',['../group__maug__retroglu__sprite.html',1,'']]], + ['retrogui_20api_23',['RetroGUI API',['../group__maug__retrogui.html',1,'']]], + ['retrogui_20controls_24',['RetroGUI Controls',['../group__maug__retrogui__ctl.html',1,'']]], + ['retrosound_20api_25',['RetroSound API',['../group__maug__retrosnd.html',1,'']]], + ['retrosound_20state_20flags_26',['RetroSound State Flags',['../group__maug__retrosnd__flags.html',1,'']]], + ['retrotile_20api_27',['RetroTile API',['../group__retrotile.html',1,'']]], + ['retrotile_20custom_20property_20types_28',['RetroTile Custom Property Types',['../group__retrotile__defs__types.html',1,'']]], + ['retrotile_20generators_29',['RetroTile Generators',['../group__retrotile__gen.html',1,'']]], + ['retrotile_20parser_30',['RetroTile Parser',['../group__retrotile__parser.html',1,'']]], + ['retrotile_20tile_20definitions_31',['RetroTile Tile Definitions',['../group__retrotile__defs.html',1,'']]], + ['return_20values_32',['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..e22c7b78 --- /dev/null +++ b/structMFILE__CADDY.html @@ -0,0 +1,147 @@ + + + + + + + +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.
     
    +mfile_seek_t seek
     
    +mfile_read_int_t read_int
     
    +
    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..9f3b053b --- /dev/null +++ b/structMFILE__CADDY__coll__graph.map @@ -0,0 +1,6 @@ + + + + + + diff --git a/structMFILE__CADDY__coll__graph.md5 b/structMFILE__CADDY__coll__graph.md5 new file mode 100644 index 00000000..e69063e7 --- /dev/null +++ b/structMFILE__CADDY__coll__graph.md5 @@ -0,0 +1 @@ +df6f3e0c269c6a8af1bef4701b8965c7 \ 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..f400a088b170eec565d1cb55771ab056e3080c62 GIT binary patch literal 6027 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 n<_X!}{lfpa)|)qT0au)eEV~Ei);(w7bR9q + + + + + + +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 zcmZ8lcRbYb|Nl@%SsCSw>{U)2vR67JE7>!g6=m<$(Qr6~aN;OrkC1Gq=)`eluk6gu z$jbKn`2F!4-^ac0KA%7C^ZvZvuh;W6p3j&E`dW0C*)IbCK&O2V{t&ztfL}BlX$ulny#taNz9x^RA^Z1puyn)rQ|O4$4}a3^g`hn4;R;*zQ4I?COmi6d06baeQp8 zuWh|2M57a#$JRcV1+igr2?5pu|K*ve{KH)uidTY`CcY*cdxnYJCLUxpMJ*d5I1CxA7+` zNxp(zlV$lrjWd87+nSs2r|e4jkEo-oN2!boo}S(}-yh1+itF`xoe|IWXQM@+(2lJI0t|ttC2X2K3a=eG_40Uz{dv1} zX2woHSeRc}xKna6PP`S>)~0s81$}LLb~e3%fx(+MZ~QoLJ`4B5{(fUMZwe6eXxSaM zJ#rDnBay)OYV@}_*1P2aD&^M67$+yE@4dYm#>Onb%<;kYXmhaC-2A+ul~vs9*RMUC zdNk1xGF4U87cX7_K6k!90h3-@U`SvY4np3`icCWj;+iUhK1*cNb6{AA^TC@=hg=h0$N@BKhTpX*o z!XT~!#>A+fB^P;B)O2RKFVDQjS+8=t;)joqkEE}!Z?X9C$;so+gzMN>wRLqyc6K~h zSy)EJ5QGU&oF4eLbu*6Q;$pw)@PCHx?(T&?6Q7^*gYHxC`Hi|;CCBt9hFKT|(*(`_ zy|AFs+uIwyYGClB_6$6nk)vb&LZGH5rIXnj1nwud>7U#`N3$6|QS&Y9^~uSam*7*VN-WzepEwVTN8^eRnnRZ8JeHp?z^M{8>H!6v6YkbjUk|acu-M$(R0|1F zh>eRonq;u*`70^XDj;ZI4dM2==FW10Gl2ckvx)U?=48t3sUw%~GM-cDMAg%JD>kj85&z)&WCBx- z=%YuET&3BiZ{MafX2yRI&q4n}ZJX;Kg;$N7 zf(6fev4;)JK|}|NQGWyr;%8-`aDJsQXI;kQbwvdm3z#Sr`pNqGc`Bkc z^Lkgx8I-_GymI~eWTgziBPGS0k&z+izskbS!NJJIH6^yPHsqu{Wm?wS+G<|!#mg1G z)8{e&ijIS_#g;)_yi&h?ZMRU^X5t?hII!T)Y;1V4?e*)3j~)N`HEZ)6r zWo`HR{^+QAX6EQLM-t{aR6(I}VuV3jWojzx36S99bwF{t>ka!u0`(n5( zm4vy~22oZst5ZS4LhOp>8?K@B8d9d>%c)^+jfF2sOv@T%jn-??!?B#>-ykTPdry)MwFR72 zTcmc?pvbB{ycCb)+Ec2-y^o1@yi7H?`eY3m*?H$dVng!nATk>(xWit191s0Zb!T5G z54@5ZDKg$ywuF?tm5=eQ~dPXg86yoXz9^u5$`}lRSAb| zyPdjHT+zIET7-Xob-9(r9mq`z!z0;i@U`jDQ0*^_4o0{BW4`$BiNm|`y9V{A@_!Gb zc&NdJqnV4iBbz(0qGFGJs(1gsLi)LWms%{M*h(zIe(hO&ox(c zJkCQVC#Ky$nYA5CMmiA_7UW6jo=i3^-JQ!ac*wHw0!m<2c%?`AlZUV+ejRthhG0f5 ziy)wvktJa5i1FpR1E2cv;X_|nSJ#lKe}YM|@f7ZOi;&dQqnpy8pVGBcgTtLIfbBOS z&FLWe{c@$4L;Q*}i-xux8q1R#kFJtZz^-cpcIcB-UylQ0c1Dd0<_vbU2oe{NC$|)b zTGj{ZB=C#mNYm2m#RDsQF#O()*lK<`xqXanWuo**@xx-DTQ-e5%m`A$myPmpKA26u z-D>1cR54XQwmce^R%Tk7C#e1Qok({$aB6C4$!=fS3?)SC2@SXb(>lp-zCn(JkvZkqYP((>)a86M<|O5ExAv41&TOiYZ&KTOqVr=M#4 zuqtYq6FF-`1H*@$SbJGmWN-uGfaH=A(aqQ!?7aqBC%eR#iV`5iPjscu@(K#@%x!D2 zxq|?}c#zTQO)T6oHB?tuXGT);S@LT?OcT(yaH|cGN5*z^bmSEM{37Sh`;1DTpA2x7eOZ0x5m2)|&88 z%Fi@JW_R6xKGbSLOIfI81AzWhU7fI#v-4XeB_&((2kLP7tZiC=fvgAsn}t7p8yO&x zp{q*vktB6L`O{leHec=vd`AoLys*#h8@k?jgVh?Yv^{U>5D!ksRf#Kna}m1W=xy(c znwWa^+P3nMK0HNG`_SlFfw-7h{9=}8s=$r>$^o!Xxgvq#iHR1_5Ltw7pIhz7 z1q_t1HDbD^3xc{3#7jJ!<-0ttVg9gzVM!_M-}MPy0I&5g9Qv>3PA##^^; ztvCB;ohJjB6!zui<^KOB1E;SRx@6ITxL1e2agk;}b2y#!{_$Hy!%!M{H}WS(Dnr)= zwaoA7xxozg3+?o?&)QC8Lo8%%uVrml?vcif8eD#48`4Yvc@Ji_Bzt@)1o3EP_wXd7 zMJ1oVPu7Cf5qD57-8ZG$IwDMmy; zIp50Uril_#ptP%#d>@{i|A3F3?%f^3HzxGbp%;+t$pZ0$xrP8yBzEh*0rU6jV?HF< zJ&rY!^PvExhGF&_r-qXGYfWLq;3xs@lp(j>i-7NLNXr3zp%=hvX=&Na%*2$SsN{Qi zPoN-3B%e8K{QV1qdwA zQoZ$HxP19AGgyJ|P!vI0Kizxon@vCSvCoxOL`+Q2&D}i{co&6o&WO86LD3@jAk#|< zgyGGsYmj(wUw&dRetoiuA>c`g6tXms(woT9q&r027WT+74oWCrWQ6-Az^~DsZBvsHf(qe9mikSJ-f;t6x1m+RYunqlkiN|yiWE3n0((L2o1owbZGUAFZb!9 zOMu+cG-DqYj*IAuf;opL{`UH#IHV}Eo4^TBfLR)2>MsNo3G$J9o#5lm9@Ul)xwW8{ zho|N?f?gF(g=JcI+WgJ&BI01IE9LZNVC!Pl(bX;cx#GtPl-Z$sVGN#6pH51EG+=2b z@6Zk*`oeiw`RgzQl<+1`$?|0fSVV^BZhbn$&O{>90QOh_sgfN*k zD+|lcThr2$H?TCCw!*q@FwIXNOS7lD*N)e*A#z~&Ih07JtF)#R{`g2i^-!k_Muned zLmYymKQ>tH{{7fU)M*>!=#ttkBnKN}4Cr}e>VEMfb=xF-hl(%cL2^Drh+9W{`#c{~ z9X}d}uF8P3P}sFX3EYJ0Uuy6g2!a<~RTxv02K$_hA_nN%7Mqr4DxBIBJS?^ZcvMtQ zbEBiRq?bTYX|ZUq5h0lYBQ}B8|F~BE(%8NSp(Xy>JFn~I11k{${<=6P2cva-H-T`$ z%F2pARHXlPR+hDtD;XVM62=3ZO#i?^@>X}!C2Cf&Ut(O+rK}r5-gY|!6BXCYY|=7= zEpjtcY85?irT@Dmc&v9LbZ2jRFLatjgv%BL{f(qSHN{=56JRp((&2+q{Kw6lUs4?E zAL8==><~Wur?g^wYpdW!?AC9)i~PqbUc|H3fVJ_;kedU4R`@gw)gcJB)6?gBN8Jv6-2ovA*>IpE&FS@$A3Njf9 z=N`y8tMT^6wWd$oLaU*O)8hm4M!y@?H8qTEV*`rDkxwT++mBS(eDCfC^EhpmJ8bh# z<;m=?Q-$0QA1Eg3JUi>ABjOepozV~&xwp4>{n2{U7x@jN6Jp1xe|Ba(w<;GQUA#{5 z=`-5V6U^Ay7)JUr6VPTS@vfxgGKb6)wR`ud)$iVIN`)B}8$T#EzGr|tMD2lM#>?=d zz1iZz?CLkLAHS!@Vxd6}KAJlMwYL}0^Y(VB z!LA}lUW?PB8^|-JrlvM`TMjRAfLtfPpdh!onX@yIyH23MKck|#xfuY?foOa)wbw_v zmXV1mijG5u=f;gozKiB6T#<%(n!Hdbt$6b$ImqnJ$A5QdLQ!dH`@#0o-%&*3Y`pB0 znvoGRIXO8r+&f?OGbCQ~oDmx+@4i{!i>|B`Kj)-a#Xtw}tn?!ru@EfQAc1`_T$d<+ ze0)s#A-=IuAxqwu66BjCQ_Z|SyYWwtMZ^OqsUSCR-UQieq;`rBuY|@>Iz<;_Do%DxRMM-mWP0Qvc|3~3t2eKYm4y}f;!Bq(M~ z7D#Q3$WP!wV#&zD^1{CT)mWAc=(W&)>$Mzlb#=0)m9}dSIN>iqj`8c+*$IGLUUoG$ zHFY@LS)tdP&U{J3nhTO%LYi26uk1AX<3|Z_PMLYd;o((JZ}x4OB{-~T*^9jIJ)X6*vt0hMH(&zQL%BE!(tgV8I4QL}Z$nN`G;f{_1Drd*O($dmu zd3|!$iOP#MiQLbQ8K<9}DbsT)q0ZfgN3-42(cu_`*i?zHqsVl61a;EP6C5VS$3F&c z*p^w<(SveR8`uTOS2NvvK?%toq~U4P#Eyrc6bGUMYW2Bn zU=wWjJ($_=f%n(kL2?Z00(^XYSJ>HOfBt*`s#G(Xo~>V+Hd^CA(P;Ah?ZQ%r=7K$# zva&KSLDKlZUcKUzlY@ZL#j5G&sw&2Xg$1lW+irT7DlR<$7vrs{V+l1muCaIZD(_;Tb7lb+FhD{l2{X-$p#WANqp*Pp;{OtoDhCrUBZ| zQ(B*#TN*YzIlutYu-@u;d)xhIe}5FHwh&fwL5kaf$2)BO&Q^IpkWp^l($aFS+<_qn zHO3DE^ zgp{|Z!Wu&|#-xgVq$YC8GhMxUHI2>DotqJu3ftBz8akorZH%|_XrK@^Eo&Ptw=y(0 zr+)qg`TF&ho^0i&AMQFCezL%y1wosr zya!P^_|2@t4Vv)v>(|YncNyeAiIch^R1O(q{qB|LA{iTkTSH5$smyTpUuk0_J6yUF zoOe4nJYwBJM$1%*Vsj8S$nGf2iEs-%1_^soapv!yVqY$FlPGv zpXw^#oVY>^%%vX5wq;I1b(8gQyfA+;9g~p7^xxX?l^1t*&%DMgGJLWZ%0Yb_(ALn0 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 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 + + + + + + +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..30ac2e49 --- /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
     
    +size_t x
     
    +size_t y
     
    +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
     
    +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..4924003c --- /dev/null +++ b/structRETROHTR__RENDER__NODE.html @@ -0,0 +1,181 @@ + + + + + + + +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

    +uint8_t flags
     
    +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
     
    +MAUG_MHANDLE font_h
     
    +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

    +uint8_t flags
     
    +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.
     
    +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..d26c8c13 --- /dev/null +++ b/topics.html @@ -0,0 +1,144 @@ + + + + + + + +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 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 zcmZWvWmHsQw;n_(0YN0B5osI{5TvCfl?Le!=`Kk@q&q}HQo6evVd#(=8fk{^7`~Su z_ulobyO=dIhx49&_TKNV^E?x*@KF*6ixdk2f#66>i7P=MD3;*64F(!`U%uh+0Uv0F zvXbJEyZgWN=G<5agc>3(E~4U=f|z&rRQY>*cQ|E6|5&SoSsy3)0agerPA`2BV^V;E zcg5cjE9p;IN+{MM+#+q6uZVnt9&6ZTKoy?JNSorJm{j6f5w`!0Wizyz$k5B=EmpD%dNC2iS{TF1ypv1d}&ME);~) zR#v+*wp02ly50-Wwu27|CLi#lMHWi3zP>iFt_#Ps%$l(HThRTgc5Vg1(X@B6HBQdw z)C)HuiBB1XKf0H%ZrU-+j@^m=ql_E7^8kgu2&a?X(-+gSlO3B%|9?+;!ie=e+l7&b zkxI=j`wPuYH%I*`0`3(f!?Cfk(lRp4kw@5_)^eZ7gy^WLeZeht>>G=USXWk7dV6~z z?^N9p)l+q+lUkU#xX>y@5~tZ)@0&WU?KfdZh8?p9Os_Pns9(HT34xoKnN@x{x2dSC zM3It}UA?(Hc0$a?x3#@4f4FzY_Y{F zMc5~8VnPL%f=?VVTfOzSkeFxQiJ-5qPrJ^}@8=uKqsxt7O(| zXvMAN%^#?!_#?V{89(vkn>=RpCzLN)SVB3?h7R@`_m2j77VV~VTn%dB?(0crZ{3ex znhm8GT%RGD?vU330ReW%8}}CQ^@f{(fPmNGABO9q7f%5!hE7&NH4yvxgSMr1|9s_K zTz|ARRwEAMUcBvzeC6yGuj{jNvth~xr>(E8tv>&wf+CGdp<4Li>Yvq(4awY(sc(Id z0?FLgnIBX6va_?+`&Z-3}23siV!!k9tR>Ao2ldFArKe1e_KjGD} zK;ZOOj_u;(jB0eEuce&A@ zJl$r#YRf4!hoOu6@a-Y9eMn75_swx*2>{^(B}`d`)R*TSXcZ?-Uqp72V`R7gG$ zejj(>;0cy_A$x#;>(+E@|oM)L*}T4e`Qtz?ECa#Kz9ns5GS$ zN<6Qt3pK{Fu_Ph%ORD5<0$X7r@tX;|lW`!d2&Z&svN*X`mOTt>7##ioO27*WijuPO z<<(AUX;TJ9oQvYiWQrmV?K-8&DLn~B7Nr1cdDXRc~>rfz1}o5hNV&Z}!|Q;t!RwsK^5iJHkY z20f~x?wVWmaIHCA8QGh9Qo3y88rxZ_Efnw~gV^I!@@vd?Pu*-Z@{Dz5`Dv#t$r@AT zeGdpxTdOC_O!eWTniCEPeK4k3%pINZa-Hj8&PCm>6`-GV&P3 z{9WYhX4J1?uJ)rt(GWOR%1)`DtXUsWghvlqp<0Ct{oYC8bwG4FP|xPXDiVdHy4auh zBgd*x@M7~)Uy*S>d_m|ERK_kOHyK|e*jcAWUld-U9Br6f-# z&amYcut6wFKz^k08UDOU3Gv2%CdZCODC`R!(>TSW%$Taj9Zm$Zfw@U#+_0Ch{PUTm z=igi~3K25`<*cG5D|tqJhTImYgDa2&nI^H{@%248q|8KAs97r%NAES@s3eH7k{KAm zgJ?#0`C%BQb!RFl$~jNtvvtJXNb4l^v!*YMtf($+-K!{4vu$ad2Jtjo@#%&2E(z6% z)+UG_QdXHcz$?6ul-;W^y92ldo>M_{w3tWOp`8KM_8&5JJkZ(6OxR&A_-R3oy^}00 z2h0-IBSMDDq8A_BBUHZATiB`cU#m!mx%U1zvfzW=)Y8?#=MS|Ae_8~$R#@>y@`#>vxK-B#dvPW&_l z;n|mS42yM+dhTG?`PtP2z9`l_9&nmc2~*?+yAL60QbM(uG|pyr^doH>;|k5aqomoG zZ{9agjCd!F7iwdVe^lOh&f}JY_7MG;$?oj}&GO!Yo=E*TtvpIIaQRe6z^Sv%5P3C4 zeW+iXXaJt7E>79&oi+B$QG)A87YmASw+~oWDLBBjKtc*h>D?b)TYq0{-gQTh%L5^s()~x(<`E z*AXt;4%7oSxqmCJ*HReHQyF-wHln|@c+{{vy8pO=lU0)tCS&gGD8wo66RZtmw7$QP ztYKgMD|93rITcNyLd7KTV<{>=ZQ<@9Tysh|^!9;Iq+_qK{C;bC-b;i{>&1|(;hO7KYOS0yB%w1q$r>g4@s8Ngp%CzN)TU%FhqMP6ylrxSudnvH=eSxrb>U9DxYy&K%*4MPZ;-WZbTR2^mLjLb~0@@gFrN3@4q(C36?0GqPH+= zz!+`wj>}!?G*Okvd(5xLD3H1omD{W{Y@WMd)9&N@2PEp(+8w6efSTw(0nT(>%!;;U zGj7;F9+DF;57Y1mvmkzstbw@Nd8nyUY2Nr!RHo%`7`jB`$>%uCq@=2|6OqY6{I!Ye z-g-QWdp390K>^o+2jrGH*n_F}3mHuYY?OwX_#1S0WK6i=JPhl;QeS zjQdMtnt;E$#os0BvydqAji^PB#DNuzLX z)^6O9cLg*Kqy0IAPpj4ZtyHH=Ls%AQMi)vpl(J&E2A-z8Gj0-_1fu(y+}=lacqFs` z32<2hljZld`S-H%yzkf#zRnN*YIYtvh!?LvaaRn~Bq~mj?3K2iQcf{XED_&|qnXpy zwfx+uyq9t&n(p7>@r{9{L*v!^OHKoX|4}L5GbA>b(wb`jN}u{Q4AXW>Erui!sTuE6 z_%s#|T6%9on06@+!sQHA7KHRT{8T%B?s1AjT33Kej!DPtpMMeANUSQ6PsJ|3-7Q{c zj=`EQ5xCT}LSboppQ=j*Bnv(QRnoXlG`sLZ8Ia5DMm@w6umw`kp0p*M(3{K*C)so?T3su9~QL znZ2XUJT$0)LcGj(#;*!7gN#upQl`K(nN>lJuUslNu{G=JSG1ofmTF-TdL= zbX&~$d{;1(#;=~szMHB{^i_UIn7Ee%@SNxB!*c#A>{;5gjLgz{eQIava}h`I3-*Q! zLxsqXW9;~7CCsFT4xc2%ll;l=1Z%YW6yf%xNjd03f zg9$i1QGpwrRj~6eA!fs3lFH614wI|jd+-tXZoT6x%lp~A65{aO<+B9c)-MSXJw>*~ z79zsKql=>`SFAiNdCV&DPsK!)PdnCRZKq71f&G*{vdJ=GI(~Q~u3>0W#+cEX?bcXR z0n;JbQugb!$JN+Ic)$uWUkRu#$eCZG5lm95EfsV!_-VGq?7k!NxPmgR(ZF)VBry9= zjE;8B`o; zM??W=g^+1|mbO|HFq{ujl2~J|r_m97T}Tz{&*E!Z!+n zEP%DMlF8DTg&!~y!yoD@oA}o5usm^G4G|1BVMN`2q`ph$(x5L7A{=pDCtz~V9%oy}FbpFLbOB>TS+(QG7Y!1)7@AXxD zBUlg#aeTiatZJ1}(2+OivF6_$pbzCs_&gGJ@F(rA2!QGq58_~jRcWn7RKaIowFJ3r z@6hs?KenB6ZGLUwg%emhp6sAz(s)DHI|^;41rZ}Lok8UNKyZcJ!N;TlgJvX?R-f%e ztX=+HS5KG9az9Dp!hY&DY^wKkmYrT&9m7f#^F8!(4nrehWJY$aex5Ev@Y!Yx@$BeF zYww(?NXO5&=DAllDJ`{0Wi2wGZ|mGaxU;Y$?2q2r!^7mpek)2}VZqD_xFjw7 ztbMC#rmSV@f~5L+sbe8n-Lwrf!jvW5OJ-qz0!~$fGz&$L8cmU7&&noxI@(#@_^3RO z&7%P~4$--w5`7YfPS8=u0wzHBQVSk}2K%kv2FT#;ywdVc>-W{lT-t(eZ!%-;v(1k~ zV=BcCxq-~hCK)kFOHosg16+t5#J0=dfRRyBO)y zzC4E7ng+JXYSBrRB2c3PnQHV$ousbCUVYtWvyxSPBEB0@blj%U%b2 z$kv3HhInx>0l4Jn=^(~u2QVPcY@;De;A(*Uj;8> z4xo`{6`^?hAN04Iij-BUU z71Mg9Q71jD@wGJRa*mQ$4Cc;L@%oEUQ_in3>n5+nL#^Qdj^3lJ3XA4^;JfeK_Zf^NELu>*p2TkzbjNfB zhW6WxQm&CP9!Ng6khGpiz8Ah?X2zU2OiUK?>zz`V^8T5MPRl^RDV<>oABsuIX1wG8 zmN&QCi`jf<0YxndcGFZf+I_OTw(ZaSAW9{DX8K{_$dIibZ;HXJn(v*Xyn2z7I)`rIoT78OXrRJC zd3eX}J3_*RNa-*1_{zYr;Xor>S$1_YlGbg6UGCK^61g zBOPdi&n$?iSy9_XF`tzc;)PYvt$QJeTw8a~H4h1=on7sU-i|^MG)pRU3UR9zM!!0| z%P*9^`Fp$ILK`D#TRdCr+=K16`4cK=XtY>yM{uw+X_bpkX{*gH**MkDcAK$b?Tqfki$j+zeGVjZ^#Kvi>8m0xt9<7h6jXB=> zXTzWWa(FlBj~B6cS@)Z1OggUigu}NYe(Hk7Ox(%E9bP#tOM12M!v~a!OPbcI$v901 z^j)hSr|k@5YyE`~(y;Sacl?5Fl^~(kfyNhqG2~85b#%JvtCd^%*CJ*;CG2OEj7hsp zE8i&n6~Q6nKG8POout0IN@!5O{Yk*^QNMCV4aEl2GI?;4j-B03p;)teZqzgX4dcPx z+S*EYXbQh;i8j0`ZsVG>SM0jpWp8i4!bECsu`d1Smg1O>&O|oYaT1^{&R-N;cDsTJ zY!)Sfh?3CrWpLnmmUK=0vPt*qSVrLQ;_p(~+-$4YX8r(3ynql)0yt5qEub2JmQUCX ztVsfwQNhFK|D9TDz}^x3ayF79`>k=ItMGjoNjv|3Q|I>ILida1@1lpaX#z7J z;xB(UA)UVO)VH4R&WQbqAaosMa5WA6)9G<>uiiuC{WMmL>|$zEDh@HqtmP^QA`+NGnTNHz+*LcKaw?=i0-bb9!EN zCMG2GtVRld1i<0v@!vRLgZ}};At&4Mj+_x+_UgaiUON(T$x2D3OGZ*UZI1ZWJ8s0J zraBJ$zOkHq_7lzh_H^nV3U!^cM;H5!yH;2lqNm3Ia7wUlEJF;P&v`rUF73MDXnXkU ztpnV;cC=JaSm^Q}0ks+5YJP5-A+X_OZ=TE-AfY3bX7Zw9V(#1dxtl;Fyw;XYNzY_^ z-?A@CRtNgn1u-jOZ2Z!Cw#wjSb2N;MCqg2W2<2c>%XTzN@`+}Rm2@PfpxaJy?UCL& zKv9p{P@jx6I9tAW@#5lQH4;T;pzwHOm^i z^8fk$A(@2FiSaQJD@1>5ET_t5{wKJ};X&t<@mgEGn3$L&_~nN1oiuPbz?#?l*;@a7 zr}Eany*lmc?k@j4PM-kPfo+ZFUe51(OWq-GXBwPYlz+<^jAcuE0#EHOG~a`Q$2Z5r zm0|kd&rv37rp?^3I!TESqzPgcnl1g1qMfbMe1)&L0&eG;HQmq=R3;+fX zr1JCl2wP5-NT|B+)o)DK+0%v+v#rmV{i1vQ8YBnQZgV8VaHr7f)~out(#TrH(!ajg zFw!?6%bnjVfqLK?N+1yeqQ|5s?77@8q104<*Q3p>NDiYOY^Zi!TVE{0a{vcF5j?@W zzo+eD3y93Xs;a8~bybl)Sb_uQ4glzTA}D0TN#BsL>qEGc!!Zfy6|&yr032IXMn(oH zm6a~!byenb=M4~4tbaEvLI-WAm&0t@by4rbNk?m}wSIq0g%zk4eyTLZ0ZudmIs?r1 zJGf}1)yHSDNJC6hle7RfQ)!m3RST6(U|sGe)?=+P#Ww)wCh`>h&k%4&5WMzRCtF9G zxTOGnrRC&|jf;C`({gFbZ8fd1GItE*2Sr5ucHLj#vYL(p@bOr>$mlmmwPH;PIXUe6 zT-0s$5I|n6PFryU*Q*)B!8?cf2sOB{2jI|s0|O^pyz?MaK)t9i9VDHt`YdK=#}2mJ zC}Xjb%%;u{C^!zRS@6EL&dkcH-zjO#(`yxy7rK1u?cF`BqE>^1ehActKAtSmku^7G z6br=80H8EB1z#L60F~FW%k!We{Vh4J#bi<62cG$W0*Adh-uuP(^-aKy{d8x_?B?Q7 zE}1)gVq$`2U6s<+M7DlF105Y*x!J=R0s!|sr5vnk%Z(z=y?wo-R4*V&da6XnzFymD zdm?x|SAM)uoeh`#?K=epywmN!{fjm3$LlF??Z0+@e{$Sa7vJIY0%OFzjPh3;#SZQ8PBWCI8u*t=oz9?GBh`1k* z0D~d1P)PsbCxmx@IN7$PZ?ae`A7Jsd3m%q8?nR$FuZ(kXaktHk??+U`iRy_C>NRe+ zIz!hM8c4Y|)D9!d%sXR#YdXVBX&0k!RcWNcteRcM$Z#^&AGcq#n zQ{VHbj{)owy?mPX?o=o2;IZyVhS+x!kR^b0F+5%$yk}!_e|a}dTay9&-Wrg8-z zy(YJ4<=hax$@+>@*Uxiyoj7!+?KxhUydv0To|g`Q4{QgWWe_ydBpzGJ7re69JRoX) z8U^kv0XXwWW~lJ%-06bb8U@>1n#EjsDxvFLPPJ0qL0=S9EbH?w0(rZe3;VOZ`TmY? zkDqgy<3&eDTg_B_bKaR;8~!Zu{=LJ$UVN9mxjz3VLcNK4-qL`kNJ>gFHZfUi#lO4R z5SA5qx4yHoy6S#1DtUSMhpG<-dqGQ!+RyAs^$jE;1eh(Ztxc{~YqJLO`eu#IXZhlA zRbrML#Ps3e;eFY?=gn$cZ^Hp?*xw>vio;CV@q&ZubE_fx^i?o4bj0mE3G zy%FdQ!QtUKfB+i!CH(91c;lXbyw@7gmF^%MH)pF^KIXB_75a+UV^$Sa4UZn z1geu#wT0?l^SLgVDWv4(%|IW9+=o?J8N0{%-XQ3SL1AIWD_z0&C3|E<0Tj75!Sgxg z?7`k%DN6T$_{fVt!ebzSV`5|Phk$&*x&4WtSS|lU$>JiD&B0iTOyPB;Z*<-N4M;QA zPi4M9=cnZ41940ew%JdgKbHnYk$_%~nu8+-)Io<%93H%9&s4Uq8@Zr~k6N$(mb$IQ ztGjLGBmyc79gHWP%XVOaxQfcNYKy;_U(WZsy1MK(QeDSD1qZX9h?Eot*y^sHp0Q#r zo&~RS9pIef+)^1Bi@dRHG~DAA=q^D8Ed)eF>ys43Tm~HvfAZL-`KV5UY8w<1VtBqc zPg%IES+5Nh|5t0&6Q;2hah3=!DiHBU^Dp`SXzrM(lZxM^2)>88{rEO1CB-rJ0{8_2 zct^9@THE0W3VxZCMktQ!c`XmeKPAZs@@3G`b3s456ea_0YjkwCN-NgO6v$vn2}8^3(+M*`2&zv|uI{!N+-LoAVc?VqCh*9<|}fg=9uPU_XWR6gg; z#nx707EbKpFH3&t_jShTPXrx5e=?Y;;@!6M?cD+6XnMHP&8k@y^vnAy_<+o% z{3w$J;`3Q);3=q$k5dccHhw4D7_JW_>E`vaH%W^B;QIU&6xt&frg%{|x3|m7%WIRm z((Y?a>o-*Y&G6ro|8zqdjoMK8NrPvrVAcmsp#yHBLi$@+u-{nflKJW6iwe|>Vq%L! z-g>V!q68B`Gw`TUUwFF{z9m2W`ni(J-T)C0`d=@`!aLMqEU0A31fM_nVFg55;-h$p 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
      +
      + + +
      + +