const char *text, int length, BC_Pixmap *pixmap, int is_utf8)
{
int l = length + 1;
- wchar_t wide_text[l];
+ wchr_t wide_text[l];
length = BC_Resources::encode(
is_utf8 ? "UTF8" : BC_Resources::encoding, BC_Resources::wide_encoding,
- (char*)text, length, (char*)wide_text, l*sizeof(wchar_t)) / sizeof(wchar_t);
+ (char*)text, length, (char*)wide_text, l*sizeof(wchr_t)) / sizeof(wchr_t);
draw_xft_text(x, y, wide_text, length, pixmap);
}
void BC_WindowBase::draw_xft_text(int x, int y,
- const wchar_t *text, int length, BC_Pixmap *pixmap)
+ const wchr_t *text, int length, BC_Pixmap *pixmap)
{
int dy = -1;
- const wchar_t *wsp = text, *wep = wsp + length;
+ const wchr_t *wsp = text, *wep = wsp + length;
int font = top_level->current_font;
while( wsp < wep ) {
- const wchar_t *wcp = wsp;
+ const wchr_t *wcp = wsp;
while( wcp < wep && *wcp != '\n' ) ++wcp;
int len = wcp - wsp;
if( len > 0 )
}
}
-int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int length)
+int BC_WindowBase::get_single_text_width(int font, const wchr_t *text, int length)
{
return draw_single_text(0, font, 0,0, text, length);
}
int BC_WindowBase::draw_single_text(int draw, int font,
- int x, int y, const wchar_t *text, int length, BC_Pixmap *pixmap)
+ int x, int y, const wchr_t *text, int length, BC_Pixmap *pixmap)
{
if( length < 0 )
- length = wcslen(text);
+ length = wstrlen(text);
if( !length ) return 0;
if( !get_resources()->use_xft ) {
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;
+ const wchr_t *up = text, *ubp = up, *uep = ubp + length;
while( up < uep ) {
XftFont *xft_font = 0;
return x - x0;
}
-void BC_WindowBase::truncate_text(char *result, const char *text, int w)
-{
- int new_w = get_text_width(current_font, text);
-
- if( new_w > w ) {
- const char* separator = "...";
- int separator_w = get_text_width(current_font, separator);
-// can't fit
- if( separator_w >= w ) {
- strcpy(result, separator);
- return;
- }
-
- int text_len = strlen(text);
-// widen middle gap until it fits
- for( int i=text_len/2; i>0; --i ) {
- strncpy(result, text, i);
- result[i] = 0;
- strcat(result, separator);
- strncat(result, text + text_len - i, i);
- result[i + strlen(separator) + i] = 0;
- new_w = get_text_width(current_font, result);
-//printf("BC_WindowBase::truncate_text %d %d %d %s\n", __LINE__, new_w, w, result);
- if(new_w < w) return;
- }
-
-// Didn't fit
- strcpy(result, separator);
- return;
- }
-
- strcpy(result, text);
-}
-
void BC_WindowBase::draw_center_text(int x, int y, const char *text, int length)
{
if(length < 0) length = strlen(text);
draw_text(x, y, text, length);
}
+void BC_WindowBase::draw_pix(int x, int y, BC_Pixmap *pixmap)
+{ // draw_pixel, no BT test
+ XDrawPoint(top_level->display,
+ pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap,
+ top_level->gc, x, y);
+}
+
void BC_WindowBase::draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap)
{ BT
// Some X drivers can't draw 0 length lines
if( x1 == x2 && y1 == y2 ) {
- draw_pixel(x1, y1, pixmap);
+ draw_pix(x1, y1, pixmap);
}
else {
XDrawLine(top_level->display,
}
}
+void BC_WindowBase::draw_bline(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap)
+{ BT
+// Short lines are all overhead to hw or sw setup, use bresenhams
+ if( y1 > y2 ) {
+ int tx = x1; x1 = x2; x2 = tx;
+ int ty = y1; y1 = y2; y2 = ty;
+ }
+
+ int x = x1, y = y1;
+ int dx = x2-x1, dy = y2-y1;
+ int dx2 = 2*dx, dy2 = 2*dy;
+ if( dx < 0 ) dx = -dx;
+ int r = dx > dy ? dx : dy, n = r;
+ int dir = 0;
+ if( dx2 < 0 ) dir += 1;
+ if( dy >= dx ) {
+ if( dx2 >= 0 ) do { /* +Y, +X */
+ draw_pix(x, y++, pixmap);
+ if( (r -= dx2) < 0 ) { r += dy2; ++x; }
+ } while( --n >= 0 );
+ else do { /* +Y, -X */
+ draw_pix(x, y++, pixmap);
+ if( (r += dx2) < 0 ) { r += dy2; --x; }
+ } while( --n >= 0 );
+ }
+ else {
+ if( dx2 >= 0 ) do { /* +X, +Y */
+ draw_pix(x++, y, pixmap);
+ if( (r -= dy2) < 0 ) { r += dx2; ++y; }
+ } while( --n >= 0 );
+ else do { /* -X, +Y */
+ draw_pix(x--, y, pixmap);
+ if( (r -= dy2) < 0 ) { r -= dx2; ++y; }
+ } while( --n >= 0 );
+ }
+}
+
void BC_WindowBase::draw_polygon(ArrayList<int> *x, ArrayList<int> *y, BC_Pixmap *pixmap)
{ BT
int npoints = MIN(x->total, y->total);