fogleman / gg

Go Graphics - 2D rendering in Go with a simple API.
https://godoc.org/github.com/fogleman/gg
MIT License
4.34k stars 352 forks source link

Drawing text within bounds #149

Open Technerder opened 2 years ago

Technerder commented 2 years ago

Does gg provide a way to draw text within a specific area (x1, y1, x2, y2)? If not, what's the best way of accomplishing something like this?

sad-pixel commented 2 years ago

gg currently does not provide this feature, I faced this issue at work once, this article was very useful to me, it may be relevant here as well.

The relevant code section (in C#, you will have to make it in Go)

public Font GetAdjustedFont(Graphics g, string graphicString, Font originalFont, int containerWidth, int maxFontSize, int minFontSize, bool smallestOnFail)
{
   Font testFont = null;
   // We utilize MeasureString which we get via a control instance           
   for (int adjustedSize = maxFontSize; adjustedSize >= minFontSize; adjustedSize--)
   {
      testFont = new Font(originalFont.Name, adjustedSize, originalFont.Style);

      // Test the string with the new size
      SizeF adjustedSizeNew = g.MeasureString(graphicString, testFont);

      if (containerWidth > Convert.ToInt32(adjustedSizeNew.Width))
      {
         // Good font, return it
         return testFont;
      }
   }

   // If you get here there was no fontsize that worked
   // return minimumSize or original?
   if (smallestOnFail)
   {
      return testFont;
   }
   else
   {
      return originalFont;
   }
}