From 4d1565a4e13d50f482e9f2118121891825057adc Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 26 Nov 2002 01:32:51 +0000 Subject: [PATCH] Substantial overhaul of colour handling in do_text(). Highlights include: * No more mucking about with transfer modes. We always set up the foreground and background sensibly, EraseRect the whole lot and use srcOr. Apple Tech Note QD505 suggests that this should be faster than srcCopy. * Always use the Palette Manager if we've got Color QuickDraw, even in 1bpp modes. * Apply the cursor colours _after_ all the other stuff, rather than trying to get them through everything else intact. Unfortunately, this doesn't make much difference to the speed. git-svn-id: svn://svn.tartarus.org/sgt/putty@2259 cda61777-01e9-0310-a592-d414129be87e --- mac/macterm.c | 76 ++++++++++++++++++++++++++--------------------------------- 1 file changed, 34 insertions(+), 42 deletions(-) diff --git a/mac/macterm.c b/mac/macterm.c index 0ddb789c..299debfe 100644 --- a/mac/macterm.c +++ b/mac/macterm.c @@ -1,4 +1,4 @@ -/* $Id: macterm.c,v 1.11 2002/11/24 00:38:44 ben Exp $ */ +/* $Id: macterm.c,v 1.12 2002/11/26 01:32:51 ben Exp $ */ /* * Copyright (c) 1999 Simon Tatham * Copyright (c) 1999, 2002 Ben Harris @@ -793,7 +793,6 @@ static void mac_drawgrowicon(Session *s) { struct do_text_args { Session *s; Rect textrect; - Rect leadrect; char *text; int len; unsigned long attr; @@ -827,12 +826,6 @@ void do_text(Context ctx, int x, int y, char *text, int len, a.len = len; a.attr = attr; a.lattr = lattr; - if (s->font_leading > 0) - SetRect(&a.leadrect, - a.textrect.left, a.textrect.bottom - s->font_leading, - a.textrect.right, a.textrect.bottom); - else - SetRect(&a.leadrect, 0, 0, 0, 0); SetPort(s->window); TextFont(s->fontnum); if (s->cfg.fontisbold || (attr & ATTR_BOLD) && !s->cfg.bold_colour) @@ -841,6 +834,7 @@ void do_text(Context ctx, int x, int y, char *text, int len, style |= underline; TextFace(style); TextSize(s->cfg.fontheight); + TextMode(srcOr); SetFractEnable(FALSE); /* We want characters on pixel boundaries */ if (HAVE_COLOR_QD()) if (style & bold) { @@ -864,55 +858,53 @@ void do_text(Context ctx, int x, int y, char *text, int len, static pascal void do_text_for_device(short depth, short devflags, GDHandle device, long cookie) { struct do_text_args *a; - int bgcolour, fgcolour, bright; + int bgcolour, fgcolour, bright, reverse, tmp; a = (struct do_text_args *)cookie; bright = (a->attr & ATTR_BOLD) && a->s->cfg.bold_colour; + reverse = a->attr & ATTR_REVERSE; - TextMode(a->attr & ATTR_REVERSE ? notSrcCopy : srcCopy); + if (depth == 1 && (a->attr & TATTR_ACTCURS)) + reverse = !reverse; - switch (depth) { - case 1: - /* XXX This should be done with a _little_ more configurability */ - ForeColor(whiteColor); - BackColor(blackColor); - if (a->attr & TATTR_ACTCURS) - TextMode(a->attr & ATTR_REVERSE ? srcCopy : notSrcCopy); - break; - case 2: - if (a->attr & TATTR_ACTCURS) { - PmForeColor(CURSOR_FG); - PmBackColor(CURSOR_BG); - TextMode(srcCopy); + if (HAVE_COLOR_QD()) { + if (depth > 2) { + fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; + bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; } else { - PmForeColor(bright ? DEFAULT_FG_BOLD : DEFAULT_FG); - PmBackColor(DEFAULT_BG); + /* + * NB: bold reverse in 2bpp breaks with the usual PuTTY model and + * boldens the background, because that's all we can do. + */ + fgcolour = bright ? DEFAULT_FG_BOLD : DEFAULT_FG; + bgcolour = DEFAULT_BG; } - break; - default: - if (a->attr & TATTR_ACTCURS) { + if (reverse) { + tmp = fgcolour; + fgcolour = bgcolour; + bgcolour = tmp; + } + if (bright && depth > 2) + fgcolour++; + if ((a->attr & TATTR_ACTCURS) && depth > 1) { fgcolour = CURSOR_FG; bgcolour = CURSOR_BG; - TextMode(srcCopy); - } else { - fgcolour = ((a->attr & ATTR_FGMASK) >> ATTR_FGSHIFT) * 2; - bgcolour = ((a->attr & ATTR_BGMASK) >> ATTR_BGSHIFT) * 2; - if (bright) - if (a->attr & ATTR_REVERSE) - bgcolour++; - else - fgcolour++; } PmForeColor(fgcolour); PmBackColor(bgcolour); - break; + } else { /* No Color Quickdraw */ + /* XXX This should be done with a _little_ more configurability */ + if (reverse) { + ForeColor(blackColor); + BackColor(whiteColor); + } else { + ForeColor(whiteColor); + BackColor(blackColor); + } } - if (a->attr & ATTR_REVERSE) - PaintRect(&a->leadrect); - else - EraseRect(&a->leadrect); + EraseRect(&a->textrect); MoveTo(a->textrect.left, a->textrect.top + a->s->font_ascent); /* FIXME: Sort out bold width adjustments on Original QuickDraw. */ DrawText(a->text, 0, a->len); -- 2.11.0