[isabelle-dev] [PATCH 0 of 3] Reduce Isabelle/jEdit output window overflow.

Makarius makarius at sketis.net
Mon Mar 25 14:40:40 CET 2013

On Mon, 25 Mar 2013, David Greenaway wrote:

> On 22/03/13 22:48, Makarius wrote:
>> On Fri, 22 Mar 2013, David Greenaway wrote:
>>>  PATCH 3: When measuring strings, use "Font.getStringBounds" instead
>>>           of "FontMetrics.stringWidth". The latter doesn't take into
>>>           account anti-aliasing or kerning, while the former is what
>>>           is actually used when rendering the strings to the screen.
>> That seems to be the most important point here.  It requires some further
>> investigation how jEdit measures things in general, so see if it agrees
>> with the actual painting.  There might be some deeper problem of
>> Graphics2D painting vs. font metrics here, that needs to be investigated.
>> If you can tell more, pointing to sources by the jEdit guys or Oracle, I
>> will listen attentively.
> The problem that this patch fixes is internal to the Isabelle sources, 
> and not directly related to how jEdit measures strings. As mentioned 
> above, Pretty uses "FontMetrics.stringWidth" to determine if text will 
> overflow, while "Rich_Text_Area" actually uses "Font.getStringBounds" to 
> layout text. Because the two values disagree for the same strings, we 
> get inadvertant overflow to the right.

I've come across that part of jEdit and Isabelle/Scala sources again 
(presenty at Isabelle/193ba70666bd).  My impression is that 
FontMetrics.stringWidth and FontMetrics.getStringBounds merely differ in 
the result type: Int vs. Double.  I also hope that 
FontMetrics.getStringBounds and Font.getStringBounds are the same, if 
provided by suitable parameters, but there is no problem to use the latter 

It seems that Java 2D text is normally snapped on a pixel grid, unless you 
explicitly ask for "fractional font metrics" as rendering hint.  This is 
off by default, and normally degrades rendering quality.  (Did you have 
that enabled?  Did it actually improve visual appearance?  On which 
physical display?)

What is also funny is that the idea of "avarage char width" that I've got 
wrong in the first attempt is also a bit confused in the jEdit sources 
(hidden behind misleading Javadocs and slightly outdated code), although 
jEdit gets its visual tab width and preferred window geometry right in the 
end, just due to the way how slightly confusing operations happen to be 

To improve general uniformity and potential of surprise, I've clarified 
the Pretty.Metric and JEdit_Lib.Pretty_Metric notions once again, to make 
more explicit what this is all about.  It does not change the situation of 
occasionaly scrollbars and 0.3 of a character off the vieport, though. 
There must be other effects, about jEdit calculating scrollbar parameters.

Generally note, that the font metric business can never be 100% right -- 
not just because of floating point arithmetic.  When text is actually 
rendered, its font-style might change again in the tokenization.  I don't 
think this tiny snag deserves more of this undue priority right now. 
(There are no bugs, no fixes, just continous improvements of 
approximations, until perfection is reached in the limit.)


More information about the isabelle-dev mailing list