fix min-size calculations for lineart textures
[mikachu/openbox.git] / render / render.c
index 97ec7b5..2813dda 100644 (file)
@@ -86,8 +86,8 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h)
     {
         gint l, t, r, b;
         RrMargins(a, &l, &t, &r, &b);
-        RECT_SET(tarea, l, t, w - l - r, h - t - b); 
-    }       
+        RECT_SET(tarea, l, t, w - l - r, h - t - b);
+    }
 
     for (i = 0; i < a->textures; i++) {
         switch (a->texture[i].type) {
@@ -101,7 +101,7 @@ Pixmap RrPaintPixmap(RrAppearance *a, gint w, gint h)
                     pixel_data_to_pixmap(a, 0, 0, w, h);
             }
             if (a->xftdraw == NULL) {
-                a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap, 
+                a->xftdraw = XftDrawCreate(RrDisplay(a->inst), a->pixmap,
                                            RrVisual(a->inst),
                                            RrColormap(a->inst));
             }
@@ -178,6 +178,12 @@ RrAppearance *RrAppearanceNew(const RrInstance *inst, gint 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);
@@ -202,7 +208,7 @@ RrAppearance *RrAppearanceCopy(RrAppearance *orig)
     if (spo->primary != NULL)
         spc->primary = RrColorNew(copy->inst,
                                   spo->primary->r,
-                                  spo->primary->g, 
+                                  spo->primary->g,
                                   spo->primary->b);
     else spc->primary = NULL;
 
@@ -367,6 +373,8 @@ gint RrMinWidth(RrAppearance *a)
     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:
@@ -376,9 +384,11 @@ gint RrMinWidth(RrAppearance *a)
             break;
         case RR_TEXTURE_TEXT:
             m = RrFontMeasureString(a->texture[i].data.text.font,
-                                    a->texture[i].data.text.string, 
+                                    a->texture[i].data.text.string,
                                     a->texture[i].data.text.shadow_offset_x,
-                                    a->texture[i].data.text.shadow_offset_y);
+                                    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;
@@ -386,14 +396,12 @@ gint RrMinWidth(RrAppearance *a)
             w += MAX(w, a->texture[i].data.rgba.width);
             break;
         case RR_TEXTURE_LINE_ART:
-            w += MAX(w, MAX(a->texture[i].data.lineart.x1,
-                            a->texture[i].data.lineart.x2));
+            w = MAX(w, MAX(a->texture[i].data.lineart.x1 - l - r,
+                           a->texture[i].data.lineart.x2 - l - r));
             break;
         }
     }
 
-    RrMargins(a, &l, &t, &r, &b);
-
     w += l + r;
 
     if (w < 1) w = 1;
@@ -404,8 +412,11 @@ 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:
@@ -414,21 +425,35 @@ gint RrMinHeight(RrAppearance *a)
             h = MAX(h, a->texture[i].data.mask.mask->height);
             break;
         case RR_TEXTURE_TEXT:
-            h += MAX(h, RrFontHeight(a->texture[i].data.text.font,
-                                     a->texture[i].data.text.shadow_offset_y));
+            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_LINE_ART:
-            h += MAX(h, MAX(a->texture[i].data.lineart.y1,
-                            a->texture[i].data.lineart.y2));
+            h = MAX(h, MAX(a->texture[i].data.lineart.y1 - t - b,
+                           a->texture[i].data.lineart.y2 - t - b));
             break;
         }
     }
 
-    RrMargins(a, &l, &t, &r, &b);
-
     h += t + b;
 
     if (h < 1) h = 1;