Fourth try to add pang_x.cpp
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@17779 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
276
src/x11/pango_x.cpp
Normal file
276
src/x11/pango_x.cpp
Normal file
@@ -0,0 +1,276 @@
|
||||
/**
|
||||
* This file gets included from dcclient.cpp and implements
|
||||
* the X11 interface to Pango.
|
||||
* Copyright (C) Owen Taylor and Robert Roebling.
|
||||
*/
|
||||
|
||||
/* Declaration */
|
||||
|
||||
void
|
||||
x11_draw_glyphs( Drawable drawable,
|
||||
GC gc,
|
||||
PangoFont *font,
|
||||
int x,
|
||||
int y,
|
||||
PangoGlyphString *glyphs);
|
||||
|
||||
void
|
||||
x11_draw_layout_line_with_colors( Drawable drawable,
|
||||
GC gc,
|
||||
int x,
|
||||
int y,
|
||||
PangoLayoutLine *line,
|
||||
XColor *foreground,
|
||||
XColor *background);
|
||||
|
||||
void
|
||||
x11_draw_layout_with_colors( Drawable drawable,
|
||||
GC gc,
|
||||
int x,
|
||||
int y,
|
||||
PangoLayout *layout,
|
||||
XColor *foreground,
|
||||
XColor *background);
|
||||
|
||||
void
|
||||
x11_draw_layout( Drawable drawable,
|
||||
GC gc,
|
||||
int x,
|
||||
int y,
|
||||
PangoLayout *layout);
|
||||
|
||||
void
|
||||
x11_pango_get_item_properties( PangoItem *item,
|
||||
PangoUnderline *uline,
|
||||
gboolean *strikethrough,
|
||||
gint *rise,
|
||||
PangoColor *fg_color,
|
||||
gboolean *fg_set,
|
||||
PangoColor *bg_color,
|
||||
gboolean *bg_set,
|
||||
gboolean *shape_set,
|
||||
PangoRectangle *ink_rect,
|
||||
PangoRectangle *logical_rect);
|
||||
|
||||
/* Implementation */
|
||||
|
||||
void
|
||||
x11_draw_glyphs( Drawable drawable,
|
||||
GC gc,
|
||||
PangoFont *font,
|
||||
int x,
|
||||
int y,
|
||||
PangoGlyphString *glyphs)
|
||||
{
|
||||
if (PANGO_XFT_IS_FONT (font))
|
||||
{
|
||||
pango_xft_picture_render( wxGlobalDisplay(), drawable, drawable, font, glyphs, x, y );
|
||||
}
|
||||
else
|
||||
{
|
||||
pango_x_render( wxGlobalDisplay(), drawable, gc, font, glyphs, x, y );
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
x11_draw_layout_line_with_colors( Drawable drawable,
|
||||
GC gc,
|
||||
int x,
|
||||
int y,
|
||||
PangoLayoutLine *line,
|
||||
XColor *foreground,
|
||||
XColor *background)
|
||||
{
|
||||
PangoRectangle overall_rect;
|
||||
PangoRectangle logical_rect;
|
||||
PangoRectangle ink_rect;
|
||||
PangoContext *context;
|
||||
gint x_off = 0;
|
||||
gint rise = 0;
|
||||
|
||||
context = pango_layout_get_context (line->layout);
|
||||
|
||||
pango_layout_line_get_extents (line,NULL, &overall_rect);
|
||||
|
||||
GSList *tmp_list = line->runs;
|
||||
while (tmp_list)
|
||||
{
|
||||
PangoUnderline uline = PANGO_UNDERLINE_NONE;
|
||||
PangoLayoutRun *run = (PangoLayoutRun *) tmp_list->data;
|
||||
PangoColor fg_color, bg_color;
|
||||
gboolean strike, fg_set, bg_set, shape_set;
|
||||
gint risen_y;
|
||||
|
||||
tmp_list = tmp_list->next;
|
||||
|
||||
x11_pango_get_item_properties (run->item, &uline,
|
||||
&strike, &rise, &fg_color, &fg_set, &bg_color, &bg_set,
|
||||
&shape_set, &ink_rect, &logical_rect);
|
||||
|
||||
/* we subtract the rise because X coordinates are upside down */
|
||||
risen_y = y - rise / PANGO_SCALE;
|
||||
|
||||
if (!shape_set)
|
||||
{
|
||||
if (uline == PANGO_UNDERLINE_NONE)
|
||||
pango_glyph_string_extents (run->glyphs, run->item->analysis.font, NULL, &logical_rect);
|
||||
else
|
||||
pango_glyph_string_extents (run->glyphs, run->item->analysis.font, &ink_rect, &logical_rect);
|
||||
}
|
||||
|
||||
#if 0
|
||||
XDrawRectangle( drawable, gc, TRUE,
|
||||
x + (x_off + logical_rect.x) / PANGO_SCALE,
|
||||
risen_y + overall_rect.y / PANGO_SCALE,
|
||||
logical_rect.width / PANGO_SCALE,
|
||||
overall_rect.height / PANGO_SCALE);
|
||||
#endif
|
||||
|
||||
if (!shape_set)
|
||||
{
|
||||
int gx = x + x_off / PANGO_SCALE;
|
||||
int gy = risen_y;
|
||||
|
||||
x11_draw_glyphs( drawable, gc, run->item->analysis.font, gx, gy, run->glyphs);
|
||||
}
|
||||
|
||||
if (uline == PANGO_UNDERLINE_SINGLE)
|
||||
{
|
||||
XDrawLine( wxGlobalDisplay(), drawable, gc,
|
||||
x + (x_off + ink_rect.x) / PANGO_SCALE - 1,
|
||||
risen_y + 1,
|
||||
x + (x_off + ink_rect.x + ink_rect.width) / PANGO_SCALE,
|
||||
risen_y + 1);
|
||||
}
|
||||
|
||||
x_off += logical_rect.width;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
x11_draw_layout_with_colors( Drawable drawable,
|
||||
GC gc,
|
||||
int x,
|
||||
int y,
|
||||
PangoLayout *layout,
|
||||
XColor *foreground,
|
||||
XColor *background)
|
||||
{
|
||||
PangoLayoutIter *iter = pango_layout_get_iter (layout);
|
||||
|
||||
do
|
||||
{
|
||||
PangoLayoutLine *line = pango_layout_iter_get_line (iter);
|
||||
|
||||
PangoRectangle logical_rect;
|
||||
pango_layout_iter_get_line_extents (iter, NULL, &logical_rect);
|
||||
|
||||
int baseline = pango_layout_iter_get_baseline (iter);
|
||||
|
||||
x11_draw_layout_line_with_colors( drawable, gc,
|
||||
x + logical_rect.x / PANGO_SCALE,
|
||||
y + baseline / PANGO_SCALE,
|
||||
line,
|
||||
foreground,
|
||||
background);
|
||||
|
||||
} while (pango_layout_iter_next_line (iter));
|
||||
|
||||
pango_layout_iter_free (iter);
|
||||
}
|
||||
|
||||
void
|
||||
x11_draw_layout( Drawable drawable,
|
||||
GC gc,
|
||||
int x,
|
||||
int y,
|
||||
PangoLayout *layout)
|
||||
{
|
||||
wxCHECK_RET( layout, wxT("No layout") );
|
||||
|
||||
x11_draw_layout_with_colors (drawable, gc, x, y, layout, NULL, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
x11_pango_get_item_properties( PangoItem *item,
|
||||
PangoUnderline *uline,
|
||||
gboolean *strikethrough,
|
||||
gint *rise,
|
||||
PangoColor *fg_color,
|
||||
gboolean *fg_set,
|
||||
PangoColor *bg_color,
|
||||
gboolean *bg_set,
|
||||
gboolean *shape_set,
|
||||
PangoRectangle *ink_rect,
|
||||
PangoRectangle *logical_rect)
|
||||
{
|
||||
GSList *tmp_list = item->analysis.extra_attrs;
|
||||
|
||||
if (strikethrough)
|
||||
*strikethrough = FALSE;
|
||||
|
||||
if (fg_set)
|
||||
*fg_set = FALSE;
|
||||
|
||||
if (bg_set)
|
||||
*bg_set = FALSE;
|
||||
|
||||
if (shape_set)
|
||||
*shape_set = FALSE;
|
||||
|
||||
if (rise)
|
||||
*rise = 0;
|
||||
|
||||
while (tmp_list)
|
||||
{
|
||||
PangoAttribute *attr = (PangoAttribute *) tmp_list->data;
|
||||
|
||||
switch (attr->klass->type)
|
||||
{
|
||||
case PANGO_ATTR_UNDERLINE:
|
||||
if (uline)
|
||||
*uline = (PangoUnderline) ((PangoAttrInt *)attr)->value;
|
||||
break;
|
||||
|
||||
case PANGO_ATTR_STRIKETHROUGH:
|
||||
if (strikethrough)
|
||||
*strikethrough = ((PangoAttrInt *)attr)->value;
|
||||
break;
|
||||
|
||||
case PANGO_ATTR_FOREGROUND:
|
||||
if (fg_color)
|
||||
*fg_color = ((PangoAttrColor *)attr)->color;
|
||||
if (fg_set)
|
||||
*fg_set = TRUE;
|
||||
|
||||
break;
|
||||
|
||||
case PANGO_ATTR_BACKGROUND:
|
||||
if (bg_color)
|
||||
*bg_color = ((PangoAttrColor *)attr)->color;
|
||||
if (bg_set)
|
||||
*bg_set = TRUE;
|
||||
|
||||
break;
|
||||
|
||||
case PANGO_ATTR_SHAPE:
|
||||
if (shape_set)
|
||||
*shape_set = TRUE;
|
||||
if (logical_rect)
|
||||
*logical_rect = ((PangoAttrShape *)attr)->logical_rect;
|
||||
if (ink_rect)
|
||||
*ink_rect = ((PangoAttrShape *)attr)->ink_rect;
|
||||
break;
|
||||
|
||||
case PANGO_ATTR_RISE:
|
||||
if (rise)
|
||||
*rise = ((PangoAttrInt *)attr)->value;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
tmp_list = tmp_list->next;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user