/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
render.h for the Openbox window manager
- Copyright (c) 2003 Ben Jansens
+ 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
#ifndef __render_h
#define __render_h
+#include "geom.h"
+#include "version.h"
+
#include <X11/Xlib.h> /* some platforms dont include this as needed for Xft */
-#define _XFT_NO_COMPAT_ /* no Xft 1 API */
-#include <X11/Xft/Xft.h>
+#include <pango/pangoxft.h>
#include <glib.h>
+G_BEGIN_DECLS
+
typedef union _RrTextureData RrTextureData;
typedef struct _RrAppearance RrAppearance;
typedef struct _RrSurface RrSurface;
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_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_PYRAMID,
+ RR_SURFACE_MIRROR_HORIZONTAL
} RrSurfaceColorType;
typedef enum {
RR_TEXTURE_MASK,
RR_TEXTURE_TEXT,
RR_TEXTURE_LINE_ART,
- RR_TEXTURE_RGBA
+ RR_TEXTURE_RGBA,
+ RR_TEXTURE_IMAGE
} RrTextureType;
typedef enum {
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;
RrColor *primary;
RrColor *secondary;
RrColor *border_color;
- RrColor *bevel_dark;
+ RrColor *bevel_dark;
RrColor *bevel_light;
RrColor *interlace_color;
gboolean interlaced;
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;
- gchar *string;
+ 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 {
struct _RrTextureRGBA {
gint width;
gint height;
+ gint alpha;
RrPixel32 *data;
-/* cached scaled so we don't have to scale often */
- gint cwidth;
- gint cheight;
- RrPixel32 *cache;
+ /* 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 {
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;
};
gint w, h;
};
+/*! Holds a RGBA image picture */
+struct _RrImagePic {
+ gint width, height;
+ RrPixel32 *data;
+};
+
+/*! 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;
+ struct _RrImageCache *cache;
+
+ struct _RrImagePic **original;
+ gint n_original;
+ struct _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 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);
RrAppearance *RrAppearanceNew (const RrInstance *inst, gint numtex);
RrAppearance *RrAppearanceCopy (RrAppearance *a);
void RrAppearanceFree (RrAppearance *a);
-
-int RrFontMeasureString (const RrFont *f, const gchar *str);
-int RrFontHeight (const RrFont *f);
-int RrFontMaxCharWidth (const RrFont *f);
-
-void RrPaint (RrAppearance *a, Window win, gint w, gint h);
-void RrMinsize (RrAppearance *a, gint *w, gint *h);
-void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
+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);
+RrImageCache* RrImageCacheNew();
+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*/