Patch #6770 by James C (sheep)
authorMatt Ebb <matt@mke3.net>
Mon, 20 Aug 2007 01:02:12 +0000 (01:02 +0000)
committerMatt Ebb <matt@mke3.net>
Mon, 20 Aug 2007 01:02:12 +0000 (01:02 +0000)
Tooltip getStringSize and getBoundingBox correction

Not really any user-visible changes here, but a nice clean-up of
internal font drawing functions, in this case used in tooltips.

Thanks!

intern/bmfont/BMF_Api.h
intern/bmfont/intern/BMF_Api.cpp
intern/bmfont/intern/BMF_BitmapFont.cpp
intern/bmfont/intern/BMF_BitmapFont.h
source/blender/ftfont/FTF_Api.h
source/blender/ftfont/intern/FTF_TTFont.h
source/blender/include/BIF_language.h
source/blender/src/interface.c
source/blender/src/language.c

index 001a9788920d44a58c5765b641e2ba7026480140..5900ea85ec79d9c6c4c46bcdb7b70b1cb017caee 100644 (file)
@@ -88,6 +88,18 @@ int BMF_GetCharacterWidth(BMF_Font* font, char c);
  */
 int BMF_GetStringWidth(BMF_Font* font, char* str);
 
+/**
+ * Returns the bounding box of a string of characters.
+ * @param font The font to use.
+ * @param str  The string.
+ * @param llx   Lower left x coord
+ * @param lly   Lower left y coord
+ * @param urx   Upper right x coord
+ * @param ury   Upper right y coord
+ */
+void BMF_GetStringBoundingBox(BMF_Font* font, char* str, float*llx, float *lly, float *urx, float *ury);
+
+
 /**
  * Returns the bounding box of the font. The width and
  * height represent the bounding box of the union of
@@ -95,7 +107,7 @@ int BMF_GetStringWidth(BMF_Font* font, char* str);
  * box represent the extent of the font and its positioning
  * about the origin.
  */
-void BMF_GetBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r);
+void BMF_GetFontBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r);
 
 /**
  * Convert the given @a font to a texture, and return the GL texture
index 46776b08ba0b33562964e3bc91773e20dc71a1fc..176ef452fdc2465d0dbfa30e828e519e6d5f13d9 100644 (file)
@@ -150,11 +150,18 @@ int BMF_GetStringWidth(BMF_Font* font, char* str)
        return ((BMF_BitmapFont*)font)->GetStringWidth(str);
 }
 
+void BMF_GetStringBoundingBox(BMF_Font* font, char* str, float*llx, float *lly, float *urx, float *ury){
+       if (!font){
+               *llx = *lly = *urx = *ury = 0;
+       }else{
+               ((BMF_BitmapFont*)font)->GetStringBoundingBox(str, llx, lly, urx, ury);
+       }
+}
 
-void BMF_GetBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r)
+void BMF_GetFontBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r)
 {
        if (!font) return;
-       ((BMF_BitmapFont*)font)->GetBoundingBox(*xmin_r, *ymin_r, *xmax_r, *ymax_r);
+       ((BMF_BitmapFont*)font)->GetFontBoundingBox(*xmin_r, *ymin_r, *xmax_r, *ymax_r);
 }
 
 int BMF_GetFontTexture(BMF_Font* font) {
index bbba2c978dd71597ab4d6568bb089b87e17af3c5..8be4ff19a4f1fa7bb7d4a99d90298aa49abb2a46 100644 (file)
@@ -107,7 +107,7 @@ int BMF_BitmapFont::GetStringWidth(char* str)
        return length;
 }
 
-void BMF_BitmapFont::GetBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax)
+void BMF_BitmapFont::GetFontBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax)
 {
        xMin = m_fontData->xmin;
        yMin = m_fontData->ymin;
@@ -115,6 +115,27 @@ void BMF_BitmapFont::GetBoundingBox(int & xMin, int & yMin, int & xMax, int & yM
        yMax = m_fontData->ymax;
 }
 
+void BMF_BitmapFont::GetStringBoundingBox(char* str, float*llx, float *lly, float *urx, float *ury)
+{
+       unsigned char c;
+       int length = 0;
+       int ascent = 0;
+       int descent = 0;
+
+       while ( (c = (unsigned char) *str++) ) {
+               length += m_fontData->chars[c].advance;
+               int d = m_fontData->chars[c].yorig;
+               int a = m_fontData->chars[c].height - m_fontData->chars[c].yorig;
+               if(a > ascent) ascent = a;
+               if(d > descent) descent = d;
+       }
+       *llx = (float)0;
+       *lly = (float)-descent;
+       *urx = (float)length;
+       *ury = (float)ascent;
+}
+
+
 int BMF_BitmapFont::GetTexture()
 {
        int fWidth = m_fontData->xmax - m_fontData->xmin;
index 30cfd650353a6044a3697e10b592b24ab75876ec..e8e0abc0561d09b79b03810f2909ca43cdcaee42 100644 (file)
@@ -76,7 +76,19 @@ public:
         * box represent the extent of the font and its positioning
         * about the origin.
         */
-       void GetBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax);
+       void GetFontBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax);
+       
+       /**
+        * Returns the bounding box of a string of characters.
+        * @param font  The font to use.
+        * @param str   The string.
+        * @param llx   Lower left x coord
+        * @param lly   Lower left y coord
+        * @param urx   Upper right x coord
+        * @param ury   Upper right y coord
+        */
+       void GetStringBoundingBox(char* str, float*llx, float *lly, float *urx, float *ury);
+
 
        /**
         * Convert the font to a texture, and return the GL texture
index b370c18f89e969380b535dcdec5443278b542289..0793c4b6dfb45e22acc194155e5ff4f9de003b87 100644 (file)
@@ -106,12 +106,12 @@ FTF_EXPORT float FTF_GetStringWidth(char* str, unsigned int flag);
 
 /**
  * Get Bounding Box
- * @param llx
- * @param lly
- * @param llz
- * @param urx
- * @param ury
- * @param urz
+ * @param llx   Lower left near x coord
+ * @param lly   Lower left near y coord
+ * @param llz   Lower left near z coord
+ * @param urx   Upper right far x coord
+ * @param ury   Upper right far y coord
+ * @param urz   Upper right far z coord
  * @param mode flag to forward to FTF_TransConvString()
  * not test yet.
  */
index c4dee93c5dc3fb01e46db222779a16189af2b7bd..b5ff1cc54bf5c4f85739cf4113091f400e7d0e2a 100644 (file)
@@ -78,6 +78,17 @@ public:
 
        float GetStringWidth(char* str, unsigned int flag);
 
+       /**
+        * Get the bounding box for a string.
+        *
+        * @param str   The string
+        * @param llx   Lower left near x coord
+        * @param lly   Lower left near y coord
+        * @param llz   Lower left near z coord
+        * @param urx   Upper right far x coord
+        * @param ury   Upper right far y coord
+        * @param urz   Upper right far z coord
+        */
        void GetBoundingBox(char* str, float *llx, float *lly, float *llz, float *urx, float *ury, float *urz, unsigned int flag);
 
        /**
index 9a6ddfc7fc5bf2b2fb33f6572345f70087ff0f2f..6ed8a8d1574b437491112a0ab79f8b7748f6f6a1 100644 (file)
@@ -33,6 +33,8 @@
 #ifndef BIF_LANGUAGE_H
 #define BIF_LANGUAGE_H
 
+#include "DNA_vec_types.h"
+
 struct BMF_Font;
 
 int  read_languagefile(void);          /* usiblender.c */
@@ -47,6 +49,7 @@ char *fontsize_pup(void);
 
 int BIF_DrawString(struct BMF_Font* font, char *str, int translate);
 float BIF_GetStringWidth(struct BMF_Font* font, char *str, int translate);
+void BIF_GetBoundingBox(struct BMF_Font* font, char* str, int translate, rctf* bbox);
 
 void BIF_RasterPos(float x, float y);
 void BIF_SetScale(float aspect);
index 56e2c6326b700f5a43b186e4866661dd7316e20c..0eb018522bfd36ad4e486b3b3beee07e7777e796 100644 (file)
@@ -4805,30 +4805,15 @@ static uiOverDraw *ui_draw_but_tip(uiBut *but)
 {
        uiOverDraw *od;
        float x1, x2, y1, y2;
+       rctf tip_bbox;
 
-#ifdef INTERNATIONAL
-       if(G.ui_international == TRUE) {
-               float llx,lly,llz,urx,ury,urz;  //for FTF_GetBoundingBox()
-
-               if(U.transopts & USER_TR_TOOLTIPS) {
-                       FTF_GetBoundingBox(but->tip, &llx,&lly,&llz,&urx,&ury,&urz, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
-
-                       x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*FTF_GetStringWidth(but->tip, FTF_USE_GETTEXT | FTF_INPUT_UTF8);  //BMF_GetStringWidth(but->font, but->tip);
-                       y1= but->y1-(ury+FTF_GetSize())-12; y2= but->y1-12;
-               } else {
-                       FTF_GetBoundingBox(but->tip, &llx,&lly,&llz,&urx,&ury,&urz, FTF_NO_TRANSCONV | FTF_INPUT_UTF8);
+       BIF_GetBoundingBox(but->font, but->tip, (U.transopts & USER_TR_TOOLTIPS), &tip_bbox);
+       
+       x1= (but->x1+but->x2)/2;
+       x2= x1+but->aspect*((tip_bbox.xmax-tip_bbox.xmin) + 8);
+       y2= but->y1-10;
+       y1= y2-but->aspect*((tip_bbox.ymax+(tip_bbox.ymax-tip_bbox.ymin)));
 
-                       x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*FTF_GetStringWidth(but->tip, FTF_NO_TRANSCONV | FTF_INPUT_UTF8);  //BMF_GetStringWidth(but->font, but->tip);
-                       y1= but->y1-(ury+FTF_GetSize())-12; y2= but->y1-12;
-               }
-       } else {
-               x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*BMF_GetStringWidth(but->font, but->tip);
-               y1= but->y1-30; y2= but->y1-12;
-       }
-#else
-       x1= (but->x1+but->x2)/2; x2= 10+x1+ but->aspect*BMF_GetStringWidth(but->font, but->tip);
-       y1= but->y1-30; y2= but->y1-12;
-#endif
 
        /* for pulldown menus it doesnt work */
        if(mywinget()==G.curscreen->mainwin);
@@ -4846,13 +4831,6 @@ static uiOverDraw *ui_draw_but_tip(uiBut *but)
                y2 += 36;
        }
 
-       // adjust tooltip heights
-       if(mywinget()==G.curscreen->mainwin)
-               y2 -= G.ui_international ? 4:1;         //tip is from pulldownmenu
-       else if(curarea->win != mywinget())
-               y2 -= G.ui_international ? 5:1;         //tip is from a windowheader
-//     else y2 += 1;                                                   //tip is from button area
-
        od= ui_begin_overdraw((int)(x1-1), (int)(y1-2), (int)(x2+4), (int)(y2+4));
 
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -4874,7 +4852,10 @@ static uiOverDraw *ui_draw_but_tip(uiBut *but)
        glRectf(x1, y1, x2, y2);
        
        glColor3ub(0,0,0);
-       ui_rasterpos_safe( x1+3, y1+5.0/but->aspect, but->aspect);
+       /* set the position for drawing text +4 in from the left edge, and leaving an equal gap between the top of the background box
+        * and the top of the string's tip_bbox, and the bottom of the background box, and the bottom of the string's tip_bbox
+        */
+       ui_rasterpos_safe(x1+4, ((y2-tip_bbox.ymax)+(y1+tip_bbox.ymin))/2 - tip_bbox.ymin, but->aspect);
        BIF_SetScale(1.0);
 
        BIF_DrawString(but->font, but->tip, (U.transopts & USER_TR_TOOLTIPS));
index bdf0dfa3baff754d028240bf6844bbe1ab78b15c..7864468287e0d5d16ab50c0e53f69cb603f156a2 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "DNA_listBase.h"
 #include "DNA_userdef_types.h"
+#include "DNA_vec_types.h"
 
 #include "BKE_global.h"                /* G */
 #include "BKE_utildefines.h"
@@ -169,6 +170,21 @@ float BIF_GetStringWidth(BMF_Font* font, char *str, int translate)
        return rt;
 }
 
+void BIF_GetBoundingBox(struct BMF_Font* font, char* str, int translate, rctf *bbox){
+       float dummy;
+#ifdef INTERNATIONAL
+       if(G.ui_international == TRUE)
+               if(translate && (U.transopts & USER_TR_BUTTONS))
+                       FTF_GetBoundingBox(str, &bbox->xmin, &bbox->ymin, &dummy, &bbox->xmax, &bbox->ymax, &dummy, FTF_USE_GETTEXT | FTF_INPUT_UTF8);
+               else
+                       FTF_GetBoundingBox(str, &bbox->xmin, &bbox->ymin, &dummy, &bbox->xmax, &bbox->ymax, &dummy, FTF_NO_TRANSCONV | FTF_INPUT_UTF8);
+       else
+               BMF_GetStringBoundingBox(font, str, &bbox->xmin, &bbox->ymin, &bbox->xmax, &bbox->ymax);
+#else
+       BMF_GetStringBoundingBox(font, str, &bbox->xmin, &bbox->ymin, &bbox->xmax, &bbox->ymax);
+#endif
+}
+
 
 #ifdef INTERNATIONAL