ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/rxvtfont.C
(Generate patch)

Comparing rxvt-unicode/src/rxvtfont.C (file contents):
Revision 1.94 by root, Thu Feb 2 18:04:46 2006 UTC vs.
Revision 1.96 by root, Sat Feb 18 15:24:39 2006 UTC

163#define dTermDisplay Display *disp = term->dpy 163#define dTermDisplay Display *disp = term->dpy
164#define dTermGC GC gc = term->gc 164#define dTermGC GC gc = term->gc
165 165
166///////////////////////////////////////////////////////////////////////////// 166/////////////////////////////////////////////////////////////////////////////
167 167
168#if XFT
169rxvt_drawable::~rxvt_drawable ()
170{
171 if (xftdrawable)
172 XftDrawDestroy (xftdrawable);
173}
174
175rxvt_drawable::operator XftDraw *()
176{
177 if (!xftdrawable)
178 xftdrawable = XftDrawCreate (screen->dpy, drawable, screen->visual, screen->cmap);
179
180 return xftdrawable;
181}
182#endif
183
184/////////////////////////////////////////////////////////////////////////////
185
186static const char * 168static const char *
187enc_char (const text_t *text, uint32_t len, codeset cs, bool &zero) 169enc_char (const text_t *text, uint32_t len, codeset cs, bool &zero)
188{ 170{
189 uint8_t *buf = rxvt_temp_buf<uint8_t> (len); 171 uint8_t *buf = rxvt_temp_buf<uint8_t> (len);
190 uint8_t *res = buf; 172 uint8_t *res = buf;
250rxvt_font::clear_rect (rxvt_drawable &d, int x, int y, int w, int h, int color) const 232rxvt_font::clear_rect (rxvt_drawable &d, int x, int y, int w, int h, int color) const
251{ 233{
252 dTermDisplay; 234 dTermDisplay;
253 dTermGC; 235 dTermGC;
254 236
255 if (color == Color_bg) 237 if (color < 0 || color == Color_bg)
256 XClearArea (disp, d, x, y, w, h, false); 238 XClearArea (disp, d, x, y, w, h, false);
257 else if (color >= 0) 239 else
258 { 240 {
259#if XFT 241#if XFT
260 XftDrawRect (d, &term->pix_colors[color].c, x, y, w, h); 242 XftDrawRect (d, &term->pix_colors[color].c, x, y, w, h);
261#else 243#else
262 XSetForeground (disp, gc, term->pix_colors[color]); 244 XSetForeground (disp, gc, term->pix_colors[color]);
1282void 1264void
1283rxvt_font_xft::draw (rxvt_drawable &d, int x, int y, 1265rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
1284 const text_t *text, int len, 1266 const text_t *text, int len,
1285 int fg, int bg) 1267 int fg, int bg)
1286{ 1268{
1287 clear_rect (d, x, y, term->fwidth * len, term->fheight, bg);
1288
1289 XGlyphInfo extents; 1269 XGlyphInfo extents;
1290 XftGlyphSpec *enc = (XftGlyphSpec *)rxvt_temp_buf (len * sizeof (XftGlyphSpec)); 1270 XftGlyphSpec *enc = (XftGlyphSpec *)rxvt_temp_buf (len * sizeof (XftGlyphSpec));
1291 XftGlyphSpec *ep = enc; 1271 XftGlyphSpec *ep = enc;
1292 1272
1293 dTermDisplay; 1273 dTermDisplay;
1294 dTermGC; 1274 dTermGC;
1295 1275
1276 int w = term->fwidth * len;
1277 int h = term->fheight;
1278
1279 bool buffered = !term->am_transparent // we aren't transparent
1280 || term->am_pixmap_trans // we have a pixmap
1281 || bg >= 0; // we don't use a transparent bg
1282
1296 // cut trailing spaces 1283 // cut trailing spaces
1297 while (len && text [len - 1] == ' ') 1284 while (len && text [len - 1] == ' ')
1298 len--; 1285 len--;
1286
1287 int x_ = buffered ? 0 : x;
1288 int y_ = buffered ? 0 : y;
1299 1289
1300 while (len) 1290 while (len)
1301 { 1291 {
1302 int cwidth = term->fwidth; 1292 int cwidth = term->fwidth;
1303 FcChar32 fc = *text++; len--; 1293 FcChar32 fc = *text++; len--;
1309 { 1299 {
1310 FT_UInt glyph = XftCharIndex (disp, f, fc); 1300 FT_UInt glyph = XftCharIndex (disp, f, fc);
1311 XftGlyphExtents (disp, f, &glyph, 1, &extents); 1301 XftGlyphExtents (disp, f, &glyph, 1, &extents);
1312 1302
1313 ep->glyph = glyph; 1303 ep->glyph = glyph;
1314 ep->x = x + (cwidth - extents.xOff >> 1); 1304 ep->x = x_ + (cwidth - extents.xOff >> 1);
1315 ep->y = y + ascent; 1305 ep->y = y_ + ascent;
1316 1306
1317 if (extents.xOff == 0) 1307 if (extents.xOff == 0)
1318 ep->x = x + cwidth; 1308 ep->x = x_ + cwidth;
1319 1309
1320 ep++; 1310 ep++;
1321 } 1311 }
1322 1312
1323 x += cwidth; 1313 x_ += cwidth;
1314 }
1315
1316 if (buffered)
1324 } 1317 {
1325
1326 if (ep != enc) 1318 if (ep != enc)
1319 {
1320 rxvt_drawable &d2 = d.screen->scratch_drawable (w, h);
1321
1322 if (bg < 0 && term->am_pixmap_trans)
1323 XCopyArea (disp, term->pixmap, d2, gc, x, y, w, h, 0, 0);
1324 else if (bg < 0 && term->bgPixmap.pixmap)
1325 {
1326 XGCValues gcv;
1327
1328 gcv.fill_style = FillTiled;
1329 gcv.tile = term->pixmap;
1330 gcv.ts_x_origin = -x;
1331 gcv.ts_y_origin = -y;
1332
1333 GC gc2 = XCreateGC (disp, d2,
1334 GCTile | GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle,
1335 &gcv);
1336
1337 XFillRectangle (disp, d2, gc2, 0, 0, w, h);
1338
1339 XFreeGC (disp, gc2);
1340 }
1341 else
1342 XftDrawRect (d2, &term->pix_colors[bg].c, 0, 0, w, h);
1343
1344 XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc);
1345 XCopyArea (disp, d2, d, gc, 0, 0, w, h, x, y);
1346 }
1347 else
1348 clear_rect (d, x, y, w, h, bg);
1349 }
1350 else
1351 {
1352 clear_rect (d, x, y, w, h, bg);
1327 XftDrawGlyphSpec (d, &term->pix_colors[fg].c, f, enc, ep - enc); 1353 XftDrawGlyphSpec (d, &term->pix_colors[fg].c, f, enc, ep - enc);
1354 }
1328} 1355}
1356
1329#endif 1357#endif
1330 1358
1331///////////////////////////////////////////////////////////////////////////// 1359/////////////////////////////////////////////////////////////////////////////
1332 1360
1333rxvt_fontset::rxvt_fontset (rxvt_term *term) 1361rxvt_fontset::rxvt_fontset (rxvt_term *term)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines