From 69c9e3ffb77e5183149b230a69872fd581e4a4c5 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 27 Dec 2022 14:39:03 -0800 Subject: [PATCH 1/5] render tiles if given in the pen; otherwise text this commit also smooths out many conflicts with other layers, but the anchor layer still gives us trouble. it will overwrite us unless we cover the upper left tile of the anchor graphic, and then the entire anchor graphic will disappear. not ideal, but it's a start --- library/modules/Screen.cpp | 76 +++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index 5baadb052..8d20fcb3e 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -54,7 +54,7 @@ using namespace DFHack; #include "df/tile_pagest.h" #include "df/interfacest.h" #include "df/enabler.h" -#include "df/graphic_map_portst.h" +#include "df/graphic_viewportst.h" #include "df/unit.h" #include "df/item.h" #include "df/job.h" @@ -117,37 +117,55 @@ bool Screen::inGraphicsMode() static bool doSetTile_default(const Pen &pen, int x, int y, bool map) { -// TODO: understand how this changes for v50 - size_t index = ((x * gps->dimy) + y); - if (!map) { - // don't let DF overlay interface elements draw over us - gps->screentexpos_anchored[index] = 0; - gps->screentexpos_top[index] = 0; - gps->screentexpos_flag[index] = 0; + if (x < 0 || x >= gps->dimx || y < 0 || y >= gps->dimy) + return false; + + if (map) { + //gps->main_viewport->screentexpos_interface + return true; } - //gps->screen1_opt_tile[index] = uint8_t(pen.tile); + + size_t index = (x * gps->dimy) + y; + + uint8_t *screen = &gps->screen[index * 8]; + long *texpos = &gps->screentexpos[index]; + uint32_t *flag = &gps->screentexpos_flag[index]; + + *screen = 0; + *texpos = 0; + *flag = 4; // remove SCREENTEXPOS_FLAG_ANCHOR_SUBORDINATE + + if (gps->top_in_use) { + screen = &gps->screen_top[index * 8]; + texpos = &gps->screentexpos_top[index]; + flag = &gps->screentexpos_top_flag[index]; + + *screen = 0; + *texpos = 0; + *flag = 4; // remove SCREENTEXPOS_FLAG_ANCHOR_SUBORDINATE + } + + if (pen.tile_mode == Screen::Pen::CharColor) + *flag |= 2; // SCREENTEXPOS_FLAG_ADDCOLOR + else if (pen.tile_mode == Screen::Pen::TileColor) + *flag |= 1; // SCREENTEXPOS_FLAG_GRAYSCALE + + if (pen.tile && init->display.flag.is_set(init_display_flags::USE_GRAPHICS)) { + *texpos = pen.tile; + } else { + screen[0] = uint8_t(pen.ch); + } + + // note that pen.bold currently (50.04) has no representation in the DF data auto fg = &gps->uccolor[pen.fg][0]; auto bg = &gps->uccolor[pen.bg][0]; - auto argb = &gps->screen[index * 8]; - argb[0] = uint8_t(pen.ch); - argb[1] = fg[0]; - argb[2] = fg[1]; - argb[3] = fg[2]; - argb[4] = bg[0]; - argb[5] = bg[1]; - argb[6] = bg[2]; -/* old code -// auto screen = gps->screen + index*4; -// screen[0] = uint8_t(pen.ch); -// screen[1] = uint8_t(pen.fg) & 15; -// screen[2] = uint8_t(pen.bg) & 15; -// screen[3] = uint8_t(pen.bold) & 1; -// gps->screentexpos[index] = pen.tile; -// gps->screentexpos_addcolor[index] = (pen.tile_mode == Screen::Pen::CharColor); -// gps->screentexpos_grayscale[index] = (pen.tile_mode == Screen::Pen::TileColor); -// gps->screentexpos_cf[index] = pen.tile_fg; -// gps->screentexpos_cbr[index] = pen.tile_bg; -*/ + screen[1] = fg[0]; + screen[2] = fg[1]; + screen[3] = fg[2]; + screen[4] = bg[0]; + screen[5] = bg[1]; + screen[6] = bg[2]; + return true; } From 75afa88790c12ccf52eecf08db889f2a59e8ed55 Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 27 Dec 2022 14:40:35 -0800 Subject: [PATCH 2/5] use tiles for our default frame --- library/lua/gui.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index ce228d715..39012463b 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -694,12 +694,14 @@ BOUNDARY_FRAME = { GREY_LINE_FRAME = { frame_pen = to_pen{ ch = 206, fg = COLOR_GREY, bg = COLOR_BLACK }, - h_frame_pen = to_pen{ ch = 205, fg = COLOR_GREY, bg = COLOR_BLACK }, - v_frame_pen = to_pen{ ch = 186, fg = COLOR_GREY, bg = COLOR_BLACK }, - lt_frame_pen = to_pen{ ch = 201, fg = COLOR_GREY, bg = COLOR_BLACK }, - lb_frame_pen = to_pen{ ch = 200, fg = COLOR_GREY, bg = COLOR_BLACK }, - rt_frame_pen = to_pen{ ch = 187, fg = COLOR_GREY, bg = COLOR_BLACK }, - rb_frame_pen = to_pen{ ch = 188, fg = COLOR_GREY, bg = COLOR_BLACK }, + t_frame_pen = to_pen{ tile=902, ch = 205, fg = COLOR_GREY, bg = COLOR_BLACK }, + l_frame_pen = to_pen{ tile=908, ch = 186, fg = COLOR_GREY, bg = COLOR_BLACK }, + b_frame_pen = to_pen{ tile=916, ch = 205, fg = COLOR_GREY, bg = COLOR_BLACK }, + r_frame_pen = to_pen{ tile=910, ch = 186, fg = COLOR_GREY, bg = COLOR_BLACK }, + lt_frame_pen = to_pen{ tile=901, ch = 201, fg = COLOR_GREY, bg = COLOR_BLACK }, + lb_frame_pen = to_pen{ tile=915, ch = 200, fg = COLOR_GREY, bg = COLOR_BLACK }, + rt_frame_pen = to_pen{ tile=903, ch = 187, fg = COLOR_GREY, bg = COLOR_BLACK }, + rb_frame_pen = to_pen{ tile=917, ch = 188, fg = COLOR_GREY, bg = COLOR_BLACK }, title_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, signature_pen = to_pen{ fg = COLOR_GREY, bg = COLOR_BLACK }, } From 033eb2aefd0995ad61d8bd875673998fb0c7bf6c Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 27 Dec 2022 15:05:13 -0800 Subject: [PATCH 3/5] use default background colors and ensure texpos_lower doesn't peek through --- library/lua/gui.lua | 24 ++++++++++++------------ library/modules/Screen.cpp | 14 ++++++++++---- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 39012463b..1094004a9 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -11,7 +11,7 @@ USE_GRAPHICS = dscreen.inGraphicsMode() local to_pen = dfhack.pen.parse -CLEAR_PEN = to_pen{ch=32,fg=0,bg=0} +CLEAR_PEN = to_pen{tile=909, ch=32, fg=0, bg=0} local FAKE_INPUT_KEYS = { _MOUSE_L = true, @@ -693,17 +693,17 @@ BOUNDARY_FRAME = { } GREY_LINE_FRAME = { - frame_pen = to_pen{ ch = 206, fg = COLOR_GREY, bg = COLOR_BLACK }, - t_frame_pen = to_pen{ tile=902, ch = 205, fg = COLOR_GREY, bg = COLOR_BLACK }, - l_frame_pen = to_pen{ tile=908, ch = 186, fg = COLOR_GREY, bg = COLOR_BLACK }, - b_frame_pen = to_pen{ tile=916, ch = 205, fg = COLOR_GREY, bg = COLOR_BLACK }, - r_frame_pen = to_pen{ tile=910, ch = 186, fg = COLOR_GREY, bg = COLOR_BLACK }, - lt_frame_pen = to_pen{ tile=901, ch = 201, fg = COLOR_GREY, bg = COLOR_BLACK }, - lb_frame_pen = to_pen{ tile=915, ch = 200, fg = COLOR_GREY, bg = COLOR_BLACK }, - rt_frame_pen = to_pen{ tile=903, ch = 187, fg = COLOR_GREY, bg = COLOR_BLACK }, - rb_frame_pen = to_pen{ tile=917, ch = 188, fg = COLOR_GREY, bg = COLOR_BLACK }, - title_pen = to_pen{ fg = COLOR_BLACK, bg = COLOR_GREY }, - signature_pen = to_pen{ fg = COLOR_GREY, bg = COLOR_BLACK }, + frame_pen = to_pen{ ch=206, fg=COLOR_GREY, bg=COLOR_BLACK }, + t_frame_pen = to_pen{ tile=902, ch=205, fg=COLOR_GREY, bg=COLOR_BLACK }, + l_frame_pen = to_pen{ tile=908, ch=186, fg=COLOR_GREY, bg=COLOR_BLACK }, + b_frame_pen = to_pen{ tile=916, ch=205, fg=COLOR_GREY, bg=COLOR_BLACK }, + r_frame_pen = to_pen{ tile=910, ch=186, fg=COLOR_GREY, bg=COLOR_BLACK }, + lt_frame_pen = to_pen{ tile=901, ch=201, fg=COLOR_GREY, bg=COLOR_BLACK }, + lb_frame_pen = to_pen{ tile=915, ch=200, fg=COLOR_GREY, bg=COLOR_BLACK }, + rt_frame_pen = to_pen{ tile=903, ch=187, fg=COLOR_GREY, bg=COLOR_BLACK }, + rb_frame_pen = to_pen{ tile=917, ch=188, fg=COLOR_GREY, bg=COLOR_BLACK }, + title_pen = to_pen{ fg=COLOR_BLACK, bg=COLOR_GREY }, + signature_pen = to_pen{ fg=COLOR_GREY, bg=COLOR_BLACK }, } function paint_frame(dc,rect,style,title) diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index 8d20fcb3e..5e3eeecc4 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -117,31 +117,36 @@ bool Screen::inGraphicsMode() static bool doSetTile_default(const Pen &pen, int x, int y, bool map) { - if (x < 0 || x >= gps->dimx || y < 0 || y >= gps->dimy) + size_t index = (x * gps->dimy) + y; + uint8_t *screen = &gps->screen[index * 8]; + + if (screen > gps->screen_limit) return false; if (map) { + //gps->main_viewport->screentexpos_interface return true; } - size_t index = (x * gps->dimy) + y; - - uint8_t *screen = &gps->screen[index * 8]; long *texpos = &gps->screentexpos[index]; + long *texpos_lower = &gps->screentexpos_lower[index]; uint32_t *flag = &gps->screentexpos_flag[index]; *screen = 0; *texpos = 0; + *texpos_lower = 0; *flag = 4; // remove SCREENTEXPOS_FLAG_ANCHOR_SUBORDINATE if (gps->top_in_use) { screen = &gps->screen_top[index * 8]; texpos = &gps->screentexpos_top[index]; + texpos_lower = &gps->screentexpos_top_lower[index]; flag = &gps->screentexpos_top_flag[index]; *screen = 0; *texpos = 0; + *texpos_lower = 0; *flag = 4; // remove SCREENTEXPOS_FLAG_ANCHOR_SUBORDINATE } @@ -154,6 +159,7 @@ static bool doSetTile_default(const Pen &pen, int x, int y, bool map) *texpos = pen.tile; } else { screen[0] = uint8_t(pen.ch); + *texpos_lower = 909; } // note that pen.bold currently (50.04) has no representation in the DF data From 99ffe769fa0b2b3763fc69f852f55f168be196ca Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 27 Dec 2022 15:23:34 -0800 Subject: [PATCH 4/5] rendering the parent now involves a full refresh in order to get the background --- library/lua/gui.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/library/lua/gui.lua b/library/lua/gui.lua index 1094004a9..709ff65f9 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -624,6 +624,7 @@ function Screen:renderParent() else dscreen.clear() end + df.global.gps.force_full_display_count = 1 end function Screen:sendInputToParent(...) From e2a4eeb42274cff2c9d5d785ac4d81e82d216f4a Mon Sep 17 00:00:00 2001 From: Myk Taylor Date: Tue, 27 Dec 2022 17:00:50 -0800 Subject: [PATCH 5/5] write textures and chars to the map --- library/modules/Screen.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/library/modules/Screen.cpp b/library/modules/Screen.cpp index 5e3eeecc4..653ab0bd3 100644 --- a/library/modules/Screen.cpp +++ b/library/modules/Screen.cpp @@ -115,20 +115,29 @@ bool Screen::inGraphicsMode() return init && init->display.flag.is_set(init_display_flags::USE_GRAPHICS); } +static bool doSetTile_map(const Pen &pen, int x, int y) { + size_t index = (x * gps->main_viewport->dim_y) + y; + long texpos = pen.tile; + if (texpos == 0) { + texpos = init->font.large_font_texpos[(uint8_t)pen.ch]; + } + gps->main_viewport->screentexpos_interface[index] = texpos; + return true; +} + static bool doSetTile_default(const Pen &pen, int x, int y, bool map) { + bool use_graphics = Screen::inGraphicsMode(); + + if (map && use_graphics) + return doSetTile_map(pen, x, y); + size_t index = (x * gps->dimy) + y; uint8_t *screen = &gps->screen[index * 8]; if (screen > gps->screen_limit) return false; - if (map) { - - //gps->main_viewport->screentexpos_interface - return true; - } - long *texpos = &gps->screentexpos[index]; long *texpos_lower = &gps->screentexpos_lower[index]; uint32_t *flag = &gps->screentexpos_flag[index]; @@ -155,7 +164,7 @@ static bool doSetTile_default(const Pen &pen, int x, int y, bool map) else if (pen.tile_mode == Screen::Pen::TileColor) *flag |= 1; // SCREENTEXPOS_FLAG_GRAYSCALE - if (pen.tile && init->display.flag.is_set(init_display_flags::USE_GRAPHICS)) { + if (pen.tile && use_graphics) { *texpos = pen.tile; } else { screen[0] = uint8_t(pen.ch);