diff --git a/src/newgdi/drawtext.c b/src/newgdi/drawtext.c index 83becfe9..00375c5b 100644 --- a/src/newgdi/drawtext.c +++ b/src/newgdi/drawtext.c @@ -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; } diff --git a/src/newgdi/glyph.c b/src/newgdi/glyph.c index 52d2e44c..7bdcf2bd 100644 --- a/src/newgdi/glyph.c +++ b/src/newgdi/glyph.c @@ -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; } diff --git a/src/newgdi/tabbedtextout.c b/src/newgdi/tabbedtextout.c index 90779216..a582d446 100644 --- a/src/newgdi/tabbedtextout.c +++ b/src/newgdi/tabbedtextout.c @@ -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; diff --git a/src/newgdi/textout.c b/src/newgdi/textout.c index 76066d57..18abd155 100644 --- a/src/newgdi/textout.c +++ b/src/newgdi/textout.c @@ -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;