set pdc->bkmode correctly before calling _gdi_draw_one_glyph()

This commit is contained in:
Vincent Wei
2022-11-27 16:31:27 +08:00
parent 84f3cf048a
commit e33d98a702
4 changed files with 45 additions and 17 deletions

View File

@@ -144,11 +144,12 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
case ACHAR_BASIC_VOWEL:
if (!ctxt->only_extent) {
// int bkmode = ctxt->pdc->bkmode;
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = BM_TRANSPARENT;
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
// ctxt->pdc->bkmode = bkmode;
ctxt->pdc->bkmode = bkmode;
adv_x = adv_y = 0;
}
break;
@@ -161,9 +162,12 @@ static BOOL cb_drawtextex2 (void* context, Glyph32 glyph_value,
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
}
else {
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
}
break;
}

View File

@@ -559,7 +559,6 @@ static void _glyph_draw_pixels (PDC pdc, int x, int y, gal_pixel pixel, int w)
pdc->cur_pixel = old_color;
}
pdc->cur_pixel = old_color;
}
#include "../newgal/blit.h"
@@ -1151,8 +1150,7 @@ static void _dc_ft2subpixel_scan_line(PDC pdc, int xpos, int ypos,
rgba_cur.g, rgba_cur.b);
if (pdc->cur_pixel != pixel) {
_glyph_draw_pixel (pdc,
x+xpos, ypos, pdc->cur_pixel);
_glyph_draw_pixel (pdc, x+xpos, ypos, pdc->cur_pixel);
}
}
@@ -2691,15 +2689,14 @@ int _gdi_draw_null_glyph (PDC pdc, int advance, BOOL direction,
if (WITHOUT_DRAWING (pdc)) goto end;
pdc->cur_pixel = pdc->bkcolor;
pdc->cur_ban = NULL;
pdc->step = 1;
if(!IntersectRect(&pdc->rc_output, &rc_back, &pdc->rc_output))
if (!IntersectRect(&pdc->rc_output, &rc_back, &pdc->rc_output))
goto end;
ENTER_DRAWING(pdc);
pdc->cur_pixel = pdc->bkcolor;
pdc->cur_ban = NULL;
pdc->step = 1;
draw_back_area (pdc, area, &gal_rc, 0, 0, flag);
LEAVE_DRAWING (pdc);
@@ -2968,7 +2965,7 @@ int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
int* adv_x, int* adv_y)
{
int my_adv_x, my_adv_y;
int advance;
int advance, bkmode;
PDC pdc;
if (glyph_value == INV_GLYPH_VALUE)
@@ -2982,9 +2979,12 @@ int GUIAPI DrawGlyph (HDC hdc, int x, int y, Glyph32 glyph_value,
/* convert to the start point on baseline. */
_gdi_get_baseline_point (pdc, &x, &y);
bkmode = pdc->bkmode;
pdc->bkmode = pdc->bkmode_set;
advance = _gdi_draw_one_glyph (pdc, glyph_value,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
x, y, &my_adv_x, &my_adv_y);
pdc->bkmode = bkmode;
if (adv_x) *adv_x = my_adv_x;
if (adv_y) *adv_y = my_adv_y;
@@ -2996,9 +2996,10 @@ int GUIAPI DrawGlyphStrings(HDC hdc, Glyph32* glyphs, int nr_glyphs,
const POINT* pts)
{
int count = 0;
int i;
int i, bkmode;
PDC pdc = dc_HDC2PDC(hdc);
bkmode = pdc->bkmode;
for (i = 0; i < nr_glyphs; i++) {
int x, y;
int my_adv_x, my_adv_y;
@@ -3019,10 +3020,12 @@ int GUIAPI DrawGlyphStrings(HDC hdc, Glyph32* glyphs, int nr_glyphs,
/* convert to the start point on baseline. */
_gdi_get_baseline_point (pdc, &x, &y);
pdc->bkmode = pdc->bkmode_set;
_gdi_draw_one_glyph (pdc, gv,
(pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
x, y, &my_adv_x, &my_adv_y);
}
pdc->bkmode = bkmode;
return count;
}

View File

@@ -175,9 +175,12 @@ static BOOL cb_tabbedtextout (void* context, Glyph32 glyph_value,
ctxt->x, ctxt->y, &adv_x, &adv_y, &bbox);
}
else {
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
}
break;
}
@@ -224,11 +227,14 @@ static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
/* use some tabs to move current x. */
if (ctxt->advance >= tab_pos) {
while (ctxt->advance >= tab_pos)
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ? ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ?
ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
}
else {
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ? ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
tab_pos += (ctxt->nr_tab >= ctxt->nTabs) ?
ctxt->tab_width : ctxt->pTabPos[ctxt->nr_tab++];
}
_gdi_draw_null_glyph (ctxt->pdc, tab_pos - ctxt->advance,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
@@ -237,18 +243,26 @@ static BOOL cb_tabbedtextoutex (void* context, Glyph32 glyph_value,
ctxt->nTabOrig = tab_pos;
break;
case ACHAR_BASIC_VOWEL:
case ACHAR_BASIC_VOWEL: {
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = BM_TRANSPARENT;
_gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
adv_x = adv_y = 0;
break;
}
default:
default: {
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
break;
}
}
ctxt->x += adv_x;

View File

@@ -179,10 +179,14 @@ static BOOL cb_textout (void* context, Glyph32 glyph_value,
ctxt->advance += _gdi_get_glyph_advance (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
0, 0, &adv_x, &adv_y, NULL);
else
else {
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
}
}
ctxt->x += adv_x;
@@ -342,9 +346,12 @@ static BOOL cb_textout_omitted (void* context, Glyph32 glyph_value, unsigned int
if((ctxt->advance + glyph_advance) > ctxt->max_extent)
return FALSE;
int bkmode = ctxt->pdc->bkmode;
ctxt->pdc->bkmode = ctxt->pdc->bkmode_set;
ctxt->advance += _gdi_draw_one_glyph (ctxt->pdc, glyph_value,
(ctxt->pdc->ta_flags & TA_X_MASK) != TA_RIGHT,
ctxt->x, ctxt->y, &adv_x, &adv_y);
ctxt->pdc->bkmode = bkmode;
}
ctxt->x += adv_x;