#include "bctimer.h"
#include "bcwindowbase.h"
#include "clip.h"
-#include "colors.h"
+#include "bccolors.h"
#include "cursors.h"
#include "fonts.h"
#include "vframe.h"
#include <string.h>
#include <wchar.h>
#include <ft2build.h>
+#include "workarounds.h"
void BC_WindowBase::copy_area(int x1, int y1, int x2, int y2, int w, int h, BC_Pixmap *pixmap)
{
{
int dy = -1;
const wchar_t *wsp = text, *wep = wsp + length;
+ int font = top_level->current_font;
while( wsp < wep ) {
const wchar_t *wcp = wsp;
while( wcp < wep && *wcp != '\n' ) ++wcp;
int len = wcp - wsp;
if( len > 0 )
- draw_wtext(x, y, wsp, len, pixmap);
+ draw_single_text(1, font, x, y, wsp, len, pixmap);
if( wcp >= wep ) break;
if( dy < 0 )
- dy = get_text_height(top_level->current_font);
+ dy = get_text_height(font);
y += dy;
wsp = wcp + 1;
}
if( values.function != GXcopy ) {
XSetFunction(top_level->display, top_level->gc, GXcopy);
XGlyphInfo info;
- XftTextExtents32(top_level->display, xft_font, fc, len, &info);
+ xftTextExtents32(top_level->display, xft_font, fc, len, &info);
src_w = info.width; src_h = info.height;
draw_pixmap = XCreatePixmap(top_level->display, top_level->win,
src_w, src_h, top_level->default_depth);
int color = get_color(); set_color(0);
XFillRectangle(top_level->display, draw_pixmap, top_level->gc, 0, 0, src_w, src_h);
set_color(color);
- xft_draw = XftDrawCreate(top_level->display, draw_pixmap,
+ xft_draw = xftDrawCreate(top_level->display, draw_pixmap,
top_level->vis, top_level->cmap);
src_x = info.x; src_y = info.y;
}
- XftDrawString32(xft_draw, xft_color, xft_font, src_x, src_y, fc, len);
+ xftDrawString32(xft_draw, xft_color, xft_font, src_x, src_y, fc, len);
if( values.function != GXcopy ) {
XSetFunction(top_level->display, top_level->gc, values.function);
Pixmap xpixmap = pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap;
XCopyArea(top_level->display, draw_pixmap, xpixmap,
top_level->gc, 0, 0, src_w, src_h, x, y);
XFreePixmap(top_level->display, draw_pixmap);
- XftDrawDestroy(xft_draw);
+ xftDrawDestroy(xft_draw);
}
}
int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int length)
{
- if( length < 0 )
- length = wcslen(text);
- if( !length ) return 0;
-
- if( !get_resources()->use_xft ) {
- if( !get_font_struct(font) ) return 0;
- XChar2b xtext[length], *xp = xtext;
- for( int i=0; i<length; ++i,++xp ) {
- xp->byte1 = (unsigned char) (text[i] >> 8);
- xp->byte2 = (unsigned char) (text[i] & 0xff);
- }
- return XTextWidth16(get_font_struct(font), xtext, length);
- }
- int x = 0;
-#ifdef HAVE_XFT
- XftFont *basefont = top_level->get_xft_struct(font);
- XftFont *curfont = 0, *altfont = 0;
- const wchar_t *up = text, *ubp = up, *uep = ubp + length;
-
- while( up < uep ) {
- XftFont *xft_font = 0;
- if( XftCharExists(top_level->display, basefont, *up) )
- xft_font = basefont;
- else if( altfont ) {
- if( XftCharExists(top_level->display, altfont, *up))
- xft_font = altfont;
- else {
- XftFontClose(top_level->display, altfont);
- altfont = 0;
- }
- }
- if( !xft_font ) {
- FcPattern *pattern = BC_Resources::find_similar_font(*up, basefont->pattern);
- if( pattern != 0 ) {
- double psize = 0;
- FcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize);
- FcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize);
- FcPatternDel(pattern, FC_SCALABLE);
- xft_font = altfont = XftFontOpenPattern(top_level->display, pattern);
- }
- }
- if( !xft_font )
- xft_font = basefont;
- if( xft_font != curfont ) {
- if( curfont && up > ubp ) {
- XGlyphInfo extents;
- XftTextExtents32(top_level->display, curfont,
- (const FcChar32*)ubp, up-ubp, &extents);
- x += extents.xOff;
- }
- ubp = up; curfont = xft_font;
- }
- ++up;
- }
-
- if( curfont && up > ubp ) {
- XGlyphInfo extents;
- XftTextExtents32(top_level->display, curfont,
- (const FcChar32*)ubp, up-ubp, &extents);
- x += extents.xOff;
- }
-
- if( altfont )
- XftFontClose(top_level->display, altfont);
-#endif
- return x;
+ return draw_single_text(0, font, 0,0, text, length);
}
-void BC_WindowBase::draw_wtext(int x, int y,
- const wchar_t *text, int length, BC_Pixmap *pixmap)
+int BC_WindowBase::draw_single_text(int draw, int font,
+ int x, int y, const wchar_t *text, int length, BC_Pixmap *pixmap)
{
if( length < 0 )
length = wcslen(text);
- if( !length ) return;
+ if( !length ) return 0;
- int font = top_level->current_font;
if( !get_resources()->use_xft ) {
- if( !get_font_struct(font) ) return;
+ if( !get_font_struct(font) ) return 0;
XChar2b xtext[length], *xp = xtext;
for( int i=0; i<length; ++i,++xp ) {
xp->byte1 = (unsigned char) (text[i] >> 8);
xp->byte2 = (unsigned char) (text[i] & 0xff);
}
- XDrawString16(top_level->display,
- pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap,
- top_level->gc, x, y, xtext, length);
- return;
+ if( draw ) {
+ XDrawString16(top_level->display,
+ pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap,
+ top_level->gc, x, y, xtext, length);
+ }
+ return XTextWidth16(get_font_struct(font), xtext, length);
}
#ifdef HAVE_XFT
- XRenderColor color;
- color.red = (top_level->current_color & 0xff0000) >> 16;
- color.red |= color.red << 8;
- color.green = (top_level->current_color & 0xff00) >> 8;
- color.green |= color.green << 8;
- color.blue = (top_level->current_color & 0xff);
- color.blue |= color.blue << 8;
- color.alpha = 0xffff;
-
XftColor xft_color;
- XftColorAllocValue(top_level->display, top_level->vis, top_level->cmap,
- &color, &xft_color);
+ if( draw ) {
+ XRenderColor color;
+ color.red = (top_level->current_color & 0xff0000) >> 16;
+ color.red |= color.red << 8;
+ color.green = (top_level->current_color & 0xff00) >> 8;
+ color.green |= color.green << 8;
+ color.blue = (top_level->current_color & 0xff);
+ color.blue |= color.blue << 8;
+ color.alpha = 0xffff;
+
+ xftColorAllocValue(top_level->display, top_level->vis, top_level->cmap,
+ &color, &xft_color);
+ }
+ int x0 = x;
XftFont *basefont = top_level->get_xft_struct(font);
XftFont *curfont = 0, *altfont = 0;
const wchar_t *up = text, *ubp = up, *uep = ubp + length;
while( up < uep ) {
XftFont *xft_font = 0;
- if( XftCharExists(top_level->display, basefont, *up) )
+ if( xftCharExists(top_level->display, basefont, *up) )
xft_font = basefont;
else if( altfont ) {
- if( XftCharExists(top_level->display, altfont, *up))
+ if( xftCharExists(top_level->display, altfont, *up))
xft_font = altfont;
else {
- XftFontClose(top_level->display, altfont);
+ xftFontClose(top_level->display, altfont);
altfont = 0;
}
}
FcPattern *pattern = BC_Resources::find_similar_font(*up, basefont->pattern);
if( pattern != 0 ) {
double psize = 0;
- FcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize);
- FcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize);
- FcPatternDel(pattern, FC_SCALABLE);
- xft_font = altfont = XftFontOpenPattern(top_level->display, pattern);
+ fcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize);
+ fcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize);
+ fcPatternDel(pattern, FC_SCALABLE);
+ xft_font = altfont = xftFontOpenPattern(top_level->display, pattern);
}
}
if( !xft_font )
xft_font = basefont;
if( xft_font != curfont ) {
if( curfont && up > ubp ) {
- xft_draw_string(&xft_color, curfont, x, y,
- (const FcChar32*)ubp, up-ubp, pixmap);
+ if( draw ) {
+ xft_draw_string(&xft_color, curfont, x, y,
+ (const FcChar32*)ubp, up-ubp, pixmap);
+ }
XGlyphInfo extents;
- XftTextExtents32(top_level->display, curfont,
+ xftTextExtents32(top_level->display, curfont,
(const FcChar32*)ubp, up-ubp, &extents);
x += extents.xOff;
}
}
if( curfont && up > ubp ) {
- xft_draw_string(&xft_color, curfont, x, y,
- (const FcChar32*)ubp, up-ubp, pixmap);
+ if( draw ) {
+ xft_draw_string(&xft_color, curfont, x, y,
+ (const FcChar32*)ubp, up-ubp, pixmap);
+ }
+ XGlyphInfo extents;
+ xftTextExtents32(top_level->display, curfont,
+ (const FcChar32*)ubp, up-ubp, &extents);
+ x += extents.xOff;
}
if( altfont )
- XftFontClose(top_level->display, altfont);
+ xftFontClose(top_level->display, altfont);
- XftColorFree(top_level->display, top_level->vis, top_level->cmap, &xft_color);
+ xftColorFree(top_level->display, top_level->vis, top_level->cmap, &xft_color);
#endif
+ return x - x0;
}
void BC_WindowBase::truncate_text(char *result, const char *text, int w)
// Hide cursor if video enabled
update_video_cursor();
-//printf("BC_WindowBase::draw_bitmap 1\n");
+//printf("BC_WindowBase::draw_bitmap %d dest_y=%d\n", __LINE__, dest_y);
if(dest_w <= 0 || dest_h <= 0)
{
// Use hardware scaling to canvas dimensions if proper color model.