summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-03-04 18:47:21 +0000
committerDana Jansens <danakj@orodu.net>2007-03-04 18:47:21 +0000
commit7744067b6b50124c31f647e2943ef1fce9fdec96 (patch)
treea5fb1ba7a7102618e62eaf4650e4c325f71b7c29 /render
parent5109b5ae200133a0d2e86479218ad9debd9e8c11 (diff)
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.
Diffstat (limited to 'render')
-rw-r--r--render/font.c70
-rw-r--r--render/font.h3
-rw-r--r--render/render.c6
-rw-r--r--render/render.h14
-rw-r--r--render/theme.c114
5 files changed, 135 insertions, 72 deletions
diff --git a/render/font.c b/render/font.c
index 0bb82620..3c64cce9 100644
--- a/render/font.c
+++ b/render/font.c
@@ -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;
diff --git a/render/font.h b/render/font.h
index 17894b8b..03f960c6 100644
--- a/render/font.h
+++ b/render/font.h
@@ -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);
diff --git a/render/render.c b/render/render.c
index fd95469c..962d3ec9 100644
--- a/render/render.c
+++ b/render/render.c
@@ -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;
diff --git a/render/render.h b/render/render.h
index 713e2f12..65d16f22 100644
--- a/render/render.h
+++ b/render/render.h
@@ -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);
diff --git a/render/theme.c b/render/theme.c
index b26af615..c8762181 100644
--- a/render/theme.c
+++ b/render/theme.c
@@ -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;