summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2009-12-21 10:53:41 -0500
committerDana Jansens <danakj@orodu.net>2009-12-21 14:08:34 -0500
commit7aae8cc5262c1b36e3196845d62489b76af9063f (patch)
tree4c6b9c8a471fec380264cc5844c3f73fe75ccb18 /render
parenta03b817aeb7fe32be881c30d50fab79455db08c5 (diff)
Set up work for making a 3.5 prerelease.
Set version stuff to 3.5.0-rc1. Copy the CHANGELOG from 3.4-working. Rename the obt-4.0 and obrender-4.0 pkgconfig stuff to obt-3.5 and obrender-3.5 Rename the "render" directory to "obrender" so that the public headers can be installed in <obrender/*>
Diffstat (limited to 'render')
-rw-r--r--render/Makefile4
-rw-r--r--render/color.c361
-rw-r--r--render/color.h51
-rw-r--r--render/font.c380
-rw-r--r--render/font.h42
-rw-r--r--render/geom.h38
-rw-r--r--render/gradient.c836
-rw-r--r--render/gradient.h27
-rw-r--r--render/icon.h422
-rw-r--r--render/image.c516
-rw-r--r--render/image.h35
-rw-r--r--render/imagecache.c144
-rw-r--r--render/imagecache.h51
-rw-r--r--render/instance.c309
-rw-r--r--render/instance.h57
-rw-r--r--render/mask.c82
-rw-r--r--render/mask.h32
-rw-r--r--render/obrender-4.0.pc.in14
-rw-r--r--render/render.c564
-rw-r--r--render/render.h350
-rw-r--r--render/test.c115
-rw-r--r--render/theme.c2007
-rw-r--r--render/theme.h266
-rw-r--r--render/version.h.in15
24 files changed, 0 insertions, 6718 deletions
diff --git a/render/Makefile b/render/Makefile
deleted file mode 100644
index b90edacf..00000000
--- a/render/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-all clean install:
- $(MAKE) -C .. -$(MAKEFLAGS) $@
-
-.PHONY: all clean install
diff --git a/render/color.c b/render/color.c
deleted file mode 100644
index 5e3f2169..00000000
--- a/render/color.c
+++ /dev/null
@@ -1,361 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- color.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "color.h"
-#include "instance.h"
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <string.h>
-
-void RrColorAllocateGC(RrColor *in)
-{
- XGCValues gcv;
-
- gcv.foreground = in->pixel;
- gcv.cap_style = CapProjecting;
- in->gc = XCreateGC(RrDisplay(in->inst),
- RrRootWindow(in->inst),
- GCForeground | GCCapStyle, &gcv);
-}
-
-RrColor *RrColorParse(const RrInstance *inst, gchar *colorname)
-{
- XColor xcol;
-
- g_assert(colorname != NULL);
- /* get rgb values from colorname */
-
- xcol.red = 0;
- xcol.green = 0;
- xcol.blue = 0;
- xcol.pixel = 0;
- if (!XParseColor(RrDisplay(inst), RrColormap(inst), colorname, &xcol)) {
- g_message("Unable to parse color '%s'", colorname);
- return NULL;
- }
- return RrColorNew(inst, xcol.red >> 8, xcol.green >> 8, xcol.blue >> 8);
-}
-
-/*#define NO_COLOR_CACHE*/
-#ifdef DEBUG
-gint id;
-#endif
-
-RrColor *RrColorNew(const RrInstance *inst, gint r, gint g, gint b)
-{
- /* this should be replaced with something far cooler */
- RrColor *out = NULL;
- XColor xcol;
- gint key;
-
- g_assert(r >= 0 && r < 256);
- g_assert(g >= 0 && g < 256);
- g_assert(b >= 0 && b < 256);
-
- key = (r << 24) + (g << 16) + (b << 8);
-#ifndef NO_COLOR_CACHE
- if ((out = g_hash_table_lookup(RrColorHash(inst), &key))) {
- out->refcount++;
- } else {
-#endif
- xcol.red = (r << 8) | r;
- xcol.green = (g << 8) | g;
- xcol.blue = (b << 8) | b;
- if (XAllocColor(RrDisplay(inst), RrColormap(inst), &xcol)) {
- out = g_new(RrColor, 1);
- out->inst = inst;
- out->r = xcol.red >> 8;
- out->g = xcol.green >> 8;
- out->b = xcol.blue >> 8;
- out->gc = None;
- out->pixel = xcol.pixel;
- out->key = key;
- out->refcount = 1;
-#ifdef DEBUG
- out->id = id++;
-#endif
-#ifndef NO_COLOR_CACHE
- g_hash_table_insert(RrColorHash(inst), &out->key, out);
- }
-#endif
- }
- return out;
-}
-
-void RrColorFree(RrColor *c)
-{
- if (c) {
- if (--c->refcount < 1) {
-#ifndef NO_COLOR_CACHE
- g_assert(g_hash_table_lookup(RrColorHash(c->inst), &c->key));
- g_hash_table_remove(RrColorHash(c->inst), &c->key);
-#endif
- if (c->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst),
- &c->pixel, 1, 0);
- if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc);
- g_free(c);
- }
- }
-}
-
-void RrReduceDepth(const RrInstance *inst, RrPixel32 *data, XImage *im)
-{
- gint r, g, b;
- gint x,y;
- RrPixel32 *p32 = (RrPixel32 *) im->data;
- RrPixel16 *p16 = (RrPixel16 *) im->data;
- RrPixel8 *p8 = (RrPixel8 *) im->data;
- switch (im->bits_per_pixel) {
- case 32:
- if ((RrRedOffset(inst) != RrDefaultRedOffset) ||
- (RrBlueOffset(inst) != RrDefaultBlueOffset) ||
- (RrGreenOffset(inst) != RrDefaultGreenOffset)) {
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- r = (data[x] >> RrDefaultRedOffset) & 0xFF;
- g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
- b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
- p32[x] = (r << RrRedOffset(inst))
- + (g << RrGreenOffset(inst))
- + (b << RrBlueOffset(inst));
- }
- data += im->width;
- p32 += im->width;
- }
- } else im->data = (gchar*) data;
- break;
- case 24:
- {
- /* reverse the ordering, shifting left 16bit should be the first byte
- out of three, etc */
- const guint roff = (16 - RrRedOffset(inst)) / 8;
- const guint goff = (16 - RrGreenOffset(inst)) / 8;
- const guint boff = (16 - RrBlueOffset(inst)) / 8;
- gint outx;
- for (y = 0; y < im->height; y++) {
- for (x = 0, outx = 0; x < im->width; x++, outx += 3) {
- r = (data[x] >> RrDefaultRedOffset) & 0xFF;
- g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
- b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
- p8[outx+roff] = r;
- p8[outx+goff] = g;
- p8[outx+boff] = b;
- }
- data += im->width;
- p8 += im->bytes_per_line;
- }
- break;
- }
- case 16:
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- r = (data[x] >> RrDefaultRedOffset) & 0xFF;
- r = r >> RrRedShift(inst);
- g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
- g = g >> RrGreenShift(inst);
- b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
- b = b >> RrBlueShift(inst);
- p16[x] = (r << RrRedOffset(inst))
- + (g << RrGreenOffset(inst))
- + (b << RrBlueOffset(inst));
- }
- data += im->width;
- p16 += im->bytes_per_line/2;
- }
- break;
- case 8:
- if (RrVisual(inst)->class == TrueColor) {
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- r = (data[x] >> RrDefaultRedOffset) & 0xFF;
- r = r >> RrRedShift(inst);
- g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
- g = g >> RrGreenShift(inst);
- b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
- b = b >> RrBlueShift(inst);
- p8[x] = (r << RrRedOffset(inst))
- + (g << RrGreenOffset(inst))
- + (b << RrBlueOffset(inst));
- }
- data += im->width;
- p8 += im->bytes_per_line;
- }
- } else {
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- p8[x] = RrPickColor(inst,
- data[x] >> RrDefaultRedOffset,
- data[x] >> RrDefaultGreenOffset,
- data[x] >> RrDefaultBlueOffset)->pixel;
- }
- data += im->width;
- p8 += im->bytes_per_line;
- }
- }
- break;
- default:
- g_error("This image bit depth (%i) is currently unhandled", im->bits_per_pixel);
-
- }
-}
-
-XColor *RrPickColor(const RrInstance *inst, gint r, gint g, gint b)
-{
- r = (r & 0xff) >> (8-RrPseudoBPC(inst));
- g = (g & 0xff) >> (8-RrPseudoBPC(inst));
- b = (b & 0xff) >> (8-RrPseudoBPC(inst));
- return &RrPseudoColors(inst)[(r << (2*RrPseudoBPC(inst))) +
- (g << (1*RrPseudoBPC(inst))) +
- b];
-}
-
-static void swap_byte_order(XImage *im)
-{
- gint x, y, di;
-
- di = 0;
- for (y = 0; y < im->height; ++y) {
- for (x = 0; x < im->height; ++x) {
- gchar *c = &im->data[di + x * im->bits_per_pixel / 8];
- gchar t;
-
- switch (im->bits_per_pixel) {
- case 32:
- t = c[2];
- c[2] = c[3];
- c[3] = t;
- case 16:
- t = c[0];
- c[0] = c[1];
- c[1] = t;
- case 8:
- case 1:
- break;
- default:
- g_error("Your bit depth (%i) is currently unhandled",
- im->bits_per_pixel);
- }
- }
- di += im->bytes_per_line;
- }
-
- if (im->byte_order == LSBFirst)
- im->byte_order = MSBFirst;
- else
- im->byte_order = LSBFirst;
-}
-
-void RrIncreaseDepth(const RrInstance *inst, RrPixel32 *data, XImage *im)
-{
- gint r, g, b;
- gint x,y;
- RrPixel32 *p32 = (RrPixel32 *) im->data;
- RrPixel16 *p16 = (RrPixel16 *) im->data;
- guchar *p8 = (guchar *)im->data;
-
- if (im->byte_order != LSBFirst)
- swap_byte_order(im);
-
- switch (im->bits_per_pixel) {
- case 32:
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- r = (p32[x] >> RrRedOffset(inst)) & 0xff;
- g = (p32[x] >> RrGreenOffset(inst)) & 0xff;
- b = (p32[x] >> RrBlueOffset(inst)) & 0xff;
- data[x] = (r << RrDefaultRedOffset)
- + (g << RrDefaultGreenOffset)
- + (b << RrDefaultBlueOffset)
- + (0xff << RrDefaultAlphaOffset);
- }
- data += im->width;
- p32 += im->bytes_per_line/4;
- }
- break;
- case 16:
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- r = (p16[x] & RrRedMask(inst)) >>
- RrRedOffset(inst) <<
- RrRedShift(inst);
- g = (p16[x] & RrGreenMask(inst)) >>
- RrGreenOffset(inst) <<
- RrGreenShift(inst);
- b = (p16[x] & RrBlueMask(inst)) >>
- RrBlueOffset(inst) <<
- RrBlueShift(inst);
- data[x] = (r << RrDefaultRedOffset)
- + (g << RrDefaultGreenOffset)
- + (b << RrDefaultBlueOffset)
- + (0xff << RrDefaultAlphaOffset);
- }
- data += im->width;
- p16 += im->bytes_per_line/2;
- }
- break;
- case 8:
- g_error("This image bit depth (%i) is currently unhandled", 8);
- break;
- case 1:
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- if (!(((p8[x / 8]) >> (x % 8)) & 0x1))
- data[x] = 0xff << RrDefaultAlphaOffset; /* black */
- else
- data[x] = 0xffffffff; /* white */
- }
- data += im->width;
- p8 += im->bytes_per_line;
- }
- break;
- default:
- g_error("This image bit depth (%i) is currently unhandled",
- im->bits_per_pixel);
- }
-}
-
-gint RrColorRed(const RrColor *c)
-{
- return c->r;
-}
-
-gint RrColorGreen(const RrColor *c)
-{
- return c->g;
-}
-
-gint RrColorBlue(const RrColor *c)
-{
- return c->b;
-}
-
-gulong RrColorPixel(const RrColor *c)
-{
- return c->pixel;
-}
-
-GC RrColorGC(RrColor *c)
-{
- if (!c->gc)
- RrColorAllocateGC(c);
- return c->gc;
-}
diff --git a/render/color.h b/render/color.h
deleted file mode 100644
index 26fa7afe..00000000
--- a/render/color.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- color.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __color_h
-#define __color_h
-
-#include "render.h"
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <glib.h>
-
-struct _RrColor {
- const RrInstance *inst;
-
- gint r;
- gint g;
- gint b;
- gulong pixel;
- GC gc;
-
- gint key;
- gint refcount;
-
-#ifdef DEBUG
- gint id;
-#endif
-};
-
-void RrColorAllocateGC(RrColor *in);
-XColor *RrPickColor(const RrInstance *inst, gint r, gint g, gint b);
-void RrReduceDepth(const RrInstance *inst, RrPixel32 *data, XImage *im);
-void RrIncreaseDepth(const RrInstance *inst, RrPixel32 *data, XImage *im);
-
-#endif /* __color_h */
diff --git a/render/font.c b/render/font.c
deleted file mode 100644
index cde0d030..00000000
--- a/render/font.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- font.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "font.h"
-#include "color.h"
-#include "mask.h"
-#include "theme.h"
-#include "geom.h"
-#include "instance.h"
-#include "gettext.h"
-
-#include <glib.h>
-#include <string.h>
-#include <stdlib.h>
-#include <locale.h>
-
-static void measure_font(const RrInstance *inst, RrFont *f)
-{
- PangoFontMetrics *metrics;
- static PangoLanguage *lang = NULL;
-
- if (lang == NULL) {
-#if PANGO_VERSION_MAJOR > 1 || \
- (PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 16)
- lang = pango_language_get_default();
-#else
- gchar *locale, *p;
- /* get the default language from the locale
- (based on gtk_get_default_language in gtkmain.c) */
- locale = g_strdup(setlocale(LC_CTYPE, NULL));
- if ((p = strchr(locale, '.'))) *p = '\0'; /* strip off the . */
- if ((p = strchr(locale, '@'))) *p = '\0'; /* strip off the @ */
- lang = pango_language_from_string(locale);
- g_free(locale);
-#endif
- }
-
- /* measure the ascent and descent */
- metrics = pango_context_get_metrics(inst->pango, f->font_desc, lang);
- f->ascent = pango_font_metrics_get_ascent(metrics);
- f->descent = pango_font_metrics_get_descent(metrics);
- pango_font_metrics_unref(metrics);
-
-}
-
-RrFont *RrFontOpen(const RrInstance *inst, const gchar *name, gint size,
- RrFontWeight weight, RrFontSlant slant)
-{
- RrFont *out;
- PangoWeight pweight;
- PangoStyle pstyle;
- PangoAttrList *attrlist;
-
- out = g_new(RrFont, 1);
- out->inst = inst;
- out->ref = 1;
- out->font_desc = pango_font_description_new();
- out->layout = pango_layout_new(inst->pango);
- out->shortcut_underline = pango_attr_underline_new(PANGO_UNDERLINE_LOW);
- out->shortcut_underline->start_index = 0;
- out->shortcut_underline->end_index = 0;
-
- attrlist = pango_attr_list_new();
- /* shortcut_underline is owned by the attrlist */
- pango_attr_list_insert(attrlist, out->shortcut_underline);
- /* the attributes are owned by the layout */
- pango_layout_set_attributes(out->layout, attrlist);
- pango_attr_list_unref(attrlist);
-
- switch (weight) {
- case RR_FONTWEIGHT_LIGHT: pweight = PANGO_WEIGHT_LIGHT; break;
- case RR_FONTWEIGHT_NORMAL: pweight = PANGO_WEIGHT_NORMAL; break;
- case RR_FONTWEIGHT_SEMIBOLD: pweight = PANGO_WEIGHT_SEMIBOLD; break;
- case RR_FONTWEIGHT_BOLD: pweight = PANGO_WEIGHT_BOLD; break;
- case RR_FONTWEIGHT_ULTRABOLD: pweight = PANGO_WEIGHT_ULTRABOLD; break;
- default: g_assert_not_reached();
- }
-
- switch (slant) {
- case RR_FONTSLANT_NORMAL: pstyle = PANGO_STYLE_NORMAL; break;
- case RR_FONTSLANT_ITALIC: pstyle = PANGO_STYLE_ITALIC; break;
- case RR_FONTSLANT_OBLIQUE: pstyle = PANGO_STYLE_OBLIQUE; break;
- default: g_assert_not_reached();
- }
-
- /* setup the font */
- pango_font_description_set_family(out->font_desc, name);
- pango_font_description_set_weight(out->font_desc, pweight);
- pango_font_description_set_style(out->font_desc, pstyle);
- pango_font_description_set_size(out->font_desc, size * PANGO_SCALE);
-
- /* setup the layout */
- pango_layout_set_font_description(out->layout, out->font_desc);
- pango_layout_set_wrap(out->layout, PANGO_WRAP_WORD_CHAR);
-
- /* get the ascent and descent */
- measure_font(inst, out);
-
- return out;
-}
-
-RrFont *RrFontOpenDefault(const RrInstance *inst)
-{
- return RrFontOpen(inst, RrDefaultFontFamily, RrDefaultFontSize,
- RrDefaultFontWeight, RrDefaultFontSlant);
-}
-
-void RrFontRef(RrFont *f)
-{
- ++f->ref;
-}
-
-void RrFontClose(RrFont *f)
-{
- if (f) {
- if (--f->ref < 1) {
- g_object_unref(f->layout);
- pango_font_description_free(f->font_desc);
- g_free(f);
- }
- }
-}
-
-static void font_measure_full(const RrFont *f, const gchar *str,
- gint *x, gint *y, gint shadow_x, gint shadow_y,
- gboolean flow, gint maxwidth)
-{
- PangoRectangle rect;
-
- pango_layout_set_text(f->layout, str, -1);
- if (flow) {
- pango_layout_set_single_paragraph_mode(f->layout, FALSE);
- pango_layout_set_width(f->layout, maxwidth * PANGO_SCALE);
- pango_layout_set_ellipsize(f->layout, PANGO_ELLIPSIZE_NONE);
- }
- else {
- /* single line mode */
- pango_layout_set_single_paragraph_mode(f->layout, TRUE);
- pango_layout_set_width(f->layout, -1);
- pango_layout_set_ellipsize(f->layout, PANGO_ELLIPSIZE_MIDDLE);
- }
-
- /* pango_layout_get_pixel_extents lies! this is the right way to get the
- size of the text's area */
- pango_layout_get_extents(f->layout, NULL, &rect);
-#if PANGO_VERSION_MAJOR > 1 || \
- (PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 16)
- /* pass the logical rect as the ink rect, this is on purpose so we get the
- full area for the text */
- pango_extents_to_pixels(&rect, NULL);
-#else
- rect.width = (rect.width + PANGO_SCALE - 1) / PANGO_SCALE;
- rect.height = (rect.height + PANGO_SCALE - 1) / PANGO_SCALE;
-#endif
- *x = rect.width + ABS(shadow_x) + 4 /* we put a 2 px edge on each side */;
- *y = rect.height + ABS(shadow_y);
-}
-
-RrSize *RrFontMeasureString(const RrFont *f, const gchar *str,
- gint shadow_x, gint shadow_y,
- gboolean flow, gint maxwidth)
-{
- RrSize *size;
-
- g_assert(!flow || maxwidth > 0);
-
- size = g_new(RrSize, 1);
- font_measure_full(f, str, &size->width, &size->height, shadow_x, shadow_y,
- flow, maxwidth);
- return size;
-}
-
-gint RrFontHeight(const RrFont *f, gint shadow_y)
-{
- return (f->ascent + f->descent) / PANGO_SCALE + ABS(shadow_y);
-}
-
-static inline int font_calculate_baseline(RrFont *f, gint height)
-{
-/* For my own reference:
- * _________
- * ^space/2 ^height ^baseline
- * v_________|_ |
- * | ^ascent | _ _
- * | | | | |_ _____ _| |_ _ _
- * | | | | _/ -_) \ / _| || |
- * | v_________v \__\___/_\_\\__|\_, |
- * | ^descent |__/
- * __________|_v
- * ^space/2 |
- * V_________v
- */
- return (((height * PANGO_SCALE) /* height of the space in pango units */
- - (f->ascent + f->descent)) /* minus space taken up by text */
- / 2 /* divided by two -> half of the empty space (this is the top
- of the text) */
- + f->ascent) /* now move down to the baseline */
- / PANGO_SCALE; /* back to pixels */
-}
-
-void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *area)
-{
- gint x,y,w;
- XftColor c;
- gint mw;
- PangoRectangle rect;
- PangoAttrList *attrlist;
- PangoEllipsizeMode ell;
-
- g_assert(!t->flow || t->maxwidth > 0);
-
- y = area->y;
- if (!t->flow)
- /* center the text vertically
- We do this centering based on the 'baseline' since different fonts
- have different top edges. It looks bad when the whole string is
- moved when 1 character from a non-default language is included in
- the string */
- y += font_calculate_baseline(t->font, area->height);
-
- /* the +2 and -4 leave a small blank edge on the sides */
- x = area->x + 2;
- w = area->width;
- if (t->flow) w = MAX(w, t->maxwidth);
- w -= 4;
- /* h = area->height; */
-
- if (t->flow)
- ell = PANGO_ELLIPSIZE_NONE;
- else {
- switch (t->ellipsize) {
- case RR_ELLIPSIZE_NONE:
- ell = PANGO_ELLIPSIZE_NONE;
- break;
- case RR_ELLIPSIZE_START:
- ell = PANGO_ELLIPSIZE_START;
- break;
- case RR_ELLIPSIZE_MIDDLE:
- ell = PANGO_ELLIPSIZE_MIDDLE;
- break;
- case RR_ELLIPSIZE_END:
- ell = PANGO_ELLIPSIZE_END;
- break;
- default:
- g_assert_not_reached();
- }
- }
-
- pango_layout_set_text(t->font->layout, t->string, -1);
- pango_layout_set_width(t->font->layout, w * PANGO_SCALE);
- pango_layout_set_ellipsize(t->font->layout, ell);
- pango_layout_set_single_paragraph_mode(t->font->layout, !t->flow);
-
- /* * * end of setting up the layout * * */
-
- pango_layout_get_pixel_extents(t->font->layout, NULL, &rect);
- mw = rect.width;
-
- /* pango_layout_set_alignment doesn't work with
- pango_xft_render_layout_line */
- switch (t->justify) {
- case RR_JUSTIFY_LEFT:
- break;
- case RR_JUSTIFY_RIGHT:
- x += (w - mw);
- break;
- case RR_JUSTIFY_CENTER:
- x += (w - mw) / 2;
- break;
- }
-
- if (t->shadow_offset_x || t->shadow_offset_y) {
- /* From nvidia's readme (chapter 23):
-
- When rendering to a 32-bit window, keep in mind that the X RENDER
- extension, used by most composite managers, expects "premultiplied
- alpha" colors. This means that if your color has components (r,g,b)
- and alpha value a, then you must render (a*r, a*g, a*b, a) into the
- target window.
- */
- c.color.red = (t->shadow_color->r | t->shadow_color->r << 8) *
- t->shadow_alpha / 255;
- c.color.green = (t->shadow_color->g | t->shadow_color->g << 8) *
- t->shadow_alpha / 255;
- c.color.blue = (t->shadow_color->b | t->shadow_color->b << 8) *
- t->shadow_alpha / 255;
- c.color.alpha = 0xffff * t->shadow_alpha / 255;
- c.pixel = t->shadow_color->pixel;
-
- /* see below... */
- if (!t->flow) {
- pango_xft_render_layout_line
- (d, &c,
-#if PANGO_VERSION_MAJOR > 1 || \
- (PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 16)
- pango_layout_get_line_readonly(t->font->layout, 0),
-#else
- pango_layout_get_line(t->font->layout, 0),
-#endif
- (x + t->shadow_offset_x) * PANGO_SCALE,
- (y + t->shadow_offset_y) * PANGO_SCALE);
- }
- else {
- pango_xft_render_layout(d, &c, t->font->layout,
- (x + t->shadow_offset_x) * PANGO_SCALE,
- (y + t->shadow_offset_y) * PANGO_SCALE);
- }
- }
-
- c.color.red = t->color->r | t->color->r << 8;
- c.color.green = t->color->g | t->color->g << 8;
- c.color.blue = t->color->b | t->color->b << 8;
- c.color.alpha = 0xff | 0xff << 8; /* fully opaque text */
- c.pixel = t->color->pixel;
-
- if (t->shortcut) {
- const gchar *s = t->string + t->shortcut_pos;
-
- t->font->shortcut_underline->start_index = t->shortcut_pos;
- t->font->shortcut_underline->end_index = t->shortcut_pos +
- (g_utf8_next_char(s) - s);
-
- /* the attributes are owned by the layout.
- re-add the attributes to the layout after changing the
- start and end index */
- attrlist = pango_layout_get_attributes(t->font->layout);
- pango_attr_list_ref(attrlist);
- pango_layout_set_attributes(t->font->layout, attrlist);
- pango_attr_list_unref(attrlist);
- }
-
- /* layout_line() uses y to specify the baseline
- The line doesn't need to be freed, it's a part of the layout */
- if (!t->flow) {
- pango_xft_render_layout_line
- (d, &c,
-#if PANGO_VERSION_MAJOR > 1 || \
- (PANGO_VERSION_MAJOR == 1 && PANGO_VERSION_MINOR >= 16)
- pango_layout_get_line_readonly(t->font->layout, 0),
-#else
- pango_layout_get_line(t->font->layout, 0),
-#endif
- x * PANGO_SCALE,
- y * PANGO_SCALE);
- }
- else {
- pango_xft_render_layout(d, &c, t->font->layout,
- x * PANGO_SCALE,
- y * PANGO_SCALE);
- }
-
- if (t->shortcut) {
- t->font->shortcut_underline->start_index = 0;
- t->font->shortcut_underline->end_index = 0;
- /* the attributes are owned by the layout.
- re-add the attributes to the layout after changing the
- start and end index */
- attrlist = pango_layout_get_attributes(t->font->layout);
- pango_attr_list_ref(attrlist);
- pango_layout_set_attributes(t->font->layout, attrlist);
- pango_attr_list_unref(attrlist);
- }
-}
diff --git a/render/font.h b/render/font.h
deleted file mode 100644
index 07d648d1..00000000
--- a/render/font.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- font.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __font_h
-#define __font_h
-#include "render.h"
-#include "geom.h"
-#include <pango/pango.h>
-
-struct _RrFont {
- const RrInstance *inst;
- gint ref;
- PangoFontDescription *font_desc;
- PangoLayout *layout; /*!< Used for measuring and rendering strings */
- PangoAttribute *shortcut_underline; /*< For underlining the shortcut key */
- gint ascent; /*!< The font's ascent in pango-units */
- gint descent; /*!< The font's descent in pango-units */
-};
-
-void RrFontDraw(XftDraw *d, RrTextureText *t, RrRect *position);
-
-/*! Increment the references for this font, RrFontClose will decrement until 0
- and then really close it */
-void RrFontRef(RrFont *f);
-
-#endif /* __font_h */
diff --git a/render/geom.h b/render/geom.h
deleted file mode 100644
index 4d81e4b3..00000000
--- a/render/geom.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- geom.h for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __render_geom_h
-#define __render_geom_h
-
-typedef struct {
- int width;
- int height;
-} RrSize;
-
-typedef struct {
- int x;
- int y;
- int width;
- int height;
-} RrRect;
-
-#define RECT_SET(r, nx, ny, w, h) \
- (r).x = (nx), (r).y = (ny), (r).width = (w), (r).height = (h)
-
-#endif
diff --git a/render/gradient.c b/render/gradient.c
deleted file mode 100644
index 60a0a555..00000000
--- a/render/gradient.c
+++ /dev/null
@@ -1,836 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- gradient.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2008 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "gradient.h"
-#include "color.h"
-#include <glib.h>
-#include <string.h>
-
-static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y,
- gboolean raised);
-static void gradient_parentrelative(RrAppearance *a, gint w, gint h);
-static void gradient_solid(RrAppearance *l, gint w, gint h);
-static void gradient_splitvertical(RrAppearance *a, gint w, gint h);
-static void gradient_vertical(RrSurface *sf, gint w, gint h);
-static void gradient_horizontal(RrSurface *sf, gint w, gint h);
-static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h);
-static void gradient_diagonal(RrSurface *sf, gint w, gint h);
-static void gradient_crossdiagonal(RrSurface *sf, gint w, gint h);
-static void gradient_pyramid(RrSurface *sf, gint inw, gint inh);
-
-void RrRender(RrAppearance *a, gint w, gint h)
-{
- RrPixel32 *data = a->surface.pixel_data;
- RrPixel32 current;
- guint r,g,b;
- register gint off, x;
-
- switch (a->surface.grad) {
- case RR_SURFACE_PARENTREL:
- gradient_parentrelative(a, w, h);
- break;
- case RR_SURFACE_SOLID:
- gradient_solid(a, w, h);
- break;
- case RR_SURFACE_SPLIT_VERTICAL:
- gradient_splitvertical(a, w, h);
- break;
- case RR_SURFACE_VERTICAL:
- gradient_vertical(&a->surface, w, h);
- break;
- case RR_SURFACE_HORIZONTAL:
- gradient_horizontal(&a->surface, w, h);
- break;
- case RR_SURFACE_MIRROR_HORIZONTAL:
- gradient_mirrorhorizontal(&a->surface, w, h);
- break;
- case RR_SURFACE_DIAGONAL:
- gradient_diagonal(&a->surface, w, h);
- break;
- case RR_SURFACE_CROSS_DIAGONAL:
- gradient_crossdiagonal(&a->surface, w, h);
- break;
- case RR_SURFACE_PYRAMID:
- gradient_pyramid(&a->surface, w, h);
- break;
- default:
- g_assert_not_reached(); /* unhandled gradient */
- return;
- }
-
- if (a->surface.interlaced) {
- gint i;
- RrPixel32 *p;
-
- r = a->surface.interlace_color->r;
- g = a->surface.interlace_color->g;
- b = a->surface.interlace_color->b;
- current = (r << RrDefaultRedOffset)
- + (g << RrDefaultGreenOffset)
- + (b << RrDefaultBlueOffset);
- p = data;
- for (i = 0; i < h; i += 2, p += w)
- for (x = 0; x < w; ++x, ++p)
- *p = current;
- }
-
- if (a->surface.relief == RR_RELIEF_FLAT && a->surface.border) {
- r = a->surface.border_color->r;
- g = a->surface.border_color->g;
- b = a->surface.border_color->b;
- current = (r << RrDefaultRedOffset)
- + (g << RrDefaultGreenOffset)
- + (b << RrDefaultBlueOffset);
- for (off = 0, x = 0; x < w; ++x, off++) {
- *(data + off) = current;
- *(data + off + ((h-1) * w)) = current;
- }
- for (off = 0, x = 0; x < h; ++x, off++) {
- *(data + (off * w)) = current;
- *(data + (off * w) + w - 1) = current;
- }
- }
-
- if (a->surface.relief != RR_RELIEF_FLAT) {
- if (a->surface.bevel == RR_BEVEL_1) {
- for (off = 1, x = 1; x < w - 1; ++x, off++)
- highlight(&a->surface, data + off,
- data + off + (h-1) * w,
- a->surface.relief==RR_RELIEF_RAISED);
- for (off = 0, x = 0; x < h; ++x, off++)
- highlight(&a->surface, data + off * w,
- data + off * w + w - 1,
- a->surface.relief==RR_RELIEF_RAISED);
- }
-
- if (a->surface.bevel == RR_BEVEL_2) {
- for (off = 2, x = 2; x < w - 2; ++x, off++)
- highlight(&a->surface, data + off + w,
- data + off + (h-2) * w,
- a->surface.relief==RR_RELIEF_RAISED);
- for (off = 1, x = 1; x < h-1; ++x, off++)
- highlight(&a->surface, data + off * w + 1,
- data + off * w + w - 2,
- a->surface.relief==RR_RELIEF_RAISED);
- }
- }
-}
-
-static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y, gboolean raised)
-{
- register gint r, g, b;
-
- RrPixel32 *up, *down;
- if (raised) {
- up = x;
- down = y;
- } else {
- up = y;
- down = x;
- }
-
- r = (*up >> RrDefaultRedOffset) & 0xFF;
- r += (r * s->bevel_light_adjust) >> 8;
- g = (*up >> RrDefaultGreenOffset) & 0xFF;
- g += (g * s->bevel_light_adjust) >> 8;
- b = (*up >> RrDefaultBlueOffset) & 0xFF;
- b += (b * s->bevel_light_adjust) >> 8;
- if (r > 0xFF) r = 0xFF;
- if (g > 0xFF) g = 0xFF;
- if (b > 0xFF) b = 0xFF;
- *up = (r << RrDefaultRedOffset) + (g << RrDefaultGreenOffset)
- + (b << RrDefaultBlueOffset);
-
- r = (*down >> RrDefaultRedOffset) & 0xFF;
- r -= (r * s->bevel_dark_adjust) >> 8;
- g = (*down >> RrDefaultGreenOffset) & 0xFF;
- g -= (g * s->bevel_dark_adjust) >> 8;
- b = (*down >> RrDefaultBlueOffset) & 0xFF;
- b -= (b * s->bevel_dark_adjust) >> 8;
- *down = (r << RrDefaultRedOffset) + (g << RrDefaultGreenOffset)
- + (b << RrDefaultBlueOffset);
-}
-
-static void create_bevel_colors(RrAppearance *l)
-{
- register gint r, g, b;
-
- /* light color */
- r = l->surface.primary->r;
- r += (r * l->surface.bevel_light_adjust) >> 8;
- g = l->surface.primary->g;
- g += (g * l->surface.bevel_light_adjust) >> 8;
- b = l->surface.primary->b;
- b += (b * l->surface.bevel_light_adjust) >> 8;
- if (r > 0xFF) r = 0xFF;
- if (g > 0xFF) g = 0xFF;
- if (b > 0xFF) b = 0xFF;
- g_assert(!l->surface.bevel_light);
- l->surface.bevel_light = RrColorNew(l->inst, r, g, b);
-
- /* dark color */
- r = l->surface.primary->r;
- r -= (r * l->surface.bevel_dark_adjust) >> 8;
- g = l->surface.primary->g;
- g -= (g * l->surface.bevel_dark_adjust) >> 8;
- b = l->surface.primary->b;
- b -= (b * l->surface.bevel_dark_adjust) >> 8;
- g_assert(!l->surface.bevel_dark);
- l->surface.bevel_dark = RrColorNew(l->inst, r, g, b);
-}
-
-/*! Repeat the first pixel over the entire block of memory
- @param start The block of memory. start[0] will be copied
- to the rest of the block.
- @param w The width of the block of memory (including the already-set first
- element
-*/
-static inline void repeat_pixel(RrPixel32 *start, gint w)
-{
- register gint x;
- RrPixel32 *dest;
-
- dest = start + 1;
-
- /* for really small things, just copy ourselves */
- if (w < 8) {
- for (x = w-1; x > 0; --x)
- *(dest++) = *start;
- }
-
- /* for >= 8, then use O(log n) memcpy's... */
- else {
- gchar *cdest;
- gint lenbytes;
-
- /* copy the first 3 * 32 bits (3 words) ourselves - then we have
- 3 + the original 1 = 4 words to make copies of at a time
-
- this is faster than doing memcpy for 1 or 2 words at a time
- */
- for (x = 3; x > 0; --x)
- *(dest++) = *start;
-
- /* cdest is a pointer to the pixel data that is typed char* so that
- adding 1 to its position moves it only one byte
-
- lenbytes is the amount of bytes that we will be copying each
- iteration. this doubles each time through the loop.
-
- x is the number of bytes left to copy into. lenbytes will alwaysa
- be bounded by x
-
- this loop will run O(log n) times (n is the number of bytes we
- need to copy into), since the size of the copy is doubled each
- iteration. it seems that gcc does some nice optimizations to make
- this memcpy very fast on hardware with support for vector operations
- such as mmx or see. here is an idea of the kind of speed up we are
- getting by doing this (splitvertical3 switches from doing
- "*(data++) = color" n times to doing this memcpy thing log n times:
-
- % cumulative self self total
- time seconds seconds calls ms/call ms/call name
- 49.44 0.88 0.88 1063 0.83 0.83 splitvertical1
- 47.19 1.72 0.84 1063 0.79 0.79 splitvertical2
- 2.81 1.77 0.05 1063 0.05 0.05 splitvertical3
- */
- cdest = (gchar*)dest;
- lenbytes = 4 * sizeof(RrPixel32);
- for (x = (w - 4) * sizeof(RrPixel32); x > 0;) {
- memcpy(cdest, start, lenbytes);
- x -= lenbytes;
- cdest += lenbytes;
- lenbytes <<= 1;
- if (lenbytes > x)
- lenbytes = x;
- }
- }
-}
-
-static void gradient_parentrelative(RrAppearance *a, gint w, gint h)
-{
- RrPixel32 *source, *dest;
- gint sw, sh, partial_w, partial_h;
- register gint i;
-
- g_assert (a->surface.parent);
- g_assert (a->surface.parent->w);
-
- sw = a->surface.parent->w;
- sh = a->surface.parent->h;
-
- /* This is a little hack. When a texture is parentrelative, and the same
- area as the parent, and has a bevel, it will draw its bevel on top
- of the parent's, amplifying it. So instead, rerender the child with
- the parent's settings, but the child's bevel and interlace */
- if (a->surface.relief != RR_RELIEF_FLAT &&
- (a->surface.parent->surface.relief != RR_RELIEF_FLAT ||
- a->surface.parent->surface.border) &&
- !a->surface.parentx && !a->surface.parenty &&
- sw == w && sh == h)
- {
- RrSurface old = a->surface;
- a->surface = a->surface.parent->surface;
-
- /* turn these off for the parent */
- a->surface.relief = RR_RELIEF_FLAT;
- a->surface.border = FALSE;
-
- a->surface.pixel_data = old.pixel_data;
-
- RrRender(a, w, h);
- a->surface = old;
- } else {
- source = (a->surface.parent->surface.pixel_data +
- a->surface.parentx + sw * a->surface.parenty);
- dest = a->surface.pixel_data;
-
- if (a->surface.parentx + w > sw) {
- partial_w = sw - a->surface.parentx;
- } else partial_w = w;
-
- if (a->surface.parenty + h > sh) {
- partial_h = sh - a->surface.parenty;
- } else partial_h = h;
-
- for (i = 0; i < partial_h; i++, source += sw, dest += w) {
- memcpy(dest, source, partial_w * sizeof(RrPixel32));
- }
- }
-}
-
-static void gradient_solid(RrAppearance *l, gint w, gint h)
-{
- register gint i;
- RrPixel32 pix;
- RrPixel32 *data = l->surface.pixel_data;
- RrSurface *sp = &l->surface;
- gint left = 0, top = 0, right = w - 1, bottom = h - 1;
-
- pix = (sp->primary->r << RrDefaultRedOffset)
- + (sp->primary->g << RrDefaultGreenOffset)
- + (sp->primary->b << RrDefaultBlueOffset);
-
- for (i = 0; i < w * h; i++)
- *data++ = pix;
-
- if (sp->interlaced)
- return;
-
- XFillRectangle(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->primary),
- 0, 0, w, h);
-
- switch (sp->relief) {
- case RR_RELIEF_RAISED:
- if (!sp->bevel_dark)
- create_bevel_colors(l);
-
- switch (sp->bevel) {
- case RR_BEVEL_1:
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- left, bottom, right, bottom);
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- right, bottom, right, top);
-
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- left, top, right, top);
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- left, bottom, left, top);
- break;
- case RR_BEVEL_2:
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- left + 2, bottom - 1, right - 2, bottom - 1);
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- right - 1, bottom - 1, right - 1, top + 1);
-
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- left + 2, top + 1, right - 2, top + 1);
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- left + 1, bottom - 1, left + 1, top + 1);
- break;
- default:
- g_assert_not_reached(); /* unhandled BevelType */
- }
- break;
- case RR_RELIEF_SUNKEN:
- if (!sp->bevel_dark)
- create_bevel_colors(l);
-
- switch (sp->bevel) {
- case RR_BEVEL_1:
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- left, bottom, right, bottom);
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- right, bottom, right, top);
-
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- left, top, right, top);
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- left, bottom, left, top);
- break;
- case RR_BEVEL_2:
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- left + 2, bottom - 1, right - 2, bottom - 1);
- XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light),
- right - 1, bottom - 1, right - 1, top + 1);
-
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- left + 2, top + 1, right - 2, top + 1);
- XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark),
- left + 1, bottom - 1, left + 1, top + 1);
- break;
- default:
- g_assert_not_reached(); /* unhandled BevelType */
- }
- break;
- case RR_RELIEF_FLAT:
- if (sp->border) {
- XDrawRectangle(RrDisplay(l->inst), l->pixmap,
- RrColorGC(sp->border_color),
- left, top, right, bottom);
- }
- break;
- default:
- g_assert_not_reached(); /* unhandled ReliefType */
- }
-}
-
-/* * * * * * * * * * * * * * GRADIENT MAGIC WOOT * * * * * * * * * * * * * * */
-
-#define VARS(x) \
- register gint len##x; \
- guint color##x[3]; \
- gint cdelta##x[3], error##x[3] = { 0, 0, 0 }, inc##x[3]; \
- gboolean bigslope##x[3] /* color slope > 1 */
-
-#define SETUP(x, from, to, w) \
- len##x = w; \
- \
- color##x[0] = from->r; \
- color##x[1] = from->g; \
- color##x[2] = from->b; \
- \
- cdelta##x[0] = to->r - from->r; \
- cdelta##x[1] = to->g - from->g; \
- cdelta##x[2] = to->b - from->b; \
- \
- if (cdelta##x[0] < 0) { \
- cdelta##x[0] = -cdelta##x[0]; \
- inc##x[0] = -1; \
- } else \
- inc##x[0] = 1; \
- if (cdelta##x[1] < 0) { \
- cdelta##x[1] = -cdelta##x[1]; \
- inc##x[1] = -1; \
- } else \
- inc##x[1] = 1; \
- if (cdelta##x[2] < 0) { \
- cdelta##x[2] = -cdelta##x[2]; \
- inc##x[2] = -1; \
- } else \
- inc##x[2] = 1; \
- bigslope##x[0] = cdelta##x[0] > w;\
- bigslope##x[1] = cdelta##x[1] > w;\
- bigslope##x[2] = cdelta##x[2] > w
-
-#define COLOR_RR(x, c) \
- c->r = color##x[0]; \
- c->g = color##x[1]; \
- c->b = color##x[2]
-
-#define COLOR(x) \
- ((color##x[0] << RrDefaultRedOffset) + \
- (color##x[1] << RrDefaultGreenOffset) + \
- (color##x[2] << RrDefaultBlueOffset))
-
-#define INCREMENT(x, i) \
- (inc##x[i])
-
-#define NEXT(x) \
-{ \
- register gint i; \
- for (i = 2; i >= 0; --i) { \
- if (!cdelta##x[i]) continue; \
- \
- if (!bigslope##x[i]) { \
- /* Y (color) is dependant on X */ \
- error##x[i] += cdelta##x[i]; \
- if ((error##x[i] << 1) >= len##x) { \
- color##x[i] += INCREMENT(x, i); \
- error##x[i] -= len##x; \
- } \
- } else { \
- /* X is dependant on Y (color) */ \
- while (1) { \
- color##x[i] += INCREMENT(x, i); \
- error##x[i] += len##x; \
- if ((error##x[i] << 1) >= cdelta##x[i]) { \
- error##x[i] -= cdelta##x[i]; \
- break; \
- } \
- } \
- } \
- } \
-}
-
-static void gradient_splitvertical(RrAppearance *a, gint w, gint h)
-{
- register gint y1, y2, y3;
- RrSurface *sf = &a->surface;
- RrPixel32 *data;
- register gint y1sz, y2sz, y3sz;
-
- VARS(y1);
- VARS(y2);
- VARS(y3);
-
- /* if h <= 5, then a 0 or 1px middle gradient.
- if h > 5, then always a 1px middle gradient.
- */
- if (h <= 5) {
- y1sz = MAX(h/2, 0);
- y2sz = (h < 3) ? 0 : (h & 1);
- y3sz = MAX(h/2, 1);
- }
- else {
- y1sz = h/2 - (1 - (h & 1));
- y2sz = 1;
- y3sz = h/2;
- }
-
- SETUP(y1, sf->split_primary, sf->primary, y1sz);
- if (y2sz) {
- /* setup to get the colors _in between_ these other 2 */
- SETUP(y2, sf->primary, sf->secondary, y2sz + 2);
- NEXT(y2); /* skip the first one, its the same as the last of y1 */
- }
- SETUP(y3, sf->secondary, sf->split_secondary, y3sz);
-
- /* find the color for the first pixel of each row first */
- data = sf->pixel_data;
-
- for (y1 = y1sz-1; y1 > 0; --y1) {
- *data = COLOR(y1);
- data += w;
- NEXT(y1);
- }
- *data = COLOR(y1);
- data += w;
- if (y2sz) {
- for (y2 = y2sz-1; y2 > 0; --y2) {
- *data = COLOR(y2);
- data += w;
- NEXT(y2);
- }
- *data = COLOR(y2);
- data += w;
- }
- for (y3 = y3sz-1; y3 > 0; --y3) {
- *data = COLOR(y3);
- data += w;
- NEXT(y3);
- }
- *data = COLOR(y3);
-
- /* copy the first pixels into the whole rows */
- data = sf->pixel_data;
- for (y1 = h; y1 > 0; --y1) {
- repeat_pixel(data, w);
- data += w;
- }
-}
-
-static void gradient_horizontal(RrSurface *sf, gint w, gint h)
-{
- register gint x, y, cpbytes;
- RrPixel32 *data = sf->pixel_data, *datav;
- gchar *datac;
-
- VARS(x);
- SETUP(x, sf->primary, sf->secondary, w);
-
- /* set the color values for the first row */
- datav = data;
- for (x = w - 1; x > 0; --x) { /* 0 -> w - 1 */
- *datav = COLOR(x);
- ++datav;
- NEXT(x);
- }
- *datav = COLOR(x);
- ++datav;
-
- /* copy the first row to the rest in O(logn) copies */
- datac = (gchar*)datav;
- cpbytes = 1 * w * sizeof(RrPixel32);
- for (y = (h - 1) * w * sizeof(RrPixel32); y > 0;) {
- memcpy(datac, data, cpbytes);
- y -= cpbytes;
- datac += cpbytes;
- cpbytes <<= 1;
- if (cpbytes > y)
- cpbytes = y;
- }
-}
-
-static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h)
-{
- register gint x, y, half1, half2, cpbytes;
- RrPixel32 *data = sf->pixel_data, *datav;
- gchar *datac;
-
- VARS(x);
-
- half1 = (w + 1) / 2;
- half2 = w / 2;
-
- /* set the color values for the first row */
-
- SETUP(x, sf->primary, sf->secondary, half1);
- datav = data;
- for (x = half1 - 1; x > 0; --x) { /* 0 -> half1 - 1 */
- *datav = COLOR(x);
- ++datav;
- NEXT(x);
- }
- *datav = COLOR(x);
- ++datav;
-
- if (half2 > 0) {
- SETUP(x, sf->secondary, sf->primary, half2);
- for (x = half2 - 1; x > 0; --x) { /* 0 -> half2 - 1 */
- *datav = COLOR(x);
- ++datav;
- NEXT(x);
- }
- *datav = COLOR(x);
- ++datav;
- }
-
- /* copy the first row to the rest in O(logn) copies */
- datac = (gchar*)datav;
- cpbytes = 1 * w * sizeof(RrPixel32);
- for (y = (h - 1) * w * sizeof(RrPixel32); y > 0;) {
- memcpy(datac, data, cpbytes);
- y -= cpbytes;
- datac += cpbytes;
- cpbytes <<= 1;
- if (cpbytes > y)
- cpbytes = y;
- }
-}
-
-static void gradient_vertical(RrSurface *sf, gint w, gint h)
-{
- register gint y;
- RrPixel32 *data;
-
- VARS(y);
- SETUP(y, sf->primary, sf->secondary, h);
-
- /* find the color for the first pixel of each row first */
- data = sf->pixel_data;
-
- for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */
- *data = COLOR(y);
- data += w;
- NEXT(y);
- }
- *data = COLOR(y);
-
- /* copy the first pixels into the whole rows */
- data = sf->pixel_data;
- for (y = h; y > 0; --y) {
- repeat_pixel(data, w);
- data += w;
- }
-}
-
-static void gradient_diagonal(RrSurface *sf, gint w, gint h)
-{
- register gint x, y;
- RrPixel32 *data = sf->pixel_data;
- RrColor left, right;
- RrColor extracorner;
-
- VARS(lefty);
- VARS(righty);
- VARS(x);
-
- extracorner.r = (sf->primary->r + sf->secondary->r) / 2;
- extracorner.g = (sf->primary->g + sf->secondary->g) / 2;
- extracorner.b = (sf->primary->b + sf->secondary->b) / 2;
-
- SETUP(lefty, sf->primary, (&extracorner), h);
- SETUP(righty, (&extracorner), sf->secondary, h);
-
- for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */
- COLOR_RR(lefty, (&left));
- COLOR_RR(righty, (&right));
-
- SETUP(x, (&left), (&right), w);
-
- for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
- *(data++) = COLOR(x);
-
- NEXT(x);
- }
- *(data++) = COLOR(x);
-
- NEXT(lefty);
- NEXT(righty);
- }
- COLOR_RR(lefty, (&left));
- COLOR_RR(righty, (&right));
-
- SETUP(x, (&left), (&right), w);
-
- for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
- *(data++) = COLOR(x);
-
- NEXT(x);
- }
- *data = COLOR(x);
-}
-
-static void gradient_crossdiagonal(RrSurface *sf, gint w, gint h)
-{
- register gint x, y;
- RrPixel32 *data = sf->pixel_data;
- RrColor left, right;
- RrColor extracorner;
-
- VARS(lefty);
- VARS(righty);
- VARS(x);
-
- extracorner.r = (sf->primary->r + sf->secondary->r) / 2;
- extracorner.g = (sf->primary->g + sf->secondary->g) / 2;
- extracorner.b = (sf->primary->b + sf->secondary->b) / 2;
-
- SETUP(lefty, (&extracorner), sf->secondary, h);
- SETUP(righty, sf->primary, (&extracorner), h);
-
- for (y = h - 1; y > 0; --y) { /* 0 -> h-1 */
- COLOR_RR(lefty, (&left));
- COLOR_RR(righty, (&right));
-
- SETUP(x, (&left), (&right), w);
-
- for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
- *(data++) = COLOR(x);
-
- NEXT(x);
- }
- *(data++) = COLOR(x);
-
- NEXT(lefty);
- NEXT(righty);
- }
- COLOR_RR(lefty, (&left));
- COLOR_RR(righty, (&right));
-
- SETUP(x, (&left), (&right), w);
-
- for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
- *(data++) = COLOR(x);
-
- NEXT(x);
- }
- *data = COLOR(x);
-}
-
-static void gradient_pyramid(RrSurface *sf, gint w, gint h)
-{
- RrPixel32 *ldata, *rdata;
- RrPixel32 *cp;
- RrColor left, right;
- RrColor extracorner;
- register gint x, y, halfw, halfh, midx, midy;
-
- VARS(lefty);
- VARS(righty);
- VARS(x);
-
- extracorner.r = (sf->primary->r + sf->secondary->r) / 2;
- extracorner.g = (sf->primary->g + sf->secondary->g) / 2;
- extracorner.b = (sf->primary->b + sf->secondary->b) / 2;
-
- halfw = w >> 1;
- halfh = h >> 1;
- midx = w - halfw - halfw; /* 0 or 1, depending if w is even or odd */
- midy = h - halfh - halfh; /* 0 or 1, depending if h is even or odd */
-
- SETUP(lefty, sf->primary, (&extracorner), halfh + midy);
- SETUP(righty, (&extracorner), sf->secondary, halfh + midy);
-
- /* draw the top half
-
- it is faster to draw both top quarters together than to draw one and
- then copy it over to the other side.
- */
-
- ldata = sf->pixel_data;
- rdata = ldata + w - 1;
- for (y = halfh + midy; y > 0; --y) { /* 0 -> (h+1)/2 */
- RrPixel32 c;
-
- COLOR_RR(lefty, (&left));
- COLOR_RR(righty, (&right));
-
- SETUP(x, (&left), (&right), halfw + midx);
-
- for (x = halfw + midx - 1; x > 0; --x) { /* 0 -> (w+1)/2 */
- c = COLOR(x);
- *(ldata++) = *(rdata--) = c;
-
- NEXT(x);
- }
- c = COLOR(x);
- *ldata = *rdata = c;
- ldata += halfw + 1;
- rdata += halfw - 1 + midx + w;
-
- NEXT(lefty);
- NEXT(righty);
- }
-
- /* copy the top half into the bottom half, mirroring it, so we can only
- copy one row at a time
-
- it is faster, to move the writing pointer forward, and the reading
- pointer backward
-
- this is the current code, moving the write pointer forward and read
- pointer backward
- 41.78 4.26 1.78 504 3.53 3.53 gradient_pyramid2
- this is the opposite, moving the read pointer forward and the write
- pointer backward
- 42.27 4.40 1.86 504 3.69 3.69 gradient_pyramid2
-
- */
- ldata = sf->pixel_data + (halfh - 1) * w;
- cp = ldata + (midy + 1) * w;
- for (y = halfh; y > 0; --y) {
- memcpy(cp, ldata, w * sizeof(RrPixel32));
- ldata -= w;
- cp += w;
- }
-}
diff --git a/render/gradient.h b/render/gradient.h
deleted file mode 100644
index 8613f0ce..00000000
--- a/render/gradient.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- gradient.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __gradient_h
-#define __gradient_h
-
-#include "render.h"
-
-void RrRender(RrAppearance *a, gint w, gint h);
-
-#endif /* __gradient_h */
diff --git a/render/icon.h b/render/icon.h
deleted file mode 100644
index f0b2d267..00000000
--- a/render/icon.h
+++ /dev/null
@@ -1,422 +0,0 @@
-/* GIMP RGBA C-Source image dump (icon.h) */
-
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- icon.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#define OB_DEFAULT_ICON_WIDTH (48)
-#define OB_DEFAULT_ICON_HEIGHT (48)
-#define OB_DEFAULT_ICON_BYTES_PER_PIXEL (4) /* 3:RGB, 4:RGBA */
-#define OB_DEFAULT_ICON_COMMENT \
- "To recreate this file, save an image as \"C-Source\" in The Gimp. Use \"ob_default_icon\" as the Prefixed Name. Enable Glib Types. Enable Save Alpha Channel. Enable Use Macros instead of Struct."
-#define OB_DEFAULT_ICON_PIXEL_DATA ((guint8*) OB_DEFAULT_ICON_pixel_data)
-static const guint8 OB_DEFAULT_ICON_pixel_data[48 * 48 * 4 + 1] =
-("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
- "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\40J\207\15\40J\207\23\40J\207"
- "\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J"
- "\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23"
- "\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207"
- "\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J"
- "\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23"
- "\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207\23\40J\207"
- "\23\40J\207\15\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0'P\213\267'Q\214\275'Q\214\275"
- "'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214"
- "\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275"
- "'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275(R\215\275'Q\214\275'Q\214"
- "\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275"
- "'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275'Q\214\275(R\215"
- "\275(R\215\275(R\215\275&P\213\267\40J\207\20\0\0\0\0\0\0\0\0\40J\207+Y{\252"
- "\377\216\253\320\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243"
- "\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204"
- "\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377"
- "\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314"
- "\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243\314\377\204\243"
- "\314\377\204\243\314\377\203\243\314\377\203\243\313\377\203\243\313\377\203"
- "\243\313\377\203\242\313\377\202\242\313\377\202\242\313\377\202\241\313\377"
- "\201\241\312\377\201\241\312\377\201\240\312\377\201\240\312\377\200\240\312"
- "\377\200\240\312\377\200\240\312\377\200\240\312\377\211\247\316\377Jn\241"
- "\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Wy\251\377]\207\275\377>o\260\377>o"
- "\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260"
- "\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377"
- ">o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260\377>o\260"
- "\377>o\260\377>o\260\377>o\260\377>o\260\377=o\260\377=o\260\377=o\260\377"
- "=o\260\377=o\260\377=o\260\377=o\260\377=o\260\377=o\260\377=o\260\377=o\260"
- "\377=o\260\377_\210\275\377Hm\241\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Tw"
- "\251\377]\207\276\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r"
- "\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263"
- "\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377"
- "?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263"
- "\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377"
- "?r\263\377?r\263\377?r\263\377?r\263\377?r\263\377]\210\277\377Fl\241\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+Rv\250\377\\\210\300\377At\265\377At\265"
- "\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377"
- "At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265"
- "\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377"
- "At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265"
- "\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377At\265\377"
- "At\265\377\\\210\300\377Dj\240\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Ot\247"
- "\377\\\211\302\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271"
- "\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377"
- "Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271"
- "\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377"
- "Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377Dw\271"
- "\377Dw\271\377Dw\271\377Dw\271\377Dw\271\377[\211\302\377Bi\240\377\40J\207"
- "+\0\0\0\0\0\0\0\0\40J\207+Ls\247\377\\\211\303\377Fy\273\377Fy\273\377Fy\273"
- "\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377"
- "Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273"
- "\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377"
- "Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273"
- "\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377Fy\273\377"
- "\\\211\303\377Ah\240\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Jq\246\377\\\212"
- "\305\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277"
- "\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377"
- "I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277"
- "\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377"
- "I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277"
- "\377I}\277\377I}\277\377I}\277\377[\212\305\377?g\237\377\40J\207+\0\0\0\0"
- "\0\0\0\0\40J\207+Jq\246\377\\\212\305\377I}\277\377I}\277\377I}\277\377I}"
- "\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277"
- "\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377I}\277\377"
- "I}\277\377I}\277\377I}\277\377J~\300\377K\177\301\377K\177\301\377K\177\301"
- "\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377K\177"
- "\301\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377K\177\301\377"
- "K\177\301\377K\177\301\377K\177\301\377K\177\301\377Z\212\307\377=f\237\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+Ip\247\377\\\213\307\377J\177\301\377J\177"
- "\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377"
- "J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301"
- "\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177\301\377J\177"
- "\301\377J\177\301\377J\177\301\377K\200\302\377K\200\302\377K\200\302\377"
- "K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302"
- "\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377K\200"
- "\302\377K\200\302\377K\200\302\377K\200\302\377K\200\302\377Z\212\307\377"
- "=f\237\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+Ho\247\377e\223\314\377Z\213\310"
- "\377Z\213\310\377Z\213\310\377Z\213\310\377Z\213\307\377Z\213\307\377Z\213"
- "\307\377Z\213\307\377Z\213\307\377Y\212\307\377Y\212\307\377Y\212\307\377"
- "Y\212\307\377Y\212\307\377X\212\307\377X\212\307\377X\212\307\377X\211\307"
- "\377X\212\307\377X\212\307\377X\211\307\377X\211\307\377X\211\307\377X\211"
- "\307\377X\211\307\377X\211\307\377X\211\307\377X\211\307\377X\211\307\377"
- "X\211\307\377W\211\307\377W\211\307\377W\211\307\377W\211\307\377W\211\307"
- "\377W\211\307\377V\211\307\377V\211\307\377V\210\307\377V\210\307\377`\217"
- "\312\377<e\237\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+<b\231\377i\212\267\377"
- "i\211\266\377i\211\266\377i\211\266\377i\211\266\377i\211\266\377h\211\266"
- "\377h\211\266\377h\211\266\377h\211\266\377h\211\266\377h\211\266\377h\211"
- "\266\377g\211\266\377g\211\266\377g\211\266\377g\211\266\377g\210\266\377"
- "g\210\266\377g\211\266\377g\211\266\377g\210\266\377g\210\266\377g\210\265"
- "\377g\210\265\377g\210\265\377g\210\265\377g\210\265\377g\210\265\377g\210"
- "\265\377g\210\265\377g\210\265\377f\210\265\377f\210\264\377f\210\264\377"
- "f\210\264\377f\210\264\377f\210\264\377f\210\264\377f\210\264\377f\207\264"
- "\377f\207\264\3778^\226\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+b\177\251\377"
- "\340\344\351\377\337\342\350\377\337\342\350\377\336\342\350\377\336\342\347"
- "\377\336\342\347\377\336\342\347\377\336\342\347\377\335\341\347\377\335\341"
- "\346\377\335\341\346\377\335\341\346\377\335\341\346\377\335\341\346\377\335"
- "\341\346\377\335\341\346\377\335\341\346\377\334\340\346\377\334\340\346\377"
- "\335\341\346\377\335\341\346\377\334\340\346\377\334\340\346\377\334\340\345"
- "\377\334\340\345\377\334\340\345\377\333\337\345\377\333\337\345\377\333\337"
- "\344\377\333\337\344\377\333\337\344\377\333\336\344\377\332\336\344\377\332"
- "\336\344\377\332\336\344\377\332\336\343\377\332\336\343\377\332\336\343\377"
- "\332\336\343\377\332\336\343\377\332\336\343\377\333\337\345\377a}\247\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\204\254\377\355\355\355\377\351\351\351"
- "\377\351\351\352\377\351\351\351\377\351\351\351\377\351\351\351\377\351\351"
- "\350\377\351\350\350\377\351\351\351\377\350\350\350\377\350\350\350\377\350"
- "\350\350\377\350\350\350\377\350\350\350\377\350\350\350\377\350\350\350\377"
- "\350\347\350\377\350\347\347\377\347\347\347\377\347\347\347\377\347\347\347"
- "\377\347\347\347\377\347\347\347\377\347\347\347\377\346\347\347\377\347\346"
- "\347\377\347\346\347\377\346\346\347\377\346\346\346\377\346\346\346\377\346"
- "\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377"
- "\346\345\345\377\345\345\346\377\345\346\345\377\345\346\345\377\345\346\345"
- "\377\345\345\345\377\351\351\351\377g\202\252\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+h\203\253\377\354\354\354\377\350\350\350\377\347\350\350\377\347"
- "\347\350\377\347\347\350\377\347\347\347\377\347\347\347\377\347\347\347\377"
- "\347\347\347\377\347\346\347\377\347\346\346\377\347\346\346\377\347\347\347"
- "\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346\346\377\346\346"
- "\346\377\346\346\346\377\345\345\346\377\345\345\345\377\345\345\346\377\345"
- "\346\346\377\345\345\345\377\345\345\345\377\345\345\345\377\345\345\345\377"
- "\345\345\345\377\345\344\344\377\345\345\344\377\345\345\345\377\345\344\344"
- "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\343\344"
- "\344\377\343\344\344\377\344\344\344\377\344\344\343\377\344\343\343\377\350"
- "\350\350\377g\202\252\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\353"
- "\352\352\377\346\346\346\377\346\345\345\377\345\346\346\377\345\346\345\377"
- "\345\345\345\377\345\345\345\377\345\345\345\377\345\345\346\377\345\345\345"
- "\377\345\345\345\377\345\345\345\377\345\345\345\377\345\345\345\377\345\345"
- "\345\377\344\345\345\377\344\344\344\377\344\345\344\377\344\344\344\377\344"
- "\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\343\343\344\377"
- "\343\343\343\377\344\343\343\377\343\343\343\377\343\343\343\377\343\343\343"
- "\377\343\343\343\377\343\343\343\377\342\343\343\377\342\343\343\377\343\342"
- "\343\377\343\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377\342"
- "\342\342\377\342\342\342\377\342\342\342\377\346\346\346\377g\202\252\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\351\351\351\377\345\344\344"
- "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\343\344"
- "\344\377\343\344\344\377\343\343\344\377\343\343\343\377\343\343\343\377\343"
- "\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377"
- "\343\343\343\377\343\343\343\377\343\342\342\377\342\342\342\377\342\342\342"
- "\377\342\342\342\377\342\342\342\377\342\341\342\377\342\342\342\377\342\342"
- "\341\377\342\341\342\377\341\341\342\377\341\341\341\377\341\341\341\377\341"
- "\341\341\377\341\341\341\377\341\341\341\377\341\340\341\377\341\341\341\377"
- "\340\341\341\377\341\341\341\377\340\340\340\377\340\340\340\377\340\340\340"
- "\377\340\340\340\377\346\345\346\377g\202\252\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+h\203\253\377\350\350\350\377\342\342\343\377\342\342\342\377\342"
- "\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377"
- "\342\342\342\377\342\342\341\377\342\341\342\377\341\341\341\377\341\341\341"
- "\377\341\341\341\377\341\341\341\377\341\341\341\377\341\341\341\377\341\341"
- "\341\377\340\341\341\377\341\340\340\377\341\340\340\377\340\340\340\377\340"
- "\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377\340\340\340\377"
- "\340\340\337\377\340\340\340\377\337\337\337\377\340\340\337\377\337\337\337"
- "\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
- "\337\377\337\337\337\377\337\337\336\377\336\337\336\377\336\336\336\377\344"
- "\344\344\377g\202\252\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\347"
- "\347\347\377\341\341\341\377\341\341\341\377\341\341\341\377\341\341\341\377"
- "\341\341\341\377\340\341\340\377\340\340\340\377\340\340\340\377\340\340\337"
- "\377\340\340\340\377\340\340\340\377\340\340\337\377\337\340\337\377\337\340"
- "\337\377\337\337\340\377\337\337\337\377\337\337\337\377\337\337\337\377\337"
- "\337\337\377\337\337\337\377\337\337\337\377\336\337\337\377\336\337\336\377"
- "\337\336\336\377\336\336\336\377\336\336\336\377\336\336\336\377\336\336\336"
- "\377\336\336\336\377\336\336\336\377\336\336\335\377\336\335\335\377\336\335"
- "\335\377\336\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335"
- "\335\335\377\335\335\335\377\335\335\335\377\343\343\343\377g\202\252\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\345\346\346\377\337\337\340"
- "\377\340\337\337\377\337\337\337\377\337\337\337\377\337\337\337\377\337\337"
- "\337\377\337\337\336\377\337\336\336\377\336\336\337\377\336\336\337\377\336"
- "\336\336\377\336\336\336\377\336\336\336\377\336\336\335\377\336\336\336\377"
- "\336\335\336\377\336\336\336\377\335\335\336\377\335\335\335\377\335\335\335"
- "\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377\335\335"
- "\334\377\334\335\335\377\334\334\334\377\334\334\334\377\334\334\334\377\334"
- "\334\334\377\334\334\334\377\334\334\334\377\334\334\334\377\334\334\334\377"
- "\334\333\334\377\333\333\333\377\333\333\333\377\333\333\333\377\333\333\333"
- "\377\333\333\333\377\341\341\342\377f\202\252\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+h\203\253\377\345\345\345\377\336\335\336\377\336\335\335\377\335"
- "\335\335\377\336\335\335\377\335\335\335\377\335\335\335\377\335\335\335\377"
- "\335\334\335\377\335\335\335\377\335\335\335\377\334\335\334\377\334\334\335"
- "\377\334\335\334\377\334\334\334\377\334\334\334\377\334\334\334\377\334\334"
- "\334\377\334\334\334\377\334\334\334\377\334\333\334\377\334\333\333\377\333"
- "\333\333\377\333\333\333\377\333\333\333\377\333\333\333\377\333\333\333\377"
- "\333\332\333\377\333\333\333\377\333\333\333\377\332\333\333\377\332\333\332"
- "\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332\332\377\332\332"
- "\332\377\332\332\332\377\331\332\331\377\331\332\331\377\331\331\332\377\341"
- "\341\341\377f\202\252\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+g\203\253\377\343"
- "\343\344\377\334\334\334\377\334\333\334\377\334\334\334\377\333\333\334\377"
- "\333\333\333\377\333\334\333\377\333\333\333\377\333\333\333\377\333\333\333"
- "\377\333\333\333\377\333\333\333\377\333\332\333\377\333\332\333\377\333\332"
- "\332\377\332\332\333\377\332\332\333\377\332\332\332\377\333\332\332\377\332"
- "\332\332\377\332\332\332\377\331\332\332\377\331\332\331\377\331\332\331\377"
- "\331\332\331\377\331\331\331\377\331\331\331\377\332\331\331\377\331\331\331"
- "\377\331\331\331\377\331\331\331\377\330\330\331\377\330\330\330\377\331\330"
- "\330\377\330\330\330\377\330\330\330\377\331\330\330\377\330\330\330\377\330"
- "\330\330\377\330\330\330\377\330\330\330\377\337\337\337\377f\202\252\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+g\203\253\377\342\342\343\377\332\332\332"
- "\377\332\332\332\377\332\332\332\377\332\332\332\377\331\332\332\377\331\332"
- "\332\377\332\332\331\377\332\331\331\377\331\331\331\377\331\331\331\377\331"
- "\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377\331\331\331\377"
- "\331\331\331\377\330\330\330\377\331\330\331\377\330\331\330\377\330\330\330"
- "\377\330\330\330\377\330\330\330\377\330\330\327\377\327\330\330\377\330\330"
- "\327\377\327\330\330\377\330\330\327\377\327\327\327\377\327\327\327\377\327"
- "\327\327\377\327\327\327\377\327\327\327\377\327\327\327\377\327\327\327\377"
- "\326\327\327\377\327\326\326\377\326\327\326\377\326\326\326\377\326\326\326"
- "\377\326\326\326\377\336\336\337\377f\202\252\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+g\203\253\377\341\341\341\377\331\331\331\377\330\331\331\377\330"
- "\330\330\377\330\330\330\377\330\330\330\377\330\330\330\377\330\330\330\377"
- "\327\330\330\377\330\330\327\377\330\330\330\377\330\327\330\377\327\327\327"
- "\377\327\330\327\377\327\330\327\377\327\327\327\377\327\327\327\377\327\327"
- "\327\377\327\327\327\377\326\327\326\377\326\327\326\377\326\326\326\377\326"
- "\326\326\377\326\326\326\377\326\326\326\377\326\326\326\377\326\326\326\377"
- "\326\326\326\377\325\325\326\377\325\326\326\377\326\325\325\377\325\325\325"
- "\377\325\326\325\377\325\325\325\377\325\325\325\377\325\325\325\377\325\325"
- "\325\377\325\325\325\377\325\324\325\377\324\324\324\377\324\324\324\377\335"
- "\335\335\377f\202\252\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+g\203\253\377\340"
- "\340\340\377\327\327\327\377\327\327\327\377\326\327\327\377\327\326\327\377"
- "\326\326\326\377\326\326\327\377\326\326\326\377\326\326\326\377\326\326\326"
- "\377\326\326\326\377\326\326\326\377\326\326\325\377\325\326\325\377\325\326"
- "\326\377\325\325\325\377\325\325\325\377\325\325\325\377\325\325\325\377\325"
- "\325\325\377\325\325\325\377\324\325\325\377\325\325\325\377\324\325\325\377"
- "\324\324\324\377\325\324\324\377\324\324\324\377\324\324\324\377\324\324\324"
- "\377\323\324\324\377\324\323\324\377\323\324\324\377\323\324\324\377\323\324"
- "\323\377\323\323\324\377\323\323\323\377\323\323\323\377\323\323\323\377\323"
- "\323\323\377\323\323\323\377\323\323\323\377\334\334\334\377f\202\252\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+g\203\253\377\337\336\337\377\325\325\325"
- "\377\325\325\325\377\325\325\325\377\325\325\325\377\325\325\325\377\325\325"
- "\325\377\325\325\324\377\325\325\325\377\324\325\324\377\324\324\324\377\324"
- "\324\324\377\324\324\324\377\324\324\324\377\324\324\324\377\324\324\324\377"
- "\324\324\324\377\324\323\323\377\323\323\323\377\324\323\323\377\323\323\323"
- "\377\323\323\323\377\324\323\323\377\323\323\323\377\323\323\323\377\323\322"
- "\323\377\323\322\322\377\322\322\322\377\322\322\322\377\322\322\322\377\322"
- "\322\322\377\322\322\322\377\322\322\322\377\322\322\322\377\321\322\321\377"
- "\321\321\322\377\321\321\321\377\321\321\321\377\321\321\321\377\321\321\321"
- "\377\321\321\321\377\334\333\334\377g\202\252\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+h\203\253\377\336\336\336\377\323\324\323\377\324\323\324\377\324"
- "\323\323\377\323\324\323\377\323\323\323\377\323\323\323\377\323\323\323\377"
- "\323\323\323\377\323\323\323\377\323\323\323\377\322\323\323\377\323\322\323"
- "\377\322\322\323\377\322\322\322\377\322\322\322\377\322\322\322\377\322\322"
- "\322\377\322\322\322\377\322\322\322\377\322\322\322\377\321\321\321\377\322"
- "\321\321\377\321\321\321\377\321\321\321\377\321\321\321\377\321\321\321\377"
- "\321\321\320\377\321\321\321\377\321\321\321\377\321\321\321\377\320\320\320"
- "\377\320\320\320\377\320\320\320\377\320\320\320\377\320\317\320\377\317\320"
- "\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320\317\317\377\332"
- "\332\332\377g\202\252\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\335"
- "\335\335\377\322\322\322\377\322\322\322\377\322\322\322\377\321\322\322\377"
- "\321\321\321\377\321\321\321\377\322\321\321\377\321\321\321\377\321\321\321"
- "\377\321\321\321\377\321\321\321\377\321\320\321\377\320\321\320\377\320\320"
- "\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320"
- "\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\317\320\320\377"
- "\317\320\317\377\317\317\317\377\317\317\317\377\317\317\317\377\317\317\317"
- "\377\317\317\317\377\316\317\317\377\317\317\317\377\317\316\316\377\316\316"
- "\316\377\317\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316"
- "\316\316\377\316\316\316\377\316\316\316\377\331\331\331\377f\202\252\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\334\334\334\377\320\320\320"
- "\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320\320\377\320\320"
- "\320\377\320\320\317\377\317\317\320\377\320\317\317\377\317\317\317\377\317"
- "\317\317\377\317\317\317\377\317\317\317\377\317\317\317\377\317\317\317\377"
- "\317\316\317\377\317\317\316\377\316\317\317\377\316\316\316\377\316\316\316"
- "\377\316\316\316\377\316\316\316\377\316\316\316\377\316\316\316\377\316\315"
- "\315\377\316\316\315\377\315\316\315\377\315\316\316\377\315\315\315\377\315"
- "\315\315\377\315\315\315\377\315\315\315\377\315\314\315\377\315\315\315\377"
- "\315\315\314\377\314\314\314\377\314\314\314\377\314\314\314\377\314\314\314"
- "\377\314\314\314\377\331\330\331\377f\202\252\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+h\203\253\377\333\333\333\377\317\317\316\377\316\317\316\377\317"
- "\316\316\377\317\316\316\377\316\317\316\377\316\316\316\377\316\316\316\377"
- "\316\316\316\377\316\316\316\377\316\315\316\377\315\315\315\377\315\315\316"
- "\377\315\315\315\377\315\315\315\377\315\315\315\377\315\315\315\377\315\315"
- "\315\377\315\315\315\377\315\315\314\377\315\314\314\377\314\314\314\377\314"
- "\315\314\377\314\314\314\377\314\314\314\377\314\314\314\377\314\314\314\377"
- "\314\314\314\377\314\314\313\377\313\313\313\377\314\314\313\377\313\313\313"
- "\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313"
- "\313\377\312\313\313\377\312\312\313\377\312\312\313\377\312\312\313\377\327"
- "\327\327\377g\203\253\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\203\253\377\332"
- "\332\332\377\315\315\315\377\314\315\315\377\315\315\315\377\315\315\315\377"
- "\314\315\315\377\314\314\315\377\314\314\314\377\314\314\314\377\314\314\314"
- "\377\314\314\314\377\314\314\314\377\314\314\314\377\313\314\314\377\313\314"
- "\313\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313\313\377\313"
- "\313\313\377\313\313\313\377\313\312\313\377\313\313\313\377\312\313\313\377"
- "\313\313\313\377\312\312\312\377\312\312\312\377\312\312\312\377\312\312\312"
- "\377\312\312\312\377\312\312\312\377\312\312\311\377\312\311\311\377\312\312"
- "\311\377\311\311\311\377\311\311\311\377\311\311\311\377\311\311\311\377\311"
- "\311\311\377\311\311\311\377\311\311\311\377\327\326\327\377g\203\253\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+g\203\253\377\331\331\331\377\313\313\313"
- "\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313\313\377\313\313"
- "\313\377\312\312\313\377\312\313\313\377\312\312\312\377\312\312\312\377\312"
- "\312\312\377\312\312\312\377\312\312\312\377\312\312\312\377\311\311\311\377"
- "\312\312\312\377\311\311\311\377\311\311\311\377\311\312\311\377\311\311\311"
- "\377\311\311\311\377\311\311\311\377\311\311\311\377\311\311\311\377\311\310"
- "\311\377\310\310\310\377\310\310\310\377\310\310\310\377\310\310\310\377\310"
- "\310\310\377\310\310\310\377\310\310\310\377\310\310\310\377\310\310\310\377"
- "\307\307\310\377\310\307\310\377\307\307\307\377\307\307\307\377\307\307\307"
- "\377\307\307\307\377\325\325\325\377g\203\253\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\207+h\204\254\377\330\330\331\377\312\312\311\377\312\312\311\377\312"
- "\311\311\377\311\311\311\377\311\311\311\377\311\311\311\377\310\311\311\377"
- "\311\311\311\377\311\311\311\377\311\310\311\377\311\310\310\377\311\311\311"
- "\377\310\310\311\377\310\310\310\377\310\310\310\377\310\310\310\377\310\310"
- "\310\377\310\310\310\377\307\310\307\377\310\310\310\377\307\307\307\377\307"
- "\307\310\377\307\307\307\377\307\307\307\377\307\307\307\377\307\307\307\377"
- "\307\307\307\377\307\307\307\377\306\306\307\377\306\307\307\377\306\306\306"
- "\377\306\306\306\377\306\306\306\377\306\306\306\377\306\306\306\377\306\306"
- "\306\377\305\306\306\377\305\306\305\377\305\306\306\377\305\306\306\377\325"
- "\325\325\377g\203\253\377\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\204\254\377\327"
- "\327\327\377\310\310\310\377\310\310\310\377\310\310\310\377\310\307\307\377"
- "\307\307\310\377\307\307\307\377\307\307\307\377\307\307\307\377\307\307\307"
- "\377\307\307\307\377\307\307\307\377\307\307\307\377\307\306\306\377\307\306"
- "\306\377\306\307\306\377\307\306\306\377\306\306\306\377\306\306\306\377\306"
- "\306\306\377\306\306\306\377\306\306\306\377\306\306\306\377\305\305\305\377"
- "\305\305\306\377\306\305\305\377\305\305\305\377\305\305\306\377\305\305\305"
- "\377\305\305\305\377\305\305\305\377\305\304\305\377\304\304\304\377\304\304"
- "\305\377\304\304\305\377\304\304\304\377\304\304\304\377\304\304\304\377\304"
- "\304\304\377\304\304\304\377\304\304\304\377\324\324\324\377g\203\253\377"
- "\40J\207+\0\0\0\0\0\0\0\0\40J\207+h\204\254\377\326\326\326\377\307\306\306"
- "\377\306\306\306\377\306\306\306\377\306\306\306\377\306\306\306\377\306\305"
- "\306\377\306\306\305\377\305\305\306\377\305\306\306\377\305\305\305\377\305"
- "\305\305\377\305\305\305\377\305\305\305\377\305\305\305\377\305\305\305\377"
- "\305\304\305\377\305\305\305\377\304\304\305\377\304\304\304\377\304\304\304"
- "\377\304\304\304\377\304\304\304\377\304\304\304\377\304\304\304\377\304\304"
- "\303\377\304\303\304\377\303\303\304\377\303\303\304\377\303\303\303\377\303"
- "\303\303\377\303\302\303\377\303\303\303\377\303\303\303\377\303\302\303\377"
- "\303\302\303\377\303\302\303\377\302\302\302\377\302\302\302\377\302\302\302"
- "\377\302\302\302\377\323\323\323\377h\204\254\377\40J\207+\0\0\0\0\0\0\0\0"
- "\40J\206+h\204\254\377\325\325\325\377\304\305\305\377\305\305\305\377\305"
- "\304\304\377\304\304\305\377\304\305\305\377\304\304\304\377\305\304\305\377"
- "\304\305\304\377\304\304\304\377\304\304\304\377\304\304\303\377\304\304\304"
- "\377\304\304\303\377\303\303\304\377\303\303\303\377\304\303\303\377\303\303"
- "\303\377\303\303\303\377\303\303\303\377\303\302\303\377\303\302\303\377\302"
- "\303\303\377\302\302\303\377\302\303\303\377\302\303\302\377\302\302\302\377"
- "\302\302\302\377\301\301\301\377\301\301\301\377\301\301\301\377\301\301\301"
- "\377\301\301\301\377\301\301\301\377\301\301\301\377\301\301\301\377\301\301"
- "\301\377\301\301\301\377\301\301\301\377\301\301\301\377\301\301\301\377\322"
- "\322\322\377g\203\253\377\37H\204,\0\0\0\0\0\0\0\1\35Cy0f\202\252\377\350"
- "\350\350\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377"
- "\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344"
- "\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344\344\377\344\344"
- "\344\377\344\344\344\377\344\344\344\377\343\343\343\377\343\343\343\377\344"
- "\344\344\377\344\343\344\377\343\343\343\377\343\343\343\377\343\343\343\377"
- "\343\343\343\377\343\343\343\377\343\343\343\377\343\343\343\377\342\342\342"
- "\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342"
- "\342\377\342\342\342\377\342\342\342\377\342\342\342\377\342\342\342\377\342"
- "\342\342\377\342\342\342\377\342\342\342\377\347\347\347\377f\202\252\377"
- "\33=p3\0\0\0\5\0\0\0\14\27""5`<+T\216\377<d\233\377<d\233\377<d\233\377<d"
- "\233\377<d\233\377<d\233\377<c\233\377:b\232\377-U\217\377<c\233\377;c\233"
- "\377:c\233\377:c\233\377:c\233\377:c\233\377:c\233\377:c\232\377:c\232\377"
- ":b\232\377:c\232\377:c\232\377:b\232\377:b\232\377:b\232\3779b\232\3779b\232"
- "\3779b\232\3779b\232\3779b\232\3779b\232\3779b\232\3779b\232\3778b\232\377"
- "+U\217\3778a\231\3778a\232\3778a\232\3778a\232\3778a\232\3778a\232\3778a\232"
- "\3777`\231\377)R\216\377\25""1YA\0\0\0\23\0\0\0\25\24.UD4_\234\377R\202\277"
- "\377R\202\277\377R\202\277\377R\202\277\377R\202\277\377R\202\277\377R\202"
- "\277\377N\177\273\3771^\232\377R\202\277\377Q\202\277\377Q\202\277\377Q\202"
- "\277\377Q\202\277\377Q\202\277\377Q\202\277\377Q\201\276\377Q\201\276\377"
- "P\201\276\377Q\201\276\377Q\201\276\377P\201\276\377P\201\276\377P\201\276"
- "\377P\201\276\377P\201\276\377P\201\276\377P\201\276\377P\201\276\377P\201"
- "\276\377O\200\276\377O\200\276\377O\200\276\3770]\232\377N\177\274\377O\200"
- "\276\377O\200\276\377O\200\276\377N\200\276\377N\200\276\377N\200\276\377"
- "N\177\275\3771]\233\377\22+OI\0\0\0\34\0\0\0\33\20%C@*S\214\377<b\227\377"
- "<a\227\377<a\227\377<a\227\377<a\227\377<a\227\377<a\227\377;_\226\377-T\216"
- "\377;`\226\377<a\227\377<a\227\377<a\227\377<a\227\377<a\227\377<a\227\377"
- "<a\227\377<a\227\377<a\227\377;`\226\377;`\226\377;`\226\377;`\226\377;`\226"
- "\377;`\226\377;`\226\377;`\226\377;`\226\377;`\226\377;`\226\377;`\226\377"
- ";`\226\377;`\226\377-T\215\377;`\226\377;`\226\377;`\226\377;`\226\377;a\226"
- "\377;a\226\377;a\226\377<a\227\377*R\214\377\17!=G\0\0\0#\0\0\0\33\3\7\14"
- ")\31""6bw\30""4\\}\26""0W\205\25.S\214\25.R\215\25.R\215\25.R\215\25.R\215"
- "\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25"
- ".R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25."
- "R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R"
- "\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25.R\215\25-Q\217"
- "\26/T\212\27""2Y\202\30""4^{\2\5\12""1\0\0\0#\0\0\0\25\0\0\0\37\0\0\0+\0\0"
- "\0""4\0\0\0=\0\0\0C\0\0\0D\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0"
- "C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0"
- "\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0"
- "C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0C\0\0\0D\0\0\0F\0\0\0B\0\0\0:\0"
- "\0\0""2\0\0\0&\0\0\0\35\0\0\0\15\0\0\0\26\0\0\0\40\0\0\0'\0\0\0/\0\0\0""3"
- "\0\0\0""3\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0"
- "\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0"
- "\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0"
- """2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2\0\0\0""2"
- "\0\0\0""2\0\0\0""2\0\0\0""3\0\0\0""5\0\0\0""2\0\0\0,\0\0\0%\0\0\0\34\0\0\0"
- "\23\0\0\0\1\0\0\0\7\0\0\0\16\0\0\0\25\0\0\0\32\0\0\0\35\0\0\0\35\0\0\0\34"
- "\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0"
- "\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0"
- "\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0"
- "\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34\0\0\0\34"
- "\0\0\0\35\0\0\0\36\0\0\0\35\0\0\0\30\0\0\0\23\0\0\0\12\0\0\0\3\0\0\0\0\0\0"
- "\0\0\0\0\0\2\0\0\0\5\0\0\0\10\0\0\0\13\0\0\0\14\0\0\0\13\0\0\0\13\0\0\0\13"
- "\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0"
- "\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0"
- "\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0"
- "\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\13\0\0\0\14\0\0\0\14"
- "\0\0\0\12\0\0\0\6\0\0\0\3\0\0\0\0\0\0\0\0");
-
diff --git a/render/image.c b/render/image.c
deleted file mode 100644
index 924504fd..00000000
--- a/render/image.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- image.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "geom.h"
-#include "image.h"
-#include "color.h"
-#include "imagecache.h"
-
-#include <glib.h>
-
-#define FRACTION 12
-#define FLOOR(i) ((i) & (~0UL << FRACTION))
-#define AVERAGE(a, b) (((((a) ^ (b)) & 0xfefefefeL) >> 1) + ((a) & (b)))
-
-void RrImagePicInit(RrImagePic *pic, gint w, gint h, RrPixel32 *data)
-{
- gint i;
-
- pic->width = w;
- pic->height = h;
- pic->data = data;
- pic->sum = 0;
- for (i = w*h; i > 0; --i)
- pic->sum += *(data++);
-}
-
-static void RrImagePicFree(RrImagePic *pic)
-{
- if (pic) {
- g_free(pic->data);
- g_free(pic);
- }
-}
-
-/*! Add a picture to an Image, that is, add another copy of the image at
- another size. This may add it to the "originals" list or to the
- "resized" list. */
-static void AddPicture(RrImage *self, RrImagePic ***list, gint *len,
- RrImagePic *pic)
-{
- gint i;
-
- g_assert(pic->width > 0 && pic->height > 0);
-
- g_assert(g_hash_table_lookup(self->cache->table, pic) == NULL);
-
- /* grow the list */
- *list = g_renew(RrImagePic*, *list, ++*len);
-
- /* move everything else down one */
- for (i = *len-1; i > 0; --i)
- (*list)[i] = (*list)[i-1];
-
- /* set the new picture up at the front of the list */
- (*list)[0] = pic;
-
- /* add the picture as a key to point to this image in the cache */
- g_hash_table_insert(self->cache->table, (*list)[0], self);
-
-/*
-#ifdef DEBUG
- g_debug("Adding %s picture to the cache:\n "
- "Image 0x%lx, w %d h %d Hash %u",
- (*list == self->original ? "ORIGINAL" : "RESIZED"),
- (gulong)self, pic->width, pic->height, RrImagePicHash(pic));
-#endif
-*/
-}
-
-/*! Remove a picture from an Image. This may remove it from the "originals"
- list or the "resized" list. */
-static void RemovePicture(RrImage *self, RrImagePic ***list,
- gint i, gint *len)
-{
- gint j;
-
-/*
-#ifdef DEBUG
- g_debug("Removing %s picture from the cache:\n "
- "Image 0x%lx, w %d h %d Hash %u",
- (*list == self->original ? "ORIGINAL" : "RESIZED"),
- (gulong)self, (*list)[i]->width, (*list)[i]->height,
- RrImagePicHash((*list)[i]));
-#endif
-*/
-
- /* remove the picture as a key in the cache */
- g_hash_table_remove(self->cache->table, (*list)[i]);
-
- /* free the picture */
- RrImagePicFree((*list)[i]);
- /* shift everything down one */
- for (j = i; j < *len-1; ++j)
- (*list)[j] = (*list)[j+1];
- /* shrink the list */
- *list = g_renew(RrImagePic*, *list, --*len);
-}
-
-/*! Given a picture in RGBA format, of a specified size, resize it to the new
- requested size (but keep its aspect ratio). If the image does not need to
- be resized (it is already the right size) then this returns NULL. Otherwise
- it returns a newly allocated RrImagePic with the resized picture inside it
-*/
-static RrImagePic* ResizeImage(RrPixel32 *src,
- gulong srcW, gulong srcH,
- gulong dstW, gulong dstH)
-{
- RrPixel32 *dst, *dststart;
- RrImagePic *pic;
- gulong dstX, dstY, srcX, srcY;
- gulong srcX1, srcX2, srcY1, srcY2;
- gulong ratioX, ratioY;
- gulong aspectW, aspectH;
-
- /* XXX should these variables be ensured to not be zero in the callers? */
- srcW = srcW ? srcW : 1;
- srcH = srcH ? srcH : 1;
- dstW = dstW ? dstW : 1;
- dstH = dstH ? dstH : 1;
-
- /* keep the aspect ratio */
- aspectW = dstW;
- aspectH = (gint)(dstW * ((gdouble)srcH / srcW));
- if (aspectH > dstH) {
- aspectH = dstH;
- aspectW = (gint)(dstH * ((gdouble)srcW / srcH));
- }
- dstW = aspectW ? aspectW : 1;
- dstH = aspectH ? aspectH : 1;
-
- if (srcW == dstW && srcH == dstH)
- return NULL; /* no scaling needed! */
-
- dststart = dst = g_new(RrPixel32, dstW * dstH);
-
- ratioX = (srcW << FRACTION) / dstW;
- ratioY = (srcH << FRACTION) / dstH;
-
- srcY2 = 0;
- for (dstY = 0; dstY < dstH; dstY++) {
- srcY1 = srcY2;
- srcY2 += ratioY;
-
- srcX2 = 0;
- for (dstX = 0; dstX < dstW; dstX++) {
- gulong red = 0, green = 0, blue = 0, alpha = 0;
- gulong portionX, portionY, portionXY, sumXY = 0;
- RrPixel32 pixel;
-
- srcX1 = srcX2;
- srcX2 += ratioX;
-
- for (srcY = srcY1; srcY < srcY2; srcY += (1UL << FRACTION)) {
- if (srcY == srcY1) {
- srcY = FLOOR(srcY);
- portionY = (1UL << FRACTION) - (srcY1 - srcY);
- if (portionY > srcY2 - srcY1)
- portionY = srcY2 - srcY1;
- }
- else if (srcY == FLOOR(srcY2))
- portionY = srcY2 - srcY;
- else
- portionY = (1UL << FRACTION);
-
- for (srcX = srcX1; srcX < srcX2; srcX += (1UL << FRACTION)) {
- if (srcX == srcX1) {
- srcX = FLOOR(srcX);
- portionX = (1UL << FRACTION) - (srcX1 - srcX);
- if (portionX > srcX2 - srcX1)
- portionX = srcX2 - srcX1;
- }
- else if (srcX == FLOOR(srcX2))
- portionX = srcX2 - srcX;
- else
- portionX = (1UL << FRACTION);
-
- portionXY = (portionX * portionY) >> FRACTION;
- sumXY += portionXY;
-
- pixel = *(src + (srcY >> FRACTION) * srcW
- + (srcX >> FRACTION));
- red += ((pixel >> RrDefaultRedOffset) & 0xFF)
- * portionXY;
- green += ((pixel >> RrDefaultGreenOffset) & 0xFF)
- * portionXY;
- blue += ((pixel >> RrDefaultBlueOffset) & 0xFF)
- * portionXY;
- alpha += ((pixel >> RrDefaultAlphaOffset) & 0xFF)
- * portionXY;
- }
- }
-
- g_assert(sumXY != 0);
- red /= sumXY;
- green /= sumXY;
- blue /= sumXY;
- alpha /= sumXY;
-
- *dst++ = (red << RrDefaultRedOffset) |
- (green << RrDefaultGreenOffset) |
- (blue << RrDefaultBlueOffset) |
- (alpha << RrDefaultAlphaOffset);
- }
- }
-
- pic = g_new(RrImagePic, 1);
- RrImagePicInit(pic, dstW, dstH, dststart);
-
- return pic;
-}
-
-/*! This draws an RGBA picture into the target, within the rectangle specified
- by the area parameter. If the area's size differs from the source's then it
- will be centered within the rectangle */
-void DrawRGBA(RrPixel32 *target, gint target_w, gint target_h,
- RrPixel32 *source, gint source_w, gint source_h,
- gint alpha, RrRect *area)
-{
- RrPixel32 *dest;
- gint col, num_pixels;
- gint dw, dh;
-
- g_assert(source_w <= area->width && source_h <= area->height);
- g_assert(area->x + area->width <= target_w);
- g_assert(area->y + area->height <= target_h);
-
- /* keep the aspect ratio */
- dw = area->width;
- dh = (gint)(dw * ((gdouble)source_h / source_w));
- if (dh > area->height) {
- dh = area->height;
- dw = (gint)(dh * ((gdouble)source_w / source_h));
- }
-
- /* copy source -> dest, and apply the alpha channel.
- center the image if it is smaller than the area */
- col = 0;
- num_pixels = dw * dh;
- dest = target + area->x + (area->width - dw) / 2 +
- (target_w * (area->y + (area->height - dh) / 2));
- while (num_pixels-- > 0) {
- guchar a, r, g, b, bgr, bgg, bgb;
-
- /* apply the rgba's opacity as well */
- a = ((*source >> RrDefaultAlphaOffset) * alpha) >> 8;
- r = *source >> RrDefaultRedOffset;
- g = *source >> RrDefaultGreenOffset;
- b = *source >> RrDefaultBlueOffset;
-
- /* background color */
- bgr = *dest >> RrDefaultRedOffset;
- bgg = *dest >> RrDefaultGreenOffset;
- bgb = *dest >> RrDefaultBlueOffset;
-
- r = bgr + (((r - bgr) * a) >> 8);
- g = bgg + (((g - bgg) * a) >> 8);
- b = bgb + (((b - bgb) * a) >> 8);
-
- *dest = ((r << RrDefaultRedOffset) |
- (g << RrDefaultGreenOffset) |
- (b << RrDefaultBlueOffset));
-
- dest++;
- source++;
-
- if (++col >= dw) {
- col = 0;
- dest += target_w - dw;
- }
- }
-}
-
-/*! Draw an RGBA texture into a target pixel buffer. */
-void RrImageDrawRGBA(RrPixel32 *target, RrTextureRGBA *rgba,
- gint target_w, gint target_h,
- RrRect *area)
-{
- RrImagePic *scaled;
-
- scaled = ResizeImage(rgba->data, rgba->width, rgba->height,
- area->width, area->height);
-
- if (scaled) {
-#ifdef DEBUG
- g_warning("Scaling an RGBA! You should avoid this and just make "
- "it the right size yourself!");
-#endif
- DrawRGBA(target, target_w, target_h,
- scaled->data, scaled->width, scaled->height,
- rgba->alpha, area);
- RrImagePicFree(scaled);
- }
- else
- DrawRGBA(target, target_w, target_h,
- rgba->data, rgba->width, rgba->height,
- rgba->alpha, area);
-}
-
-/*! Create a new RrImage, which is linked to an image cache */
-RrImage* RrImageNew(RrImageCache *cache)
-{
- RrImage *self;
-
- g_assert(cache != NULL);
-
- self = g_new0(RrImage, 1);
- self->ref = 1;
- self->cache = cache;
- return self;
-}
-
-void RrImageRef(RrImage *self)
-{
- ++self->ref;
-}
-
-void RrImageUnref(RrImage *self)
-{
- if (self && --self->ref == 0) {
-/*
-#ifdef DEBUG
- g_debug("Refcount to 0, removing ALL pictures from the cache:\n "
- "Image 0x%lx", (gulong)self);
-#endif
-*/
- while (self->n_original > 0)
- RemovePicture(self, &self->original, 0, &self->n_original);
- while (self->n_resized > 0)
- RemovePicture(self, &self->resized, 0, &self->n_resized);
- g_free(self);
- }
-}
-
-/*! Add a new picture with the given RGBA pixel data and dimensions into the
- RrImage. This adds an "original" picture to the image.
-*/
-void RrImageAddPicture(RrImage *self, RrPixel32 *data, gint w, gint h)
-{
- gint i;
- RrImagePic *pic;
-
- /* make sure we don't already have this size.. */
- for (i = 0; i < self->n_original; ++i)
- if (self->original[i]->width == w && self->original[i]->height == h) {
-/*
-#ifdef DEBUG
- g_debug("Found duplicate ORIGINAL image:\n "
- "Image 0x%lx, w %d h %d", (gulong)self, w, h);
-#endif
-*/
- return;
- }
-
- /* remove any resized pictures of this same size */
- for (i = 0; i < self->n_resized; ++i)
- if (self->resized[i]->width == w || self->resized[i]->height == h) {
- RemovePicture(self, &self->resized, i, &self->n_resized);
- break;
- }
-
- /* add the new picture */
- pic = g_new(RrImagePic, 1);
- RrImagePicInit(pic, w, h, g_memdup(data, w*h*sizeof(RrPixel32)));
- AddPicture(self, &self->original, &self->n_original, pic);
-}
-
-/*! Remove the picture from the RrImage which has the given dimensions. This
- removes an "original" picture from the image.
-*/
-void RrImageRemovePicture(RrImage *self, gint w, gint h)
-{
- gint i;
-
- /* remove any resized pictures of this same size */
- for (i = 0; i < self->n_original; ++i)
- if (self->original[i]->width == w && self->original[i]->height == h) {
- RemovePicture(self, &self->original, i, &self->n_original);
- break;
- }
-}
-
-/*! Draw an RrImage texture into a target pixel buffer. If the RrImage does
- not contain a picture of the appropriate size, then one of its "original"
- pictures will be resized and used (and stored in the RrImage as a "resized"
- picture).
- */
-void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
- gint target_w, gint target_h,
- RrRect *area)
-{
- gint i, min_diff, min_i, min_aspect_diff, min_aspect_i;
- RrImage *self;
- RrImagePic *pic;
- gboolean free_pic;
-
- self = img->image;
- pic = NULL;
- free_pic = FALSE;
-
- /* is there an original of this size? (only the larger of
- w or h has to be right cuz we maintain aspect ratios) */
- for (i = 0; i < self->n_original; ++i)
- if ((self->original[i]->width >= self->original[i]->height &&
- self->original[i]->width == area->width) ||
- (self->original[i]->width <= self->original[i]->height &&
- self->original[i]->height == area->height))
- {
- pic = self->original[i];
- break;
- }
-
- /* is there a resize of this size? */
- for (i = 0; i < self->n_resized; ++i)
- if ((self->resized[i]->width >= self->resized[i]->height &&
- self->resized[i]->width == area->width) ||
- (self->resized[i]->width <= self->resized[i]->height &&
- self->resized[i]->height == area->height))
- {
- gint j;
- RrImagePic *saved;
-
- /* save the selected one */
- saved = self->resized[i];
-
- /* shift all the others down */
- for (j = i; j > 0; --j)
- self->resized[j] = self->resized[j-1];
-
- /* and move the selected one to the top of the list */
- self->resized[0] = saved;
-
- pic = self->resized[0];
- break;
- }
-
- if (!pic) {
- gdouble aspect;
-
- /* find an original with a close size */
- min_diff = min_aspect_diff = -1;
- min_i = min_aspect_i = 0;
- aspect = ((gdouble)area->width) / area->height;
- for (i = 0; i < self->n_original; ++i) {
- gint diff;
- gint wdiff, hdiff;
- gdouble myasp;
-
- /* our size difference metric.. */
- wdiff = self->original[i]->width - area->width;
- hdiff = self->original[i]->height - area->height;
- diff = (wdiff * wdiff) + (hdiff * hdiff);
-
- /* find the smallest difference */
- if (min_diff < 0 || diff < min_diff) {
- min_diff = diff;
- min_i = i;
- }
- /* and also find the smallest difference with the same aspect
- ratio (and prefer this one) */
- myasp = ((gdouble)self->original[i]->width) /
- self->original[i]->height;
- if (ABS(aspect - myasp) < 0.0000001 &&
- (min_aspect_diff < 0 || diff < min_aspect_diff))
- {
- min_aspect_diff = diff;
- min_aspect_i = i;
- }
- }
-
- /* use the aspect ratio correct source if there is one */
- if (min_aspect_i >= 0)
- min_i = min_aspect_i;
-
- /* resize the original to the given area */
- pic = ResizeImage(self->original[min_i]->data,
- self->original[min_i]->width,
- self->original[min_i]->height,
- area->width, area->height);
-
- /* add the resized image to the image, as the first in the resized
- list */
- if (self->n_resized >= self->cache->max_resized_saved)
- /* remove the last one (last used one) */
- RemovePicture(self, &self->resized, self->n_resized - 1,
- &self->n_resized);
- if (self->cache->max_resized_saved)
- /* add it to the top of the resized list */
- AddPicture(self, &self->resized, &self->n_resized, pic);
- else
- free_pic = TRUE; /* don't leak mem! */
- }
-
- g_assert(pic != NULL);
-
- DrawRGBA(target, target_w, target_h,
- pic->data, pic->width, pic->height,
- img->alpha, area);
- if (free_pic)
- RrImagePicFree(pic);
-}
diff --git a/render/image.h b/render/image.h
deleted file mode 100644
index b478daf9..00000000
--- a/render/image.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- image.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __image_h
-#define __image_h
-
-#include "render.h"
-#include "geom.h"
-
-/*! Initialize an RrImagePicture to the specified dimensions and pixel data */
-void RrImagePicInit(RrImagePic *pic, gint w, gint h, RrPixel32 *data);
-
-void RrImageDrawImage(RrPixel32 *target, RrTextureImage *img,
- gint target_w, gint target_h,
- RrRect *area);
-void RrImageDrawRGBA(RrPixel32 *target, RrTextureRGBA *rgba,
- gint target_w, gint target_h,
- RrRect *area);
-
-#endif
diff --git a/render/imagecache.c b/render/imagecache.c
deleted file mode 100644
index 9c605f9d..00000000
--- a/render/imagecache.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- imagecache.c for the Openbox window manager
- Copyright (c) 2008 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "imagecache.h"
-#include "image.h"
-
-static gboolean RrImagePicEqual(const RrImagePic *p1,
- const RrImagePic *p2);
-
-RrImageCache* RrImageCacheNew(gint max_resized_saved)
-{
- RrImageCache *self;
-
- g_assert(max_resized_saved >= 0);
-
- self = g_new(RrImageCache, 1);
- self->ref = 1;
- self->max_resized_saved = max_resized_saved;
- self->table = g_hash_table_new((GHashFunc)RrImagePicHash,
- (GEqualFunc)RrImagePicEqual);
- return self;
-}
-
-void RrImageCacheRef(RrImageCache *self)
-{
- ++self->ref;
-}
-
-void RrImageCacheUnref(RrImageCache *self)
-{
- if (self && --self->ref == 0) {
- g_assert(g_hash_table_size(self->table) == 0);
- g_hash_table_unref(self->table);
-
- g_free(self);
- }
-}
-
-/*! Finds an image in the cache, if it is already in there */
-RrImage* RrImageCacheFind(RrImageCache *self,
- RrPixel32 *data, gint w, gint h)
-{
- RrImagePic pic;
-
- RrImagePicInit(&pic, w, h, data);
- return g_hash_table_lookup(self->table, &pic);
-}
-
-#define hashsize(n) ((RrPixel32)1<<(n))
-#define hashmask(n) (hashsize(n)-1)
-#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
-/* mix -- mix 3 32-bit values reversibly. */
-#define mix(a,b,c) \
-{ \
- a -= c; a ^= rot(c, 4); c += b; \
- b -= a; b ^= rot(a, 6); a += c; \
- c -= b; c ^= rot(b, 8); b += a; \
- a -= c; a ^= rot(c,16); c += b; \
- b -= a; b ^= rot(a,19); a += c; \
- c -= b; c ^= rot(b, 4); b += a; \
-}
-/* final -- final mixing of 3 32-bit values (a,b,c) into c */
-#define final(a,b,c) \
-{ \
- c ^= b; c -= rot(b,14); \
- a ^= c; a -= rot(c,11); \
- b ^= a; b -= rot(a,25); \
- c ^= b; c -= rot(b,16); \
- a ^= c; a -= rot(c,4); \
- b ^= a; b -= rot(a,14); \
- c ^= b; c -= rot(b,24); \
-}
-
-/* This is a fast, reversable hash function called "lookup3", found here:
- http://burtleburtle.net/bob/c/lookup3.c, by Bob Jenkins
-
- This hashing algorithm is "reversible", that is, not cryptographically
- secure at all. But we don't care about that, we just want something to
- tell when images are the same or different relatively quickly.
-*/
-guint32 hashword(const guint32 *key, gint length, guint32 initval)
-{
- guint32 a,b,c;
-
- /* Set up the internal state */
- a = b = c = 0xdeadbeef + (((guint32)length)<<2) + initval;
-
- /* handle most of the key */
- while (length > 3)
- {
- a += key[0];
- b += key[1];
- c += key[2];
- mix(a,b,c);
- length -= 3;
- key += 3;
- }
-
- /* handle the last 3 guint32's */
- switch(length) /* all the case statements fall through */
- {
- case 3: c+=key[2];
- case 2: b+=key[1];
- case 1: a+=key[0];
- final(a,b,c);
- case 0: /* case 0: nothing left to add */
- break;
- }
- /* report the result */
- return c;
-}
-
-/*! This is some arbitrary initial value for the hashing function. It's
- constant so that you get the same result from the same data each time.
-*/
-#define HASH_INITVAL 0xf00d
-
-guint RrImagePicHash(const RrImagePic *p)
-{
- return hashword(p->data, p->width * p->height, HASH_INITVAL);
-}
-
-static gboolean RrImagePicEqual(const RrImagePic *p1,
- const RrImagePic *p2)
-{
- return p1->width == p2->width && p1->height == p2->height &&
- p1->sum == p2->sum;
-}
diff --git a/render/imagecache.h b/render/imagecache.h
deleted file mode 100644
index 4ad2deae..00000000
--- a/render/imagecache.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- imagecache.h for the Openbox window manager
- Copyright (c) 2008 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __imagecache_h
-#define __imagecache_h
-
-#include <glib.h>
-
-struct _RrImagePic;
-
-guint RrImagePicHash(const struct _RrImagePic *p);
-
-/*! Create a new image cache. An image cache is basically a hash table to look
- up RrImages. Each RrImage in the cache may contain one or more Pictures,
- that is one or more actual copies of image data at various sizes. For eg,
- for a window, all of its various icons are loaded into the same RrImage.
- When an RrImage is drawn and a picture inside it needs to be resized, that
- is also saved within the RrImage.
-
- For each picture that an RrImage has, the picture is hashed and that is used
- as a key to find the RrImage. So, given any picture in any RrImage in the
- cache, if you hash it, you will find the RrImage.
-*/
-struct _RrImageCache {
- gint ref;
- /*! When an original picture is resized for an RrImage, the resized picture
- is saved in the RrImage. This specifies how many pictures should be
- saved at a time. When this is exceeded, the least recently used
- "resized" picture is deleted.
- */
- gint max_resized_saved;
-
- GHashTable *table;
-};
-
-#endif
diff --git a/render/instance.c b/render/instance.c
deleted file mode 100644
index b867815c..00000000
--- a/render/instance.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- instance.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "instance.h"
-
-static RrInstance *definst = NULL;
-
-static void RrTrueColorSetup (RrInstance *inst);
-static void RrPseudoColorSetup (RrInstance *inst);
-
-#ifdef DEBUG
-#include "color.h"
-#endif
-static void
-dest(gpointer data)
-{
-#ifdef DEBUG
- RrColor *c = data;
- if (c->refcount > 0)
- g_error("color %d (%d,%d,%d) in hash table with %d "
- "leftover references",
- c->id, RrColorRed(c), RrColorGreen(c), RrColorBlue(c),
- c->refcount);
-#endif
-}
-
-#if 0
-static void f(gpointer key, gpointer value, gpointer n)
-{
- RrColor *c = value;
- if (c->id == *(gint*)n)
- g_message("color %d has %d references", c->id, c->refcount);
-}
-
-void print_refs(gint id)
-{
- g_hash_table_foreach(RrColorHash(definst), f, &id);
-}
-#endif
-
-RrInstance* RrInstanceNew (Display *display, gint screen)
-{
- g_type_init(); /* supposedly needed for pango but seems to work without */
-
- definst = g_new (RrInstance, 1);
- definst->display = display;
- definst->screen = screen;
-
- definst->depth = DefaultDepth(display, screen);
- definst->visual = DefaultVisual(display, screen);
- definst->colormap = DefaultColormap(display, screen);
- definst->pango = pango_xft_get_context(display, screen);
-
- definst->pseudo_colors = NULL;
-
- definst->color_hash = g_hash_table_new_full(g_int_hash, g_int_equal,
- NULL, dest);
-
- switch (definst->visual->class) {
- case TrueColor:
- RrTrueColorSetup(definst);
- break;
- case PseudoColor:
- case StaticColor:
- case GrayScale:
- case StaticGray:
- RrPseudoColorSetup(definst);
- break;
- default:
- g_critical("Unsupported visual class");
- g_free (definst);
- return definst = NULL;
- }
- return definst;
-}
-
-static void RrTrueColorSetup (RrInstance *inst)
-{
- gulong red_mask, green_mask, blue_mask;
- XImage *timage = NULL;
-
- timage = XCreateImage(inst->display, inst->visual, inst->depth,
- ZPixmap, 0, NULL, 1, 1, 32, 0);
- g_assert(timage != NULL);
- /* find the offsets for each color in the visual's masks */
- inst->red_mask = red_mask = timage->red_mask;
- inst->green_mask = green_mask = timage->green_mask;
- inst->blue_mask = blue_mask = timage->blue_mask;
-
- inst->red_offset = 0;
- inst->green_offset = 0;
- inst->blue_offset = 0;
-
- while (! (red_mask & 1)) { inst->red_offset++; red_mask >>= 1; }
- while (! (green_mask & 1)) { inst->green_offset++; green_mask >>= 1; }
- while (! (blue_mask & 1)) { inst->blue_offset++; blue_mask >>= 1; }
-
- inst->red_shift = inst->green_shift = inst->blue_shift = 8;
- while (red_mask) { red_mask >>= 1; inst->red_shift--; }
- while (green_mask) { green_mask >>= 1; inst->green_shift--; }
- while (blue_mask) { blue_mask >>= 1; inst->blue_shift--; }
- XFree(timage);
-}
-
-#define RrPseudoNcolors(inst) (1 << (inst->pseudo_bpc * 3))
-
-static void RrPseudoColorSetup (RrInstance *inst)
-{
- XColor icolors[256];
- gint tr, tg, tb, n, r, g, b, i, incolors, ii;
- gulong dev;
- gint cpc, _ncolors;
-
- /* determine the number of colors and the bits-per-color */
- inst->pseudo_bpc = 2; /* XXX THIS SHOULD BE A USER OPTION */
- g_assert(inst->pseudo_bpc >= 1);
- _ncolors = RrPseudoNcolors(inst);
-
- if (_ncolors > 1 << inst->depth) {
- g_message("Invalid colormap size. Resizing.");
- inst->pseudo_bpc = 1 << (inst->depth/3) >> 3;
- _ncolors = 1 << (inst->pseudo_bpc * 3);
- }
-
- /* build a color cube */
- inst->pseudo_colors = g_new(XColor, _ncolors);
- cpc = 1 << inst->pseudo_bpc; /* colors per channel */
-
- for (n = 0, r = 0; r < cpc; r++)
- for (g = 0; g < cpc; g++)
- for (b = 0; b < cpc; b++, n++) {
- tr = (gint)(((gfloat)(r)/(gfloat)(cpc-1)) * 0xFF);
- tg = (gint)(((gfloat)(g)/(gfloat)(cpc-1)) * 0xFF);
- tb = (gint)(((gfloat)(b)/(gfloat)(cpc-1)) * 0xFF);
- inst->pseudo_colors[n].red = tr | tr << 8;
- inst->pseudo_colors[n].green = tg | tg << 8;
- inst->pseudo_colors[n].blue = tb | tb << 8;
- /* used to track allocation */
- inst->pseudo_colors[n].flags = DoRed|DoGreen|DoBlue;
- }
-
- /* allocate the colors */
- for (i = 0; i < _ncolors; i++)
- if (!XAllocColor(inst->display, inst->colormap,
- &inst->pseudo_colors[i]))
- inst->pseudo_colors[i].flags = 0; /* mark it as unallocated */
-
- /* try allocate any colors that failed allocation above */
-
- /* get the allocated values from the X server
- (only the first 256 XXX why!?)
- */
- incolors = (((1 << inst->depth) > 256) ? 256 : (1 << inst->depth));
- for (i = 0; i < incolors; i++)
- icolors[i].pixel = i;
- XQueryColors(inst->display, inst->colormap, icolors, incolors);
-
- /* try match unallocated ones */
- for (i = 0; i < _ncolors; i++) {
- if (!inst->pseudo_colors[i].flags) { /* if it wasn't allocated... */
- gulong closest = 0xffffffff, close = 0;
- for (ii = 0; ii < incolors; ii++) {
- /* find deviations */
- r = (inst->pseudo_colors[i].red - icolors[ii].red) & 0xff;
- g = (inst->pseudo_colors[i].green - icolors[ii].green) & 0xff;
- b = (inst->pseudo_colors[i].blue - icolors[ii].blue) & 0xff;
- /* find a weighted absolute deviation */
- dev = (r * r) + (g * g) + (b * b);
-
- if (dev < closest) {
- closest = dev;
- close = ii;
- }
- }
-
- inst->pseudo_colors[i].red = icolors[close].red;
- inst->pseudo_colors[i].green = icolors[close].green;
- inst->pseudo_colors[i].blue = icolors[close].blue;
- inst->pseudo_colors[i].pixel = icolors[close].pixel;
-
- /* try alloc this closest color, it had better succeed! */
- if (XAllocColor(inst->display, inst->colormap,
- &inst->pseudo_colors[i]))
- /* mark as alloced */
- inst->pseudo_colors[i].flags = DoRed|DoGreen|DoBlue;
- else
- /* wtf has gone wrong, its already alloced for chissake! */
- g_assert_not_reached();
- }
- }
-}
-
-void RrInstanceFree (RrInstance *inst)
-{
- if (inst) {
- if (inst == definst) definst = NULL;
- g_free(inst->pseudo_colors);
- g_hash_table_destroy(inst->color_hash);
- g_object_unref(inst->pango);
- g_free(inst);
- }
-}
-
-Display* RrDisplay (const RrInstance *inst)
-{
- return (inst ? inst : definst)->display;
-}
-
-gint RrScreen (const RrInstance *inst)
-{
- return (inst ? inst : definst)->screen;
-}
-
-Window RrRootWindow (const RrInstance *inst)
-{
- return RootWindow (RrDisplay (inst), RrScreen (inst));
-}
-
-Visual *RrVisual (const RrInstance *inst)
-{
- return (inst ? inst : definst)->visual;
-}
-
-gint RrDepth (const RrInstance *inst)
-{
- return (inst ? inst : definst)->depth;
-}
-
-Colormap RrColormap (const RrInstance *inst)
-{
- return (inst ? inst : definst)->colormap;
-}
-
-gint RrRedOffset (const RrInstance *inst)
-{
- return (inst ? inst : definst)->red_offset;
-}
-
-gint RrGreenOffset (const RrInstance *inst)
-{
- return (inst ? inst : definst)->green_offset;
-}
-
-gint RrBlueOffset (const RrInstance *inst)
-{
- return (inst ? inst : definst)->blue_offset;
-}
-
-gint RrRedShift (const RrInstance *inst)
-{
- return (inst ? inst : definst)->red_shift;
-}
-
-gint RrGreenShift (const RrInstance *inst)
-{
- return (inst ? inst : definst)->green_shift;
-}
-
-gint RrBlueShift (const RrInstance *inst)
-{
- return (inst ? inst : definst)->blue_shift;
-}
-
-gint RrRedMask (const RrInstance *inst)
-{
- return (inst ? inst : definst)->red_mask;
-}
-
-gint RrGreenMask (const RrInstance *inst)
-{
- return (inst ? inst : definst)->green_mask;
-}
-
-gint RrBlueMask (const RrInstance *inst)
-{
- return (inst ? inst : definst)->blue_mask;
-}
-
-guint RrPseudoBPC (const RrInstance *inst)
-{
- return (inst ? inst : definst)->pseudo_bpc;
-}
-
-XColor *RrPseudoColors (const RrInstance *inst)
-{
- return (inst ? inst : definst)->pseudo_colors;
-}
-
-GHashTable* RrColorHash (const RrInstance *inst)
-{
- return (inst ? inst : definst)->color_hash;
-}
diff --git a/render/instance.h b/render/instance.h
deleted file mode 100644
index 324f061a..00000000
--- a/render/instance.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- instance.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __render_instance_h
-#define __render_instance_h
-
-#include <X11/Xlib.h>
-#include <glib.h>
-#include <pango/pangoxft.h>
-
-struct _RrInstance {
- Display *display;
- gint screen;
-
- Visual *visual;
- gint depth;
- Colormap colormap;
- PangoContext *pango;
-
- gint red_offset;
- gint green_offset;
- gint blue_offset;
-
- gint red_shift;
- gint green_shift;
- gint blue_shift;
-
- gint red_mask;
- gint green_mask;
- gint blue_mask;
-
- gint pseudo_bpc;
- XColor *pseudo_colors;
-
- GHashTable *color_hash;
-};
-
-guint RrPseudoBPC (const RrInstance *inst);
-XColor* RrPseudoColors (const RrInstance *inst);
-GHashTable* RrColorHash (const RrInstance *inst);
-
-#endif
diff --git a/render/mask.c b/render/mask.c
deleted file mode 100644
index b6e3c443..00000000
--- a/render/mask.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- mask.c for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "color.h"
-#include "mask.h"
-
-RrPixmapMask *RrPixmapMaskNew(const RrInstance *inst,
- gint w, gint h, const gchar *data)
-{
- RrPixmapMask *m = g_new(RrPixmapMask, 1);
- m->inst = inst;
- m->width = w;
- m->height = h;
- /* round up to nearest byte */
- m->data = g_memdup(data, (w + 7) / 8 * h);
- m->mask = XCreateBitmapFromData(RrDisplay(inst), RrRootWindow(inst),
- data, w, h);
- return m;
-}
-
-void RrPixmapMaskFree(RrPixmapMask *m)
-{
- if (m) {
- XFreePixmap(RrDisplay(m->inst), m->mask);
- g_free(m->data);
- g_free(m);
- }
-}
-
-void RrPixmapMaskDraw(Pixmap p, const RrTextureMask *m, const RrRect *area)
-{
- gint x, y;
- if (m->mask == NULL) return; /* no mask given */
-
- /* set the clip region */
- x = area->x + (area->width - m->mask->width) / 2;
- y = area->y + (area->height - m->mask->height) / 2;
-
- if (x < 0) x = 0;
- if (y < 0) y = 0;
-
- XSetClipMask(RrDisplay(m->mask->inst), RrColorGC(m->color), m->mask->mask);
- XSetClipOrigin(RrDisplay(m->mask->inst), RrColorGC(m->color), x, y);
-
- /* fill in the clipped region */
- XFillRectangle(RrDisplay(m->mask->inst), p, RrColorGC(m->color), x, y,
- x + m->mask->width, y + m->mask->height);
-
- /* unset the clip region */
- XSetClipMask(RrDisplay(m->mask->inst), RrColorGC(m->color), None);
- XSetClipOrigin(RrDisplay(m->mask->inst), RrColorGC(m->color), 0, 0);
-}
-
-RrPixmapMask *RrPixmapMaskCopy(const RrPixmapMask *src)
-{
- RrPixmapMask *m = g_new(RrPixmapMask, 1);
- m->inst = src->inst;
- m->width = src->width;
- m->height = src->height;
- /* round up to nearest byte */
- m->data = g_memdup(src->data, (src->width + 7) / 8 * src->height);
- m->mask = XCreateBitmapFromData(RrDisplay(m->inst), RrRootWindow(m->inst),
- m->data, m->width, m->height);
- return m;
-}
diff --git a/render/mask.h b/render/mask.h
deleted file mode 100644
index 4dc85031..00000000
--- a/render/mask.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- mask.h for the Openbox window manager
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __mask_h
-#define __mask_h
-
-#include "render.h"
-#include "geom.h"
-
-RrPixmapMask *RrPixmapMaskNew(const RrInstance *inst,
- gint w, gint h, const gchar *data);
-void RrPixmapMaskFree(RrPixmapMask *m);
-RrPixmapMask *RrPixmapMaskCopy(const RrPixmapMask *src);
-void RrPixmapMaskDraw(Pixmap p, const RrTextureMask *m, const RrRect *area);
-
-#endif
diff --git a/render/obrender-4.0.pc.in b/render/obrender-4.0.pc.in
deleted file mode 100644
index 539606a4..00000000
--- a/render/obrender-4.0.pc.in
+++ /dev/null
@@ -1,14 +0,0 @@
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-xcflags=@X_CFLAGS@
-xlibs=@X_LIBS@
-
-Name: ObRender
-Description: Openbox Render Library
-Version: @RR_VERSION@
-Requires: obt-4.0 glib-2.0 xft pangoxft
-Libs: -L${libdir} -lobrender ${xlibs}
-Cflags: -I${includedir}/openbox/@RR_VERSION@ ${xcflags}
diff --git a/render/render.c b/render/render.c
deleted file mode 100644
index 20002e32..00000000
--- a/render/render.c
+++ /dev/null
@@ -1,564 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- render.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "gradient.h"
-#include "font.h"
-#include "mask.h"
-#include "color.h"
-#include "image.h"
-#include "theme.h"
-
-#include <glib.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xft/Xft.h>
-
-#ifdef HAVE_STDLIB_H
-# include <stdlib.h>
-#endif
-
-static void pixel_data_to_pixmap(RrAppearance *l,
- gint x, gint y, gint w, gint h);
-
-Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h)
-{
- gint i, transferred = 0, force_transfer = 0;
- Pixmap oldp = None;
- RrRect tarea; /* area in which to draw textures */
- gboolean resized;
-
- if (w <= 0 || h <= 0) return None;
-
- if (a->surface.parentx < 0 || a->surface.parenty < 0) {
- /* ob_debug("Invalid parent co-ordinates\n"); */
- return None;
- }
-
- if (a->surface.grad == RR_SURFACE_PARENTREL &&
- (a->surface.parentx >= a->surface.parent->w ||
- a->surface.parenty >= a->surface.parent->h))
- {
- return None;
- }
-
- resized = (a->w != w || a->h != h);
-
- oldp = a->pixmap; /* save to free after changing the visible pixmap */
- a->pixmap = XCreatePixmap(RrDisplay(a->inst),
- RrRootWindow(a->inst),
- w, h, RrDepth(a->inst));
-
- g_assert(a->pixmap != None);
- a->w = w;
- a->h = h;
-
- if (a->xftdraw != NULL)
- XftDrawDestroy(a->xftdraw);
- a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap,
- RrVisual(a->inst), RrColormap(a->inst));
- g_assert(a->xftdraw != NULL);
-
- if (resized) {
- g_free(a->surface.pixel_data);
- a->surface.pixel_data = g_new(RrPixel32, w * h);
- }
-
- RrRender(a, w, h);
-
- {
- gint l, t, r, b;
- RrMargins(a, &l, &t, &r, &b);
- RECT_SET(tarea, l, t, w - l - r, h - t - b);
- }
-
- for (i = 0; i < a->textures; i++) {
- switch (a->texture[i].type) {
- case RR_TEXTURE_NONE:
- break;
- case RR_TEXTURE_TEXT:
- if (!transferred) {
- transferred = 1;
- if ((a->surface.grad != RR_SURFACE_SOLID)
- || (a->surface.interlaced))
- pixel_data_to_pixmap(a, 0, 0, w, h);
- }
- if (a->xftdraw == NULL) {
- a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap,
- RrVisual(a->inst),
- RrColormap(a->inst));
- }
- RrFontDraw(a->xftdraw, &a->texture[i].data.text, &tarea);
- break;
- case RR_TEXTURE_LINE_ART:
- if (!transferred) {
- transferred = 1;
- if ((a->surface.grad != RR_SURFACE_SOLID)
- || (a->surface.interlaced))
- pixel_data_to_pixmap(a, 0, 0, w, h);
- }
- XDrawLine(RrDisplay(a->inst), a->pixmap,
- RrColorGC(a->texture[i].data.lineart.color),
- a->texture[i].data.lineart.x1,
- a->texture[i].data.lineart.y1,
- a->texture[i].data.lineart.x2,
- a->texture[i].data.lineart.y2);
- break;
- case RR_TEXTURE_MASK:
- if (!transferred) {
- transferred = 1;
- if ((a->surface.grad != RR_SURFACE_SOLID)
- || (a->surface.interlaced))
- pixel_data_to_pixmap(a, 0, 0, w, h);
- }
- RrPixmapMaskDraw(a->pixmap, &a->texture[i].data.mask, &tarea);
- break;
- case RR_TEXTURE_IMAGE:
- g_assert(!transferred);
- {
- RrRect narea = tarea;
- RrTextureImage *img = &a->texture[i].data.image;
- narea.x += img->tx;
- narea.width -= img->tx;
- narea.y += img->ty;
- narea.height -= img->ty;
- if (img->twidth)
- narea.width = MIN(narea.width, img->twidth);
- if (img->theight)
- narea.height = MIN(narea.height, img->theight);
- RrImageDrawImage(a->surface.pixel_data,
- &a->texture[i].data.image,
- a->w, a->h,
- &narea);
- }
- force_transfer = 1;
- break;
- case RR_TEXTURE_RGBA:
- g_assert(!transferred);
- {
- RrRect narea = tarea;
- RrTextureRGBA *rgb = &a->texture[i].data.rgba;
- narea.x += rgb->tx;
- narea.width -= rgb->tx;
- narea.y += rgb->ty;
- narea.height -= rgb->ty;
- if (rgb->twidth)
- narea.width = MIN(narea.width, rgb->twidth);
- if (rgb->theight)
- narea.height = MIN(narea.height, rgb->theight);
- RrImageDrawRGBA(a->surface.pixel_data,
- &a->texture[i].data.rgba,
- a->w, a->h,
- &narea);
- }
- force_transfer = 1;
- break;
- }
- }
-
- if (!transferred) {
- transferred = 1;
- if ((a->surface.grad != RR_SURFACE_SOLID) || (a->surface.interlaced) ||
- force_transfer)
- {
- pixel_data_to_pixmap(a, 0, 0, w, h);
- }
- }
-
- return oldp;
-}
-
-void RrPaint(RrAppearance *a, Window win, gint w, gint h)
-{
- Pixmap oldp;
-
- oldp = RrPaintPixmap(a, w, h);
- XSetWindowBackgroundPixmap(RrDisplay(a->inst), win, a->pixmap);
- XClearWindow(RrDisplay(a->inst), win);
- /* free this after changing the visible pixmap */
- if (oldp) XFreePixmap(RrDisplay(a->inst), oldp);
-}
-
-RrAppearance *RrAppearanceNew(const RrInstance *inst, gint numtex)
-{
- RrAppearance *out;
-
- out = g_new0(RrAppearance, 1);
- out->inst = inst;
- out->textures = numtex;
- out->surface.bevel_light_adjust = 128;
- out->surface.bevel_dark_adjust = 64;
- if (numtex) out->texture = g_new0(RrTexture, numtex);
-
- return out;
-}
-
-void RrAppearanceRemoveTextures(RrAppearance *a)
-{
- g_free(a->texture);
- a->textures = 0;
-}
-
-void RrAppearanceAddTextures(RrAppearance *a, gint numtex)
-{
- g_assert(a->textures == 0);
-
- a->textures = numtex;
- if (numtex) a->texture = g_new0(RrTexture, numtex);
-}
-
-void RrAppearanceClearTextures(RrAppearance *a)
-{
- memset(a->texture, 0, a->textures * sizeof(RrTexture));
-}
-
-RrAppearance *RrAppearanceCopy(RrAppearance *orig)
-{
- RrSurface *spo, *spc;
- RrAppearance *copy = g_new(RrAppearance, 1);
-
- copy->inst = orig->inst;
-
- spo = &(orig->surface);
- spc = &(copy->surface);
- spc->grad = spo->grad;
- spc->relief = spo->relief;
- spc->bevel = spo->bevel;
- if (spo->primary != NULL)
- spc->primary = RrColorNew(copy->inst,
- spo->primary->r,
- spo->primary->g,
- spo->primary->b);
- else spc->primary = NULL;
-
- if (spo->secondary != NULL)
- spc->secondary = RrColorNew(copy->inst,
- spo->secondary->r,
- spo->secondary->g,
- spo->secondary->b);
- else spc->secondary = NULL;
-
- if (spo->border_color != NULL)
- spc->border_color = RrColorNew(copy->inst,
- spo->border_color->r,
- spo->border_color->g,
- spo->border_color->b);
- else spc->border_color = NULL;
-
- if (spo->interlace_color != NULL)
- spc->interlace_color = RrColorNew(copy->inst,
- spo->interlace_color->r,
- spo->interlace_color->g,
- spo->interlace_color->b);
- else spc->interlace_color = NULL;
-
- if (spo->bevel_dark != NULL)
- spc->bevel_dark = RrColorNew(copy->inst,
- spo->bevel_dark->r,
- spo->bevel_dark->g,
- spo->bevel_dark->b);
- else spc->bevel_dark = NULL;
-
- if (spo->bevel_light != NULL)
- spc->bevel_light = RrColorNew(copy->inst,
- spo->bevel_light->r,
- spo->bevel_light->g,
- spo->bevel_light->b);
- else spc->bevel_light = NULL;
-
- if (spo->split_primary != NULL)
- spc->split_primary = RrColorNew(copy->inst,
- spo->split_primary->r,
- spo->split_primary->g,
- spo->split_primary->b);
- else spc->split_primary = NULL;
-
- if (spo->split_secondary != NULL)
- spc->split_secondary = RrColorNew(copy->inst,
- spo->split_secondary->r,
- spo->split_secondary->g,
- spo->split_secondary->b);
- else spc->split_secondary = NULL;
-
- spc->interlaced = spo->interlaced;
- spc->bevel_light_adjust = spo->bevel_light_adjust;
- spc->bevel_dark_adjust = spo->bevel_dark_adjust;
- spc->border = spo->border;
- spc->parent = NULL;
- spc->parentx = spc->parenty = 0;
- spc->pixel_data = NULL;
-
- copy->textures = orig->textures;
- copy->texture = g_memdup(orig->texture,
- orig->textures * sizeof(RrTexture));
- copy->pixmap = None;
- copy->xftdraw = NULL;
- copy->w = copy->h = 0;
- return copy;
-}
-
-void RrAppearanceFree(RrAppearance *a)
-{
- if (a) {
- RrSurface *p;
- if (a->pixmap != None) XFreePixmap(RrDisplay(a->inst), a->pixmap);
- if (a->xftdraw != NULL) XftDrawDestroy(a->xftdraw);
- if (a->textures)
- g_free(a->texture);
- p = &a->surface;
- RrColorFree(p->primary);
- RrColorFree(p->secondary);
- RrColorFree(p->border_color);
- RrColorFree(p->interlace_color);
- RrColorFree(p->bevel_dark);
- RrColorFree(p->bevel_light);
- RrColorFree(p->split_primary);
- RrColorFree(p->split_secondary);
- g_free(p->pixel_data);
- p->pixel_data = NULL;
- g_free(a);
- }
-}
-
-static void pixel_data_to_pixmap(RrAppearance *l,
- gint x, gint y, gint w, gint h)
-{
- RrPixel32 *in, *scratch;
- Pixmap out;
- XImage *im = NULL;
- im = XCreateImage(RrDisplay(l->inst), RrVisual(l->inst), RrDepth(l->inst),
- ZPixmap, 0, NULL, w, h, 32, 0);
- g_assert(im != NULL);
-
- in = l->surface.pixel_data;
- out = l->pixmap;
-
-/* this malloc is a complete waste of time on normal 32bpp
- as reduce_depth just sets im->data = data and returns
-*/
- scratch = g_new(RrPixel32, im->width * im->height);
- im->data = (gchar*) scratch;
- RrReduceDepth(l->inst, in, im);
- XPutImage(RrDisplay(l->inst), out,
- DefaultGC(RrDisplay(l->inst), RrScreen(l->inst)),
- im, 0, 0, x, y, w, h);
- im->data = NULL;
- XDestroyImage(im);
- g_free(scratch);
-}
-
-void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b)
-{
- *l = *t = *r = *b = 0;
-
- if (a->surface.grad != RR_SURFACE_PARENTREL) {
- if (a->surface.relief != RR_RELIEF_FLAT) {
- switch (a->surface.bevel) {
- case RR_BEVEL_1:
- *l = *t = *r = *b = 1;
- break;
- case RR_BEVEL_2:
- *l = *t = *r = *b = 2;
- break;
- }
- } else if (a->surface.border) {
- *l = *t = *r = *b = 1;
- }
- }
-}
-
-void RrMinSize(RrAppearance *a, gint *w, gint *h)
-{
- *w = RrMinWidth(a);
- *h = RrMinHeight(a);
-}
-
-gint RrMinWidth(RrAppearance *a)
-{
- gint i;
- RrSize *m;
- gint l, t, r, b;
- gint w = 0;
-
- RrMargins(a, &l, &t, &r, &b);
-
- for (i = 0; i < a->textures; ++i) {
- switch (a->texture[i].type) {
- case RR_TEXTURE_NONE:
- break;
- case RR_TEXTURE_MASK:
- w = MAX(w, a->texture[i].data.mask.mask->width);
- break;
- case RR_TEXTURE_TEXT:
- m = RrFontMeasureString(a->texture[i].data.text.font,
- a->texture[i].data.text.string,
- a->texture[i].data.text.shadow_offset_x,
- a->texture[i].data.text.shadow_offset_y,
- a->texture[i].data.text.flow,
- a->texture[i].data.text.maxwidth);
- w = MAX(w, m->width);
- g_free(m);
- break;
- case RR_TEXTURE_RGBA:
- w += MAX(w, a->texture[i].data.rgba.width);
- break;
- case RR_TEXTURE_IMAGE:
- /* images resize so they don't contribute anything to the min */
- break;
- case RR_TEXTURE_LINE_ART:
- w = MAX(w, MAX(a->texture[i].data.lineart.x1 - l - r,
- a->texture[i].data.lineart.x2 - l - r));
- break;
- }
- }
-
- w += l + r;
-
- if (w < 1) w = 1;
- return w;
-}
-
-gint RrMinHeight(RrAppearance *a)
-{
- gint i;
- gint l, t, r, b;
- RrSize *m;
- gint h = 0;
-
- RrMargins(a, &l, &t, &r, &b);
-
- for (i = 0; i < a->textures; ++i) {
- switch (a->texture[i].type) {
- case RR_TEXTURE_NONE:
- break;
- case RR_TEXTURE_MASK:
- h = MAX(h, a->texture[i].data.mask.mask->height);
- break;
- case RR_TEXTURE_TEXT:
- if (a->texture[i].data.text.flow) {
- g_assert(a->texture[i].data.text.string != NULL);
-
- m = RrFontMeasureString
- (a->texture[i].data.text.font,
- a->texture[i].data.text.string,
- a->texture[i].data.text.shadow_offset_x,
- a->texture[i].data.text.shadow_offset_y,
- a->texture[i].data.text.flow,
- a->texture[i].data.text.maxwidth);
- h += MAX(h, m->height);
- g_free(m);
- }
- else
- h += MAX(h,
- RrFontHeight
- (a->texture[i].data.text.font,
- a->texture[i].data.text.shadow_offset_y));
- break;
- case RR_TEXTURE_RGBA:
- h += MAX(h, a->texture[i].data.rgba.height);
- break;
- case RR_TEXTURE_IMAGE:
- /* images resize so they don't contribute anything to the min */
- break;
- case RR_TEXTURE_LINE_ART:
- h = MAX(h, MAX(a->texture[i].data.lineart.y1 - t - b,
- a->texture[i].data.lineart.y2 - t - b));
- break;
- }
- }
-
- h += t + b;
-
- if (h < 1) h = 1;
- return h;
-}
-
-static void reverse_bits(gchar *c, gint n)
-{
- gint i;
- for (i = 0; i < n; i++, c++)
- *c = (((*c * 0x0802UL & 0x22110UL) |
- (*c * 0x8020UL & 0x88440UL)) * 0x10101UL) >> 16;
-}
-
-gboolean RrPixmapToRGBA(const RrInstance *inst,
- Pixmap pmap, Pixmap mask,
- gint *w, gint *h, RrPixel32 **data)
-{
- Window xr;
- gint xx, xy;
- guint pw, ph, mw, mh, xb, xd, i, x, y, di;
- XImage *xi, *xm = NULL;
-
- if (!XGetGeometry(RrDisplay(inst), pmap,
- &xr, &xx, &xy, &pw, &ph, &xb, &xd))
- return FALSE;
-
- if (mask) {
- if (!XGetGeometry(RrDisplay(inst), mask,
- &xr, &xx, &xy, &mw, &mh, &xb, &xd))
- return FALSE;
- if (pw != mw || ph != mh || xd != 1)
- return FALSE;
- }
-
- xi = XGetImage(RrDisplay(inst), pmap,
- 0, 0, pw, ph, 0xffffffff, ZPixmap);
- if (!xi)
- return FALSE;
-
- if (mask) {
- xm = XGetImage(RrDisplay(inst), mask,
- 0, 0, mw, mh, 0xffffffff, ZPixmap);
- if (!xm) {
- XDestroyImage(xi);
- return FALSE;
- }
- if ((xm->bits_per_pixel == 1) && (xm->bitmap_bit_order != LSBFirst))
- reverse_bits(xm->data, xm->bytes_per_line * xm->height);
- }
-
- if ((xi->bits_per_pixel == 1) && (xi->bitmap_bit_order != LSBFirst))
- reverse_bits(xi->data, xi->bytes_per_line * xi->height);
-
- *data = g_new(RrPixel32, pw * ph);
- RrIncreaseDepth(inst, *data, xi);
-
- if (mask) {
- /* apply transparency from the mask */
- di = 0;
- for (i = 0, y = 0; y < ph; ++y) {
- for (x = 0; x < pw; ++x, ++i) {
- if (!((((unsigned)xm->data[di + x / 8]) >> (x % 8)) & 0x1))
- (*data)[i] &= ~(0xff << RrDefaultAlphaOffset);
- }
- di += xm->bytes_per_line;
- }
- }
-
- *w = pw;
- *h = ph;
-
- XDestroyImage(xi);
- if (mask)
- XDestroyImage(xm);
-
- return TRUE;
-}
diff --git a/render/render.h b/render/render.h
deleted file mode 100644
index 706843e3..00000000
--- a/render/render.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- render.h for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __render_h
-#define __render_h
-
-#include "geom.h"
-#include "render/version.h"
-
-#include <X11/Xlib.h> /* some platforms dont include this as needed for Xft */
-#include <pango/pangoxft.h>
-#include <glib.h>
-
-G_BEGIN_DECLS
-
-typedef union _RrTextureData RrTextureData;
-typedef struct _RrAppearance RrAppearance;
-typedef struct _RrSurface RrSurface;
-typedef struct _RrFont RrFont;
-typedef struct _RrTexture RrTexture;
-typedef struct _RrTextureMask RrTextureMask;
-typedef struct _RrTextureRGBA RrTextureRGBA;
-typedef struct _RrTextureImage RrTextureImage;
-typedef struct _RrTextureText RrTextureText;
-typedef struct _RrTextureLineArt RrTextureLineArt;
-typedef struct _RrPixmapMask RrPixmapMask;
-typedef struct _RrInstance RrInstance;
-typedef struct _RrColor RrColor;
-typedef struct _RrImage RrImage;
-typedef struct _RrImagePic RrImagePic;
-typedef struct _RrImageCache RrImageCache;
-
-typedef guint32 RrPixel32;
-typedef guint16 RrPixel16;
-typedef guchar RrPixel8;
-
-typedef enum {
- RR_RELIEF_FLAT,
- RR_RELIEF_RAISED,
- RR_RELIEF_SUNKEN
-} RrReliefType;
-
-typedef enum {
- RR_BEVEL_1,
- RR_BEVEL_2
-} RrBevelType;
-
-typedef enum {
- RR_SURFACE_NONE,
- RR_SURFACE_PARENTREL,
- RR_SURFACE_SOLID,
- RR_SURFACE_SPLIT_VERTICAL,
- RR_SURFACE_HORIZONTAL,
- RR_SURFACE_VERTICAL,
- RR_SURFACE_DIAGONAL,
- RR_SURFACE_CROSS_DIAGONAL,
- RR_SURFACE_PYRAMID,
- RR_SURFACE_MIRROR_HORIZONTAL
-} RrSurfaceColorType;
-
-typedef enum {
- RR_TEXTURE_NONE,
- RR_TEXTURE_MASK,
- RR_TEXTURE_TEXT,
- RR_TEXTURE_LINE_ART,
- RR_TEXTURE_RGBA,
- RR_TEXTURE_IMAGE
-} RrTextureType;
-
-typedef enum {
- RR_JUSTIFY_LEFT,
- RR_JUSTIFY_CENTER,
- RR_JUSTIFY_RIGHT
-} RrJustify;
-
-/* Put middle first so it's the default */
-typedef enum {
- RR_ELLIPSIZE_MIDDLE,
- RR_ELLIPSIZE_NONE,
- RR_ELLIPSIZE_START,
- RR_ELLIPSIZE_END
-} RrEllipsizeMode;
-
-typedef enum {
- RR_FONTWEIGHT_LIGHT,
- RR_FONTWEIGHT_NORMAL,
- RR_FONTWEIGHT_SEMIBOLD,
- RR_FONTWEIGHT_BOLD,
- RR_FONTWEIGHT_ULTRABOLD
-} RrFontWeight;
-
-typedef enum {
- RR_FONTSLANT_NORMAL,
- RR_FONTSLANT_ITALIC,
- RR_FONTSLANT_OBLIQUE
-} RrFontSlant;
-
-struct _RrSurface {
- RrSurfaceColorType grad;
- RrReliefType relief;
- RrBevelType bevel;
- RrColor *primary;
- RrColor *secondary;
- RrColor *border_color;
- RrColor *bevel_dark;
- RrColor *bevel_light;
- RrColor *interlace_color;
- gboolean interlaced;
- gboolean border;
- RrAppearance *parent;
- gint parentx;
- gint parenty;
- RrPixel32 *pixel_data;
- gint bevel_dark_adjust; /* 0-255, default is 64 */
- gint bevel_light_adjust; /* 0-255, default is 128 */
- RrColor *split_primary;
- RrColor *split_secondary;
-};
-
-struct _RrTextureText {
- RrFont *font;
- RrJustify justify;
- RrColor *color;
- const gchar *string;
- gint shadow_offset_x;
- gint shadow_offset_y;
- RrColor *shadow_color;
- gboolean shortcut; /*!< Underline a character */
- guint shortcut_pos; /*!< Position in bytes of the character to underline */
- RrEllipsizeMode ellipsize;
- gboolean flow; /* allow multiple lines. must set maxwidth below */
- gint maxwidth;
- guchar shadow_alpha; /* at the bottom to improve alignment */
-};
-
-struct _RrPixmapMask {
- const RrInstance *inst;
- Pixmap mask;
- gint width;
- gint height;
- gchar *data;
-};
-
-struct _RrTextureMask {
- RrColor *color;
- RrPixmapMask *mask;
-};
-
-struct _RrTextureRGBA {
- gint width;
- gint height;
- gint alpha;
- RrPixel32 *data;
- /* size and position to draw at (if these are zero, then it will be
- drawn to fill the entire texture */
- gint tx;
- gint ty;
- gint twidth;
- gint theight;
-};
-
-struct _RrTextureImage {
- RrImage *image;
- gint alpha;
- /* size and position to draw at (if these are zero, then it will be
- drawn to fill the entire texture */
- gint tx;
- gint ty;
- gint twidth;
- gint theight;
-};
-
-struct _RrTextureLineArt {
- RrColor *color;
- gint x1;
- gint y1;
- gint x2;
- gint y2;
-};
-
-union _RrTextureData {
- RrTextureRGBA rgba;
- RrTextureImage image;
- RrTextureText text;
- RrTextureMask mask;
- RrTextureLineArt lineart;
-};
-
-struct _RrTexture {
- /* If changing the type of a texture, you should DEFINITELY call
- RrAppearanceClearTextures() first! */
- RrTextureType type;
- RrTextureData data;
-};
-
-struct _RrAppearance {
- const RrInstance *inst;
-
- RrSurface surface;
- gint textures;
- RrTexture *texture;
- Pixmap pixmap;
- XftDraw *xftdraw;
-
- /* cached for internal use */
- gint w, h;
-};
-
-/*! Holds a RGBA image picture */
-struct _RrImagePic {
- gint width, height;
- RrPixel32 *data;
- /* The sum of all the pixels. This is used to compare pictures if their
- hashes match. */
- gint sum;
-};
-
-/*! An RrImage is a sort of meta-image. It can contain multiple versions of
- an image at different sizes, which may or may not be completely different
- pictures */
-struct _RrImage {
- gint ref;
- RrImageCache *cache;
-
- /*! An array of "originals", that is of RrPictures that have been added
- to the image in various sizes, and that have not been resized. These
- are explicitly added to the RrImage. */
- RrImagePic **original;
- gint n_original;
- /*! An array of "resized" pictures. When an "original" RrPicture
- needs to be resized for drawing, it is saved in here so that it doesn't
- need to be resized again. These are automatically added to the
- RrImage. */
- RrImagePic **resized;
- gint n_resized;
-};
-
-/* these are the same on all endian machines because it seems to be dependant
- on the endianness of the gfx card, not the cpu. */
-#define RrDefaultAlphaOffset 24
-#define RrDefaultRedOffset 16
-#define RrDefaultGreenOffset 8
-#define RrDefaultBlueOffset 0
-
-#define RrDefaultFontFamily "arial,sans"
-#define RrDefaultFontSize 8
-#define RrDefaultFontWeight RR_FONTWEIGHT_NORMAL
-#define RrDefaultFontSlant RR_FONTSLANT_NORMAL
-
-RrInstance* RrInstanceNew (Display *display, gint screen);
-void RrInstanceFree (RrInstance *inst);
-
-Display* RrDisplay (const RrInstance *inst);
-gint RrScreen (const RrInstance *inst);
-Window RrRootWindow (const RrInstance *inst);
-Visual* RrVisual (const RrInstance *inst);
-gint RrDepth (const RrInstance *inst);
-Colormap RrColormap (const RrInstance *inst);
-gint RrRedOffset (const RrInstance *inst);
-gint RrGreenOffset (const RrInstance *inst);
-gint RrBlueOffset (const RrInstance *inst);
-gint RrRedShift (const RrInstance *inst);
-gint RrGreenShift (const RrInstance *inst);
-gint RrBlueShift (const RrInstance *inst);
-gint RrRedMask (const RrInstance *inst);
-gint RrGreenMask (const RrInstance *inst);
-gint RrBlueMask (const RrInstance *inst);
-
-RrColor *RrColorNew (const RrInstance *inst, gint r, gint g, gint b);
-RrColor *RrColorParse (const RrInstance *inst, gchar *colorname);
-void RrColorFree (RrColor *in);
-
-gint RrColorRed (const RrColor *c);
-gint RrColorGreen (const RrColor *c);
-gint RrColorBlue (const RrColor *c);
-gulong RrColorPixel (const RrColor *c);
-GC RrColorGC (RrColor *c);
-
-RrAppearance *RrAppearanceNew (const RrInstance *inst, gint numtex);
-RrAppearance *RrAppearanceCopy (RrAppearance *a);
-void RrAppearanceFree (RrAppearance *a);
-void RrAppearanceRemoveTextures(RrAppearance *a);
-void RrAppearanceAddTextures(RrAppearance *a, gint numtex);
-/*! Always call this when changing the type of a texture in an appearance */
-void RrAppearanceClearTextures(RrAppearance *a);
-
-RrFont *RrFontOpen (const RrInstance *inst, const gchar *name,
- gint size, RrFontWeight weight, RrFontSlant slant);
-RrFont *RrFontOpenDefault (const RrInstance *inst);
-void RrFontClose (RrFont *f);
-RrSize *RrFontMeasureString (const RrFont *f, const gchar *str,
- gint shadow_offset_x, gint shadow_offset_y,
- gboolean flow, gint maxwidth);
-gint RrFontHeight (const RrFont *f, gint shadow_offset_y);
-gint RrFontMaxCharWidth (const RrFont *f);
-
-/* Paint into the appearance. The old pixmap is returned (if there was one). It
- is the responsibility of the caller to call XFreePixmap on the return when
- it is non-null. */
-Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
-void RrPaint (RrAppearance *a, Window win, gint w, gint h);
-void RrMinSize (RrAppearance *a, gint *w, gint *h);
-gint RrMinWidth (RrAppearance *a);
-/* For text textures, if flow is TRUE, then the string must be set before
- calling this, otherwise it doesn't need to be */
-gint RrMinHeight (RrAppearance *a);
-void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
-
-gboolean RrPixmapToRGBA(const RrInstance *inst,
- Pixmap pmap, Pixmap mask,
- gint *w, gint *h, RrPixel32 **data);
-
-/*! Create a new image cache for RrImages.
- @param max_resized_saved The number of resized copies of an image to save
-*/
-RrImageCache* RrImageCacheNew(gint max_resized_saved);
-void RrImageCacheRef(RrImageCache *self);
-void RrImageCacheUnref(RrImageCache *self);
-
-/*! Finds an image in the cache, if it is already in there */
-RrImage* RrImageCacheFind(RrImageCache *self,
- RrPixel32 *data, gint w, gint h);
-
-RrImage* RrImageNew(RrImageCache *cache);
-void RrImageRef(RrImage *im);
-void RrImageUnref(RrImage *im);
-
-void RrImageAddPicture(RrImage *im, RrPixel32 *data, gint w, gint h);
-void RrImageRemovePicture(RrImage *im, gint w, gint h);
-
-G_END_DECLS
-
-#endif /*__render_h*/
diff --git a/render/test.c b/render/test.c
deleted file mode 100644
index 55ab621e..00000000
--- a/render/test.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- test.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
- Copyright (c) 2003 Derek Foreman
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include <stdio.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/extensions/shape.h>
-#include <string.h>
-#include <stdlib.h>
-#include "render.h"
-#include <glib.h>
-
-static gint x_error_handler(Display * disp, XErrorEvent * error)
-{
- gchar buf[1024];
- XGetErrorText(disp, error->error_code, buf, 1024);
- printf("%s\n", buf);
- return 0;
-}
-
-Display *ob_display;
-gint ob_screen;
-Window ob_root;
-
-gint main()
-{
- Window win;
- RrInstance *inst;
- RrAppearance *look;
- int done;
-
- Window root;
- XEvent report;
- gint h = 500, w = 500;
-
- ob_display = XOpenDisplay(NULL);
- XSetErrorHandler(x_error_handler);
- ob_screen = DefaultScreen(ob_display);
- ob_root = RootWindow(ob_display, ob_screen);
- win =
- XCreateWindow(ob_display, RootWindow(ob_display, 0),
- 10, 10, w, h, 10,
- CopyFromParent, /* depth */
- CopyFromParent, /* class */
- CopyFromParent, /* visual */
- 0, /* valuemask */
- 0); /* attributes */
- XMapWindow(ob_display, win);
- XSelectInput(ob_display, win, ExposureMask | StructureNotifyMask);
- root = RootWindow (ob_display, DefaultScreen (ob_display));
- inst = RrInstanceNew(ob_display, ob_screen);
-
- look = RrAppearanceNew(inst, 0);
- look->surface.grad = RR_SURFACE_MIRROR_HORIZONTAL;
- look->surface.secondary = RrColorParse(inst, "Yellow");
- look->surface.split_secondary = RrColorParse(inst, "Red");
- look->surface.split_primary = RrColorParse(inst, "Green");
- look->surface.primary = RrColorParse(inst, "Blue");
- look->surface.interlaced = FALSE;
- if (ob_display == NULL) {
- fprintf(stderr, "couldn't connect to X server :0\n");
- return 0;
- }
-
-#if BIGTEST
- int i;
- look->surface.pixel_data = g_new(RrPixel32, w*h);
- for (i = 0; i < 10000; ++i) {
- printf("\r%d", i);
- fflush(stdout);
- RrRender(look, w, h);
- }
- exit (0);
-#endif
-
- RrPaint(look, win, w, h);
- done = 0;
- while (!done) {
- XNextEvent(ob_display, &report);
- switch (report.type) {
- case Expose:
- break;
- case ConfigureNotify:
- RrPaint(look, win,
- report.xconfigure.width,
- report.xconfigure.height);
- break;
- case UnmapNotify:
- done = 1;
- break;
- }
- }
-
- RrAppearanceFree (look);
- RrInstanceFree (inst);
-
- return 1;
-}
diff --git a/render/theme.c b/render/theme.c
deleted file mode 100644
index 6c136bf5..00000000
--- a/render/theme.c
+++ /dev/null
@@ -1,2007 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- theme.c for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "render.h"
-#include "color.h"
-#include "font.h"
-#include "mask.h"
-#include "theme.h"
-#include "icon.h"
-#include "obt/paths.h"
-
-#include <X11/Xlib.h>
-#include <X11/Xresource.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-
-static XrmDatabase loaddb(const gchar *name, gchar **path);
-static gboolean read_int(XrmDatabase db, const gchar *rname, gint *value);
-static gboolean read_string(XrmDatabase db, const gchar *rname, gchar **value);
-static gboolean read_color(XrmDatabase db, const RrInstance *inst,
- const gchar *rname, RrColor **value);
-static gboolean read_mask(const RrInstance *inst, const gchar *path,
- RrTheme *theme, const gchar *maskname,
- RrPixmapMask **value);
-static gboolean read_appearance(XrmDatabase db, const RrInstance *inst,
- const gchar *rname, RrAppearance *value,
- gboolean allow_trans);
-static int parse_inline_number(const char *p);
-static RrPixel32* read_c_image(gint width, gint height, const guint8 *data);
-static void set_default_appearance(RrAppearance *a);
-
-static RrFont *get_font(RrFont *target, RrFont **default_font,
- const RrInstance *inst)
-{
- if (target) {
- RrFontRef(target);
- return target;
- } else {
- /* Only load the default font once */
- if (*default_font) {
- RrFontRef(*default_font);
- } else {
- *default_font = RrFontOpenDefault(inst);
- }
- return *default_font;
- }
-}
-
-RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
- gboolean allow_fallback,
- RrFont *active_window_font, RrFont *inactive_window_font,
- RrFont *menu_title_font, RrFont *menu_item_font,
- RrFont *active_osd_font, RrFont *inactive_osd_font)
-{
- XrmDatabase db = NULL;
- RrJustify winjust, mtitlejust;
- gchar *str;
- RrTheme *theme;
- RrFont *default_font = NULL;
- gchar *path;
- gboolean userdef;
-
- if (name) {
- db = loaddb(name, &path);
- if (db == NULL) {
- g_message("Unable to load the theme '%s'", name);
- if (allow_fallback)
- g_message("Falling back to the default theme '%s'",
- DEFAULT_THEME);
- /* fallback to the default theme */
- name = NULL;
- }
- }
- if (name == NULL) {
- if (allow_fallback) {
- db = loaddb(DEFAULT_THEME, &path);
- if (db == NULL) {
- g_message("Unable to load the theme '%s'", DEFAULT_THEME);
- return NULL;
- }
- } else
- return NULL;
- }
-
- theme = g_new0(RrTheme, 1);
-
- theme->inst = inst;
- theme->name = g_strdup(name ? name : DEFAULT_THEME);
-
- theme->a_disabled_focused_max = RrAppearanceNew(inst, 1);
- theme->a_disabled_unfocused_max = RrAppearanceNew(inst, 1);
- theme->a_hover_focused_max = RrAppearanceNew(inst, 1);
- theme->a_hover_unfocused_max = RrAppearanceNew(inst, 1);
- theme->a_toggled_focused_unpressed_max = RrAppearanceNew(inst, 1);
- theme->a_toggled_unfocused_unpressed_max = RrAppearanceNew(inst, 1);
- theme->a_toggled_hover_focused_max = RrAppearanceNew(inst, 1);
- theme->a_toggled_hover_unfocused_max = RrAppearanceNew(inst, 1);
- theme->a_toggled_focused_pressed_max = RrAppearanceNew(inst, 1);
- theme->a_toggled_unfocused_pressed_max = RrAppearanceNew(inst, 1);
- theme->a_focused_unpressed_max = RrAppearanceNew(inst, 1);
- theme->a_focused_pressed_max = RrAppearanceNew(inst, 1);
- theme->a_unfocused_unpressed_max = RrAppearanceNew(inst, 1);
- theme->a_unfocused_pressed_max = RrAppearanceNew(inst, 1);
- theme->a_focused_grip = RrAppearanceNew(inst, 0);
- theme->a_unfocused_grip = RrAppearanceNew(inst, 0);
- theme->a_focused_title = RrAppearanceNew(inst, 0);
- theme->a_unfocused_title = RrAppearanceNew(inst, 0);
- theme->a_focused_label = RrAppearanceNew(inst, 1);
- theme->a_unfocused_label = RrAppearanceNew(inst, 1);
- theme->a_icon = RrAppearanceNew(inst, 1);
- theme->a_focused_handle = RrAppearanceNew(inst, 0);
- theme->a_unfocused_handle = RrAppearanceNew(inst, 0);
- theme->a_menu = RrAppearanceNew(inst, 0);
- theme->a_menu_title = RrAppearanceNew(inst, 0);
- theme->a_menu_text_title = RrAppearanceNew(inst, 1);
- theme->a_menu_normal = RrAppearanceNew(inst, 0);
- theme->a_menu_selected = RrAppearanceNew(inst, 0);
- theme->a_menu_disabled = RrAppearanceNew(inst, 0);
- /* a_menu_disabled_selected is copied from a_menu_selected */
- theme->a_menu_text_normal = RrAppearanceNew(inst, 1);
- theme->a_menu_text_selected = RrAppearanceNew(inst, 1);
- theme->a_menu_text_disabled = RrAppearanceNew(inst, 1);
- theme->a_menu_text_disabled_selected = RrAppearanceNew(inst, 1);
- theme->a_menu_bullet_normal = RrAppearanceNew(inst, 1);
- theme->a_menu_bullet_selected = RrAppearanceNew(inst, 1);
- theme->a_clear = RrAppearanceNew(inst, 0);
- theme->a_clear_tex = RrAppearanceNew(inst, 1);
- theme->osd_bg = RrAppearanceNew(inst, 0);
- theme->osd_hilite_label = RrAppearanceNew(inst, 1);
- theme->osd_hilite_bg = RrAppearanceNew(inst, 0);
- theme->osd_unhilite_label = RrAppearanceNew(inst, 1);
- theme->osd_unhilite_bg = RrAppearanceNew(inst, 0);
-
- /* load the font stuff */
- theme->win_font_focused = get_font(active_window_font,
- &default_font, inst);
- theme->win_font_unfocused = get_font(inactive_window_font,
- &default_font, inst);
-
- winjust = RR_JUSTIFY_LEFT;
- if (read_string(db, "window.label.text.justify", &str)) {
- if (!g_ascii_strcasecmp(str, "right"))
- winjust = RR_JUSTIFY_RIGHT;
- else if (!g_ascii_strcasecmp(str, "center"))
- winjust = RR_JUSTIFY_CENTER;
- }
-
- theme->menu_title_font = get_font(menu_title_font, &default_font, inst);
-
- mtitlejust = RR_JUSTIFY_LEFT;
- if (read_string(db, "menu.title.text.justify", &str)) {
- if (!g_ascii_strcasecmp(str, "right"))
- mtitlejust = RR_JUSTIFY_RIGHT;
- else if (!g_ascii_strcasecmp(str, "center"))
- mtitlejust = RR_JUSTIFY_CENTER;
- }
-
- theme->menu_font = get_font(menu_item_font, &default_font, inst);
-
- theme->osd_font_hilite = get_font(active_osd_font, &default_font, inst);
- theme->osd_font_unhilite = get_font(inactive_osd_font, &default_font,inst);
-
- /* load direct dimensions */
- if ((!read_int(db, "menu.overlap.x", &theme->menu_overlap_x) &&
- !read_int(db, "menu.overlap", &theme->menu_overlap_x)) ||
- theme->menu_overlap_x < -100 || theme->menu_overlap_x > 100)
- theme->menu_overlap_x = 0;
- if ((!read_int(db, "menu.overlap.y", &theme->menu_overlap_y) &&
- !read_int(db, "menu.overlap", &theme->menu_overlap_y)) ||
- theme->menu_overlap_y < -100 || theme->menu_overlap_y > 100)
- theme->menu_overlap_y = 0;
- if (!read_int(db, "window.handle.width", &theme->handle_height) ||
- theme->handle_height < 0 || theme->handle_height > 100)
- theme->handle_height = 6;
- if (!read_int(db, "padding.width", &theme->paddingx) ||
- theme->paddingx < 0 || theme->paddingx > 100)
- theme->paddingx = 3;
- if (!read_int(db, "padding.height", &theme->paddingy) ||
- theme->paddingy < 0 || theme->paddingy > 100)
- theme->paddingy = theme->paddingx;
- if (!read_int(db, "border.width", &theme->fbwidth) ||
- theme->fbwidth < 0 || theme->fbwidth > 100)
- theme->fbwidth = 1;
- /* menu border width inherits from the frame border width */
- if (!read_int(db, "menu.border.width", &theme->mbwidth) ||
- theme->mbwidth < 0 || theme->mbwidth > 100)
- theme->mbwidth = theme->fbwidth;
- /* osd border width inherits from the frame border width */
- if (!read_int(db, "osd.border.width", &theme->obwidth) ||
- theme->obwidth < 0 || theme->obwidth > 100)
- theme->obwidth = theme->fbwidth;
- if (!read_int(db, "window.client.padding.width", &theme->cbwidthx) ||
- theme->cbwidthx < 0 || theme->cbwidthx > 100)
- theme->cbwidthx = theme->paddingx;
- if (!read_int(db, "window.client.padding.height", &theme->cbwidthy) ||
- theme->cbwidthy < 0 || theme->cbwidthy > 100)
- theme->cbwidthy = theme->cbwidthx;
- if (!read_int(db, "menu.separator.width", &theme->menu_sep_width) ||
- theme->menu_sep_width < 1 || theme->menu_sep_width > 100)
- theme->menu_sep_width = 1;
- if (!read_int(db, "menu.separator.padding.width",
- &theme->menu_sep_paddingx) ||
- theme->menu_sep_paddingx < 0 || theme->menu_sep_paddingx > 100)
- theme->menu_sep_paddingx = 6;
- if (!read_int(db, "menu.separator.padding.height",
- &theme->menu_sep_paddingy) ||
- theme->menu_sep_paddingy < 0 || theme->menu_sep_paddingy > 100)
- theme->menu_sep_paddingy = 3;
-
- /* load colors */
- if (!read_color(db, inst,
- "window.active.border.color",
- &theme->frame_focused_border_color) &&
- !read_color(db, inst,
- "border.color",
- &theme->frame_focused_border_color))
- theme->frame_focused_border_color = RrColorNew(inst, 0, 0, 0);
- /* title separator focused color inherits from focused border color */
- if (!read_color(db, inst,
- "window.active.title.separator.color",
- &theme->title_separator_focused_color))
- theme->title_separator_focused_color =
- RrColorNew(inst,
- theme->frame_focused_border_color->r,
- theme->frame_focused_border_color->g,
- theme->frame_focused_border_color->b);
- /* unfocused border color inherits from frame focused border color */
- if (!read_color(db, inst,
- "window.inactive.border.color",
- &theme->frame_unfocused_border_color))
- theme->frame_unfocused_border_color =
- RrColorNew(inst, theme->frame_focused_border_color->r,
- theme->frame_focused_border_color->g,
- theme->frame_focused_border_color->b);
- /* title separator unfocused color inherits from unfocused border color */
- if (!read_color(db, inst,
- "window.inactive.title.separator.color",
- &theme->title_separator_unfocused_color))
- theme->title_separator_unfocused_color =
- RrColorNew(inst,
- theme->frame_unfocused_border_color->r,
- theme->frame_unfocused_border_color->g,
- theme->frame_unfocused_border_color->b);
-
- /* menu border color inherits from frame focused border color */
- if (!read_color(db, inst, "menu.border.color", &theme->menu_border_color))
- theme->menu_border_color =
- RrColorNew(inst,
- theme->frame_focused_border_color->r,
- theme->frame_focused_border_color->g,
- theme->frame_focused_border_color->b);
- /* osd border color inherits from frame focused border color */
- if (!read_color(db, inst, "osd.border.color", &theme->osd_border_color))
- theme->osd_border_color =
- RrColorNew(inst,
- theme->frame_focused_border_color->r,
- theme->frame_focused_border_color->g,
- theme->frame_focused_border_color->b);
- if (!read_color(db, inst,
- "window.active.client.color",
- &theme->cb_focused_color))
- theme->cb_focused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.inactive.client.color",
- &theme->cb_unfocused_color))
- theme->cb_unfocused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.active.label.text.color",
- &theme->title_focused_color))
- theme->title_focused_color = RrColorNew(inst, 0x0, 0x0, 0x0);
- if (!read_color(db, inst, "osd.active.label.text.color",
- &theme->osd_text_active_color) &&
- !read_color(db, inst, "osd.label.text.color",
- &theme->osd_text_active_color))
- theme->osd_text_active_color =
- RrColorNew(inst,
- theme->title_focused_color->r,
- theme->title_focused_color->g,
- theme->title_focused_color->b);
- if (!read_color(db, inst,
- "window.inactive.label.text.color",
- &theme->title_unfocused_color))
- theme->title_unfocused_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst, "osd.inactive.label.text.color",
- &theme->osd_text_inactive_color))
- theme->osd_text_inactive_color =
- RrColorNew(inst,
- theme->title_unfocused_color->r,
- theme->title_unfocused_color->g,
- theme->title_unfocused_color->b);
- if (!read_color(db, inst,
- "window.active.button.unpressed.image.color",
- &theme->titlebut_focused_unpressed_color))
- theme->titlebut_focused_unpressed_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "window.inactive.button.unpressed.image.color",
- &theme->titlebut_unfocused_unpressed_color))
- theme->titlebut_unfocused_unpressed_color =
- RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.active.button.pressed.image.color",
- &theme->titlebut_focused_pressed_color))
- theme->titlebut_focused_pressed_color =
- RrColorNew(inst,
- theme->titlebut_focused_unpressed_color->r,
- theme->titlebut_focused_unpressed_color->g,
- theme->titlebut_focused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.pressed.image.color",
- &theme->titlebut_unfocused_pressed_color))
- theme->titlebut_unfocused_pressed_color =
- RrColorNew(inst,
- theme->titlebut_unfocused_unpressed_color->r,
- theme->titlebut_unfocused_unpressed_color->g,
- theme->titlebut_unfocused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.active.button.disabled.image.color",
- &theme->titlebut_disabled_focused_color))
- theme->titlebut_disabled_focused_color =
- RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "window.inactive.button.disabled.image.color",
- &theme->titlebut_disabled_unfocused_color))
- theme->titlebut_disabled_unfocused_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "window.active.button.hover.image.color",
- &theme->titlebut_hover_focused_color))
- theme->titlebut_hover_focused_color =
- RrColorNew(inst,
- theme->titlebut_focused_unpressed_color->r,
- theme->titlebut_focused_unpressed_color->g,
- theme->titlebut_focused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.hover.image.color",
- &theme->titlebut_hover_unfocused_color))
- theme->titlebut_hover_unfocused_color =
- RrColorNew(inst,
- theme->titlebut_unfocused_unpressed_color->r,
- theme->titlebut_unfocused_unpressed_color->g,
- theme->titlebut_unfocused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.active.button.toggled.unpressed.image.color",
- &theme->titlebut_toggled_focused_unpressed_color) &&
- !read_color(db, inst,
- "window.active.button.toggled.image.color",
- &theme->titlebut_toggled_focused_unpressed_color))
- theme->titlebut_toggled_focused_unpressed_color =
- RrColorNew(inst,
- theme->titlebut_focused_pressed_color->r,
- theme->titlebut_focused_pressed_color->g,
- theme->titlebut_focused_pressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.toggled.unpressed.image.color",
- &theme->titlebut_toggled_unfocused_unpressed_color) &&
- !read_color(db, inst,
- "window.inactive.button.toggled.image.color",
- &theme->titlebut_toggled_unfocused_unpressed_color))
- theme->titlebut_toggled_unfocused_unpressed_color =
- RrColorNew(inst,
- theme->titlebut_unfocused_pressed_color->r,
- theme->titlebut_unfocused_pressed_color->g,
- theme->titlebut_unfocused_pressed_color->b);
- if (!read_color(db, inst,
- "window.active.button.toggled.hover.image.color",
- &theme->titlebut_toggled_hover_focused_color))
- theme->titlebut_toggled_hover_focused_color =
- RrColorNew(inst,
- theme->titlebut_toggled_focused_unpressed_color->r,
- theme->titlebut_toggled_focused_unpressed_color->g,
- theme->titlebut_toggled_focused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.toggled.hover.image.color",
- &theme->titlebut_toggled_hover_unfocused_color))
- theme->titlebut_toggled_hover_unfocused_color =
- RrColorNew(inst,
- theme->titlebut_toggled_unfocused_unpressed_color->r,
- theme->titlebut_toggled_unfocused_unpressed_color->g,
- theme->titlebut_toggled_unfocused_unpressed_color->b);
- if (!read_color(db, inst,
- "window.active.button.toggled.pressed.image.color",
- &theme->titlebut_toggled_focused_pressed_color))
- theme->titlebut_toggled_focused_pressed_color =
- RrColorNew(inst,
- theme->titlebut_focused_pressed_color->r,
- theme->titlebut_focused_pressed_color->g,
- theme->titlebut_focused_pressed_color->b);
- if (!read_color(db, inst,
- "window.inactive.button.toggled.pressed.image.color",
- &theme->titlebut_toggled_unfocused_pressed_color))
- theme->titlebut_toggled_unfocused_pressed_color =
- RrColorNew(inst,
- theme->titlebut_unfocused_pressed_color->r,
- theme->titlebut_unfocused_pressed_color->g,
- theme->titlebut_unfocused_pressed_color->b);
- if (!read_color(db, inst,
- "menu.title.text.color", &theme->menu_title_color))
- theme->menu_title_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "menu.items.text.color", &theme->menu_color))
- theme->menu_color = RrColorNew(inst, 0xff, 0xff, 0xff);
- if (!read_color(db, inst,
- "menu.items.disabled.text.color",
- &theme->menu_disabled_color))
- theme->menu_disabled_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "menu.items.active.disabled.text.color",
- &theme->menu_disabled_selected_color))
- theme->menu_disabled_selected_color =
- RrColorNew(inst,
- theme->menu_disabled_color->r,
- theme->menu_disabled_color->g,
- theme->menu_disabled_color->b);
- if (!read_color(db, inst,
- "menu.items.active.text.color",
- &theme->menu_selected_color))
- theme->menu_selected_color = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst,
- "menu.separator.color", &theme->menu_sep_color))
- theme->menu_sep_color = RrColorNew(inst,
- theme->menu_color->r,
- theme->menu_color->g,
- theme->menu_color->b);
-
- /* load the image masks */
-
- /* maximize button masks */
- userdef = TRUE;
- if (!read_mask(inst, path, theme, "max.xbm", &theme->max_mask)) {
- guchar data[] = { 0x3f, 0x3f, 0x21, 0x21, 0x21, 0x3f };
- theme->max_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
- userdef = FALSE;
- }
- if (!read_mask(inst, path, theme, "max_toggled.xbm",
- &theme->max_toggled_mask))
- {
- if (userdef)
- theme->max_toggled_mask = RrPixmapMaskCopy(theme->max_mask);
- else {
- guchar data[] = { 0x3e, 0x22, 0x2f, 0x29, 0x39, 0x0f };
- theme->max_toggled_mask = RrPixmapMaskNew(inst, 6, 6,(gchar*)data);
- }
- }
- if (!read_mask(inst, path, theme, "max_pressed.xbm",
- &theme->max_pressed_mask))
- theme->max_pressed_mask = RrPixmapMaskCopy(theme->max_mask);
- if (!read_mask(inst,path,theme,"max_disabled.xbm",
- &theme->max_disabled_mask))
- theme->max_disabled_mask = RrPixmapMaskCopy(theme->max_mask);
- if (!read_mask(inst, path, theme, "max_hover.xbm", &theme->max_hover_mask))
- theme->max_hover_mask = RrPixmapMaskCopy(theme->max_mask);
- if (!read_mask(inst, path, theme, "max_toggled_pressed.xbm",
- &theme->max_toggled_pressed_mask))
- theme->max_toggled_pressed_mask =
- RrPixmapMaskCopy(theme->max_toggled_mask);
- if (!read_mask(inst, path, theme, "max_toggled_hover.xbm",
- &theme->max_toggled_hover_mask))
- theme->max_toggled_hover_mask =
- RrPixmapMaskCopy(theme->max_toggled_mask);
-
- /* iconify button masks */
- if (!read_mask(inst, path, theme, "iconify.xbm", &theme->iconify_mask)) {
- guchar data[] = { 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f };
- theme->iconify_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
- }
- if (!read_mask(inst, path, theme, "iconify_pressed.xbm",
- &theme->iconify_pressed_mask))
- theme->iconify_pressed_mask = RrPixmapMaskCopy(theme->iconify_mask);
- if (!read_mask(inst, path, theme, "iconify_disabled.xbm",
- &theme->iconify_disabled_mask))
- theme->iconify_disabled_mask = RrPixmapMaskCopy(theme->iconify_mask);
- if (!read_mask(inst, path, theme, "iconify_hover.xbm",
- &theme->iconify_hover_mask))
- theme->iconify_hover_mask = RrPixmapMaskCopy(theme->iconify_mask);
-
- /* all desktops button masks */
- userdef = TRUE;
- if (!read_mask(inst, path, theme, "desk.xbm", &theme->desk_mask)) {
- guchar data[] = { 0x33, 0x33, 0x00, 0x00, 0x33, 0x33 };
- theme->desk_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
- userdef = FALSE;
- }
- if (!read_mask(inst, path, theme, "desk_toggled.xbm",
- &theme->desk_toggled_mask)) {
- if (userdef)
- theme->desk_toggled_mask = RrPixmapMaskCopy(theme->desk_mask);
- else {
- guchar data[] = { 0x00, 0x1e, 0x1a, 0x16, 0x1e, 0x00 };
- theme->desk_toggled_mask =
- RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
- }
- }
- if (!read_mask(inst, path, theme, "desk_pressed.xbm",
- &theme->desk_pressed_mask))
- theme->desk_pressed_mask = RrPixmapMaskCopy(theme->desk_mask);
- if (!read_mask(inst, path, theme, "desk_disabled.xbm",
- &theme->desk_disabled_mask))
- theme->desk_disabled_mask = RrPixmapMaskCopy(theme->desk_mask);
- if (!read_mask(inst, path, theme, "desk_hover.xbm",
- &theme->desk_hover_mask))
- theme->desk_hover_mask = RrPixmapMaskCopy(theme->desk_mask);
- if (!read_mask(inst, path, theme, "desk_toggled_pressed.xbm",
- &theme->desk_toggled_pressed_mask))
- theme->desk_toggled_pressed_mask =
- RrPixmapMaskCopy(theme->desk_toggled_mask);
- if (!read_mask(inst, path, theme, "desk_toggled_hover.xbm",
- &theme->desk_toggled_hover_mask))
- theme->desk_toggled_hover_mask =
- RrPixmapMaskCopy(theme->desk_toggled_mask);
-
- /* shade button masks */
- if (!read_mask(inst, path, theme, "shade.xbm", &theme->shade_mask)) {
- guchar data[] = { 0x3f, 0x3f, 0x00, 0x00, 0x00, 0x00 };
- theme->shade_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
- }
- if (!read_mask(inst, path, theme, "shade_toggled.xbm",
- &theme->shade_toggled_mask))
- theme->shade_toggled_mask = RrPixmapMaskCopy(theme->shade_mask);
- if (!read_mask(inst, path, theme, "shade_pressed.xbm",
- &theme->shade_pressed_mask))
- theme->shade_pressed_mask = RrPixmapMaskCopy(theme->shade_mask);
- if (!read_mask(inst, path, theme, "shade_disabled.xbm",
- &theme->shade_disabled_mask))
- theme->shade_disabled_mask = RrPixmapMaskCopy(theme->shade_mask);
- if (!read_mask(inst, path, theme, "shade_hover.xbm",
- &theme->shade_hover_mask))
- theme->shade_hover_mask = RrPixmapMaskCopy(theme->shade_mask);
- if (!read_mask(inst, path, theme, "shade_toggled_pressed.xbm",
- &theme->shade_toggled_pressed_mask))
- theme->shade_toggled_pressed_mask =
- RrPixmapMaskCopy(theme->shade_toggled_mask);
- if (!read_mask(inst, path, theme, "shade_toggled_hover.xbm",
- &theme->shade_toggled_hover_mask))
- theme->shade_toggled_hover_mask =
- RrPixmapMaskCopy(theme->shade_toggled_mask);
-
- /* close button masks */
- if (!read_mask(inst, path, theme, "close.xbm", &theme->close_mask)) {
- guchar data[] = { 0x33, 0x3f, 0x1e, 0x1e, 0x3f, 0x33 };
- theme->close_mask = RrPixmapMaskNew(inst, 6, 6, (gchar*)data);
- }
- if (!read_mask(inst, path, theme, "close_pressed.xbm",
- &theme->close_pressed_mask))
- theme->close_pressed_mask = RrPixmapMaskCopy(theme->close_mask);
- if (!read_mask(inst, path, theme, "close_disabled.xbm",
- &theme->close_disabled_mask))
- theme->close_disabled_mask = RrPixmapMaskCopy(theme->close_mask);
- if (!read_mask(inst, path, theme, "close_hover.xbm",
- &theme->close_hover_mask))
- theme->close_hover_mask = RrPixmapMaskCopy(theme->close_mask);
-
- /* submenu bullet mask */
- if (!read_mask(inst, path, theme, "bullet.xbm", &theme->menu_bullet_mask))
- {
- guchar data[] = { 0x01, 0x03, 0x07, 0x0f, 0x07, 0x03, 0x01 };
- theme->menu_bullet_mask = RrPixmapMaskNew(inst, 4, 7, (gchar*)data);
- }
-
- /* up and down arrows */
- {
- guchar data[] = { 0xfe, 0x00, 0x7c, 0x00, 0x38, 0x00, 0x10, 0x00 };
- theme->down_arrow_mask = RrPixmapMaskNew(inst, 9, 4, (gchar*)data);
- }
- {
- guchar data[] = { 0x10, 0x00, 0x38, 0x00, 0x7c, 0x00, 0xfe, 0x00 };
- theme->up_arrow_mask = RrPixmapMaskNew(inst, 9, 4, (gchar*)data);
- }
-
- /* setup the default window icon */
- theme->def_win_icon = read_c_image(OB_DEFAULT_ICON_WIDTH,
- OB_DEFAULT_ICON_HEIGHT,
- OB_DEFAULT_ICON_pixel_data);
- theme->def_win_icon_w = OB_DEFAULT_ICON_WIDTH;
- theme->def_win_icon_h = OB_DEFAULT_ICON_HEIGHT;
-
- /* read the decoration textures */
- if (!read_appearance(db, inst,
- "window.active.title.bg", theme->a_focused_title,
- FALSE))
- set_default_appearance(theme->a_focused_title);
- if (!read_appearance(db, inst,
- "window.inactive.title.bg", theme->a_unfocused_title,
- FALSE))
- set_default_appearance(theme->a_unfocused_title);
- if (!read_appearance(db, inst,
- "window.active.label.bg", theme->a_focused_label,
- TRUE))
- set_default_appearance(theme->a_focused_label);
- if (!read_appearance(db, inst,
- "window.inactive.label.bg", theme->a_unfocused_label,
- TRUE))
- set_default_appearance(theme->a_unfocused_label);
- if (!read_appearance(db, inst,
- "window.active.handle.bg", theme->a_focused_handle,
- FALSE))
- set_default_appearance(theme->a_focused_handle);
- if (!read_appearance(db, inst,
- "window.inactive.handle.bg",theme->a_unfocused_handle,
- FALSE))
- set_default_appearance(theme->a_unfocused_handle);
- if (!read_appearance(db, inst,
- "window.active.grip.bg", theme->a_focused_grip,
- TRUE))
- set_default_appearance(theme->a_focused_grip);
- if (!read_appearance(db, inst,
- "window.inactive.grip.bg", theme->a_unfocused_grip,
- TRUE))
- set_default_appearance(theme->a_unfocused_grip);
- if (!read_appearance(db, inst,
- "menu.items.bg", theme->a_menu,
- FALSE))
- set_default_appearance(theme->a_menu);
- if (!read_appearance(db, inst,
- "menu.title.bg", theme->a_menu_title,
- TRUE))
- set_default_appearance(theme->a_menu_title);
- if (!read_appearance(db, inst,
- "menu.items.active.bg", theme->a_menu_selected,
- TRUE))
- set_default_appearance(theme->a_menu_selected);
- theme->a_menu_disabled_selected =
- RrAppearanceCopy(theme->a_menu_selected);
-
- /* read appearances for non-decorations (on-screen-display) */
- if (!read_appearance(db, inst, "osd.bg", theme->osd_bg, FALSE)) {
- RrAppearanceFree(theme->osd_bg);
- theme->osd_bg = RrAppearanceCopy(theme->a_focused_title);
- }
- if (!read_appearance(db, inst, "osd.active.label.bg",
- theme->osd_hilite_label, TRUE) &&
- !read_appearance(db, inst, "osd.label.bg",
- theme->osd_hilite_label, TRUE)) {
- RrAppearanceFree(theme->osd_hilite_label);
- theme->osd_hilite_label = RrAppearanceCopy(theme->a_focused_label);
- }
- if (!read_appearance(db, inst, "osd.inactive.label.bg",
- theme->osd_unhilite_label, TRUE)) {
- RrAppearanceFree(theme->osd_unhilite_label);
- theme->osd_unhilite_label = RrAppearanceCopy(theme->a_unfocused_label);
- }
- /* osd_hilite_fg can't be parentrel */
- if (!read_appearance(db, inst, "osd.hilight.bg",
- theme->osd_hilite_bg, FALSE)) {
- RrAppearanceFree(theme->osd_hilite_bg);
- if (theme->a_focused_label->surface.grad != RR_SURFACE_PARENTREL)
- theme->osd_hilite_bg = RrAppearanceCopy(theme->a_focused_label);
- else
- theme->osd_hilite_bg = RrAppearanceCopy(theme->a_focused_title);
- }
- /* osd_unhilite_fg can't be parentrel either */
- if (!read_appearance(db, inst, "osd.unhilight.bg",
- theme->osd_unhilite_bg, FALSE)) {
- RrAppearanceFree(theme->osd_unhilite_bg);
- if (theme->a_unfocused_label->surface.grad != RR_SURFACE_PARENTREL)
- theme->osd_unhilite_bg=RrAppearanceCopy(theme->a_unfocused_label);
- else
- theme->osd_unhilite_bg=RrAppearanceCopy(theme->a_unfocused_title);
- }
-
- /* read buttons textures */
- if (!read_appearance(db, inst,
- "window.active.button.disabled.bg",
- theme->a_disabled_focused_max,
- TRUE))
- set_default_appearance(theme->a_disabled_focused_max);
- if (!read_appearance(db, inst,
- "window.inactive.button.disabled.bg",
- theme->a_disabled_unfocused_max,
- TRUE))
- set_default_appearance(theme->a_disabled_unfocused_max);
- if (!read_appearance(db, inst,
- "window.active.button.pressed.bg",
- theme->a_focused_pressed_max,
- TRUE))
- set_default_appearance(theme->a_focused_pressed_max);
- if (!read_appearance(db, inst,
- "window.inactive.button.pressed.bg",
- theme->a_unfocused_pressed_max,
- TRUE))
- set_default_appearance(theme->a_unfocused_pressed_max);
- if (!read_appearance(db, inst,
- "window.active.button.toggled.unpressed.bg",
- theme->a_toggled_focused_unpressed_max,
- TRUE) &&
- !read_appearance(db, inst,
- "window.active.button.toggled.bg",
- theme->a_toggled_focused_unpressed_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_toggled_focused_unpressed_max);
- theme->a_toggled_focused_unpressed_max =
- RrAppearanceCopy(theme->a_focused_pressed_max);
- }
- if (!read_appearance(db, inst,
- "window.inactive.button.toggled.unpressed.bg",
- theme->a_toggled_unfocused_unpressed_max,
- TRUE) &&
- !read_appearance(db, inst,
- "window.inactive.button.toggled.bg",
- theme->a_toggled_unfocused_unpressed_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_toggled_unfocused_unpressed_max);
- theme->a_toggled_unfocused_unpressed_max =
- RrAppearanceCopy(theme->a_unfocused_pressed_max);
- }
- if (!read_appearance(db, inst,
- "window.active.button.toggled.hover.bg",
- theme->a_toggled_hover_focused_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_toggled_hover_focused_max);
- theme->a_toggled_hover_focused_max =
- RrAppearanceCopy(theme->a_toggled_focused_unpressed_max);
- }
- if (!read_appearance(db, inst,
- "window.inactive.button.toggled.hover.bg",
- theme->a_toggled_hover_unfocused_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_toggled_hover_unfocused_max);
- theme->a_toggled_hover_unfocused_max =
- RrAppearanceCopy(theme->a_toggled_unfocused_unpressed_max);
- }
- if (!read_appearance(db, inst,
- "window.active.button.toggled.pressed.bg",
- theme->a_toggled_focused_pressed_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_toggled_focused_pressed_max);
- theme->a_toggled_focused_pressed_max =
- RrAppearanceCopy(theme->a_focused_pressed_max);
- }
- if (!read_appearance(db, inst,
- "window.inactive.button.toggled.pressed.bg",
- theme->a_toggled_unfocused_pressed_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_toggled_unfocused_pressed_max);
- theme->a_toggled_unfocused_pressed_max =
- RrAppearanceCopy(theme->a_unfocused_pressed_max);
- }
- if (!read_appearance(db, inst,
- "window.active.button.unpressed.bg",
- theme->a_focused_unpressed_max,
- TRUE))
- set_default_appearance(theme->a_focused_unpressed_max);
- if (!read_appearance(db, inst,
- "window.inactive.button.unpressed.bg",
- theme->a_unfocused_unpressed_max,
- TRUE))
- set_default_appearance(theme->a_unfocused_unpressed_max);
- if (!read_appearance(db, inst,
- "window.active.button.hover.bg",
- theme->a_hover_focused_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_hover_focused_max);
- theme->a_hover_focused_max =
- RrAppearanceCopy(theme->a_focused_unpressed_max);
- }
- if (!read_appearance(db, inst,
- "window.inactive.button.hover.bg",
- theme->a_hover_unfocused_max,
- TRUE))
- {
- RrAppearanceFree(theme->a_hover_unfocused_max);
- theme->a_hover_unfocused_max =
- RrAppearanceCopy(theme->a_unfocused_unpressed_max);
- }
-
- theme->a_disabled_focused_close =
- RrAppearanceCopy(theme->a_disabled_focused_max);
- theme->a_disabled_unfocused_close =
- RrAppearanceCopy(theme->a_disabled_unfocused_max);
- theme->a_hover_focused_close =
- RrAppearanceCopy(theme->a_hover_focused_max);
- theme->a_hover_unfocused_close =
- RrAppearanceCopy(theme->a_hover_unfocused_max);
- theme->a_unfocused_unpressed_close =
- RrAppearanceCopy(theme->a_unfocused_unpressed_max);
- theme->a_unfocused_pressed_close =
- RrAppearanceCopy(theme->a_unfocused_pressed_max);
- theme->a_focused_unpressed_close =
- RrAppearanceCopy(theme->a_focused_unpressed_max);
- theme->a_focused_pressed_close =
- RrAppearanceCopy(theme->a_focused_pressed_max);
- theme->a_disabled_focused_desk =
- RrAppearanceCopy(theme->a_disabled_focused_max);
- theme->a_disabled_unfocused_desk =
- RrAppearanceCopy(theme->a_disabled_unfocused_max);
- theme->a_hover_focused_desk =
- RrAppearanceCopy(theme->a_hover_focused_max);
- theme->a_hover_unfocused_desk =
- RrAppearanceCopy(theme->a_hover_unfocused_max);
- theme->a_toggled_hover_focused_desk =
- RrAppearanceCopy(theme->a_toggled_hover_focused_max);
- theme->a_toggled_hover_unfocused_desk =
- RrAppearanceCopy(theme->a_toggled_hover_unfocused_max);
- theme->a_toggled_focused_unpressed_desk =
- RrAppearanceCopy(theme->a_toggled_focused_unpressed_max);
- theme->a_toggled_unfocused_unpressed_desk =
- RrAppearanceCopy(theme->a_toggled_unfocused_unpressed_max);
- theme->a_toggled_focused_pressed_desk =
- RrAppearanceCopy(theme->a_toggled_focused_pressed_max);
- theme->a_toggled_unfocused_pressed_desk =
- RrAppearanceCopy(theme->a_toggled_unfocused_pressed_max);
- theme->a_unfocused_unpressed_desk =
- RrAppearanceCopy(theme->a_unfocused_unpressed_max);
- theme->a_unfocused_pressed_desk =
- RrAppearanceCopy(theme->a_unfocused_pressed_max);
- theme->a_focused_unpressed_desk =
- RrAppearanceCopy(theme->a_focused_unpressed_max);
- theme->a_focused_pressed_desk =
- RrAppearanceCopy(theme->a_focused_pressed_max);
- theme->a_disabled_focused_shade =
- RrAppearanceCopy(theme->a_disabled_focused_max);
- theme->a_disabled_unfocused_shade =
- RrAppearanceCopy(theme->a_disabled_unfocused_max);
- theme->a_hover_focused_shade =
- RrAppearanceCopy(theme->a_hover_focused_max);
- theme->a_hover_unfocused_shade =
- RrAppearanceCopy(theme->a_hover_unfocused_max);
- theme->a_toggled_hover_focused_shade =
- RrAppearanceCopy(theme->a_toggled_hover_focused_max);
- theme->a_toggled_hover_unfocused_shade =
- RrAppearanceCopy(theme->a_toggled_hover_unfocused_max);
- theme->a_toggled_focused_unpressed_shade =
- RrAppearanceCopy(theme->a_toggled_focused_unpressed_max);
- theme->a_toggled_unfocused_unpressed_shade =
- RrAppearanceCopy(theme->a_toggled_unfocused_unpressed_max);
- theme->a_toggled_focused_pressed_shade =
- RrAppearanceCopy(theme->a_toggled_focused_pressed_max);
- theme->a_toggled_unfocused_pressed_shade =
- RrAppearanceCopy(theme->a_toggled_unfocused_pressed_max);
- theme->a_unfocused_unpressed_shade =
- RrAppearanceCopy(theme->a_unfocused_unpressed_max);
- theme->a_unfocused_pressed_shade =
- RrAppearanceCopy(theme->a_unfocused_pressed_max);
- theme->a_focused_unpressed_shade =
- RrAppearanceCopy(theme->a_focused_unpressed_max);
- theme->a_focused_pressed_shade =
- RrAppearanceCopy(theme->a_focused_pressed_max);
- theme->a_disabled_focused_iconify =
- RrAppearanceCopy(theme->a_disabled_focused_max);
- theme->a_disabled_unfocused_iconify =
- RrAppearanceCopy(theme->a_disabled_focused_max);
- theme->a_hover_focused_iconify =
- RrAppearanceCopy(theme->a_hover_focused_max);
- theme->a_hover_unfocused_iconify =
- RrAppearanceCopy(theme->a_hover_unfocused_max);
- theme->a_unfocused_unpressed_iconify =
- RrAppearanceCopy(theme->a_unfocused_unpressed_max);
- theme->a_unfocused_pressed_iconify =
- RrAppearanceCopy(theme->a_unfocused_pressed_max);
- theme->a_focused_unpressed_iconify =
- RrAppearanceCopy(theme->a_focused_unpressed_max);
- theme->a_focused_pressed_iconify =
- RrAppearanceCopy(theme->a_focused_pressed_max);
-
- theme->a_icon->surface.grad =
- theme->a_clear->surface.grad =
- theme->a_clear_tex->surface.grad =
- theme->a_menu_text_title->surface.grad =
- theme->a_menu_normal->surface.grad =
- theme->a_menu_disabled->surface.grad =
- theme->a_menu_text_normal->surface.grad =
- theme->a_menu_text_selected->surface.grad =
- theme->a_menu_text_disabled->surface.grad =
- theme->a_menu_text_disabled_selected->surface.grad =
- theme->a_menu_bullet_normal->surface.grad =
- theme->a_menu_bullet_selected->surface.grad = RR_SURFACE_PARENTREL;
-
- /* set up the textures */
- theme->a_focused_label->texture[0].type = RR_TEXTURE_TEXT;
- theme->a_focused_label->texture[0].data.text.justify = winjust;
- theme->a_focused_label->texture[0].data.text.font=theme->win_font_focused;
- theme->a_focused_label->texture[0].data.text.color =
- theme->title_focused_color;
-
- if (read_string(db, "window.active.label.text.font", &str)) {
- char *p;
- gint i = 0;
- gint j;
- if (strstr(str, "shadow=y")) {
- if ((p = strstr(str, "shadowoffset=")))
- i = parse_inline_number(p + strlen("shadowoffset="));
- else
- i = 1;
- theme->a_focused_label->texture[0].data.text.shadow_offset_x = i;
- theme->a_focused_label->texture[0].data.text.shadow_offset_y = i;
- }
- if ((p = strstr(str, "shadowtint=")))
- {
- i = parse_inline_number(p + strlen("shadowtint="));
- j = (i > 0 ? 0 : 255);
- i = ABS(i*255/100);
-
- theme->title_focused_shadow_color = RrColorNew(inst, j, j, j);
- theme->title_focused_shadow_alpha = i;
- } else {
- theme->title_focused_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->title_focused_shadow_alpha = 50;
- }
- }
-
- theme->a_focused_label->texture[0].data.text.shadow_color =
- theme->title_focused_shadow_color;
- theme->a_focused_label->texture[0].data.text.shadow_alpha =
- theme->title_focused_shadow_alpha;
-
- theme->osd_hilite_label->texture[0].type = RR_TEXTURE_TEXT;
- theme->osd_hilite_label->texture[0].data.text.justify = RR_JUSTIFY_LEFT;
- theme->osd_hilite_label->texture[0].data.text.font =
- theme->osd_font_hilite;
- theme->osd_hilite_label->texture[0].data.text.color =
- theme->osd_text_active_color;
-
- theme->osd_unhilite_label->texture[0].type = RR_TEXTURE_TEXT;
- theme->osd_unhilite_label->texture[0].data.text.justify = RR_JUSTIFY_LEFT;
- theme->osd_unhilite_label->texture[0].data.text.font =
- theme->osd_font_unhilite;
- theme->osd_unhilite_label->texture[0].data.text.color =
- theme->osd_text_inactive_color;
-
- if (read_string(db, "osd.active.label.text.font", &str) ||
- read_string(db, "osd.label.text.font", &str))
- {
- char *p;
- gint i = 0;
- gint j;
- if (strstr(str, "shadow=y")) {
- if ((p = strstr(str, "shadowoffset=")))
- i = parse_inline_number(p + strlen("shadowoffset="));
- else
- i = 1;
- theme->osd_hilite_label->texture[0].data.text.shadow_offset_x = i;
- theme->osd_hilite_label->texture[0].data.text.shadow_offset_y = i;
- }
- if ((p = strstr(str, "shadowtint=")))
- {
- i = parse_inline_number(p + strlen("shadowtint="));
- j = (i > 0 ? 0 : 255);
- i = ABS(i*255/100);
-
- theme->osd_text_active_shadow_color = RrColorNew(inst, j, j, j);
- theme->osd_text_active_shadow_alpha = i;
- } else {
- theme->osd_text_active_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->osd_text_active_shadow_alpha = 50;
- }
- } else {
- /* inherit the font settings from the focused label */
- theme->osd_hilite_label->texture[0].data.text.shadow_offset_x =
- theme->a_focused_label->texture[0].data.text.shadow_offset_x;
- theme->osd_hilite_label->texture[0].data.text.shadow_offset_y =
- theme->a_focused_label->texture[0].data.text.shadow_offset_y;
- if (theme->title_focused_shadow_color)
- theme->osd_text_active_shadow_color =
- RrColorNew(inst,
- theme->title_focused_shadow_color->r,
- theme->title_focused_shadow_color->g,
- theme->title_focused_shadow_color->b);
- else
- theme->osd_text_active_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->osd_text_active_shadow_alpha =
- theme->title_focused_shadow_alpha;
- }
-
- theme->osd_hilite_label->texture[0].data.text.shadow_color =
- theme->osd_text_active_shadow_color;
- theme->osd_hilite_label->texture[0].data.text.shadow_alpha =
- theme->osd_text_active_shadow_alpha;
-
- if (read_string(db, "osd.inactive.label.text.font", &str))
- {
- char *p;
- gint i = 0;
- gint j;
- if (strstr(str, "shadow=y")) {
- if ((p = strstr(str, "shadowoffset=")))
- i = parse_inline_number(p + strlen("shadowoffset="));
- else
- i = 1;
- theme->osd_unhilite_label->texture[0].data.text.shadow_offset_x=i;
- theme->osd_unhilite_label->texture[0].data.text.shadow_offset_y=i;
- }
- if ((p = strstr(str, "shadowtint=")))
- {
- i = parse_inline_number(p + strlen("shadowtint="));
- j = (i > 0 ? 0 : 255);
- i = ABS(i*255/100);
-
- theme->osd_text_inactive_shadow_color = RrColorNew(inst, j, j, j);
- theme->osd_text_inactive_shadow_alpha = i;
- } else {
- theme->osd_text_inactive_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->osd_text_inactive_shadow_alpha = 50;
- }
- } else {
- /* inherit the font settings from the focused label */
- theme->osd_unhilite_label->texture[0].data.text.shadow_offset_x =
- theme->a_unfocused_label->texture[0].data.text.shadow_offset_x;
- theme->osd_unhilite_label->texture[0].data.text.shadow_offset_y =
- theme->a_unfocused_label->texture[0].data.text.shadow_offset_y;
- if (theme->title_unfocused_shadow_color)
- theme->osd_text_inactive_shadow_color =
- RrColorNew(inst,
- theme->title_unfocused_shadow_color->r,
- theme->title_unfocused_shadow_color->g,
- theme->title_unfocused_shadow_color->b);
- else
- theme->osd_text_inactive_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->osd_text_inactive_shadow_alpha =
- theme->title_unfocused_shadow_alpha;
- }
-
- theme->osd_unhilite_label->texture[0].data.text.shadow_color =
- theme->osd_text_inactive_shadow_color;
- theme->osd_unhilite_label->texture[0].data.text.shadow_alpha =
- theme->osd_text_inactive_shadow_alpha;
-
- theme->a_unfocused_label->texture[0].type = RR_TEXTURE_TEXT;
- theme->a_unfocused_label->texture[0].data.text.justify = winjust;
- theme->a_unfocused_label->texture[0].data.text.font =
- theme->win_font_unfocused;
- theme->a_unfocused_label->texture[0].data.text.color =
- theme->title_unfocused_color;
-
- if (read_string(db, "window.inactive.label.text.font", &str)) {
- char *p;
- gint i = 0;
- gint j;
- if (strstr(str, "shadow=y")) {
- if ((p = strstr(str, "shadowoffset=")))
- i = parse_inline_number(p + strlen("shadowoffset="));
- else
- i = 1;
- theme->a_unfocused_label->texture[0].data.text.shadow_offset_x = i;
- theme->a_unfocused_label->texture[0].data.text.shadow_offset_y = i;
- }
- if ((p = strstr(str, "shadowtint=")))
- {
- i = parse_inline_number(p + strlen("shadowtint="));
- j = (i > 0 ? 0 : 255);
- i = ABS(i*255/100);
-
- theme->title_unfocused_shadow_color = RrColorNew(inst, j, j, j);
- theme->title_unfocused_shadow_alpha = i;
- } else {
- theme->title_unfocused_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->title_unfocused_shadow_alpha = 50;
- }
- }
-
- theme->a_unfocused_label->texture[0].data.text.shadow_color =
- theme->title_unfocused_shadow_color;
- theme->a_unfocused_label->texture[0].data.text.shadow_alpha =
- theme->title_unfocused_shadow_alpha;
-
- theme->a_menu_text_title->texture[0].type = RR_TEXTURE_TEXT;
- theme->a_menu_text_title->texture[0].data.text.justify = mtitlejust;
- theme->a_menu_text_title->texture[0].data.text.font =
- theme->menu_title_font;
- theme->a_menu_text_title->texture[0].data.text.color =
- theme->menu_title_color;
-
- if (read_string(db, "menu.title.text.font", &str)) {
- char *p;
- gint i = 0;
- gint j;
- if (strstr(str, "shadow=y")) {
- if ((p = strstr(str, "shadowoffset=")))
- i = parse_inline_number(p + strlen("shadowoffset="));
- else
- i = 1;
- theme->a_menu_text_title->texture[0].data.text.shadow_offset_x = i;
- theme->a_menu_text_title->texture[0].data.text.shadow_offset_y = i;
- }
- if ((p = strstr(str, "shadowtint=")))
- {
- i = parse_inline_number(p + strlen("shadowtint="));
- j = (i > 0 ? 0 : 255);
- i = ABS(i*255/100);
-
- theme->menu_title_shadow_color = RrColorNew(inst, j, j, j);
- theme->menu_title_shadow_alpha = i;
- } else {
- theme->menu_title_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->menu_title_shadow_alpha = 50;
- }
- }
-
- theme->a_menu_text_title->texture[0].data.text.shadow_color =
- theme->menu_title_shadow_color;
- theme->a_menu_text_title->texture[0].data.text.shadow_alpha =
- theme->menu_title_shadow_alpha;
-
- theme->a_menu_text_normal->texture[0].type =
- theme->a_menu_text_selected->texture[0].type =
- theme->a_menu_text_disabled->texture[0].type =
- theme->a_menu_text_disabled_selected->texture[0].type =
- RR_TEXTURE_TEXT;
- theme->a_menu_text_normal->texture[0].data.text.justify =
- theme->a_menu_text_selected->texture[0].data.text.justify =
- theme->a_menu_text_disabled->texture[0].data.text.justify =
- theme->a_menu_text_disabled_selected->texture[0].data.text.justify =
- RR_JUSTIFY_LEFT;
- theme->a_menu_text_normal->texture[0].data.text.font =
- theme->a_menu_text_selected->texture[0].data.text.font =
- theme->a_menu_text_disabled->texture[0].data.text.font =
- theme->a_menu_text_disabled_selected->texture[0].data.text.font =
- theme->menu_font;
- theme->a_menu_text_normal->texture[0].data.text.color = theme->menu_color;
- theme->a_menu_text_selected->texture[0].data.text.color =
- theme->menu_selected_color;
- theme->a_menu_text_disabled->texture[0].data.text.color =
- theme->menu_disabled_color;
- theme->a_menu_text_disabled_selected->texture[0].data.text.color =
- theme->menu_disabled_selected_color;
-
- if (read_string(db, "menu.items.font", &str)) {
- char *p;
- gint i = 0;
- gint j;
- if (strstr(str, "shadow=y")) {
- if ((p = strstr(str, "shadowoffset=")))
- i = parse_inline_number(p + strlen("shadowoffset="));
- else
- i = 1;
- theme->a_menu_text_normal->
- texture[0].data.text.shadow_offset_x = i;
- theme->a_menu_text_normal->
- texture[0].data.text.shadow_offset_y = i;
- theme->a_menu_text_selected->
- texture[0].data.text.shadow_offset_x = i;
- theme->a_menu_text_selected->
- texture[0].data.text.shadow_offset_y = i;
- theme->a_menu_text_disabled->
- texture[0].data.text.shadow_offset_x = i;
- theme->a_menu_text_disabled->
- texture[0].data.text.shadow_offset_y = i;
- theme->a_menu_text_disabled_selected->
- texture[0].data.text.shadow_offset_x = i;
- theme->a_menu_text_disabled_selected->
- texture[0].data.text.shadow_offset_y = i;
- }
- if ((p = strstr(str, "shadowtint=")))
- {
- i = parse_inline_number(p + strlen("shadowtint="));
- j = (i > 0 ? 0 : 255);
- i = ABS(i*255/100);
-
- theme->menu_text_normal_shadow_color = RrColorNew(inst, j, j, j);
- theme->menu_text_selected_shadow_color = RrColorNew(inst, j, j, j);
- theme->menu_text_disabled_shadow_color = RrColorNew(inst, j, j, j);
- theme->menu_text_normal_shadow_alpha = i;
- theme->menu_text_selected_shadow_alpha = i;
- theme->menu_text_disabled_shadow_alpha = i;
- theme->menu_text_disabled_selected_shadow_alpha = i;
- } else {
- theme->menu_text_normal_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->menu_text_selected_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->menu_text_disabled_shadow_color = RrColorNew(inst, 0, 0, 0);
- theme->menu_text_normal_shadow_alpha = 50;
- theme->menu_text_selected_shadow_alpha = 50;
- theme->menu_text_disabled_selected_shadow_alpha = 50;
- }
- }
-
- theme->a_menu_text_normal->texture[0].data.text.shadow_color =
- theme->menu_text_normal_shadow_color;
- theme->a_menu_text_normal->texture[0].data.text.shadow_alpha =
- theme->menu_text_normal_shadow_alpha;
- theme->a_menu_text_selected->texture[0].data.text.shadow_color =
- theme->menu_text_selected_shadow_color;
- theme->a_menu_text_selected->texture[0].data.text.shadow_alpha =
- theme->menu_text_selected_shadow_alpha;
- theme->a_menu_text_disabled->texture[0].data.text.shadow_color =
- theme->menu_text_disabled_shadow_color;
- theme->a_menu_text_disabled->texture[0].data.text.shadow_alpha =
- theme->menu_text_disabled_shadow_alpha;
- theme->a_menu_text_disabled_selected->texture[0].data.text.shadow_color =
- theme->menu_text_disabled_shadow_color;
- theme->a_menu_text_disabled_selected->texture[0].data.text.shadow_alpha =
- theme->menu_text_disabled_shadow_alpha;
-
- theme->a_disabled_focused_max->texture[0].type =
- theme->a_disabled_unfocused_max->texture[0].type =
- theme->a_hover_focused_max->texture[0].type =
- theme->a_hover_unfocused_max->texture[0].type =
- theme->a_toggled_hover_focused_max->texture[0].type =
- theme->a_toggled_hover_unfocused_max->texture[0].type =
- theme->a_toggled_focused_unpressed_max->texture[0].type =
- theme->a_toggled_unfocused_unpressed_max->texture[0].type =
- theme->a_toggled_focused_pressed_max->texture[0].type =
- theme->a_toggled_unfocused_pressed_max->texture[0].type =
- theme->a_focused_unpressed_max->texture[0].type =
- theme->a_focused_pressed_max->texture[0].type =
- theme->a_unfocused_unpressed_max->texture[0].type =
- theme->a_unfocused_pressed_max->texture[0].type =
- theme->a_disabled_focused_close->texture[0].type =
- theme->a_disabled_unfocused_close->texture[0].type =
- theme->a_hover_focused_close->texture[0].type =
- theme->a_hover_unfocused_close->texture[0].type =
- theme->a_focused_unpressed_close->texture[0].type =
- theme->a_focused_pressed_close->texture[0].type =
- theme->a_unfocused_unpressed_close->texture[0].type =
- theme->a_unfocused_pressed_close->texture[0].type =
- theme->a_disabled_focused_desk->texture[0].type =
- theme->a_disabled_unfocused_desk->texture[0].type =
- theme->a_hover_focused_desk->texture[0].type =
- theme->a_hover_unfocused_desk->texture[0].type =
- theme->a_toggled_hover_focused_desk->texture[0].type =
- theme->a_toggled_hover_unfocused_desk->texture[0].type =
- theme->a_toggled_focused_unpressed_desk->texture[0].type =
- theme->a_toggled_unfocused_unpressed_desk->texture[0].type =
- theme->a_toggled_focused_pressed_desk->texture[0].type =
- theme->a_toggled_unfocused_pressed_desk->texture[0].type =
- theme->a_focused_unpressed_desk->texture[0].type =
- theme->a_focused_pressed_desk->texture[0].type =
- theme->a_unfocused_unpressed_desk->texture[0].type =
- theme->a_unfocused_pressed_desk->texture[0].type =
- theme->a_disabled_focused_shade->texture[0].type =
- theme->a_disabled_unfocused_shade->texture[0].type =
- theme->a_hover_focused_shade->texture[0].type =
- theme->a_hover_unfocused_shade->texture[0].type =
- theme->a_toggled_hover_focused_shade->texture[0].type =
- theme->a_toggled_hover_unfocused_shade->texture[0].type =
- theme->a_toggled_focused_unpressed_shade->texture[0].type =
- theme->a_toggled_unfocused_unpressed_shade->texture[0].type =
- theme->a_toggled_focused_pressed_shade->texture[0].type =
- theme->a_toggled_unfocused_pressed_shade->texture[0].type =
- theme->a_focused_unpressed_shade->texture[0].type =
- theme->a_focused_pressed_shade->texture[0].type =
- theme->a_unfocused_unpressed_shade->texture[0].type =
- theme->a_unfocused_pressed_shade->texture[0].type =
- theme->a_disabled_focused_iconify->texture[0].type =
- theme->a_disabled_unfocused_iconify->texture[0].type =
- theme->a_hover_focused_iconify->texture[0].type =
- theme->a_hover_unfocused_iconify->texture[0].type =
- theme->a_focused_unpressed_iconify->texture[0].type =
- theme->a_focused_pressed_iconify->texture[0].type =
- theme->a_unfocused_unpressed_iconify->texture[0].type =
- theme->a_unfocused_pressed_iconify->texture[0].type =
- theme->a_menu_bullet_normal->texture[0].type =
- theme->a_menu_bullet_selected->texture[0].type = RR_TEXTURE_MASK;
-
- theme->a_disabled_focused_max->texture[0].data.mask.mask =
- theme->a_disabled_unfocused_max->texture[0].data.mask.mask =
- theme->max_disabled_mask;
- theme->a_hover_focused_max->texture[0].data.mask.mask =
- theme->a_hover_unfocused_max->texture[0].data.mask.mask =
- theme->max_hover_mask;
- theme->a_focused_pressed_max->texture[0].data.mask.mask =
- theme->a_unfocused_pressed_max->texture[0].data.mask.mask =
- theme->max_pressed_mask;
- theme->a_focused_unpressed_max->texture[0].data.mask.mask =
- theme->a_unfocused_unpressed_max->texture[0].data.mask.mask =
- theme->max_mask;
- theme->a_toggled_hover_focused_max->texture[0].data.mask.mask =
- theme->a_toggled_hover_unfocused_max->texture[0].data.mask.mask =
- theme->max_toggled_hover_mask;
- theme->a_toggled_focused_unpressed_max->texture[0].data.mask.mask =
- theme->a_toggled_unfocused_unpressed_max->texture[0].data.mask.mask =
- theme->max_toggled_mask;
- theme->a_toggled_focused_pressed_max->texture[0].data.mask.mask =
- theme->a_toggled_unfocused_pressed_max->texture[0].data.mask.mask =
- theme->max_toggled_pressed_mask;
- theme->a_disabled_focused_close->texture[0].data.mask.mask =
- theme->a_disabled_unfocused_close->texture[0].data.mask.mask =
- theme->close_disabled_mask;
- theme->a_hover_focused_close->texture[0].data.mask.mask =
- theme->a_hover_unfocused_close->texture[0].data.mask.mask =
- theme->close_hover_mask;
- theme->a_focused_pressed_close->texture[0].data.mask.mask =
- theme->a_unfocused_pressed_close->texture[0].data.mask.mask =
- theme->close_pressed_mask;
- theme->a_focused_unpressed_close->texture[0].data.mask.mask =
- theme->a_unfocused_unpressed_close->texture[0].data.mask.mask =
- theme->close_mask;
- theme->a_disabled_focused_desk->texture[0].data.mask.mask =
- theme->a_disabled_unfocused_desk->texture[0].data.mask.mask =
- theme->desk_disabled_mask;
- theme->a_hover_focused_desk->texture[0].data.mask.mask =
- theme->a_hover_unfocused_desk->texture[0].data.mask.mask =
- theme->desk_hover_mask;
- theme->a_focused_pressed_desk->texture[0].data.mask.mask =
- theme->a_unfocused_pressed_desk->texture[0].data.mask.mask =
- theme->desk_pressed_mask;
- theme->a_focused_unpressed_desk->texture[0].data.mask.mask =
- theme->a_unfocused_unpressed_desk->texture[0].data.mask.mask =
- theme->desk_mask;
- theme->a_toggled_hover_focused_desk->texture[0].data.mask.mask =
- theme->a_toggled_hover_unfocused_desk->texture[0].data.mask.mask =
- theme->desk_toggled_hover_mask;
- theme->a_toggled_focused_unpressed_desk->texture[0].data.mask.mask =
- theme->a_toggled_unfocused_unpressed_desk->texture[0].data.mask.mask =
- theme->desk_toggled_mask;
- theme->a_toggled_focused_pressed_desk->texture[0].data.mask.mask =
- theme->a_toggled_unfocused_pressed_desk->texture[0].data.mask.mask =
- theme->desk_toggled_pressed_mask;
- theme->a_disabled_focused_shade->texture[0].data.mask.mask =
- theme->a_disabled_unfocused_shade->texture[0].data.mask.mask =
- theme->shade_disabled_mask;
- theme->a_hover_focused_shade->texture[0].data.mask.mask =
- theme->a_hover_unfocused_shade->texture[0].data.mask.mask =
- theme->shade_hover_mask;
- theme->a_focused_pressed_shade->texture[0].data.mask.mask =
- theme->a_unfocused_pressed_shade->texture[0].data.mask.mask =
- theme->shade_pressed_mask;
- theme->a_focused_unpressed_shade->texture[0].data.mask.mask =
- theme->a_unfocused_unpressed_shade->texture[0].data.mask.mask =
- theme->shade_mask;
- theme->a_toggled_hover_focused_shade->texture[0].data.mask.mask =
- theme->a_toggled_hover_unfocused_shade->texture[0].data.mask.mask =
- theme->shade_toggled_hover_mask;
- theme->a_toggled_focused_unpressed_shade->texture[0].data.mask.mask =
- theme->a_toggled_unfocused_unpressed_shade->texture[0].data.mask.mask =
- theme->shade_toggled_mask;
- theme->a_toggled_focused_pressed_shade->texture[0].data.mask.mask =
- theme->a_toggled_unfocused_pressed_shade->texture[0].data.mask.mask =
- theme->shade_toggled_pressed_mask;
- theme->a_disabled_focused_iconify->texture[0].data.mask.mask =
- theme->a_disabled_unfocused_iconify->texture[0].data.mask.mask =
- theme->iconify_disabled_mask;
- theme->a_hover_focused_iconify->texture[0].data.mask.mask =
- theme->a_hover_unfocused_iconify->texture[0].data.mask.mask =
- theme->iconify_hover_mask;
- theme->a_focused_pressed_iconify->texture[0].data.mask.mask =
- theme->a_unfocused_pressed_iconify->texture[0].data.mask.mask =
- theme->iconify_pressed_mask;
- theme->a_focused_unpressed_iconify->texture[0].data.mask.mask =
- theme->a_unfocused_unpressed_iconify->texture[0].data.mask.mask =
- theme->iconify_mask;
- theme->a_menu_bullet_normal->texture[0].data.mask.mask =
- theme->a_menu_bullet_selected->texture[0].data.mask.mask =
- theme->menu_bullet_mask;
- theme->a_disabled_focused_max->texture[0].data.mask.color =
- theme->a_disabled_focused_close->texture[0].data.mask.color =
- theme->a_disabled_focused_desk->texture[0].data.mask.color =
- theme->a_disabled_focused_shade->texture[0].data.mask.color =
- theme->a_disabled_focused_iconify->texture[0].data.mask.color =
- theme->titlebut_disabled_focused_color;
- theme->a_disabled_unfocused_max->texture[0].data.mask.color =
- theme->a_disabled_unfocused_close->texture[0].data.mask.color =
- theme->a_disabled_unfocused_desk->texture[0].data.mask.color =
- theme->a_disabled_unfocused_shade->texture[0].data.mask.color =
- theme->a_disabled_unfocused_iconify->texture[0].data.mask.color =
- theme->titlebut_disabled_unfocused_color;
- theme->a_hover_focused_max->texture[0].data.mask.color =
- theme->a_hover_focused_close->texture[0].data.mask.color =
- theme->a_hover_focused_desk->texture[0].data.mask.color =
- theme->a_hover_focused_shade->texture[0].data.mask.color =
- theme->a_hover_focused_iconify->texture[0].data.mask.color =
- theme->titlebut_hover_focused_color;
- theme->a_hover_unfocused_max->texture[0].data.mask.color =
- theme->a_hover_unfocused_close->texture[0].data.mask.color =
- theme->a_hover_unfocused_desk->texture[0].data.mask.color =
- theme->a_hover_unfocused_shade->texture[0].data.mask.color =
- theme->a_hover_unfocused_iconify->texture[0].data.mask.color =
- theme->titlebut_hover_unfocused_color;
- theme->a_toggled_hover_focused_max->texture[0].data.mask.color =
- theme->a_toggled_hover_focused_desk->texture[0].data.mask.color =
- theme->a_toggled_hover_focused_shade->texture[0].data.mask.color =
- theme->titlebut_toggled_hover_focused_color;
- theme->a_toggled_hover_unfocused_max->texture[0].data.mask.color =
- theme->a_toggled_hover_unfocused_desk->texture[0].data.mask.color =
- theme->a_toggled_hover_unfocused_shade->texture[0].data.mask.color =
- theme->titlebut_toggled_hover_unfocused_color;
- theme->a_toggled_focused_unpressed_max->texture[0].data.mask.color =
- theme->a_toggled_focused_unpressed_desk->texture[0].data.mask.color =
- theme->a_toggled_focused_unpressed_shade->texture[0].data.mask.color =
- theme->titlebut_toggled_focused_unpressed_color;
- theme->a_toggled_unfocused_unpressed_max->texture[0].data.mask.color =
- theme->a_toggled_unfocused_unpressed_desk->texture[0].data.mask.color =
- theme->a_toggled_unfocused_unpressed_shade->texture[0].data.mask.color=
- theme->titlebut_toggled_unfocused_unpressed_color;
- theme->a_toggled_focused_pressed_max->texture[0].data.mask.color =
- theme->a_toggled_focused_pressed_desk->texture[0].data.mask.color =
- theme->a_toggled_focused_pressed_shade->texture[0].data.mask.color =
- theme->titlebut_toggled_focused_pressed_color;
- theme->a_toggled_unfocused_pressed_max->texture[0].data.mask.color =
- theme->a_toggled_unfocused_pressed_desk->texture[0].data.mask.color =
- theme->a_toggled_unfocused_pressed_shade->texture[0].data.mask.color =
- theme->titlebut_toggled_unfocused_pressed_color;
- theme->a_focused_unpressed_max->texture[0].data.mask.color =
- theme->a_focused_unpressed_close->texture[0].data.mask.color =
- theme->a_focused_unpressed_desk->texture[0].data.mask.color =
- theme->a_focused_unpressed_shade->texture[0].data.mask.color =
- theme->a_focused_unpressed_iconify->texture[0].data.mask.color =
- theme->titlebut_focused_unpressed_color;
- theme->a_focused_pressed_max->texture[0].data.mask.color =
- theme->a_focused_pressed_close->texture[0].data.mask.color =
- theme->a_focused_pressed_desk->texture[0].data.mask.color =
- theme->a_focused_pressed_shade->texture[0].data.mask.color =
- theme->a_focused_pressed_iconify->texture[0].data.mask.color =
- theme->titlebut_focused_pressed_color;
- theme->a_unfocused_unpressed_max->texture[0].data.mask.color =
- theme->a_unfocused_unpressed_close->texture[0].data.mask.color =
- theme->a_unfocused_unpressed_desk->texture[0].data.mask.color =
- theme->a_unfocused_unpressed_shade->texture[0].data.mask.color =
- theme->a_unfocused_unpressed_iconify->texture[0].data.mask.color =
- theme->titlebut_unfocused_unpressed_color;
- theme->a_unfocused_pressed_max->texture[0].data.mask.color =
- theme->a_unfocused_pressed_close->texture[0].data.mask.color =
- theme->a_unfocused_pressed_desk->texture[0].data.mask.color =
- theme->a_unfocused_pressed_shade->texture[0].data.mask.color =
- theme->a_unfocused_pressed_iconify->texture[0].data.mask.color =
- theme->titlebut_unfocused_pressed_color;
- theme->a_menu_bullet_normal->texture[0].data.mask.color =
- theme->menu_color;
- theme->a_menu_bullet_selected->texture[0].data.mask.color =
- theme->menu_selected_color;
-
- g_free(path);
- 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_y);
- theme->win_font_height =
- MAX(theme->win_font_height,
- RrFontHeight
- (theme->win_font_focused,
- theme->a_unfocused_label->texture[0].data.text.shadow_offset_y));
- theme->menu_title_font_height = RrFontHeight
- (theme->menu_title_font,
- theme->a_menu_text_title->texture[0].data.text.shadow_offset_y);
- theme->menu_font_height = RrFontHeight
- (theme->menu_font,
- theme->a_menu_text_normal->texture[0].data.text.shadow_offset_y);
-
- /* calculate some last extents */
- {
- gint ft, fb, fl, fr, ut, ub, ul, ur;
-
- RrMargins(theme->a_focused_label, &fl, &ft, &fr, &fb);
- RrMargins(theme->a_unfocused_label, &ul, &ut, &ur, &ub);
- theme->label_height = theme->win_font_height + MAX(ft + fb, ut + ub);
- theme->label_height += theme->label_height % 2;
-
- /* this would be nice I think, since padding.width can now be 0,
- but it breaks frame.c horribly and I don't feel like fixing that
- right now, so if anyone complains, here is how to keep text from
- going over the title's bevel/border with a padding.width of 0 and a
- bevelless/borderless label
- RrMargins(theme->a_focused_title, &fl, &ft, &fr, &fb);
- RrMargins(theme->a_unfocused_title, &ul, &ut, &ur, &ub);
- theme->title_height = theme->label_height +
- MAX(MAX(theme->padding * 2, ft + fb),
- MAX(theme->padding * 2, ut + ub));
- */
- theme->title_height = theme->label_height + theme->paddingy * 2;
-
- RrMargins(theme->a_menu_title, &ul, &ut, &ur, &ub);
- theme->menu_title_label_height = theme->menu_title_font_height+ut+ub;
- theme->menu_title_height = theme->menu_title_label_height +
- theme->paddingy * 2;
- }
- theme->button_size = theme->label_height - 2;
- theme->grip_width = 25;
-
- return theme;
-}
-
-void RrThemeFree(RrTheme *theme)
-{
- if (theme) {
- g_free(theme->name);
-
- RrColorFree(theme->menu_border_color);
- RrColorFree(theme->osd_border_color);
- RrColorFree(theme->frame_focused_border_color);
- RrColorFree(theme->frame_unfocused_border_color);
- RrColorFree(theme->title_separator_focused_color);
- RrColorFree(theme->title_separator_unfocused_color);
- RrColorFree(theme->cb_unfocused_color);
- RrColorFree(theme->cb_focused_color);
- RrColorFree(theme->title_focused_color);
- RrColorFree(theme->title_unfocused_color);
- RrColorFree(theme->titlebut_disabled_focused_color);
- RrColorFree(theme->titlebut_disabled_unfocused_color);
- RrColorFree(theme->titlebut_hover_focused_color);
- RrColorFree(theme->titlebut_hover_unfocused_color);
- RrColorFree(theme->titlebut_toggled_hover_focused_color);
- RrColorFree(theme->titlebut_toggled_hover_unfocused_color);
- RrColorFree(theme->titlebut_toggled_focused_pressed_color);
- RrColorFree(theme->titlebut_toggled_unfocused_pressed_color);
- RrColorFree(theme->titlebut_toggled_focused_unpressed_color);
- RrColorFree(theme->titlebut_toggled_unfocused_unpressed_color);
- RrColorFree(theme->titlebut_focused_pressed_color);
- RrColorFree(theme->titlebut_unfocused_pressed_color);
- RrColorFree(theme->titlebut_focused_unpressed_color);
- RrColorFree(theme->titlebut_unfocused_unpressed_color);
- RrColorFree(theme->menu_title_color);
- RrColorFree(theme->menu_sep_color);
- RrColorFree(theme->menu_color);
- RrColorFree(theme->menu_selected_color);
- RrColorFree(theme->menu_disabled_color);
- RrColorFree(theme->menu_disabled_selected_color);
- RrColorFree(theme->title_focused_shadow_color);
- RrColorFree(theme->title_unfocused_shadow_color);
- RrColorFree(theme->osd_text_active_color);
- RrColorFree(theme->osd_text_inactive_color);
- RrColorFree(theme->osd_text_active_shadow_color);
- RrColorFree(theme->osd_text_inactive_shadow_color);
- RrColorFree(theme->menu_title_shadow_color);
- RrColorFree(theme->menu_text_normal_shadow_color);
- RrColorFree(theme->menu_text_selected_shadow_color);
- RrColorFree(theme->menu_text_disabled_shadow_color);
- RrColorFree(theme->menu_text_disabled_selected_shadow_color);
-
- g_free(theme->def_win_icon);
-
- RrPixmapMaskFree(theme->max_mask);
- RrPixmapMaskFree(theme->max_toggled_mask);
- RrPixmapMaskFree(theme->max_toggled_hover_mask);
- RrPixmapMaskFree(theme->max_toggled_pressed_mask);
- RrPixmapMaskFree(theme->max_disabled_mask);
- RrPixmapMaskFree(theme->max_hover_mask);
- RrPixmapMaskFree(theme->max_pressed_mask);
- RrPixmapMaskFree(theme->desk_mask);
- RrPixmapMaskFree(theme->desk_toggled_mask);
- RrPixmapMaskFree(theme->desk_toggled_hover_mask);
- RrPixmapMaskFree(theme->desk_toggled_pressed_mask);
- RrPixmapMaskFree(theme->desk_disabled_mask);
- RrPixmapMaskFree(theme->desk_hover_mask);
- RrPixmapMaskFree(theme->desk_pressed_mask);
- RrPixmapMaskFree(theme->shade_mask);
- RrPixmapMaskFree(theme->shade_toggled_mask);
- RrPixmapMaskFree(theme->shade_toggled_hover_mask);
- RrPixmapMaskFree(theme->shade_toggled_pressed_mask);
- RrPixmapMaskFree(theme->shade_disabled_mask);
- RrPixmapMaskFree(theme->shade_hover_mask);
- RrPixmapMaskFree(theme->shade_pressed_mask);
- RrPixmapMaskFree(theme->iconify_mask);
- RrPixmapMaskFree(theme->iconify_disabled_mask);
- RrPixmapMaskFree(theme->iconify_hover_mask);
- RrPixmapMaskFree(theme->iconify_pressed_mask);
- RrPixmapMaskFree(theme->close_mask);
- RrPixmapMaskFree(theme->close_disabled_mask);
- RrPixmapMaskFree(theme->close_hover_mask);
- RrPixmapMaskFree(theme->close_pressed_mask);
- RrPixmapMaskFree(theme->menu_bullet_mask);
- RrPixmapMaskFree(theme->down_arrow_mask);
- RrPixmapMaskFree(theme->up_arrow_mask);
-
- RrFontClose(theme->win_font_focused);
- RrFontClose(theme->win_font_unfocused);
- RrFontClose(theme->menu_title_font);
- RrFontClose(theme->menu_font);
- RrFontClose(theme->osd_font_hilite);
- RrFontClose(theme->osd_font_unhilite);
-
- RrAppearanceFree(theme->a_disabled_focused_max);
- RrAppearanceFree(theme->a_disabled_unfocused_max);
- RrAppearanceFree(theme->a_hover_focused_max);
- RrAppearanceFree(theme->a_hover_unfocused_max);
- RrAppearanceFree(theme->a_toggled_hover_focused_max);
- RrAppearanceFree(theme->a_toggled_hover_unfocused_max);
- RrAppearanceFree(theme->a_toggled_focused_unpressed_max);
- RrAppearanceFree(theme->a_toggled_focused_pressed_max);
- RrAppearanceFree(theme->a_toggled_unfocused_unpressed_max);
- RrAppearanceFree(theme->a_toggled_unfocused_pressed_max);
- RrAppearanceFree(theme->a_focused_unpressed_max);
- RrAppearanceFree(theme->a_focused_pressed_max);
- RrAppearanceFree(theme->a_unfocused_unpressed_max);
- RrAppearanceFree(theme->a_unfocused_pressed_max);
- RrAppearanceFree(theme->a_disabled_focused_close);
- RrAppearanceFree(theme->a_disabled_unfocused_close);
- RrAppearanceFree(theme->a_hover_focused_close);
- RrAppearanceFree(theme->a_hover_unfocused_close);
- RrAppearanceFree(theme->a_focused_unpressed_close);
- RrAppearanceFree(theme->a_focused_pressed_close);
- RrAppearanceFree(theme->a_unfocused_unpressed_close);
- RrAppearanceFree(theme->a_unfocused_pressed_close);
- RrAppearanceFree(theme->a_disabled_focused_desk);
- RrAppearanceFree(theme->a_disabled_unfocused_desk);
- RrAppearanceFree(theme->a_hover_focused_desk);
- RrAppearanceFree(theme->a_hover_unfocused_desk);
- RrAppearanceFree(theme->a_toggled_hover_focused_desk);
- RrAppearanceFree(theme->a_toggled_hover_unfocused_desk);
- RrAppearanceFree(theme->a_toggled_focused_unpressed_desk);
- RrAppearanceFree(theme->a_toggled_focused_pressed_desk);
- RrAppearanceFree(theme->a_toggled_unfocused_unpressed_desk);
- RrAppearanceFree(theme->a_toggled_unfocused_pressed_desk);
- RrAppearanceFree(theme->a_focused_unpressed_desk);
- RrAppearanceFree(theme->a_focused_pressed_desk);
- RrAppearanceFree(theme->a_unfocused_unpressed_desk);
- RrAppearanceFree(theme->a_unfocused_pressed_desk);
- RrAppearanceFree(theme->a_disabled_focused_shade);
- RrAppearanceFree(theme->a_disabled_unfocused_shade);
- RrAppearanceFree(theme->a_hover_focused_shade);
- RrAppearanceFree(theme->a_hover_unfocused_shade);
- RrAppearanceFree(theme->a_toggled_hover_focused_shade);
- RrAppearanceFree(theme->a_toggled_hover_unfocused_shade);
- RrAppearanceFree(theme->a_toggled_focused_unpressed_shade);
- RrAppearanceFree(theme->a_toggled_focused_pressed_shade);
- RrAppearanceFree(theme->a_toggled_unfocused_unpressed_shade);
- RrAppearanceFree(theme->a_toggled_unfocused_pressed_shade);
- RrAppearanceFree(theme->a_focused_unpressed_shade);
- RrAppearanceFree(theme->a_focused_pressed_shade);
- RrAppearanceFree(theme->a_unfocused_unpressed_shade);
- RrAppearanceFree(theme->a_unfocused_pressed_shade);
- RrAppearanceFree(theme->a_disabled_focused_iconify);
- RrAppearanceFree(theme->a_disabled_unfocused_iconify);
- RrAppearanceFree(theme->a_hover_focused_iconify);
- RrAppearanceFree(theme->a_hover_unfocused_iconify);
- RrAppearanceFree(theme->a_focused_unpressed_iconify);
- RrAppearanceFree(theme->a_focused_pressed_iconify);
- RrAppearanceFree(theme->a_unfocused_unpressed_iconify);
- RrAppearanceFree(theme->a_unfocused_pressed_iconify);
- RrAppearanceFree(theme->a_focused_grip);
- RrAppearanceFree(theme->a_unfocused_grip);
- RrAppearanceFree(theme->a_focused_title);
- RrAppearanceFree(theme->a_unfocused_title);
- RrAppearanceFree(theme->a_focused_label);
- RrAppearanceFree(theme->a_unfocused_label);
- RrAppearanceFree(theme->a_icon);
- RrAppearanceFree(theme->a_focused_handle);
- RrAppearanceFree(theme->a_unfocused_handle);
- RrAppearanceFree(theme->a_menu);
- RrAppearanceFree(theme->a_menu_title);
- RrAppearanceFree(theme->a_menu_text_title);
- RrAppearanceFree(theme->a_menu_normal);
- RrAppearanceFree(theme->a_menu_selected);
- RrAppearanceFree(theme->a_menu_disabled);
- RrAppearanceFree(theme->a_menu_disabled_selected);
- RrAppearanceFree(theme->a_menu_text_normal);
- RrAppearanceFree(theme->a_menu_text_selected);
- RrAppearanceFree(theme->a_menu_text_disabled);
- RrAppearanceFree(theme->a_menu_text_disabled_selected);
- RrAppearanceFree(theme->a_menu_bullet_normal);
- RrAppearanceFree(theme->a_menu_bullet_selected);
- RrAppearanceFree(theme->a_clear);
- RrAppearanceFree(theme->a_clear_tex);
- RrAppearanceFree(theme->osd_bg);
- RrAppearanceFree(theme->osd_hilite_bg);
- RrAppearanceFree(theme->osd_hilite_label);
- RrAppearanceFree(theme->osd_unhilite_bg);
- RrAppearanceFree(theme->osd_unhilite_label);
-
- g_free(theme);
- }
-}
-
-static XrmDatabase loaddb(const gchar *name, gchar **path)
-{
- GSList *it;
- XrmDatabase db = NULL;
- gchar *s;
-
- if (name[0] == '/') {
- s = g_build_filename(name, "openbox-3", "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- *path = g_path_get_dirname(s);
- g_free(s);
- } else {
- ObtPaths *p;
-
- p = obt_paths_new();
-
- /* XXX backwards compatibility, remove me sometime later */
- s = g_build_filename(g_get_home_dir(), ".themes", name,
- "openbox-3", "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- *path = g_path_get_dirname(s);
- g_free(s);
-
- for (it = obt_paths_data_dirs(p); !db && it; it = g_slist_next(it))
- {
- s = g_build_filename(it->data, "themes", name,
- "openbox-3", "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- *path = g_path_get_dirname(s);
- g_free(s);
- }
-
- obt_paths_unref(p);
- }
-
- if (db == NULL) {
- s = g_build_filename(name, "themerc", NULL);
- if ((db = XrmGetFileDatabase(s)))
- *path = g_path_get_dirname(s);
- g_free(s);
- }
-
- return db;
-}
-
-static gchar *create_class_name(const gchar *rname)
-{
- gchar *rclass = g_strdup(rname);
- gchar *p = rclass;
-
- while (TRUE) {
- *p = toupper(*p);
- p = strchr(p+1, '.');
- if (p == NULL) break;
- ++p;
- if (*p == '\0') break;
- }
- return rclass;
-}
-
-static gboolean read_int(XrmDatabase db, const gchar *rname, gint *value)
-{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *rettype, *end;
- XrmValue retvalue;
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- *value = (gint)strtol(retvalue.addr, &end, 10);
- if (end != retvalue.addr)
- ret = TRUE;
- }
-
- g_free(rclass);
- return ret;
-}
-
-static gboolean read_string(XrmDatabase db, const gchar *rname, gchar **value)
-{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *rettype;
- XrmValue retvalue;
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- *value = retvalue.addr;
- ret = TRUE;
- }
-
- g_free(rclass);
- return ret;
-}
-
-static gboolean read_color(XrmDatabase db, const RrInstance *inst,
- const gchar *rname, RrColor **value)
-{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *rettype;
- XrmValue retvalue;
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- RrColor *c = RrColorParse(inst, retvalue.addr);
- if (c != NULL) {
- *value = c;
- ret = TRUE;
- }
- }
-
- g_free(rclass);
- return ret;
-}
-
-static gboolean read_mask(const RrInstance *inst, const gchar *path,
- RrTheme *theme, const gchar *maskname,
- RrPixmapMask **value)
-{
- gboolean ret = FALSE;
- gchar *s;
- gint hx, hy; /* ignored */
- guint w, h;
- guchar *b;
-
- s = g_build_filename(path, maskname, NULL);
- if (XReadBitmapFileData(s, &w, &h, &b, &hx, &hy) == BitmapSuccess) {
- ret = TRUE;
- *value = RrPixmapMaskNew(inst, w, h, (gchar*)b);
- XFree(b);
- }
- g_free(s);
-
- return ret;
-}
-
-static void parse_appearance(gchar *tex, RrSurfaceColorType *grad,
- RrReliefType *relief, RrBevelType *bevel,
- gboolean *interlaced, gboolean *border,
- gboolean allow_trans)
-{
- gchar *t;
-
- /* convert to all lowercase */
- for (t = tex; *t != '\0'; ++t)
- *t = g_ascii_tolower(*t);
-
- if (allow_trans && strstr(tex, "parentrelative") != NULL) {
- *grad = RR_SURFACE_PARENTREL;
- } else {
- if (strstr(tex, "gradient") != NULL) {
- if (strstr(tex, "crossdiagonal") != NULL)
- *grad = RR_SURFACE_CROSS_DIAGONAL;
- else if (strstr(tex, "pyramid") != NULL)
- *grad = RR_SURFACE_PYRAMID;
- else if (strstr(tex, "mirrorhorizontal") != NULL)
- *grad = RR_SURFACE_MIRROR_HORIZONTAL;
- else if (strstr(tex, "horizontal") != NULL)
- *grad = RR_SURFACE_HORIZONTAL;
- else if (strstr(tex, "splitvertical") != NULL)
- *grad = RR_SURFACE_SPLIT_VERTICAL;
- else if (strstr(tex, "vertical") != NULL)
- *grad = RR_SURFACE_VERTICAL;
- else
- *grad = RR_SURFACE_DIAGONAL;
- } else {
- *grad = RR_SURFACE_SOLID;
- }
- }
-
- if (strstr(tex, "sunken") != NULL)
- *relief = RR_RELIEF_SUNKEN;
- else if (strstr(tex, "flat") != NULL)
- *relief = RR_RELIEF_FLAT;
- else if (strstr(tex, "raised") != NULL)
- *relief = RR_RELIEF_RAISED;
- else
- *relief = (*grad == RR_SURFACE_PARENTREL) ?
- RR_RELIEF_FLAT : RR_RELIEF_RAISED;
-
- *border = FALSE;
- if (*relief == RR_RELIEF_FLAT) {
- if (strstr(tex, "border") != NULL)
- *border = TRUE;
- } else {
- if (strstr(tex, "bevel2") != NULL)
- *bevel = RR_BEVEL_2;
- else
- *bevel = RR_BEVEL_1;
- }
-
- if (strstr(tex, "interlaced") != NULL)
- *interlaced = TRUE;
- else
- *interlaced = FALSE;
-}
-
-static gboolean read_appearance(XrmDatabase db, const RrInstance *inst,
- const gchar *rname, RrAppearance *value,
- gboolean allow_trans)
-{
- gboolean ret = FALSE;
- gchar *rclass = create_class_name(rname);
- gchar *cname, *ctoname, *bcname, *icname, *hname, *sname;
- gchar *csplitname, *ctosplitname;
- gchar *rettype;
- XrmValue retvalue;
- gint i;
-
- cname = g_strconcat(rname, ".color", NULL);
- ctoname = g_strconcat(rname, ".colorTo", NULL);
- bcname = g_strconcat(rname, ".border.color", NULL);
- icname = g_strconcat(rname, ".interlace.color", NULL);
- hname = g_strconcat(rname, ".highlight", NULL);
- sname = g_strconcat(rname, ".shadow", NULL);
- csplitname = g_strconcat(rname, ".color.splitTo", NULL);
- ctosplitname = g_strconcat(rname, ".colorTo.splitTo", NULL);
-
- if (XrmGetResource(db, rname, rclass, &rettype, &retvalue) &&
- retvalue.addr != NULL) {
- parse_appearance(retvalue.addr,
- &value->surface.grad,
- &value->surface.relief,
- &value->surface.bevel,
- &value->surface.interlaced,
- &value->surface.border,
- allow_trans);
- if (!read_color(db, inst, cname, &value->surface.primary))
- value->surface.primary = RrColorNew(inst, 0, 0, 0);
- if (!read_color(db, inst, ctoname, &value->surface.secondary))
- value->surface.secondary = RrColorNew(inst, 0, 0, 0);
- if (value->surface.border)
- if (!read_color(db, inst, bcname,
- &value->surface.border_color))
- value->surface.border_color = RrColorNew(inst, 0, 0, 0);
- if (value->surface.interlaced)
- if (!read_color(db, inst, icname,
- &value->surface.interlace_color))
- value->surface.interlace_color = RrColorNew(inst, 0, 0, 0);
- if (read_int(db, hname, &i) && i >= 0)
- value->surface.bevel_light_adjust = i;
- if (read_int(db, sname, &i) && i >= 0 && i <= 256)
- value->surface.bevel_dark_adjust = i;
-
- if (value->surface.grad == RR_SURFACE_SPLIT_VERTICAL) {
- gint r, g, b;
-
- if (!read_color(db, inst, csplitname,
- &value->surface.split_primary))
- {
- r = value->surface.primary->r;
- r += r >> 2;
- g = value->surface.primary->g;
- g += g >> 2;
- b = value->surface.primary->b;
- b += b >> 2;
- if (r > 0xFF) r = 0xFF;
- if (g > 0xFF) g = 0xFF;
- if (b > 0xFF) b = 0xFF;
- value->surface.split_primary = RrColorNew(inst, r, g, b);
- }
-
- if (!read_color(db, inst, ctosplitname,
- &value->surface.split_secondary))
- {
- r = value->surface.secondary->r;
- r += r >> 4;
- g = value->surface.secondary->g;
- g += g >> 4;
- b = value->surface.secondary->b;
- b += b >> 4;
- if (r > 0xFF) r = 0xFF;
- if (g > 0xFF) g = 0xFF;
- if (b > 0xFF) b = 0xFF;
- value->surface.split_secondary = RrColorNew(inst, r, g, b);
- }
- }
-
- ret = TRUE;
- }
-
- g_free(ctosplitname);
- g_free(csplitname);
- g_free(sname);
- g_free(hname);
- g_free(icname);
- g_free(bcname);
- g_free(ctoname);
- g_free(cname);
- g_free(rclass);
- return ret;
-}
-
-static int parse_inline_number(const char *p)
-{
- int neg = 1;
- int res = 0;
- if (*p == '-') {
- neg = -1;
- ++p;
- }
- for (; isdigit(*p); ++p)
- res = res * 10 + *p - '0';
- res *= neg;
- return res;
-}
-
-static void set_default_appearance(RrAppearance *a)
-{
- a->surface.grad = RR_SURFACE_SOLID;
- a->surface.relief = RR_RELIEF_FLAT;
- a->surface.bevel = RR_BEVEL_1;
- a->surface.interlaced = FALSE;
- a->surface.border = FALSE;
- a->surface.primary = RrColorNew(a->inst, 0, 0, 0);
- a->surface.secondary = RrColorNew(a->inst, 0, 0, 0);
-}
-
-/* Reads the output from gimp's C-Source file format into valid RGBA data for
- an RrTextureRGBA. */
-static RrPixel32* read_c_image(gint width, gint height, const guint8 *data)
-{
- RrPixel32 *im, *p;
- gint i;
-
- p = im = g_memdup(data, width * height * sizeof(RrPixel32));
-
- for (i = 0; i < width * height; ++i) {
- guchar a = ((*p >> 24) & 0xff);
- guchar b = ((*p >> 16) & 0xff);
- guchar g = ((*p >> 8) & 0xff);
- guchar r = ((*p >> 0) & 0xff);
-
- *p = ((r << RrDefaultRedOffset) +
- (g << RrDefaultGreenOffset) +
- (b << RrDefaultBlueOffset) +
- (a << RrDefaultAlphaOffset));
- p++;
- }
-
- return im;
-}
diff --git a/render/theme.h b/render/theme.h
deleted file mode 100644
index 3f9063e6..00000000
--- a/render/theme.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- theme.h for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003-2007 Dana Jansens
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __theme_h
-#define __theme_h
-
-#include "render.h"
-
-G_BEGIN_DECLS
-
-typedef struct _RrTheme RrTheme;
-
-struct _RrTheme {
- const RrInstance *inst;
-
- /* style settings - fonts */
- RrFont *win_font_focused;
- RrFont *win_font_unfocused;
- RrFont *menu_title_font;
- RrFont *menu_font;
- RrFont *osd_font_hilite;
- RrFont *osd_font_unhilite;
-
- /* style settings - geometry */
- gint paddingx;
- gint paddingy;
- gint handle_height;
- gint fbwidth; /*!< frame border width */
- gint mbwidth; /*!< menu border width */
- gint obwidth; /*!< osd border width */
- gint cbwidthx;
- gint cbwidthy;
- gint menu_overlap_x;
- gint menu_overlap_y;
- gint menu_sep_width;
- gint menu_sep_paddingx;
- gint menu_sep_paddingy;
- /* these ones are calculated, not set directly by the theme file */
- gint win_font_height;
- gint menu_title_font_height;
- gint menu_font_height;
- gint label_height;
- gint title_height;
- gint button_size;
- gint grip_width;
- gint menu_title_label_height;
- gint menu_title_height;
-
- /* style settings - colors */
- RrColor *menu_border_color;
- RrColor *osd_border_color;
- RrColor *frame_focused_border_color;
- RrColor *frame_unfocused_border_color;
- RrColor *title_separator_focused_color;
- RrColor *title_separator_unfocused_color;
- RrColor *cb_focused_color;
- RrColor *cb_unfocused_color;
- RrColor *title_focused_color;
- RrColor *title_unfocused_color;
- RrColor *titlebut_disabled_focused_color;
- RrColor *titlebut_disabled_unfocused_color;
- RrColor *titlebut_hover_focused_color;
- RrColor *titlebut_hover_unfocused_color;
- RrColor *titlebut_toggled_hover_focused_color;
- RrColor *titlebut_toggled_hover_unfocused_color;
- RrColor *titlebut_toggled_focused_pressed_color;
- RrColor *titlebut_toggled_unfocused_pressed_color;
- RrColor *titlebut_toggled_focused_unpressed_color;
- RrColor *titlebut_toggled_unfocused_unpressed_color;
- RrColor *titlebut_focused_pressed_color;
- RrColor *titlebut_unfocused_pressed_color;
- RrColor *titlebut_focused_unpressed_color;
- RrColor *titlebut_unfocused_unpressed_color;
- RrColor *menu_title_color;
- RrColor *menu_sep_color;
- RrColor *menu_color;
- RrColor *menu_selected_color;
- RrColor *menu_disabled_color;
- RrColor *menu_disabled_selected_color;
- RrColor *title_focused_shadow_color;
- gchar title_focused_shadow_alpha;
- RrColor *title_unfocused_shadow_color;
- gchar title_unfocused_shadow_alpha;
- RrColor *osd_text_active_color;
- RrColor *osd_text_inactive_color;
- RrColor *osd_text_active_shadow_color;
- RrColor *osd_text_inactive_shadow_color;
- gchar osd_text_active_shadow_alpha;
- gchar osd_text_inactive_shadow_alpha;
- RrColor *menu_title_shadow_color;
- gchar menu_title_shadow_alpha;
- RrColor *menu_text_normal_shadow_color;
- gchar menu_text_normal_shadow_alpha;
- RrColor *menu_text_selected_shadow_color;
- gchar menu_text_selected_shadow_alpha;
- RrColor *menu_text_disabled_shadow_color;
- gchar menu_text_disabled_shadow_alpha;
- RrColor *menu_text_disabled_selected_shadow_color;
- gchar menu_text_disabled_selected_shadow_alpha;
-
- /* style settings - pics */
- RrPixel32 *def_win_icon; /* RGBA */
- gint def_win_icon_w;
- gint def_win_icon_h;
-
- /* style settings - masks */
- RrPixmapMask *max_mask;
- RrPixmapMask *max_hover_mask;
- RrPixmapMask *max_pressed_mask;
- RrPixmapMask *max_toggled_mask;
- RrPixmapMask *max_toggled_hover_mask;
- RrPixmapMask *max_toggled_pressed_mask;
- RrPixmapMask *max_disabled_mask;
- RrPixmapMask *iconify_mask;
- RrPixmapMask *iconify_hover_mask;
- RrPixmapMask *iconify_pressed_mask;
- RrPixmapMask *iconify_disabled_mask;
- RrPixmapMask *desk_mask;
- RrPixmapMask *desk_hover_mask;
- RrPixmapMask *desk_pressed_mask;
- RrPixmapMask *desk_toggled_mask;
- RrPixmapMask *desk_toggled_hover_mask;
- RrPixmapMask *desk_toggled_pressed_mask;
- RrPixmapMask *desk_disabled_mask;
- RrPixmapMask *shade_mask;
- RrPixmapMask *shade_hover_mask;
- RrPixmapMask *shade_pressed_mask;
- RrPixmapMask *shade_toggled_mask;
- RrPixmapMask *shade_toggled_hover_mask;
- RrPixmapMask *shade_toggled_pressed_mask;
- RrPixmapMask *shade_disabled_mask;
- RrPixmapMask *close_mask;
- RrPixmapMask *close_hover_mask;
- RrPixmapMask *close_disabled_mask;
- RrPixmapMask *close_pressed_mask;
-
- RrPixmapMask *menu_bullet_mask; /* submenu pointer */
-#if 0
- RrPixmapMask *menu_toggle_mask; /* menu boolean */
-#endif
-
- RrPixmapMask *down_arrow_mask;
- RrPixmapMask *up_arrow_mask;
-
- /* global appearances */
- RrAppearance *a_disabled_focused_max;
- RrAppearance *a_disabled_unfocused_max;
- RrAppearance *a_hover_focused_max;
- RrAppearance *a_hover_unfocused_max;
- RrAppearance *a_focused_unpressed_max;
- RrAppearance *a_focused_pressed_max;
- RrAppearance *a_unfocused_unpressed_max;
- RrAppearance *a_unfocused_pressed_max;
- RrAppearance *a_toggled_hover_focused_max;
- RrAppearance *a_toggled_hover_unfocused_max;
- RrAppearance *a_toggled_focused_unpressed_max;
- RrAppearance *a_toggled_focused_pressed_max;
- RrAppearance *a_toggled_unfocused_unpressed_max;
- RrAppearance *a_toggled_unfocused_pressed_max;
- RrAppearance *a_disabled_focused_close;
- RrAppearance *a_disabled_unfocused_close;
- RrAppearance *a_hover_focused_close;
- RrAppearance *a_hover_unfocused_close;
- RrAppearance *a_focused_unpressed_close;
- RrAppearance *a_focused_pressed_close;
- RrAppearance *a_unfocused_unpressed_close;
- RrAppearance *a_unfocused_pressed_close;
- RrAppearance *a_disabled_focused_desk;
- RrAppearance *a_disabled_unfocused_desk;
- RrAppearance *a_hover_focused_desk;
- RrAppearance *a_hover_unfocused_desk;
- RrAppearance *a_focused_unpressed_desk;
- RrAppearance *a_focused_pressed_desk;
- RrAppearance *a_unfocused_unpressed_desk;
- RrAppearance *a_unfocused_pressed_desk;
- RrAppearance *a_toggled_hover_focused_desk;
- RrAppearance *a_toggled_hover_unfocused_desk;
- RrAppearance *a_toggled_focused_unpressed_desk;
- RrAppearance *a_toggled_focused_pressed_desk;
- RrAppearance *a_toggled_unfocused_unpressed_desk;
- RrAppearance *a_toggled_unfocused_pressed_desk;
- RrAppearance *a_disabled_focused_shade;
- RrAppearance *a_disabled_unfocused_shade;
- RrAppearance *a_hover_focused_shade;
- RrAppearance *a_hover_unfocused_shade;
- RrAppearance *a_focused_unpressed_shade;
- RrAppearance *a_focused_pressed_shade;
- RrAppearance *a_unfocused_unpressed_shade;
- RrAppearance *a_unfocused_pressed_shade;
- RrAppearance *a_toggled_hover_focused_shade;
- RrAppearance *a_toggled_hover_unfocused_shade;
- RrAppearance *a_toggled_focused_unpressed_shade;
- RrAppearance *a_toggled_focused_pressed_shade;
- RrAppearance *a_toggled_unfocused_unpressed_shade;
- RrAppearance *a_toggled_unfocused_pressed_shade;
- RrAppearance *a_disabled_focused_iconify;
- RrAppearance *a_disabled_unfocused_iconify;
- RrAppearance *a_hover_focused_iconify;
- RrAppearance *a_hover_unfocused_iconify;
- RrAppearance *a_focused_unpressed_iconify;
- RrAppearance *a_focused_pressed_iconify;
- RrAppearance *a_unfocused_unpressed_iconify;
- RrAppearance *a_unfocused_pressed_iconify;
- RrAppearance *a_focused_grip;
- RrAppearance *a_unfocused_grip;
- RrAppearance *a_focused_title;
- RrAppearance *a_unfocused_title;
- RrAppearance *a_focused_label;
- RrAppearance *a_unfocused_label;
- /* always parentrelative, so no focused/unfocused */
- RrAppearance *a_icon;
- RrAppearance *a_focused_handle;
- RrAppearance *a_unfocused_handle;
- RrAppearance *a_menu_text_title;
- RrAppearance *a_menu_title;
- RrAppearance *a_menu;
- RrAppearance *a_menu_normal;
- RrAppearance *a_menu_selected;
- RrAppearance *a_menu_disabled;
- RrAppearance *a_menu_disabled_selected;
- RrAppearance *a_menu_text_normal;
- RrAppearance *a_menu_text_disabled;
- RrAppearance *a_menu_text_disabled_selected;
- RrAppearance *a_menu_text_selected;
- RrAppearance *a_menu_bullet_normal;
- RrAppearance *a_menu_bullet_selected;
- RrAppearance *a_clear; /* clear with no texture */
- RrAppearance *a_clear_tex; /* clear with a texture */
-
- RrAppearance *osd_bg; /* can never be parent relative */
- RrAppearance *osd_hilite_bg; /* can never be parent relative */
- RrAppearance *osd_hilite_label; /* can be parent relative */
- RrAppearance *osd_unhilite_bg; /* can never be parent relative */
- RrAppearance *osd_unhilite_label; /* can be parent relative */
-
- gchar *name;
-};
-
-/*! The font values are all optional. If a NULL is used for any of them, then
- the default font will be used. */
-RrTheme* RrThemeNew(const RrInstance *inst, const gchar *theme,
- gboolean allow_fallback,
- RrFont *active_window_font, RrFont *inactive_window_font,
- RrFont *menu_title_font, RrFont *menu_item_font,
- RrFont *active_osd_font, RrFont *inactive_osd_font);
-void RrThemeFree(RrTheme *theme);
-
-G_END_DECLS
-
-#endif
diff --git a/render/version.h.in b/render/version.h.in
deleted file mode 100644
index 0ff30b57..00000000
--- a/render/version.h.in
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef rr__version_h
-#define rr__version_h
-
-#define RR_MAJOR_VERSION @RR_MAJOR_VERSION@
-#define RR_MINOR_VERSION @RR_MINOR_VERSION@
-#define RR_MICRO_VERSION @RR_MICRO_VERSION@
-#define RR_VERSION RR_MAJOR_VERSION.RR_MINOR_VERSION.RR_MICRO_VERSION
-
-#define RR_CHECK_VERSION(major,minor,micro) \
- (RR_MAJOR_VERSION > (major) || \
- (RR_MAJOR_VERSION == (major) && RR_MINOR_VERSION > (minor)) || \
- (RR_MAJOR_VERSION == (major) && RR_MINOR_VERSION == (minor) && \
- RR_MICRO_VERSION >= (micro)))
-
-#endif