moving shadow information out of the themes, and into the Text textures.

cleaning up some old Xft cruft in font.c also, that is no longer needed.
This commit is contained in:
Dana Jansens 2007-03-04 18:47:21 +00:00
parent 5109b5ae20
commit 7744067b6b
5 changed files with 135 additions and 72 deletions

View file

@ -31,29 +31,6 @@
#include <stdlib.h>
#include <locale.h>
#define OB_SHADOW "shadow"
#define OB_SHADOW_OFFSET "shadowoffset"
#define OB_SHADOW_ALPHA "shadowtint"
FcObjectType objs[] = {
{ OB_SHADOW, FcTypeBool },
{ OB_SHADOW_OFFSET, FcTypeInteger },
{ OB_SHADOW_ALPHA, FcTypeInteger }
};
static gboolean started = FALSE;
static void font_startup(void)
{
if (!XftInit(0)) {
g_warning(_("Couldn't initialize Xft."));
exit(EXIT_FAILURE);
}
/* Here we are teaching xft about the shadow, shadowoffset & shadowtint */
FcNameRegisterObjectTypes(objs, (sizeof(objs) / sizeof(objs[0])));
}
static void measure_font(const RrInstance *inst, RrFont *f)
{
PangoFontMetrics *metrics;
@ -76,20 +53,12 @@ static void measure_font(const RrInstance *inst, RrFont *f)
}
RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size,
RrFontWeight weight, RrFontSlant slant, gboolean shadow,
gint shadowoffset, gchar shadowtint)
RrFontWeight weight, RrFontSlant slant)
{
RrFont *out;
PangoWeight pweight;
PangoStyle pstyle;
if (!started) {
font_startup();
started = TRUE;
}
g_assert(shadowtint <= 100 && shadowtint >= -100);
out = g_new(RrFont, 1);
out->inst = inst;
out->ref = 1;
@ -118,11 +87,6 @@ RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size,
pango_font_description_set_style(out->font_desc, pstyle);
pango_font_description_set_size(out->font_desc, size * PANGO_SCALE);
/* setup the shadow */
out->shadow = shadow;
out->offset = shadowoffset;
out->tint = shadowtint;
/* setup the layout */
pango_layout_set_font_description(out->layout, out->font_desc);
pango_layout_set_single_paragraph_mode(out->layout, TRUE);
@ -137,9 +101,7 @@ RrFont *RrFontOpen(const RrInstance *inst, gchar *name, gint size,
RrFont *RrFontOpenDefault(const RrInstance *inst)
{
return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize,
RrDefaultFontWeight, RrDefaultFontSlant,
RrDefaultFontShadow, RrDefaultFontShadowOffset,
RrDefaultFontShadowTint);
RrDefaultFontWeight, RrDefaultFontSlant);
}
void RrFontRef(RrFont *f)
@ -159,29 +121,29 @@ void RrFontClose(RrFont *f)
}
static void font_measure_full(const RrFont *f, const gchar *str,
gint *x, gint *y)
gint *x, gint *y, gint shadow_offset)
{
PangoRectangle rect;
pango_layout_set_text(f->layout, str, -1);
pango_layout_set_width(f->layout, -1);
pango_layout_get_pixel_extents(f->layout, NULL, &rect);
*x = rect.width + (f->shadow ? ABS(f->offset) : 0);
*y = rect.height + (f->shadow ? ABS(f->offset) : 0);
*x = rect.width + ABS(shadow_offset);
*y = rect.height + ABS(shadow_offset);
}
RrSize *RrFontMeasureString(const RrFont *f, const gchar *str)
RrSize *RrFontMeasureString(const RrFont *f, const gchar *str,
gint shadow_offset)
{
RrSize *size;
size = g_new(RrSize, 1);
font_measure_full(f, str, &size->width, &size->height);
font_measure_full(f, str, &size->width, &size->height, shadow_offset);
return size;
}
gint RrFontHeight(const RrFont *f)
gint RrFontHeight(const RrFont *f, gint shadow_offset)
{
return (f->ascent + f->descent) / PANGO_SCALE +
(f->shadow ? f->offset : 0);
return (f->ascent + f->descent) / PANGO_SCALE + ABS(shadow_offset);
}
static inline int font_calculate_baseline(RrFont *f, gint height)
@ -245,27 +207,27 @@ void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
break;
}
if (t->font->shadow) {
if (t->font->tint >= 0) {
if (t->shadow_offset) {
if (t->shadow_tint >= 0) {
c.color.red = 0;
c.color.green = 0;
c.color.blue = 0;
c.color.alpha = 0xffff * t->font->tint / 100;
c.color.alpha = 0xffff * t->shadow_tint / 100;
c.pixel = BlackPixel(RrDisplay(t->font->inst),
RrScreen(t->font->inst));
} else {
c.color.red = 0xffff;
c.color.green = 0xffff;
c.color.blue = 0xffff;
c.color.alpha = 0xffff * -t->font->tint / 100;
c.color.alpha = 0xffff * -t->shadow_tint / 100;
c.pixel = WhitePixel(RrDisplay(t->font->inst),
RrScreen(t->font->inst));
}
/* see below... */
pango_xft_render_layout_line
(d, &c, pango_layout_get_line(t->font->layout, 0),
(x + t->font->offset) * PANGO_SCALE,
(y + t->font->offset) * PANGO_SCALE);
(x + t->shadow_offset) * PANGO_SCALE,
(y + t->shadow_offset) * PANGO_SCALE);
}
c.color.red = t->color->r | t->color->r << 8;

View file

@ -30,9 +30,6 @@ struct _RrFont {
PangoLayout *layout; /*!< Used for measuring and rendering strings */
gint ascent; /*!< The font's ascent in pango-units */
gint descent; /*!< The font's descent in pango-units */
gint shadow;
gchar tint;
gint offset;
};
void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);

View file

@ -348,9 +348,11 @@ void RrMinsize(RrAppearance *a, gint *w, gint *h)
break;
case RR_TEXTURE_TEXT:
m = RrFontMeasureString(a->texture[i].data.text.font,
a->texture[i].data.text.string);
a->texture[i].data.text.string,
a->texture[i].data.text.shadow_offset);
*w = MAX(*w, m->width + 4);
m->height = RrFontHeight(a->texture[i].data.text.font);
m->height = RrFontHeight(a->texture[i].data.text.font,
a->texture[i].data.text.shadow_offset);
*h += MAX(*h, m->height);
g_free(m);
break;

View file

@ -121,6 +121,8 @@ struct _RrTextureText {
RrJustify justify;
RrColor *color;
gchar *string;
gint shadow_offset;
gchar shadow_tint;
};
struct _RrPixmapMask {
@ -190,9 +192,6 @@ struct _RrAppearance {
#define RrDefaultFontSize 8
#define RrDefaultFontWeight RR_FONTWEIGHT_NORMAL
#define RrDefaultFontSlant RR_FONTSLANT_NORMAL
#define RrDefaultFontShadow FALSE
#define RrDefaultFontShadowOffset 1
#define RrDefaultFontShadowTint 50
RrInstance* RrInstanceNew (Display *display, gint screen);
void RrInstanceFree (RrInstance *inst);
@ -228,13 +227,12 @@ RrAppearance *RrAppearanceCopy (RrAppearance *a);
void RrAppearanceFree (RrAppearance *a);
RrFont *RrFontOpen (const RrInstance *inst, gchar *name, gint size,
RrFontWeight weight, RrFontSlant slant,
gboolean shadow, gint shadowoffset,
gchar shadowtint);
RrFontWeight weight, RrFontSlant slant);
RrFont *RrFontOpenDefault (const RrInstance *inst);
void RrFontClose (RrFont *f);
RrSize *RrFontMeasureString (const RrFont *f, const gchar *str);
gint RrFontHeight (const RrFont *f);
RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
gint shadow_offset);
gint RrFontHeight (const RrFont *f, gint shadow_offset);
gint RrFontMaxCharWidth (const RrFont *f);
void RrPaint (RrAppearance *a, Window win, gint w, gint h);

View file

@ -32,6 +32,7 @@
#include <string.h>
static XrmDatabase loaddb(RrTheme *theme, gchar *name);
static gboolean read_bool(XrmDatabase db, gchar *rname, gboolean *value);
static gboolean read_int(XrmDatabase db, gchar *rname, gint *value);
static gboolean read_string(XrmDatabase db, gchar *rname, gchar **value);
static gboolean read_color(XrmDatabase db, const RrInstance *inst,
@ -51,8 +52,11 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
{
XrmDatabase db = NULL;
RrJustify winjust, mtitlejust;
gboolean b;
gchar *str;
RrTheme *theme;
gint offset;
gint tint;
theme = g_new0(RrTheme, 1);
@ -116,15 +120,12 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
RrFontRef(active_window_font);
} else
theme->win_font_focused = RrFontOpenDefault(inst);
theme->win_font_height = RrFontHeight(theme->win_font_focused);
if (inactive_window_font) {
theme->win_font_unfocused = inactive_window_font;
RrFontRef(inactive_window_font);
} else
theme->win_font_unfocused = RrFontOpenDefault(inst);
theme->win_font_height = MAX(theme->win_font_height,
RrFontHeight(theme->win_font_unfocused));
winjust = RR_JUSTIFY_LEFT;
if (read_string(db, "window.label.text.justify", &str)) {
@ -139,7 +140,6 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
RrFontRef(menu_title_font);
} else
theme->menu_title_font = RrFontOpenDefault(inst);
theme->menu_title_font_height = RrFontHeight(theme->menu_title_font);
mtitlejust = RR_JUSTIFY_LEFT;
if (read_string(db, "menu.title.text.justify", &str)) {
@ -154,7 +154,6 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
RrFontRef(menu_item_font);
} else
theme->menu_font = RrFontOpenDefault(inst);
theme->menu_font_height = RrFontHeight(theme->menu_font);
/* load direct dimensions */
if (!read_int(db, "menu.overlap", &theme->menu_overlap) ||
@ -655,6 +654,22 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->app_hilite_label->texture[0].data.text.color =
theme->title_focused_color;
if (read_bool(db, "window.active.label.text.shadow", &b) && b) {
if (!read_int(db, "window.active.label.text.shadow.offset", &offset))
offset = 1;
if (!read_int(db, "window.active.label.text.shadow.tint", &tint))
tint = 50;
tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
} else {
offset = 0;
tint = 50;
}
theme->a_focused_label->texture[0].data.text.shadow_offset =
theme->app_hilite_label->texture[0].data.text.shadow_offset = offset;
theme->a_focused_label->texture[0].data.text.shadow_tint =
theme->app_hilite_label->texture[0].data.text.shadow_tint = tint;
theme->a_unfocused_label->texture[0].type =
theme->app_unhilite_label->texture[0].type = RR_TEXTURE_TEXT;
theme->a_unfocused_label->texture[0].data.text.justify = winjust;
@ -667,11 +682,42 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->app_unhilite_label->texture[0].data.text.color =
theme->title_unfocused_color;
if (read_bool(db, "window.inactive.label.text.shadow", &b) && b) {
if (!read_int(db, "window.inactive.label.text.shadow.offset", &offset))
offset = 1;
if (!read_int(db, "window.inactive.label.text.shadow.tint", &tint))
tint = 50;
tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
} else {
offset = 0;
tint = 50;
}
theme->a_unfocused_label->texture[0].data.text.shadow_offset =
theme->app_unhilite_label->texture[0].data.text.shadow_offset =
offset;
theme->a_unfocused_label->texture[0].data.text.shadow_tint =
theme->app_unhilite_label->texture[0].data.text.shadow_tint = tint;
theme->a_menu_title->texture[0].type = RR_TEXTURE_TEXT;
theme->a_menu_title->texture[0].data.text.justify = mtitlejust;
theme->a_menu_title->texture[0].data.text.font = theme->menu_title_font;
theme->a_menu_title->texture[0].data.text.color = theme->menu_title_color;
if (read_bool(db, "menu.title.text.shadow", &b) && b) {
if (!read_int(db, "menu.title.text.shadow.offset", &offset))
offset = 1;
if (!read_int(db, "menu.title.text.shadow.tint", &tint))
tint = 50;
tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
} else {
offset = 0;
tint = 50;
}
theme->a_menu_title->texture[0].data.text.shadow_offset = offset;
theme->a_menu_title->texture[0].data.text.shadow_tint = tint;
theme->a_menu_text_normal->texture[0].type =
theme->a_menu_text_disabled->texture[0].type =
theme->a_menu_text_selected->texture[0].type = RR_TEXTURE_TEXT;
@ -689,6 +735,25 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
theme->a_menu_text_selected->texture[0].data.text.color =
theme->menu_selected_color;
if (read_bool(db, "menu.items.text.shadow", &b) && b) {
if (!read_int(db, "menu.items.text.shadow.offset", &offset))
offset = 1;
if (!read_int(db, "menu.items.text.shadow.tint", &tint))
tint = 50;
tint = (tint > 100 ? 100 : (tint < -100 ? -100 : tint));
} else {
offset = 0;
tint = 50;
}
theme->a_menu_text_normal->texture[0].data.text.shadow_offset =
theme->a_menu_text_disabled->texture[0].data.text.shadow_offset =
theme->a_menu_text_selected->texture[0].data.text.shadow_offset =
offset;
theme->a_menu_text_normal->texture[0].data.text.shadow_tint =
theme->a_menu_text_disabled->texture[0].data.text.shadow_tint =
theme->a_menu_text_selected->texture[0].data.text.shadow_tint = tint;
theme->a_disabled_focused_max->texture[0].type =
theme->a_disabled_unfocused_max->texture[0].type =
theme->a_hover_focused_max->texture[0].type =
@ -873,6 +938,23 @@ RrTheme* RrThemeNew(const RrInstance *inst, gchar *name,
XrmDestroyDatabase(db);
/* set the font heights */
theme->win_font_height = RrFontHeight
(theme->win_font_focused,
theme->a_focused_label->texture[0].data.text.shadow_offset);
theme->win_font_height =
MAX(theme->win_font_height,
RrFontHeight
(theme->win_font_focused,
theme->a_unfocused_label->texture[0].data.text.shadow_offset));
theme->menu_title_font_height = RrFontHeight
(theme->menu_title_font,
theme->a_menu_title->texture[0].data.text.shadow_offset);
theme->menu_font_height = RrFontHeight
(theme->menu_font,
theme->a_menu_text_normal->texture[0].data.text.shadow_offset);
/* calculate some last extents */
{
gint ft, fb, fl, fr, ut, ub, ul, ur;
@ -1094,6 +1176,28 @@ static gchar *create_class_name(gchar *rname)
return rclass;
}
static gboolean read_bool(XrmDatabase db, gchar *rname, gint *value)
{
gboolean ret = FALSE;
gchar *rclass = create_class_name(rname);
gchar *rettype;
XrmValue retvalue;
if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
retvalue.addr != NULL) {
if (!g_ascii_strcasecmp(retvalue.addr, "true")) {
*value = TRUE;
ret = TRUE;
} else if (!g_ascii_strcasecmp(retvalue.addr, "false")) {
*value = FALSE;
ret = TRUE;
}
}
g_free(rclass);
return ret;
}
static gboolean read_int(XrmDatabase db, gchar *rname, gint *value)
{
gboolean ret = FALSE;