void Graphics::drawText(const char_t* text, ulong_t length, const Point& topLeft, bool inverted) { FontEffects fx = font_.effects(); PalmUnderlineSetter setUnderline(convertUnderlineMode(fx.underline())); ScalingSetter setScaling(*this); uint_t height = fontHeight(); uint_t top=topLeft.y; if (fx.subscript()) top+=(height/3); if (inverted) WinDrawInvertedChars(text, length, topLeft.x, top); else WinDrawChars(text, length, topLeft.x, top); if (fx.strikeOut()) { uint_t baseline = fontBaseline(); top=topLeft.y + (baseline*2)/3; uint_t width = FntCharsWidth(text, length); Color_t color=setTextColor(0); setTextColor(color); // Quite strange method of querying current text color... color=setForegroundColor(color); WinDrawOperation old; if (inverted) old=WinSetDrawMode(winInvert); drawLine(topLeft.x, top, topLeft.x+width, top); if (inverted) WinSetDrawMode(old); setForegroundColor(color); } }
// Equivalent of "at". static void put_char_at(Short row, Short col, Char ch, Boolean bold) { Short cheat, vcheat = DunTopY + (itsy_on ? 0 : 0);//center the map vertically RectangleType r; Short vc_w = itsy_on ? visible_char_w_itsy : visible_char_w; Short vc_h = itsy_on ? visible_char_h_itsy : visible_char_h; RctSetRectangle(&r, col * vc_w, row*vc_h+vcheat, vc_w, vc_h); if (!my_prefs.black_bg || IsColor) WinEraseRectangle(&r, 0); else WinDrawRectangle(&r, 0); // calculate pixel position of "row, col" and put char there cheat = vc_w - FntCharWidth(ch); // center the variable width characters if (cheat <= 1) cheat = 0; else cheat /= 2; if (ch != ' ') { #ifdef I_AM_COLOR // if (IsColor) { // WinSetTextColor(get_color(ch, col+visible_x, row+visible_y)); // } #endif if (!itsy_on && (ch== 'g' || ch== 'j' || ch== 'p' ||ch == 'q' ||ch == 'y')) vcheat--; // unfortunately, letters with dangling bits are a pain. if (!my_prefs.black_bg || IsColor) WinDrawChars(&ch, 1, col * vc_w + cheat, row * vc_h+vcheat); else WinDrawInvertedChars(&ch, 1, col * vc_w + cheat, row * vc_h+vcheat); if (bold) WinInvertRectangle(&r, 0); /* 0 for square corners */ } terminal[row][col] = ch; }