Fix some typos in comments.
[mikachu/openbox.git] / render / render.h
index 713e2f1..f7bc504 100644 (file)
@@ -2,7 +2,7 @@
 
    render.h for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
    Copyright (c) 2003        Derek Foreman
 
    This program is free software; you can redistribute it and/or modify
@@ -37,14 +37,19 @@ 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,
@@ -75,7 +80,8 @@ typedef enum {
     RR_TEXTURE_MASK,
     RR_TEXTURE_TEXT,
     RR_TEXTURE_LINE_ART,
-    RR_TEXTURE_RGBA
+    RR_TEXTURE_RGBA,
+    RR_TEXTURE_IMAGE
 } RrTextureType;
 
 typedef enum {
@@ -84,6 +90,14 @@ 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,
@@ -105,7 +119,7 @@ struct _RrSurface {
     RrColor *primary;
     RrColor *secondary;
     RrColor *border_color;
-    RrColor *bevel_dark; 
+    RrColor *bevel_dark;
     RrColor *bevel_light;
     RrColor *interlace_color;
     gboolean interlaced;
@@ -114,13 +128,26 @@ struct _RrSurface {
     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 {
@@ -139,11 +166,25 @@ struct _RrTextureMask {
 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 {
@@ -156,12 +197,15 @@ 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;
 };
@@ -179,6 +223,35 @@ struct _RrAppearance {
     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
@@ -190,9 +263,6 @@ struct _RrAppearance {
 #define RrDefaultFontSize         8
 #define RrDefaultFontWeight       RR_FONTWEIGHT_NORMAL
 #define RrDefaultFontSlant        RR_FONTSLANT_NORMAL
-#define RrDefaultFontShadow       FALSE
-#define RrDefaultFontShadowOffset 1
-#define RrDefaultFontShadowTint   50
 
 RrInstance* RrInstanceNew (Display *display, gint screen);
 void        RrInstanceFree (RrInstance *inst);
@@ -226,25 +296,55 @@ 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, gchar *name, gint size,
-                             RrFontWeight weight, RrFontSlant slant,
-                             gboolean shadow, gint shadowoffset,
-                             gchar shadowtint);
+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    RrFontHeight        (const 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);
 
-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);
+/* 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*/