Closed Bug 126919 (xft) Opened 23 years ago Closed 22 years ago

Xft support on X Mozilla

Categories

(Core :: Internationalization, defect)

x86
Linux
defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: keithp, Assigned: blizzard)

References

()

Details

(Keywords: intl, Whiteboard: [driver:blizzard])

Attachments

(4 files, 33 obsolete files)

30.69 KB, text/plain
Details
79.75 KB, image/png
Details
4.26 KB, text/plain
Details
191.70 KB, patch
rbs
: review+
shaver
: approval+
Details | Diff | Splinter Review
This bug is a forum to discuss how to integrate Xft support into X-based Mozilla
builds, both changes needed within the Mozilla code base and changes needed in
Xft and the underlying Fontconfig libraries.

I'm using Mozilla as a target for Xft development and will be keeping a
patch current.  That work can be seen at http://keithp.com/mozilla

The current design uses the font matching inside the Fontconfig library, which
is nearly CSS2 compliant (except for weight fill-in, and a few other minor
nits).  My plan is to build CSS2/3 compliant matching by fixing the Fontconfig
matching and adding a small amount of helper code within Mozilla.
Keywords: intl
QA Contact: ruixu → ylong
Stealing!
Assignee: keithp → blizzard
Status: UNCONFIRMED → NEW
Ever confirmed: true
Attached patch config patch (obsolete) — Splinter Review
This is a patch that makes the required changes to configure.in and all of the
toplevel changes that need to happen to get Xft building in the tree.
a=brendan@mozilla.org for 0.9.9.

/be
Blocks: 122050
Keywords: mozilla0.9.9+
The config changes have been checked in.  Now for real code...
Attached patch code changes (obsolete) — Splinter Review
Code changes.
Whiteboard: [driver:blizzard]
Sorry to spam this bug, but does the merged code need CVS Xfree86 to work, just
like the patches did on keithp.com?
No, it doesn't.  It uses private copies of Xrender and Xft which are already in
our tree.  It should also work with any X server.
+void
+nsFontGTK::GetFontProperties(float &aScale,
+                             nscoord &aAscent,
+                             nscoord &aDescent,
+                             nscoord &aLineSpacing,
+                             nscoord &aWidthMaxBounds,
+                             float &aSpaceWidth,
+                             float &aXHeight,
+                             float &aUnderlinePosition,
+                             nscoord &aUnderlineThickness,
+                             nscoord &aSuperscriptOffset,
+                             nscoord &aSubscriptOffset)

In the long run the items we get will evolve and rather
than have one mondo function that grows and grows I'd 
recommend small distinct functions that rarely need
to be changed.


+xftFindMozLangGroup (nsACString &mozLangGroup)
+{
+  for (unsigned int i = 0; i < NUM_XFT_LANG_GROUPS; i++)
+  {
+    if (mozLangGroup.Equals (xftLangGroups[i].aMozLangGroup,
+                            nsCaseInsensitiveCStringComparator()))
+    {
+      return &xftLangGroups[i];
+    }
+  }
+  return 0;
+}

Could you make this a hash for better performance?

+PRBool
+UseXft (void)
+{
+  static PRBool          been_here_done_that = PR_FALSE;
+  static PRBool          use_xft;
+  if (!been_here_done_that)
+  {
+    been_here_done_that = PR_TRUE;
+    use_xft = getenv ("MOZILLA_XFT") != 0;
+  }
+  return use_xft;
+}

Can we make this a pref?

Does this patch integrate with the existing X core font
support?
FYI, that wasn't meant to be a final patch. :)  I'll respond to your comments
tomorrow.
The freetype library in other-licenses/freetype does not work for objdir
builds.  I modified the build to use the system version of libfreetype if the
system version >= 2.0.8, which is the version checked into the tree (verified
with diff).  Since there is an actual released version of the required library,
can we punt the in-tree version?

Also, discovered a small bug.  When we add additional arguments for
sub-configures at the end of configure.in, we were never resetting
ac_configure_args for the next configure call. This patch fixes that as well.
Comment on attachment 71641 [details] [diff] [review]
Check for system version of freetype

r=bryner
Attachment #71641 - Flags: review+
Comment on attachment 71641 [details] [diff] [review]
Check for system version of freetype

a=shaver for 0.9.9
Attachment #71641 - Flags: approval+
Index: gfx/src/gtk/Makefile.in
===================================================================
RCS file: /cvsroot/mozilla/gfx/src/gtk/Makefile.in,v
retrieving revision 1.75
diff -u -r1.75 Makefile.in
--- gfx/src/gtk/Makefile.in	2002/02/19 08:53:50	1.75
+++ gfx/src/gtk/Makefile.in	2002/02/27 10:00:37
@@ -46,6 +46,7 @@
 
	  content \
 
	  layout \
 
	  necko \
+
	  Xft \
 
	  $(NULL)


That seems like it shouldn't be in the patch.  Plus, if you need the freetype on
the system, it doesn't set the requirement.
Depends on: 128153
The Xft in REQUIRES comes from the previous code changes patch, attachment 71528 [details] [diff] [review].

> Plus, if you need the freetype on the system, it doesn't set the requirement.

I thought that you said that the freetype headers were installed in
dist/include/freetype2 ?  My build works fine w/o Xft in REQUIRES so I guess it
can be removed.
What's the status here? Has the 0.9.9 critical work been checked in? Can we move
on this today so we can start looking for a release build tomorrow? 
This shouldn't be on the 0.9.9 radar.
No longer blocks: 122050
Attached patch patch (obsolete) — Splinter Review
Nothing new here, just checkpointing.
Reminder: make sure the list in prefs is sorted.
I've been using the experimental build (2002-02-28-14) for about a week now, and
it's been nothing short of excellent.  I know that there are a few
anti-antialiasing fanatics out there, though.

I definately think that this code should be enabled in 1.0, with the simple
addition of a run-time preference for the anti-aa crowd.  Performance, in terms
of speed, rendering accuracy, and the total lack of crashes, etc., of the build
has been great.

What do we need to do to get this into 1.0.0?

-SteveK
I'm not sure if this is a bug, or just not implemented yet, but I've found that
when using this build, the font preferences panel is pretty broken:

1) The list of available fonts seems to be only a subset of the fonts I actually
have available (and configured in my .fonts.conf file.  I also made sure that
other font sources were using similar paths, i.e. my xfs config, and
/etc/fonts.conf).

2) Changing the font preferences seems to have no effect; I currently have moz
set to use serif for proportional, and serif is set to a copperplate font, and
I'm still seeing the same, "times roman-type" serif font everywhere..

3) There's still some performance issues in there, but they're all manageable;
it takes a while to create a new .fonts.cache file (startup), and opening the
fonts preference dialog takes a few seconds (maybe 5?), during which mozilla
seems to block.  Again, these are noticable but not a big deal; as long as page
rendering is quick, which it is, these are almost trivial problems.

I'm assuming this patch is separate from the freetype support that was in 0.9.9
(although apparently not enabled in some of the mozilla.org builds of 0.9.9).

A definite benefit of this patch over the existing freetype stuff, besides
better integration with system font handling & etc, is the 'cleartype'-like
antialiasing for LCDs which is in the Xft package but *not* in the current
mozilla antialiasing functionality.  Using Xft would (hopefully) mean that
Mozilla inherits cleartype as well, which is a big help for us laptop users!

Am I understanding the situation correctly, or should I be filing 'no cleartype
currently on machine w/ LCDs' as a bug somewhere else?
> 1) The list of available fonts seems to be only a subset of the fonts I
> actually have available (and configured in my .fonts.conf file.  I also made
> sure that other font sources were using similar paths, i.e. my xfs config, and
> /etc/fonts.conf).

The patch lists only fonts appropriate for each language; it extracts this
information from the OS/2 table in the font.  Fonts without an OS/2 table aren't
(currently) listed.  There is an alternate selection mechanism based on
the presense of 'key' characters for each language, but that won't separate the
various Han factions.  Suggestions on how to make it work for fonts that
don't advertise any OS/2 tables are welcome.

> 2) Changing the font preferences seems to have no effect; I currently have moz
> set to use serif for proportional, and serif is set to a copperplate font, and
> I'm still seeing the same, "times roman-type" serif font everywhere..

Hmm. It may be that your fonts.conf files is overriding these selections by
'preferring' some other font, or it may be that the font you've requested
doesn't advertise support for the desired language group.

> 3) There's still some performance issues in there, but they're all manageable;
> it takes a while to create a new .fonts.cache file (startup), and opening the
> fonts preference dialog takes a few seconds (maybe 5?), during which mozilla
> seems to block.  Again, these are noticable but not a big deal; as long as
> page rendering is quick, which it is, these are almost trivial problems.

Once the core XFree86 system is using fontconfig, the font caches should
be built automatically whenever new fonts are installed.  The font preference
dialog does take a while to pop up, and I'm not quite sure of the reason --
my recollection is that the last time I profiled it, it was spending a lot of
time building the UI elements that showed the list of fonts.
*** Bug 31296 has been marked as a duplicate of this bug. ***
To add to comment #21.

I tried the patch using fonts that I copied from windows. There was a total of
137 fonts in the directory, but I only could chose between 6 of them. 

If Windows is able to make us of all of them, shouldn't we be able to use them too?
Chris,

Is there a newer version of the xft patch available? I tried the latest one from
here and mozilla freezes on startup with MOZ_XFT=1. Your experimental binary
builds run fine with AA.
I'm using build 20020301 with xft that was on blizzard's rh page. It works
really well, except that the font metrics seem to be sometimes incorrect. When I
go to certain pages, the font size changes abruptly in the middle of the text
without any good reason.
Example: http://news.bbc.co.uk/hi/english/uk/newsid_622000/622457.stm

Another problem that I have and that seems related to the first one is when I go
certain pages, the font size also changes abruptly, but the text using the
larger font seems to be layed out as if it was using a smaller font.. Links are
written over the rest of the text and the text seems to "leak" out of its box
and over the right side of the page.
Example: http://www.wired.com/news/politics/0,1283,51425,00.html

I noticed that those builds are gone... Is it because there is a newer patch
somewhere that fixes that? Has this bug been pushed to post 1.0?
The news.bbc.co.uk site is (unfortunately) a mess. Have a look through the
source or try validating it if you're feeling brave. It's pretty hard to pin
down the font size to any particular error, but the unclosed FONT tag on line
741 is a good contender.

I have a style sheet I can send you that makes it a whole lot more readable, but
I don't think mozilla supports user style sheets yet (I'm using galeon).

The wired.com one does look like a metric problem, but also occurs on a vanilla
0.9.9 install, so probably isn't Xft related. Perhaps Bug #116273 ?
Bob, potential evangelism spin-off bug opportunity in comment 28.

/be
tristan has it covered in bug 56800
Is the approved patch in this bug ready to land or is that something old?
This patch isn't up to date, no.
Well, I've got some comments from my testing of the 1.0rc2 experimental Xft build...

Generally rather impressive, sometimes the fonts get rather skinny and fuzzy
when the point sizes get very low (mostly CSS pages I'm guessing), but otherwise
a huge improvement from standard X fonts.  It's such a relief to see some better
fonts, I'm used to this level of quality and better, because I've had the
fortune to work on a system that I'd argue still has the best font renderer out
there (can anyone guess? :))

_However_, I've found at least one problem, with Traditional Chinese pages. I'm
using the Microsoft MingLiu font, and found that on many/all Traditional Chinese
web pages Mozilla simply locks up and never returns, the only way out being to
kill the process. Pages I've seen go wrong include:
http://tw.yahoo.com/
http://chinese.yahoo.com/
sub-pages on http://www.ibm.com/tw/

My system is RedHat 7.1, XFree86 4.1.0, freetype 2.0.1
John: Have you tried the TrueType support that is already in Linux/Unix Mozilla?

http://www.mozilla.org/projects/fonts/unix/enabling_truetype.html
In response to comment 34 :

I've not tried the direct Freetype support, as there are no (Redhat) Linux
binary builds with this support switched on. It also seems to be an
inappropriate way to get antialiased fonts in X11, which is why the Xft
experimental build came along AFAICT. The browser shouldn't need to know all
about different font renderers, and where the fonts for these renderers are
stored...that should be provided by the system. 

In the case of the experimental build, this system is Xft, which admittedly
seems to be tied to Freetype at the moment (someone correct me if I'm wrong).
The direct freetype support currently in the tree looks really horrible on my
laptop. I really require Xft support. I still use a 0.9.8 rpm build with Xft
that was on blizzard's people.redhat.com page. It would be really great if Xft
worked for 1.0... And if someone made Xft-enabled RPMs...
I have had problems using type1 fonts with xft enabled mozilla. When initially
setting up my fonts.conf file without any MS core web fonts, I can list out and
select type1 fonts, eg. Bitstream Carter, but as soon as I install the MS fonts
(in a separate directory), the type1 fonts no longer show up. Can this be an
encoding issue?

I also looked for a debug environment variable similar to export
NS_FONT_DEBUG=400, which works with the freetype enabled mozilla. Do such a
debug variable exist for the Xft version?
Try FC_DEBUG=1.
> Try FC_DEBUG=1.

That doesn't work with the redhat rc2 rpm's at least, running as 'export
FC_DEBUG=1 ; mozilla'.
With the release of Mozilla 1.0

http://ftp.mozilla.org/pub/mozilla/nightly/experimental/xft/

has disappeared (along with all of http://ftp.mozilla.org/pub/mozilla/nightly/)

Is there any chance of getting a Mozilla 1.0 RPMs with Xft support. I'd like to
get the last few fixes, but couldn't live without the Xft support. :)

Those directories are still there.  You just have to use ftp.  I'll build one
soonish.
Any idea if xft support goes into the trunk anytime soon?
In response to comment 42 :

As far as I can tell the FTP site has been completely cleaned out, and the only
things on it are Mozilla 1.0 archives.

Can't see anything but /pub/mozilla/releases/mozilla1.0/ via ftp or http
See bug 149542
its on 207.200.85.37, but not .38 or .39...
Is the 1.0 release on ftp://207.200.85.37 in the xft 1.0 area really a proper
xft release? Setting FC_DEBUG=1 doesn't work. The smooth subpixel rendering I
had with rc3 doesn't work, it doesn't react to changes in /etc/fonts/fonts.conf,
nor changes in /etc/X11/Xft. And it only gives me dreadfull type1 fonts, none of
my ttf fonts are found...

Any ideas? The build id says 2002060615.

And shouldn't there be a way of identifying non-trunk builds?
I had problems with Mozilla with xft on scrolling. It would cause X to start
eatting all the cpu, hence a keyboard/mouse/display lockup. If I logged in over
the network and killed X the system would totally lockup. This is running as a
normal user. It seemed to be somewhat random. At first it would take a number of
hours to reproduce and then it went for 3-4 days without happening. I suspect
this is related to comments I have read that the latest xft patch for Mozilla is
designed for XFree86 CVS and not XFree86 4.2.0 which I am using.
It now seems that mozilla uses it's private fonts.conf in
/usr/lib/mozilla-1.0.0/res/Xft.
*** Bug 155167 has been marked as a duplicate of this bug. ***
What is the status of Xft these days?

I recently saw a message where Keith seemed to say that support for non render 
systems was still not released:

http://XFree86.Org/pipermail/fonts/2002-July/001873.html

> Posted by Keith on Fri, 12 Jul 2002 22:37:23 -0700 to fonts@XFree86.Org
> 
> > The new Xft (not yet released, but in CVS) doesn't even need Render and
> > will work on any X server.

Is this correct?
Will anyone provide xft mozilla rpm's for 1.1beta?
Don't even bother looking at this, it's not done yet.  It's making me nervous
staying on my hard drive, though, so I have to put it somewhere.
In such a large change (12K+ line patch) I would hope to see us continue to 
share more code between the gfs/src/gtk and the gfx/src/xlib.

Is there any reason not to share class definitions like 
gfx/src/gtk/nsFontHandleGtk.h?

Even code like gfx/src/gtk/nsFontInstanceCore.cpp seems like it ought to be
common to both.
I'm not entirely opposed to sharing code.  I'm just trying to break out the core
code at the moment so that nsFontMetricsGTK.cpp can be built with or without it.
 I'm pretty close.  However, I have to admit that sharing that code is
relatively low on my priority list.
It would be unfortunate if the 12,000+ line patch had to be duplicated by
Roland to keep the gfx/src/xlib version in sync (which we have been supporting
for several years now).
Yes, it sure would be a shame.
Attached patch another checkpoint (obsolete) — Splinter Review
New patch, core fonts work OK with this patch.	Xft is not yet integrated, nor
is freetype re-integrated.
Attachment #71280 - Attachment is obsolete: true
Attachment #71528 - Attachment is obsolete: true
Attachment #71641 - Attachment is obsolete: true
Attachment #73429 - Attachment is obsolete: true
Attachment #92521 - Attachment is obsolete: true
Attached patch checkpointing changes (obsolete) — Splinter Review
Rendering and text measurement for xft is limping along now.  Western text
seems solid.  Unicode isn't done yet, but is starting to get there.  Good place
to take a snapshot before re-merging with the tip and fixing the font selection
algorithms.
Attachment #93735 - Attachment is obsolete: true
If this patch is complied in, will moz run if Xft or FreeType2 is not available?

If not, what should be done so Xft support can, by default, be build into moz 
and moz can continue to run on systems without Xft?
> If this patch is complied in, will moz run if Xft or FreeType2 is not available?
> 
> If not, what should be done so Xft support can, by default, be build into moz 
> and moz can continue to run on systems without Xft?

As the patch stands today, you either compile it in and have a hard reference to
fontconfig and Xft, or you don't compile it.  The number of Xft + Fontconfig
calls that are made via this patch is actually quite small so it wouldn't hard
to do a dlopen and dispatch system, much like how the current freetype code works.

However, that's not one of the goals of the patch right now.  I'm more
interested in getting good system intergration with systems that have a proper
xft and fontconfig installation.  Maybe down the road a bit I'll worry about
dispatching functions.  It shouldn't be too hard to add.  I just want to get the
font rendering working properly first.
Another option is to make the Xft/FontConfig code part of a loadable XPCom 
module.
It's fine to defer working on the linkage issue for now. Of course, this will 
have to be resolved before any patch can be considered for serious review. 
It sounds like a good idea to make these experimental patches to get some 
feedback.
Most of patch looks like it is not directly needed for Xft. 

This obscures the Xft changes.

Separating out the Xft changes from the reorg would make it much easier for
people to see what you are actually doing that is Xft related.
As it stands now this patch makes significant non-Xft related changes to the 
font subsystem.

Perhaps you could separate this into a separate bug so it can be discussed
separately from the Xft issues.

Before any one codes up a massive change to the font subsystem I would hope 
that we would give other developers time to add their input. I am fairly 
positive that other font developers may have thoughts and it seems reasonable 
to include, communicate, and coordinate with them. I believe we may find that
they have

  1) other goals and directions
  2) other work in progress
  3) other planned work
  4) other requested work/features

It would also be good to discuss the particulars of the changes implied in
this patch:

  1) the extent and goals of this particular change
  2) how this particular significant fits the font subsystem architecture
  3) how to manage any possible negative user impact
The most compatible way to add Xft support would be to make another font 
subclass just like the direct FreeType2 code does:

 class nsFreeTypeFont : public nsFontGTK {

only for Xft it would be something like this:

 class nsXftFont : public nsFontGTK {

This would fit in smoothly with moz's font subsystem and allow it to select 
from Xft as well as any of the another font technologies that it currently 
uses.

This would also seperate the font selection issues (problematic) from the 
rendering issues (not so problematic).

This code should be enabled (default off) by a pref just as the direct freetype 
code is.

This should detect if Xft is available and disable itself if not available.
There's been a while since there was a public test build (1.0), how about
providing one for 1.1beta?
The goal that I have is pretty simple.  Use Xft and fontconfig for font matching
and rendering.

Given that fontconfig handles all the matching, it's far easier to seperate the
code instead of intermingling it with the old matching code.  That's why I'm not
interested in just making an nsFontGTK subclass.  (There's an older patch that
essentially does this.)

I'll also throw this out there, since it's going to be a serious bone of
contention - I'm also not interested in supporting the old X11 interface for
font matching or listing those fonts as even available if you're using Xft and
fontconfig for fonts.

At the same time, it's important that the current code build without Xft and it
would be nice if the code built without X11 support for those of us that don't
need it anymore.  Plus, it would be nice to have a run time switch to be able to
choose between the two of them at run time, assuming you've built with both.

So, given those broad goals the easiest way to get from point A to point B is to
seperate the old X11 code from the Xft code so that you can build with one or
the other or both.  That's pretty easy:

o Turn nsFontMetricsGTK into a class that doesn't know anything about freetype,
X11 or fontconfig.

o Build an interface that is the basic definition for font matching and
rendering at a pretty high level.  (nsFontInstance)

o Move the existing X11 code into its own class that knows how to do that
matching and rendering. (nsFontInstanceGTK)

o Create a new Xft class that knows how to do all of its own matching and
rendering. (nsFontInstanceXft)

o Put a big fat switch, frankenstein style, in nsFontMetricsGTK that knows how
to dispatch to the right instance, depending on build options and runtime options.

...and that's about it.

The way that these goals play out into an implementation, the Xft code is almost
all new code, and doesn't have to integrate with the old code.\

What do other developers need, given that I'm not making any changes to the old
code, other than moving it?  This is as pretty close to zero impact on the X11
code as it gets, other than not doing it at all, and that's not an option.
> I'm also not interested in supporting the old X11 interface for font
> matching or listing those fonts as even available if you're using Xft and
> fontconfig for fonts.

This would eliminate the bulk of the fonts on most Unix system and result
in very serious display regressions.

Until most Unix systems (and variants like Redhat) have a good supply of
TrueType and/or Type1 fonts this strategy is completely unrealistic for X 
Windows Mozilla and Netscape.

If you want to make an experimental build that is fine but I will strongly
resist allowing this in standard Mozilla and Netscape builds (including rpms).
Xft2 can display PCF fonts, so that shouldn't really be a problem.  Also, most
linux distributions come with a fair number of free Type1/TTF fonts (the URW and
Luxi fonts come to mind).
> This would eliminate the bulk of the fonts on most Unix system and result
> in very serious display regressions.

That's why the "big switch" exists -- the default installation would continue to
provide both the core and Xft paths and continue to use the core path by
default.  Vendors redistributing Mozilla could choose to provide a suitable set
of fonts accessible by Xft and eliminate the core support in their private builds.

> Xft2 can display PCF fonts, so that shouldn't really be a problem.

Xft depends on FreeType for font access and FreeType has relatively primitive
PCF support at this point.  It doesn't deal with compressed (.gz or .Z) files
and it has no support for encodings other than Latin-1 or 10646.  Vendors would
have to make a small effort to ensure that the necessary fonts could be accessed
by Xft applications.

My plan at this point is to migrate XFree86 from pcf to sfnt for bitmap fonts.
I've seen some preliminary results from the people involved which are very
encouraging; less disk space with better performance.  I'm hoping that work will
be finished in the next couple of months.  This seems a more profitable route
than adding code to FreeType to support decompression and non-Unicode encodings,
and so I've terminated efforts along that line.
> 
> This would eliminate the bulk of the fonts on most Unix system and result
> in very serious display regressions.
> 
> Until most Unix systems (and variants like Redhat) have a good supply of
> TrueType and/or Type1 fonts this strategy is completely unrealistic for X 
> Windows Mozilla and Netscape.

That's why I'm suggesting that we make it a build option, and that they can be
seperated.  It's going to be a while before we have the same kind of coverage
that we do with pcf fonts.  However, I suspect it's going to be a lot shorter
than you think.

> 
> If you want to make an experimental build that is fine but I will strongly
> resist allowing this in standard Mozilla and Netscape builds (including rpms).

We're not talking about the default build here at all.  Besides, the Xft and
fontconfig dependency are hard to satisfy at this point.  Although the next Red
Hat release will ship with this as the only font selection mechanism available
to Gtk and Qt apps, it's going to be a while before it gets into the field.

But, then again, there will be quite a few early adoptors including Red Hat.
Why don't you give this effort its own name?

This way it will be easier for users to tell which one they are using, the press
can easily tell which one they are reviewing, and we can setup a separate 
component in bugzilla for you.

You could call it xftzilla or blizilla or whatever.
I just can't resist putting in my 2c here.

The current X font system sucks.  It really really sucks.  Almost anything will
be better, and I think that Keith's Xft stuff will be a lot better.

For quite some time, I've been using the old Xft patches, because it's the only
thing that makes mozilla not look like crap on Unix.  Heck, I'm still using 1.0
because I just can't look at the "mainstream" builds.  It still doesn't look as
good as mozilla does on Mac OS X, but it holds it's own.

I think Chris is on the right path in developing a new font subsystem based on
Xft, and keeping the old one relatively intact as a "legacy" system for users on
older X11 systems.  Making spaghetti-code which mixes and matches renderers
(Xft, X11) seems like it will be _more_ difficult to maintain, and I don't see a
good reason to mix renderers on-screen anyway.

Call it what you want while he's writing it, but by time the convergence of this
code, the Xft system in X11, and vendor support for the two comes together,
you'll probably see all the new systems using this.  I, for one, am very happy
to see this work progressing, because with the standard X11 code, X11 users are
getting a really sub-standard experience, which makes Unix systems look bad next
to their proprietary counterparts.

Agreeably, the need for legacy X11 font support will be important for quite some
time, but anything that helps move the drive for a modern, unified X11 font
handling system is in the entire community's best interest.

Once the bugs are ironed out (and there seems like there's plenty of work there)
I'd hope that press would be forewarned when using the legacy code, instead of
this new, modern code, so they don't accidentally judge Mozilla on Unix based on
it's current font handling system.

I would really encourage people to dream a bigger dream: 

  Dump the whole X server!

The goal to allow a user to do graphics over a network is now done via the HTTP 
and the web.

Why keep a system where graphic operations require a process context switch? 
This is very expensive (which is why no other UI does this).

Very few users use the remote capabilities of X. Its silly to make the typical 
case (client and framebuffer on the same machine) suffer for the odd unused case 
(remote frame buffer). If people want remote access then make helper processes
that communicate with remote processes and access the local framebuffer.

bstell, I can only assume that the previous comment was posted sarcastically, in
which case it is not very helpful. 

Given that Chris' patch can be compiled away, what specific objections do you
have to it?

(If you were being serious about X being redundant because of HTTP and the web,
then you have bigger problems)
It is a completely serious statement. If we are going to rip up the user's 
environment (one more time) then lets move from X's very inefficient design.
If we are going to hang on to a 1980's design then I'm reluctant to disturb 
users.

> Given that Chris' patch can be compiled away, what specific objections do you
> have to it?

1) It needs to be out of the normal font path so it does not disturb normal
   font development. This would help reduce bitrot. This would also simpilify 
   the review process. It could be something like gfx/src/qt.

2) It needs to be easily identifiable by the user so they know what to expect / 
   not expect. The best way would be to have a separate executable name.

3) It needs its own bugzilla component to help make the bug reporting / 
   assignment manageable.

> It is a completely serious statement. If we are going to rip up the user's 
> environment (one more time) then lets move from X's very inefficient design.
> If we are going to hang on to a 1980's design then I'm reluctant to disturb 
> users.

I'm not sure how to react to something this ludicrous.  It's kind of like having
a conversation where you say "Hey, how are you doing today?" and the response
being "YOU SMELL LIKE CABBAGE!"  A total non sequitur.

> 
>> Given that Chris' patch can be compiled away, what specific objections do you
>> have to it?
> 
> 1) It needs to be out of the normal font path so it does not disturb normal
>    font development. This would help reduce bitrot. This would also simpilify 
>    the review process. It could be something like gfx/src/qt.

I'm not going to fork all of gfx/src/gtk to just change fonts.  That's pretty
silly.  Also, since this patch moves the code without making any changes and
seperates the code paths entirely, I'm doing exactly what you state here - it
does not disturb normal font development.  It just means that you do your
hacking in another file.

> 
> 2) It needs to be easily identifiable by the user so they know what to expect / 
>    not expect. The best way would be to have a separate executable name.

That's completely silly.

> 
> 3) It needs its own bugzilla component to help make the bug reporting / 
>    assignment manageable.
> 

That I don't mind at all.  Totally reasonable.
I want Xft in Mozilla because 1) our fonts look awful without it, especially on
an otherwise-Xft desktop like GNOME 2, and 2) it's already configured by my
distribution/desktop.  It's a disruption to my environment to _not_ have Xft
present, which is why I'm not upgrading to 1.0.1/1.1 until there are Xft-enabled
builds.  (And I am _far_ from the only person in this situation.  And as Sun and
HP and Red Hat start to ship GNOME2-based desktops in the very near future,
along with 3rd-party desktop shops like Ximian, the number of people who will
expect Mozilla to use their font config will only increase.)

Demanding another binary name is just silly.  We use the name "mozilla"
everywhere (including binary naming on Windows and Mac), it's a protected
trademark, etc.  If you build with xlib, you get "mozilla", not "xlibzilla". 
Let's just forget that suggestion was even made.
> it does not disturb normal font development.

Have you forgotten so quickly that you just told people to stay out of your way
because you were going to remove the direct FreeType2 code? This was a clear 
attempt to disturb normal font developement.

http://bugzilla.mozilla.org/show_bug.cgi?id=144664#c11
> -- Addl. Comment #11 From Christopher Blizzard 2002-07-22 09:01 --
> 
> Careful.  I'm about to whack this code hard, removing most of the 
> direct free type interfaces in favor of Xft.


> [different executable name] Let's just forget that suggestion was even made.

No lets not. Remember what Chris is proposing:

> I'm also not interested in supporting the old X11 interface ... or listing
> those fonts as even available if you're using Xft and fontconfig for fonts.

This will cause major regressions for many users. Lots of users are going
to open bugs that say "why can't moz see my fonts anymore?. 

Do I hear a volunteer to be the default assignee that looks at X bugs? That 
person will be burdened with the repeated task of asking the question "which 
version are you using?" (Mike/Chris?)

It is unfair to burden the current font developers with this. Unless someone
agrees to do this then we need to make it as easy as possible to tell which
font system is in place. The easiest way to do this is by having a separate
executable name.
> Have you forgotten so quickly that you just told people to stay out of your way
> because you were going to remove the direct FreeType2 code? This was a clear 
> attempt to disturb normal font developement.

What??  I never said that.  Once again, for the umpteenth time you have
misrepresented what I've said.  I only said that I was going to be working in a
specific area and they should be aware of it.  I never said stop.  I never said
don't do this.  I was just letting people know.  You know, communicating and stuff?

> This will cause major regressions for many users. Lots of users are going
> to open bugs that say "why can't moz see my fonts anymore?. 

Only if you choose to build with Xft enabled.  You don't have to do this. 
Mozilla doesn't have to do this.  Netscape doesn't have to do this.  People that
want to use Xft can deal with those bugs.

> 
> Do I hear a volunteer to be the default assignee that looks at X bugs? That 
> person will be burdened with the repeated task of asking the question "which 
> version are you using?" (Mike/Chris?)
> 
> It is unfair to burden the current font developers with this. Unless someone
> agrees to do this then we need to make it as easy as possible to tell which
> font system is in place. The easiest way to do this is by having a separate
> executable name.
> 

As opposed to burdening the gtk developers with waiting for roland to copy code
over and over into another directory every time they fix something?  Why don't
we have x11zilla?  That's an example of another huge forked code base.

I've already said that I'm perfectly happy with an xft specific component. 
That's fine with me.  You shouldn't have to do a lot of triage, since this
probably won't be coming from mozilla.org in the near future.
> What??  I never said that.  Once again, for the umpteenth time you have
> misrepresented what I've said.  I only said that I was going to be working 
> in a specific area and they should be aware of it.  I never said stop.  I 
> never said don't do this.  I was just letting people know.  You know, 
> communicating and stuff?

In the future, if you want to suggest to other developers that you are
trying to _cooperate_ with them, then would you kindly _not_ say: 

  "Careful.  I'm about to whack this code hard" 

and then clarify that statement by saying 

  "think about it since I'm working on something that might conflict". 

Both these statements indicate that you are doing something with will break
their work and they had better watch out. Since neither of these comments
hint at cooperation, it makes it very hard to gather that you want to work
with others. They both sound like you will be causing the other developers
problems. In the future, perhaps you could say something like this:

  I'm planning big changes in related code and I would like to coordinate
  with you to minimize any impact on your work.

>> This will cause major regressions for many users. Lots of users are going
>> to open bugs that say "why can't moz see my fonts anymore?. 
>
> Only if you choose to build with Xft enabled.  You don't have to do this.
> Mozilla doesn't have to do this.  Netscape doesn't have to do this.  People
> that want to use Xft can deal with those bugs.

Xft is only available on a very few systems and lacks a variety of features
that X mozilla has. If someone wants to build an executable that lacks moz's
current features and will not run on systems without Xrender, Xft, and
FontConfig I have no issue as long as it has a different name. It is fine to
add features and keep the common name but if we subtract features then we
should make it _very_ clear that the build is missing these features. Simply
having some release notes is not enough. It would need to be very plain to
even the most novice user. In a case like this a different name would be an
appropriate way to let users know.

Having said all this I would _much_ prefer that Xft support be built into
the regular builds by default, and automatically enabled when moz finds the 
needed libraries and X extension are available on the user's system.

FontConfig is a bit more difficult but I would prefer that moz use the parts
that are ready now and then integrate the other parts as they become ready.

> As opposed to burdening the gtk developers with waiting for roland to copy 
> code over and over into another directory every time they fix something? 
> Why don't we have x11zilla? 

We already started working on this a long time ago. Its called
gfx/src/x11shared and I'm sure Roland would love to have you participate.

> I've already said that I'm perfectly happy with an xft specific component. 

Would you please clarify what you mean here?

  Do you want to fit Xft in to the current moz font code?

  Or are you just talking about bugzilla?

> You shouldn't have to do a lot of triage, since this probably won't be 
> coming from mozilla.org in the near future.

Keith, do you know that I _already_ spend time helping people figure out if
they have your Xft rpm version? As long as it is called mozilla users will
file bugzilla bug reports against mozilla and mozilla font developers will
have to spend time helping users determine which version they have.
Let me list the issues I see to dropping the current moz font code and just 
using Xft/FontConfig.

1) Only percentage of Unix/Linux systems have Xft installed. Is there a
   place where users can download the needed libraries to upgrade the
   various flavors of Unix/Linux (eg: Solaris, HPUX, ...)? I don't
   think it is acceptable to simply assume a typical user will download
   the source, build, and install it.

2) Has Xft released a version with support for non Xrender systems?
   I know Keith wrote the code but I never saw an announcement saying
   it was available. Again: how do users get it on their systems?

3) FontConfig has not (yet) been released. The posting I've seen indicate
   that it is just now at RC3.  Again: how do users get it on their systems?

4) Does Xft/FontConfig support MathML?

5) When doing fallback font lookup does Xft/FontConfig distinguish between
   special characters like CJK (wide) smart quotes and western (narrow) smart
   quotes and choose the appropriate one for the document's language?

6) Does Xft/FontConfig support anti-aliased scaled bitmaps (AASB)? Most
   Unix/Linux systems have limited sizes for CJK fonts. Using AASB mozilla
   can generate good looking intermediate sizes which leads to much better
   page layout for CJK pages. This is very important for systems that lack
   outline scalable font like Truetype.

7) Does Xft/FontConfig support GB18030? The People's Republic of China
   requires any software distributed there to support this.

8) Does Xft/FontConfig support Unicode surrogates?

9) Does Xft/FontConfig support Korean precomposed Hangul using hanterm fonts?

10) Does Xft/FontConfig have a way to ban ugly X fonts? Unfortunately, there
    are a fair number of bad looking X fonts.

11) Does Xft/FontConfig support user defined font encodings? We still have
    users that use this to display pages where the font or encoding is
    not a standard.

12) Does Xft/FontConfig support transliteration? Ie: what does Xft/FontConfig
    do for characters like copyright when no font has a copyright symbol?

13) Does Xft/FontConfig support a way for the font developer(s) to debug
    what fonts are being selected by a users system? This is important
    because the fonts installed on users' systems varies widely and it is not
    always possible to reproduce a user's problem on a developer's system.

14) Does Xft/FontConfig support Indic shaping? We have work in progress here.

15) Does Xft/FontConfig support embedding Truetype fonts in Postscript printing
    output? We have work in progress here.

{argh, mid-air collision... well here's what i said _before_ the last comment
post...}

ok, this is getting a bit ridiculous.  i'm cc-ed on this bug because i'm very
interested in the development of an xft-enabled mozilla, not because i want to
hear about what bstell think's about blizzard's communication ability.  if you
have a problem with how blizzard post comments to other bugs, and feel the need
to flame him over how he spends his coding time, please use some other private
means such as email.  the 'conversation' is pretty much pointless at this time
anyway, since compromise or agreement is rarely reached while the participants
are **** off at each other, as the case appears to be here.  so please, calm down.

with that said, my perspective:  i think moz looks _awful_ without the xft code.
 i have been using 1.1a since it came out, simply because i can't stand 1.1b or
the trunk without the xft code.  yes, i happen to understand the technical and
support problems associated with making a big change in something as important
as font rendering. but:

1) as blizzard has repeatedly stated, xft/fontconfig will not be in the default
build until it can replace the current system (or, i would hope, coexist with it).
2) i believe blizzard mentioned somewhere that his current vision is that the
core x font code and xft font code will eventually be able to sit side by side,
with the option of using either.
3) this is all just initial work to get the code _operational_, nothing about it
being usable for the masses.  it is likely to undergo many changes before it's
used mainstream.
4) having a different application name is ridiculous (though i _do_ like how
'blizzilla' sounds).  how does a new font renderer make it a different application?
5) if people aren't reporting bugs on the xft-enabled RPM correctly, and you
(bstell) are required to sort them all out, then this is 1) a deficiency in
bugzilla's bug-reporting facilities, and you should file a bug for that, and 2)
a problem with how the xft-enabled RPMs are being built and distributed - e.g.
the name should be something like mozilla-1.0.0xft.i386.rpm.  then that way, a
quick query of what package version the user has installed will clear up any
problems about who should be dealing with the bug.

i really want to see the xft/fontconfig code working, and i think that _after_
the code is working, effort should be put on trying to integrate it as
seamlessly as possible with the current system (even if that means changes to
the current system), with the ability to fallback to core x font support when
xft/fontconfig isn't available.  this way it can be enabled in the default
build, but not give users problems when they don't have the necessary pieces to
make use of it.

i'm sorry if i'm a bit out of line, and i'm sorry if i sound condescending, but
mozilla is something i care about very much (as i'm sure is true of the
developers involved as well), and i just want to see useful work getting done
without wasting time on arguing over things that haven't even happened yet.
Please note the following correction to comment #81:

s/Keith, do you know/Chris, do you know/
> 2) i believe blizzard mentioned somewhere that his current vision is that
> the core x font code and xft font code will eventually be able to sit side
> by side, with the option of using either.

It should not be an either or choice. We should use the best parts of both.

> 4) how does a new font renderer make it a different application?

When we drop features it makes it a different application.

> 5) if people aren't reporting bugs on the xft-enabled RPM correctly, and 
> you (bstell) are required to sort them all out, then this is 1) a 
> deficiency in bugzilla's bug-reporting facilities, and you should file a 
> bug for that, and

If we use the name mozilla how will novice users know?

> 2) a problem with how the xft-enabled RPMs are being built and distributed 
> - e.g. the name should be something like mozilla-1.0.0xft.i386.rpm.  then
> that way, a quick query of what package version the user has installed will
> clear up any problems about who should be dealing with the bug.

What happens when the installer is a different person from the user?

What happens when the installer forgets or does not realize the significance?

> i'm sorry if i'm a bit out of line, and i'm sorry if i sound condescending,
> but mozilla is something i care about very much (as i'm sure is true of the
> developers involved as well), 

You are not out of line. We all care about moz's development.

> and i just want to see useful work getting done without wasting time on 
> arguing over things that haven't even happened yet.

It is important to plan ahead. We need to be getting the best of both not 
dropping the existing features. It is far better to spend this time up front
before a developer has invested a large amount of work. I certianly do not plan
to see Chris' work suffer the fate the fate of getting to the review stage only
to be force back to the design stage because the design stage was incomplete.
> 1) Only percentage of Unix/Linux systems have Xft installed. Is there a
 >   place where users can download the needed libraries to upgrade the
>    various flavors of Unix/Linux (eg: Solaris, HPUX, ...)? I don't
>    think it is acceptable to simply assume a typical user will download
>    the source, build, and install it.

If Mozilla binaries are made available for these systems, fontconfig/Xft
binaries can be provide at the same time. If binaries aren't available for 
Mozilla, I don't see how they are needed for Xft/fontconfig. Mozilla
could certainly include private versions of the libraries and have
a:

 --with-included-xft 

command line option, though I wouldn't recommend it.

> 2) Has Xft released a version with support for non Xrender systems?
>    I know Keith wrote the code but I never saw an announcement saying
>    it was available. Again: how do users get it on their systems?

Should be released this week.

> 3) FontConfig has not (yet) been released. The posting I've seen indicate
>    that it is just now at RC3.  Again: how do users get it on their systems?

Should be released this week

> 4) Does Xft/FontConfig support MathML?

If fonts are encoded using some sort of standard,it should just be
a layout level issue. If it involves recognizing specific fonts, and
knowing how they are encoded, it will be a little bit difficult to
fit that sort of hackery on top o fthe fontconifg framework, though Mozilla 
could certainly just ask for those fonts specifically.

> 5) When doing fallback font lookup does Xft/FontConfig distinguish between
>    special characters like CJK (wide) smart quotes and western (narrow) smart
>    quotes and choose the appropriate one for the document's language?

If it's a matter of font selection, fontconfig will reorder it's choice of 
fonts based on language tag. If it's a matter of code point selection,
then it's a layout level issue, not a fontconfig/Xft issue.

> 6) Does Xft/FontConfig support anti-aliased scaled bitmaps (AASB)? Most
>    Unix/Linux systems have limited sizes for CJK fonts. Using AASB mozilla
>    can generate good looking intermediate sizes which leads to much better
>    page layout for CJK pages. This is very important for systems that lack
>   outline scalable font like Truetype.

If this is something to care about, it should be added to freetype.
Putting it in Mozilla is putting it in the wrong layer, since the idea
is not Web-browser specific in any way.

> 7) Does Xft/FontConfig support GB18030? The People's Republic of China
>    requires any software distributed there to support this.

Character encodings have nothing to do with the font system, in general. Both
KDE and GNOME run fine in GB18030 on top of Xft/fontconfig.

> 8) Does Xft/FontConfig support Unicode surrogates?

Encoding issue, again. XftDrawStringUtf16 doesn't exist so, you'd have
to convert to UTF-8 or 32-bit characters first, but Xft definitely 
clean for non-BMP.

> 9) Does Xft/FontConfig support Korean precomposed Hangul using hanterm fonts?

Do you mean "composing Jamos on the fly" as opposed to using precposed
syllables? This is basically a layout level issue, though depending on
what fonts you are talking about, there might be some connection to
the custom encoding question. I've never seen a TrueType or postscript
font for use with combine-on-the-fly Jamos, so it's hard to say if 
Xft could handle such a font or not. I suspect it could.

> 10) Does Xft/FontConfig have a way to ban ugly X fonts? Unfortunately, there
>     are a fair number of bad looking X fonts.

fontconfig is a separate font database from the core X system, so generally
the solution is simply not to have these fonts in the database. I'm not
sure I understand this question completely, though.

> 11) Does Xft/FontConfig support user defined font encodings? We still have
>     users that use this to display pages where the font or encoding is
>     not a standard.

The only place I've ever seen this is in Indic web pages, where typical
the usage isn't custom encoded fonts but *mis-encoded* fonts where ASCII
and/or latin-1 code points have been reused. Fontconfig can't detect this,
so sure, it will ``work''. You can't simply create a clean custom encoding
for a TrueType fonts, so people don't do it, but reuse other encodings.

> 12) Does Xft/FontConfig support transliteration? Ie: what does Xft/FontConfig
>     do for characters like copyright when no font has a copyright symbol?

Layout issue, not an Xft issue. The layout layer can find if the font has
a copyright symbol or not with no problem.

> 13) Does Xft/FontConfig support a way for the font developer(s) to debug
>     what fonts are being selected by a users system? This is important
>     because the fonts installed on users' systems varies widely and it is not
>     always possible to reproduce a user's problem on a developer's system.

Yes.

> 14) Does Xft/FontConfig support Indic shaping? We have work in progress here.

Layout issue, not an Xft issue; Pango, for example, has quite complete Indic
OpenType support on top of Xft.

> 15) Does Xft/FontConfig support embedding Truetype fonts in Postscript > printing
>     output? We have work in progress here.

You have access to the font files and FT_Face objects, I don't see how this
is otherwise relevant to Xft/fontconfig. There has been discusison of
finding a way to share the code for this between all the different users
of fontconfig, but using fontconfig certainly doesn't hinder Mozilla 
from going its' own way here.

The issues above seem to indicate some confusion about what fontconfig
and Xft are; in basic terms:

 - fontconfig is an API for maintaining font catalogs, and doing lookups
   in them. 

 - Xft is an API for rendering glyphs from fonts located by fontconfig.

Most of the things mentioned above either are non-issues or are at
different levels from Xft/fontconfig. The only ones I see of being 
any concern at all for the Xft/fontconfig layer are the ones involving
encoding - MathML, Hangul combining Jamos, and custom encodings. I don't 
really understand any of these problems fully. If the needs could be
articulated cleary, then I'm sure if Xft doesn't meet the needs in
this area now, then it could be extended.

The reason we need Xft/fontconfig support in Moizlla is simply that it will 
shortly be  *the* font system on the majority of Linux and Unix systems. 
(We could argue how big that majority is; I'd say "vast majority"
in fact.) On such systems, not using Xft/fontconfig for Mozilla makes
no more sense than not using the Win32 font API on Windows.

I'd argue that on other Linux/Unix systems, Mozilla might as well use 
Xft/fontconfig as well, since all the problems need to be solved
for Xft/fontconfig.

I don't think moving Xft/fontconfig-2.0.0 will meet the overwhelming
majority of Mozilla's needs. If Mozilla has other different needs beyond
that, then the reason they aren't addressed by Xft/fontconfig is because
the only people who understand them haven't yet worked hands-on with
Xft/fontconfig so no concrete proposal for a solution hsa been arrived
at.

What I don't want to see happening (and seems to be happening already)
is:

 Month1: We can't switch to Xft/fontconfig because the Xft/fontconfig
  codebase doesn't support X .
 
 [ Work continues on the custom Mozilla code base, and support for Y is
   added ] 

 Month2: We can't switch to Xft/fontconfig because the Xft/fontconfig
  codebase doesn't support X and Y.

 [ Work continues on both code bases, Xft/fontconfig gets X, Z is
    added to the custom font code base ]
  
 Month3: We can't switchIf  to Xft/fontconfig because the Xft/fontconfig
  codebase doesn't support Y and Z.

And AFAIK, the big issue right now isn't switching over, but just
getting Xft/fontconfig support in the tree?
> I don't think moving Xft/fontconfig-2.0.0 will meet the overwhelming
> majority of Mozilla's needs. If Mozilla has other different needs beyond
> that, then the reason they aren't addressed by Xft/fontconfig is because
 the only people who understand them haven't yet worked hands-on with
> Xft/fontconfig so no concrete proposal for a solution hsa been arrived
> at.

That is clearly incoherent; What I meant to say was:

 I think Xft/fontconfig-2.0.0 will meet the overwhelming majority of Mozilla's
 needs...
> If Mozilla binaries are made available for these systems, fontconfig/Xft
> binaries can be provide at the same time. If binaries aren't available for
> Mozilla, I don't see how they are needed for Xft/fontconfig.

Mozilla/Netscape _is_ being distributed in binary form to new and older
Unix/Linux systems. Xft/FontConfig needs to get a similar distribution
system in place.

> Mozilla could certainly include private versions of the libraries and
> have a: --with-included-xft
> command line option, though I wouldn't recommend it.

Does Mozilla/Netscape want to distribute Xft/FontConfig? If you or someone
else wants to pursue this that's fine with me.

> > 2) Has Xft released a version with support for non Xrender systems?
...
> Should be released this week.
>
> > 3) FontConfig has not (yet) been released. The posting I've seen indicate
...
> Should be released this week

It will be good to see them finally get some field time.

> > 4) Does Xft/FontConfig support MathML?
>
> If fonts are encoded using some sort of standard,it should just be
> a layout level issue. If it involves recognizing specific fonts, and
> knowing how they are encoded, it will be a little bit difficult to
> fit that sort of hackery on top o fthe fontconifg framework, though
> Mozilla could certainly just ask for those fonts specifically.

I do not particularly care how it is done but I do not want to lose this
feature. Perhaps someone can convince Roger Sidje to add MathML support
to Xft/FontConfig.

> > 5) When doing fallback font lookup does Xft/FontConfig distinguish
> >    between special characters like CJK (wide) smart quotes and western
> >    (narrow) smart quotes and choose the appropriate one for the
> >    document's language?
>
> If it's a matter of font selection, fontconfig will reorder it's choice
> of fonts based on language tag. If it's a matter of code point selection,
> then it's a layout level issue, not a fontconfig/Xft issue.

Agreed, this is a font selection issue. It is still a requirement that
needs to be satisfied and I am curious not if FontConfig can do this but
if FontConfig does do this. This is an easy one, just get it in FontConfig
and lets be done with the discussion.

> > 6) Does Xft/FontConfig support anti-aliased scaled bitmaps (AASB)? Most
> >    Unix/Linux systems have limited sizes for CJK fonts. Using AASB
> >    mozilla can generate good looking intermediate sizes which leads to
> >    much better page layout for CJK pages. This is very important for
> >    systems that lack outline scalable font like Truetype.
>
> If this is something to care about, it should be added to freetype.

This is actually an interesting point. Some kind of AASB should be in
FreeType since AASB is part of the Truetype spec. It is not clear to
me if FreeType should do this for non-Truetype fonts although it might
be reasonable to ask them to do it. Regardless of how it is done I do
not want to lose this feature.

> Putting it in Mozilla is putting it in the wrong layer, since the idea
> is not Web-browser specific in any way.

I would love to see it in other places like Xft or FreeType. It is very
important for CJK users with only bitmap fonts. When it is available in
a 3rd party library we can remove the code in mozilla. Until then moz
still needs it.

> > 7) Does Xft/FontConfig support GB18030? The People's Republic of China
> >    requires any software distributed there to support this.
>
> Character encodings have nothing to do with the font system, in general.
> Both KDE and GNOME run fine in GB18030 on top of Xft/fontconfig.
> ... XftDrawStringUtf16 doesn't exist,

Mozilla is a UTF-16 application so regardless of how it is implemented
(Xft/FontConfig or Chris' patch) non BMP support needs to continue to
work for both Truetype fonts and X fonts.

> > 9) Does Xft/FontConfig support Korean precomposed Hangul using hanterm
> >    fonts?
>
> Do you mean "composing Jamos on the fly" as opposed to using precposed
> syllables? This is basically a layout level issue, though depending on
> what fonts you are talking about, there might be some connection to
> the custom encoding question. I've never seen a TrueType or postscript
> font for use with combine-on-the-fly Jamos, so it's hard to say if
> Xft could handle such a font or not. I suspect it could.

There are X users that do not have fonts with precomposed Jamos. If they
do have non-composed Jamos moz will use multiple non-composed glyphs to
represent the precomposed characters. This feature need to be retained.

> > 10) Does Xft/FontConfig have a way to ban ugly X fonts? Unfortunately, there
> >     are a fair number of bad looking X fonts.
>
> fontconfig is a separate font database from the core X system, so generally
> the solution is simply not to have these fonts in the database. I'm not
> sure I understand this question completely, though.

There are some bad looking fonts (the URW fonts come to mind). How will it
be managed so the novice user does not see these? This is an easy one, I
just want to know that it is actually done.

> > 11) Does Xft/FontConfig support user defined font encodings? We still have
> >     users that use this to display pages where the font or encoding is
> >     not a standard.
>
> The only place I've ever seen this is in Indic web pages, where typical
> the usage isn't custom encoded fonts but *mis-encoded* fonts where ASCII
> and/or latin-1 code points have been reused. Fontconfig can't detect this,
> so sure, it will ``work''. You can't simply create a clean custom encoding
> for a TrueType fonts, so people don't do it, but reuse other encodings.

However it gets done is fine as long as we retain this feature.

> > 12) Does Xft/FontConfig support transliteration? Ie: what does 
Xft/FontConfig
> >     do for characters like copyright when no font has a copyright symbol?
>
> Layout issue, not an Xft issue. The layout layer can find if the font has
> a copyright symbol or not with no problem.

In mozilla the layout code does layout not character transliteration.
Regardless of where it is done this feature needs to be retained.

> > 13) Does Xft/FontConfig support a way for the font developer(s) to debug
> >     what fonts are being selected by a users system? This is important
> >     because the fonts installed on users' systems varies widely and it is 
not
> >     always possible to reproduce a user's problem on a developer's system.
>
> Yes.

Could you provide details? How does a font maintainer find out what fonts
are being used on the user's system?

> > 14) Does Xft/FontConfig support Indic shaping? We have work in progress
> >     here.
>
> Layout issue, not an Xft issue; Pango, for example, has quite complete Indic
> OpenType support on top of Xft.

This is not a layout issue. Layout should deal with the Unicode character
values not the glyph numbers. The handling of ligatures in moz belongs at
the font subsystem layer.

> > 15) Does Xft/FontConfig support embedding Truetype fonts in Postscript
> >     printing output? We have work in progress here.
>
> You have access to the font files and FT_Face objects, I don't see how this
> is otherwise relevant to Xft/fontconfig. There has been discusison of
> finding a way to share the code for this between all the different users
> of fontconfig, but using fontconfig certainly doesn't hinder Mozilla
> from going its' own way here.

It does in the sense that the proposal here currently plans to rip out the
code that the printing work currently uses. This is an important feature and
we should not lose it.

> The issues above seem to indicate some confusion about what fontconfig
> and Xft are; in basic terms:
>
>  - fontconfig is an API for maintaining font catalogs, and doing lookups
>    in them.
>
>  - Xft is an API for rendering glyphs from fonts located by fontconfig.
>
> Most of the things mentioned above either are non-issues or are at
> different levels from Xft/fontconfig. The only ones I see of being
> any concern at all for the Xft/fontconfig layer are the ones involving
> encoding - MathML, Hangul combining Jamos, and custom encodings. I don't
> really understand any of these problems fully. If the needs could be
> articulated cleary, then I'm sure if Xft doesn't meet the needs in
> this area now, then it could be extended.

Xft/FontConfig may or may not be the exact place where the features are
provided. Regardless of where the code is, the features need to continue to
work in mozilla.

> The reason we need Xft/fontconfig support in Mozilla is simply that it will
> shortly be  *the* font system on the majority of Linux and Unix systems.
> (We could argue how big that majority is; I'd say "vast majority"
> in fact.) On such systems, not using Xft/fontconfig for Mozilla makes
> no more sense than not using the Win32 font API on Windows.

Can we agree that "vast majority" is 95%? Or is this too high?
The question here is "what percentage of users is it okay to cut off?".

Whatever percentage we agree represents "vast majority" we need to look at
what percentage of systems in the field today have Xft?

When will the number of systems with Xft reach 50%, 75%, 90%, 95%?

What about FontConfig?

I know it sounds easy to add a new library to moz but I don't suppose you
were around when Darin tried to start using uconv.
http://bugzilla.mozilla.org/show_bug.cgi?id=129279
Uconv has been out for years and they still had problems getting it to
work on all the various versions of Unix.

Using a new library seems like an easy thing but getting the all the details
are done is difficult.

The easiest to get Xft in moz without losing features is to integrate Xft
into the current code and use the best features of both. Doing it this way
we get minimal developer impact and we do not lose features.
Repeating my question; I'm a regular mozilla 1.0 xft experimental build user.
Will someone release a 1.1 build with xft support on 

http://ftp.mozilla.org/pub/mozilla/nightly/experimental/xft/Red_Hat_7x_RPMS/

?
I'll try to make some 1.1 rpms this week, assuming I find the time to finish the
major parts of my patch.
> > If Mozilla binaries are made available for these systems, fontconfig/Xft
> > binaries can be provide at the same time. If binaries aren't available for
> > Mozilla, I don't see how they are needed for Xft/fontconfig.
> 
> Mozilla/Netscape _is_ being distributed in binary form to new and older
> Unix/Linux systems. Xft/FontConfig needs to get a similar distribution
> system in place.

I suspect that Keith would be happy to put binary packages on his site
if people provided them; however, distributing them in the same place
as the Mozilla binary packages makes quite a bit of sense to me.

[...]

> > > 2) Has Xft released a version with support for non Xrender systems?
> ...
> > Should be released this week.
>>
> > > 3) FontConfig has not (yet) been released. The posting I've seen indicate
> ...
> > Should be released this week
>
> It will be good to see them finally get some field time.

Xft2 and fontconfig are a central part of the current Red Hat betas, which
have thousands of of users. We are using them as the only
rendering engine for both GTK+ and Qt. This is not exactly "unused code".

> > > 4) Does Xft/FontConfig support MathML?
>>
> > If fonts are encoded using some sort of standard,it should just be
> > a layout level issue. If it involves recognizing specific fonts, and
> > knowing how they are encoded, it will be a little bit difficult to
> > fit that sort of hackery on top o fthe fontconifg framework, though
> > Mozilla could certainly just ask for those fonts specifically.
>
> I do not particularly care how it is done but I do not want to lose this
> feature. Perhaps someone can convince Roger Sidje to add MathML support
> to Xft/FontConfig.

It seemed to me that the big stumbling block earlier was just
that people weren't sure how MathML fonts should be encoded. 
If we can get the Xft code into the tree, people will be able
to start playing with the the combination instead of just
theorizing about it.

> > > 5) When doing fallback font lookup does Xft/FontConfig distinguish
< > >    between special characters like CJK (wide) smart quotes and western
> > >    (narrow) smart quotes and choose the appropriate one for the
> > >    document's language?
> >
> > If it's a matter of font selection, fontconfig will reorder it's choice
> > of fonts based on language tag. If it's a matter of code point selection,
> > then it's a layout level issue, not a fontconfig/Xft issue.
> 
> Agreed, this is a font selection issue. It is still a requirement that
> needs to be satisfied and I am curious not if FontConfig can do this but
> if FontConfig does do this. This is an easy one, just get it in FontConfig
> and lets be done with the discussion.

If your language tag is "ja-jp", then fontconfig favours fonts that support
Japanese, if your language tag is "en-us", then fontconfig does not
do such reordering of the fallback fonts. This should be sufficient
handling for ambiguious width characters.

> > > 10) Does Xft/FontConfig have a way to ban ugly X fonts? Unfortunately, there
> > >     are a fair number of bad looking X fonts.
> >
> > fontconfig is a separate font database from the core X system, so generally
> > the solution is simply not to have these fonts in the database. I'm not
> > sure I understand this question completely, though.
> 
> There are some bad looking fonts (the URW fonts come to mind). How will it
> be managed so the novice user does not see these? This is an easy one, I
> just want to know that it is actually done.

The main URW fonts render quite well here, thank you. (I've fixed
a bunch of Freetype Bugs that were causing glitches with their 
rendering.) If the novice shouldn't see a font, then I don't 
know why it is in the fontconfig catalog. It doesn't seem to me
that a blacklist mechanism is necessary.

> > > 12) Does Xft/FontConfig support transliteration? Ie: what does 
> Xft/FontConfig
> > >     do for characters like copyright when no font has a copyright symbol?
> >
> > Layout issue, not an Xft issue. The layout layer can find if the font has
> > a copyright symbol or not with no problem.
> 
> In mozilla the layout code does layout not character transliteration.
> Regardless of where it is done this feature needs to be retained.

I guess there is confusion here. By "layout" I mean the level above
Xft. The thing in Pango's place. You clearly are thinking of the
Mozilla layout engine.

> > > 13) Does Xft/FontConfig support a way for the font developer(s) to debug
> > >     what fonts are being selected by a users system? This is important
> > >     because the fonts installed on users' systems varies widely and it is 
> not
> > >     always possible to reproduce a user's problem on a developer's system.
> >
> > Yes.
> 
> Could you provide details? How does a font maintainer find out what fonts
> are being used on the user's system?

 fc-list lists the full set of fonts
 FC_DEBUG=[number] will provide as much detail as you want on matching

> > > 14) Does Xft/FontConfig support Indic shaping? We have work in progress
> > >     here.
> >
> > Layout issue, not an Xft issue; Pango, for example, has quite complete Indic
> > OpenType support on top of Xft.
>
> This is not a layout issue. Layout should deal with the Unicode character
> values not the glyph numbers. The handling of ligatures in moz belongs at
> the font subsystem layer.

Again, confusion over the term "layout".

> > > 15) Does Xft/FontConfig support embedding Truetype fonts in Postscript
> > >     printing output? We have work in progress here.
> >
> > You have access to the font files and FT_Face objects, I don't see how this
> > is otherwise relevant to Xft/fontconfig. There has been discusison of
> > finding a way to share the code for this between all the different users
> > of fontconfig, but using fontconfig certainly doesn't hinder Mozilla
> > from going its' own way here.
> 
> It does in the sense that the proposal here currently plans to rip out the
> code that the printing work currently uses. This is an important feature and
> we should not lose it.

I'd think with just a bit of cooperation, code that can be shared
could be moved to a common place. 

[...]

> > The reason we need Xft/fontconfig support in Mozilla is simply that it will
> > shortly be  *the* font system on the majority of Linux and Unix systems.
> > (We could argue how big that majority is; I'd say "vast majority"
> > in fact.) On such systems, not using Xft/fontconfig for Mozilla makes
> > no more sense than not using the Win32 font API on Windows.
> 
> Can we agree that "vast majority" is 95%? Or is this too high?
> The question here is "what percentage of users is it okay to cut off?".

Why do you think that adding Xft/fontconfig support is cutting
people off? Because they won't be able to compile Xft/fontconfig
on their system? Because their system will be too slow to
use anything but core X fonts?

> Whatever percentage we agree represents "vast majority" we need to look at
> what percentage of systems in the field today have Xft?
> 
> When will the number of systems with Xft reach 50%, 75%, 90%, 95%?
> 
> What about FontConfig?

Xft2 and fontconfig go together. Right now, the percentage of systems
with Xft2 is miniscule. But every system that runs with XFree86
will get Xft2 when upgraded to XFree86-4.3. Every Red Hat system
will have Xft2 as of the next release. By sometime next year,
more than 95% of new Unix and Linux installs will be Xft2 and
fontconfig based. Pushing Xft2 and fontconfig to older systems
will depend on whether software people want to use requires it.

> I know it sounds easy to add a new library to moz but I don't suppose you
> were around when Darin tried to start using uconv.
> http://bugzilla.mozilla.org/show_bug.cgi?id=129279
> Uconv has been out for years and they still had problems getting it to
> work on all the various versions of Unix.
> 
> Using a new library seems like an easy thing but getting the all the details
> are done is difficult.

> The easiest to get Xft in moz without losing features is to integrate Xft
> into the current code and use the best features of both. Doing it this way
> we get minimal developer impact and we do not lose features.

I'm really not catching why this is the case. As I understand
it, Chris's proposal is to add conditional compilation between:;

 - Current X + freetype code
 - Xft2

With a clear separation between the two code bases, while your
proposal is to add conditional #ifdef support for Xft support
mixed in with the current code?

Since I don't see any reason anyone would want to:

 - Mix core X fonts with Xft
 - Runtime switch betweeen freetype and Xft

The only advantage I see of your approach is that a user could
possibly choose to start up Mozilla using core X fonts,
if their Xft configuration wasn't working, or performance
turned out to be a problem with Xft.

But even if startup-time switching was desired, it seems
to me that separated code bases would be easiest. The advantages
of separated code bases are:

 - If Xft support turns out to be a disaster, it could be dropped
   with minimal disruption.
 - If Xft support works out well, the old font code could
   be removed with minimal distruption.
 - The Xft codebase doesn't need to conform exactly to the 
   structure of the current code or vice versa.
 - Allowing mixed runtime operation simply makes everything
   more complex -- you are switching over the type of font
   all over the place.

Of course, regressions in functionality are a bad thing, and
code that is still useful in Xft codebase should be reused,
but even here, separating things out seems like a good
thing:

 - the Xft codebase won't be blocked until feature parity
   is reached, or won't require broken stubs all over
   the place.
 - It will make it easy to check for parity, instead of wondering
   what backend is rendering some AA font.
 - People who need the more obscure features that might be
   temporarily lost can simply use the old code; vendors,
   whether Netscape, or Red Hat, will be able to switch
   when they feel the Xft code is ready (if that ever happens)
   without worrying about leakage of brokeness.
>  - Runtime switch betweeen freetype and Xft

Actually, my patch allows for this to happen quite easily.  I had planned to
make it possible to choose at runtime via a pref whether or not to use Xft,
assuming that you had built with the code with both enabled (which is also
supported.)
> > There are some bad looking fonts (the URW fonts come to mind). How will it
> > be managed so the novice user does not see these? This is an easy one, I
> > just want to know that it is actually done.
>
> The main URW fonts render quite well here, thank you. (I've fixed
> a bunch of Freetype Bugs that were causing glitches with their
> rendering.) If the novice shouldn't see a font, then I don't
> know why it is in the fontconfig catalog. It doesn't seem to me
> that a blacklist mechanism is necessary.

Its the URW X bitmap fonts that look bad. If you've ever wondered why
mozilla's X font pref includes the foundry its because that is the way
Erik choose to let the user select Adobe X fonts over URW X fonts of the
same name.

> > > > 12) Does Xft/FontConfig support transliteration? Ie: what does
> > Xft/FontConfig
> > > >     do for characters like copyright when no font has a copyright 
symbol?
> > >
> > > Layout issue, not an Xft issue. The layout layer can find if the font has
> > > a copyright symbol or not with no problem.
> >
> > In mozilla the layout code does layout not character transliteration.
> > Regardless of where it is done this feature needs to be retained.
>
> I guess there is confusion here. By "layout" I mean the level above
> Xft. The thing in Pango's place. You clearly are thinking of the
> Mozilla layout engine.

Yes, in the context of adding Xft to mozilla I hope we can agree that the
term "layout" refers to mozilla's layout.

> > > > 15) Does Xft/FontConfig support embedding Truetype fonts in Postscript
> > > >     printing output? We have work in progress here.
> > >
> > > You have access to the font files and FT_Face objects, I don't see how 
this
> > > is otherwise relevant to Xft/fontconfig. There has been discusison of
> > > finding a way to share the code for this between all the different users
> > > of fontconfig, but using fontconfig certainly doesn't hinder Mozilla
> > > from going its' own way here.
> >
> > It does in the sense that the proposal here currently plans to rip out the
> > code that the printing work currently uses. This is an important feature and
> > we should not lose it.
>
> I'd think with just a bit of cooperation, code that can be shared
> could be moved to a common place.

The plan is to put the part that is specific to the direct FreeType2 code
and Xft behind an IDL interface. This way the code does not need to know
where the information came from.

> [...]
>
> > > The reason we need Xft/fontconfig support in Mozilla is simply that it 
will
> > > shortly be  *the* font system on the majority of Linux and Unix systems.
> > > (We could argue how big that majority is; I'd say "vast majority"
> > > in fact.) On such systems, not using Xft/fontconfig for Mozilla makes
> > > no more sense than not using the Win32 font API on Windows.
> >
> > Can we agree that "vast majority" is 95%? Or is this too high?
> > The question here is "what percentage of users is it okay to cut off?".
>
> Why do you think that adding Xft/fontconfig support is cutting
> people off? Because they won't be able to compile Xft/fontconfig
> on their system? Because their system will be too slow to
> use anything but core X fonts?

Its not a developer issue.

The "cut off" occurs if we _drop_ support for core X fonts and the user's
system does not yet have Xft/FontConfig.

> > Whatever percentage we agree represents "vast majority" we need to look at
> > what percentage of systems in the field today have Xft?
> >
> > When will the number of systems with Xft reach 50%, 75%, 90%, 95%?
> >
> > What about FontConfig?
>
> Xft2 and fontconfig go together. Right now, the percentage of systems
> with Xft2 is miniscule. But every system that runs with XFree86
> will get Xft2 when upgraded to XFree86-4.3. Every Red Hat system
> will have Xft2 as of the next release. By sometime next year,
> more than 95% of new Unix and Linux installs will be Xft2 and
> fontconfig based. Pushing Xft2 and fontconfig to older systems
> will depend on whether software people want to use requires it.

Mozilla should continue to run on the older systems and if/when a user
add Xft/FontConfig mozilla should automatically start using it.

This means 2 things:

 1) We need to retain our support for the core X fonts until some high
    percentage of systems have Xft/FontConfig. Once the percentage of
    users with Xft/FontConfig is high the older code will atrophy naturally
    from lack of interest.

 2) all versions of mozilla should have Xft/FontConfig support built in
    and moz should be able to use both at once.

> > The easiest to get Xft in moz without losing features is to integrate Xft
> > into the current code and use the best features of both. Doing it this way
> > we get minimal developer impact and we do not lose features.
>
> I'm really not catching why this is the case. As I understand
> it, Chris's proposal is to add conditional compilation between:;
>
>  - Current X + freetype code
>  - Xft2
>
> With a clear separation between the two code bases, while your
> proposal is to add conditional #ifdef support for Xft support
> mixed in with the current code?

I propose a runtime switch that would work just like the direct FreeType2
code:

  if Xft is there then use it

> Since I don't see any reason anyone would want to:
>
>  - Mix core X fonts with Xft

This is an easy one: not every user has all fonts in all languages
Moz should be able to use all the fonts that are available.

>  - Runtime switch betweeen freetype and Xft

I'm not interested in a runtime switch between the direct FreeType2
code and Xft; if Xft is available there is no reason to use the direct
FreeType2 code. I'm interested in being able to use both the current
core X font code and Xft simultaneously.

> The only advantage I see of your approach is that a user could
> possibly choose to start up Mozilla using core X fonts,
> if their Xft configuration wasn't working,

Yes, moz needs to startup even if Xft is not available/working. Lets not
have multiple executables with the same name but lacking such basic
features.

> or performance turned out to be a problem with Xft.

I think we can all agree that Xft's performance is likely to be
better than the current direct FreeType access code.

> But even if startup-time switching was desired, it seems
> to me that separated code bases would be easiest. The advantages
> of separated code bases are:
>
>  - If Xft support turns out to be a disaster, it could be dropped
>    with minimal disruption.

Its not likely to be a disaster. However, its availability on every system
will be an issue for a long time to come. Lets make a plan where this
does not interfer with getting Xft into mozilla.

>  - If Xft support works out well, the old font code could
>    be removed with minimal distruption.

By allowing the current core X font code to work simultaneously we can put
Xft support in all moz X products now and the issue of how long it takes
for Xft's deployment into the field is not an issue for mozilla. In this
way mozilla continues to "just work". Once Xft is on the vast majority of
users' systems then we can pull out the old code.

>  - The Xft codebase doesn't need to conform exactly to the
>    structure of the current code or vice versa.

Why is this important?

Are there reasons why this would be considered more important than
not disrupting the user?

>  - Allowing mixed runtime operation simply makes everything
>    more complex -- you are switching over the type of font
>    all over the place.

Yes, exactly, moz should be able to use all the font resources on a system
to provide the best text display. An alternate would be if someone setup
a font distribution system where all the commonly needed fonts could
automatically be downloaded. This is one of the ways Microsoft solved their
deployment issue and it would be a great alternative but I do not see this
on the horizon for the X market.

> Of course, regressions in functionality are a bad thing, and
> code that is still useful in Xft codebase should be reused,
> but even here, separating things out seems like a good
> thing:
>
>  - the Xft codebase won't be blocked until feature parity
>    is reached, or won't require broken stubs all over
>    the place.

How/why would Xft need to be blocked if it can work simultaneously with the
core X font code?

>  - It will make it easy to check for parity, instead of wondering
>    what backend is rendering some AA font.

I've always suggested that Xft preferred over the direct FreeType2 code.
However, regardless of what form of FreeType2 based font code moz uses
moz should still be able to access the core X fonts.

>  - People who need the more obscure features that might be
>    temporarily lost can simply use the old code; vendors,
>    whether Netscape, or Red Hat, will be able to switch
>    when they feel the Xft code is ready (if that ever happens)
>    without worrying about leakage of brokeness.

I do not want a "switch" point driven by the _supplier_. As the needed
libraries are available then the feature should begin working in moz.
The current Xft mozilla already suffers from this design; users can
either:

 have Xft in a really old version of mozilla

or

 have a current mozilla and no Xft

We need to get Xft working with the current code and building in all
versions. It needs to run when it can; ie: as Xft/FontConfig are deployed.
OK, I'm not going to quote that whole long message because it's getting out of
hand.  There seem to be a few major stumbling points here:

o Brian wants the ability to load Xft and fontconfig at runtime instead of
linking against it directly.

I don't personally think that this is a great idea, but I'm not passionate about
it.  The simple fact is that the code that would be required to build a big
dispatch table is relatively trivial and shouldn't be an item to prevent this
code from going into the tree.  It's something that can be fixed later.  It's a
couple hundred lines of code, at the very most.

o Simultaneous use of core fonts and fontconfig.

This is the big stumbling block.  I'll come out and say it - I have zero
interest in trying to mix fontconfig's matching results and the current core
matching code.  There will be user impact here, yes, but if they already have
fontconfig on their systems it can be assumed that they already have their fonts
set up properly and they don't need the core infastructure anymore.  Fontconfig
is a replacement for the core fonts, not an additional mechanism for selecting
fonts to mix with core font selection.

I realize that there will be some user impact here, but it shouldn't be too bad.
 It's perfectly acceptable to me and our beta Red Hat users who have made the
switch to entirely fontconfig based systems and they aren't screaming their
heads off yet, so we have to be doing something right.

It's important that Mozilla match exactly the same as all the other applications
on the desktop when it comes to choosing which fonts go with which families and
aliases.  If Mozilla is using an entirely different mechanism for matching,
which is what you are suggesting, this won't be the case and Mozilla will
continue to integrate poorly into the Unix desktop.

o Interfaces for printing

The interfaces that I've seen are all based around using the current matching
algorithms.  The interfaces describe the fonts - sizes, families, etc.  They
assume that you will doing your matching by hand.  At least, that was the last
time I looked.

o Confusion over what mozilla is - supplier?

I see some confusion about not wanting to have to wait for a "supplier" in order
to get new functionality.  I think this shows a pretty fundamental
misunderstanding of what Mozilla is and what our roles are.

Mozilla is not an end user application.  Period.  We do not cater to end users,
we do not make builds with end users in mind.  The only reason that we build
binaries and put them on an ftp server at all is so that QA is easier.  Some of
our QA team is made up of people who might be considered end users, but don't
let that fact confuse you into believing that we are an end user product.  We're
not.

So, your exasperated comment about having to wait for suppliers in order to get
code into the field makes almost no sense whatsoever.  Of course, we want have
to wait for suppliers to get code into the field!  They are the best way to do
so.  What this means is that each of the suppliers (really, we call them mozilla
distributors) gets to make their own decision about when they want to ship what
features.

So, for example, Red Hat will probably be one of the first shipping Xft and Gtk2
because our next release will be all set up to handle it.  We'll be able to have
a completely configured system ready to drop mozilla into.  We have that luxury
and we should be able to do that with the Mozilla code.

Sun, on the other hand might want to ship Gtk2 for accessibility reasons but
they don't have Xrender in their servers and don't ship fontconfig or Xft at
this point (but will have to soon if they want a version of Gtk2 that works in
the future.)  They probably won't ship Xft any time soon.  The prefer core fonts
+ freetype because it's a good match for their system.

Netscape, on the other hand, might want to hold off since they need to work on a
wider variety of hardware because they aren't system integrators - they
distribute end user applications - so compatibility is more important than what
features are included.

So, when you think about who your target audience is it's important that you
understand that there are more people out there than just Netscape.  There are
also people who are ready to make the final switch and have the infastructure in
place to do it.  Eventually, the rest of the world will catch up and we will be
able to remove the core code entirely, but I know that's not going to happen any
time soon which is why I'm creating this careful seperation of the two code bases.

o Do we want to build Xft by default into Mozilla?

The answer to the last question leads to this one.  And at this point, I don't
have an easy answer.  I guess that my immediate answer would be 'no' since as
the patch stands right now you have to link directly.  But eventually, once some
of the build boxes have xft installed and I set up a patch that does dynamic
loading, we can.  I don't mind that at all.  It widens our test coverage and
makes my job easier in the end since I'm going to be supporting this code.

In conclusion, I'll just say that I think that fontconfig and Xft are up to the
task to be both the selection and rendering component for Mozilla.  Red Hat's
experience with our next release has shown this to be true.  And the relatively
minor user impact isn't enough to prevent the code from going into the tree
using the current design IMHO.
Note that in the Red Hat Linux release we're winding up now, and in all future
releases, it's a bug if an app uses both fontconfig fonts and core X fonts; 
we have moved the old PCF fonts we want to use into fonts.conf so fontconfig 
will find them, and if duplicate or extra fonts not found in fonts.conf show up
in the UI then it's a bug. Neither GTK2 nor Qt3 will use core fonts under any
circumstances in our release. If we wanted the old fonts to appear, we would put
them in fonts.conf.

So I would appreciate an easy way to make Mozilla work in this environment, as
it's broken for users if the list of available fonts is different in Mozilla vs. 
other applications. Mozilla needs to display exactly the same set of fonts 
displayed by GTK2 and Qt3 font selectors or it's confusing. This is the purpose
of fontconfig, to get every toolkit on the same font framework.

(On a more editorial and less factual note, I don't think merging the two 
font backends ever makes sense; having both available yes, using both at once, 
no. But even allowing both at once is fine from my point of view as long as
there's a way to set it up so that core X fonts are entirely ignored - not
loaded, no extra overhead from them, not displayed to the user.)
Similarly, the next release of Ximian Desktop will feature GTK 2.0 and Pango 1.1
with the Xft2/fontconfig backend across all of our supported platforms (perhaps
with the exception of Solaris), and it will be the *only* method that all of our
GTK and GNOME-based apps use.  When an Xft-enabled Mozilla lands, we will start
shipping it, and we likely won't even enable the core X font backend in the
build at all (and definitely not at runtime).

From a desktop integration standpoint, it's absolutely paramount that a single
font mechanism exist across the whole desktop, in all applications.  This is the
entire reason why fontconfig exists today.  We're taking a similar approach to
Red Hat in that all of the PCF fonts will be added to the fontconfig catalog, so
I agree with Havoc in that it would make our lives a lot easier if we didn't
have to patch that out in our Mozilla builds.
Joe: If you want apps to stop using core X fonts you could just remove all the 
core X fonts from the X server (excluding "fixed" which is required).
Removing core X fonts from the server isn't right, because you want old 
apps to keep working, while making progress with new apps. Plus Ximian doesn't 
usually replace the X server, only the desktop.
We can always dream.
> o Simultaneous use of core fonts and fontconfig.
> 
> This is the big stumbling block.  I'll come out and say it - I have zero
> interest in trying to mix fontconfig's matching results and the current core
> matching code.

Why would mozilla intentionally want to produce a version that is incompatable
with all previous versions of Redhat?

I can certianly see how it might fit with Redhat's goals but for mozilla it adds
an unwanted burden to mozilla's font development, font maintenace, build system, 
distribution system, and bug tracking system. 

Having 2 versions of mozilla for Redhat that work on some systems but not
others adds a level of user confusion.

The proposed Xft only version will lose features like MathML and AASB (which is 
important for CJK users).
My request is just that we have an easy way for the mozilla that's _included_
with _newer_ versions to use fontconfig/Xft2 only. (And of course the
fontconfig/Xft2 version should plan to support MathML and AASB.)
> Why would mozilla intentionally want to produce a version that is incompatable
> with all previous versions of Redhat?
> 
> I can certianly see how it might fit with Redhat's goals but for mozilla it adds
> an unwanted burden to mozilla's font development, font maintenace, build system, 
> distribution system, and bug tracking system. 

This is exactly the misunderstanding that I was talking about.  Mozilla does not
ship to end users.  Netscape ships to end users.  Red Hat ships to end users. 
So, you need to re-ask the question differently:

Q: "Why would Netscape want to produce a version that is incompatible with all
previous versions of Red Hat?"

A: I don't know, I don't speak for Netscape.  But I can guess.  I would guess
that Netscape probably wouldn't want to ship something that was incompatible
with previous versions.  And I'm not asking them to do anything like that.

ok, the other side of the story:

Q: "Why would Red Hat want to produce a version that is incompatible with all
previous versions of Red Hat?"

A: Easy, we don't have to worry about it because we can take an entire system
view.  We want to ship this as part of our entire platform and we can set the
capibilities for the platform to include Xft and therefore we don't have to
worry about previous versions Red Hat.

So, as you can see, the scenarios that we are arguing for are very different.

There's also the opposite of this question: "Why would Mozilla want to produce a
version that isn't compatible with any new versions of Red Hat?"  It would be an
important question, if Mozilla were shipping to end users.

There's the issue of support and integration, of course.  This isn't without
cost to you, and I realize that.  But I've done as much as I can to seperate the
two code bases so you can work on what you need to and I can work on what I need
to as part of my job.  I'm minimized the impact to you ask much as possible.

What else can I do?  This code isn't going to go away, that's for sure and
you're seriously risking a pretty big fork if you're going to reject it out of hand.

> Having 2 versions of mozilla for Redhat that work on some systems but not
> others adds a level of user confusion.

No, it doesn't because Red Hat ships exactly one version.  In fact, for Red Hat
it's pretty bad because Mozilla has a completely different set of fonts for
everything than all the rest of the desktop.  Not having this code in is causing
more problems than are supposedly caused by including them.

> 
> The proposed Xft only version will lose features like MathML and AASB (which is 
> important for CJK users).
> 

MathML I can fix, even if it's a solution that's explicitly for MathML.  I'm not
concerned about that at all.

AASB I'm not too worried about, either, since we do AA and from a system
standpoint we have a somewhat decent set of fonts.  Not perfect, but certainly
good enough given what it's replacing.  Once again, these things are important
from Netscape's standpoint, for sure, but I'm not Netscape.  Plus, all of us on
the Xft side of the fence would like to see a generalized solution to this in
freetype/Xft instead of a one-off solution for a single application.  I'm 100%
sure that Keith and friends would love to see this integrated into Freetype and
Xft.  You're more than welcome to help.
Chief Lizard Wrangler Mitchell Baker had this to say on the point now being argued:

"Mozilla releases are intended for the development community rather than the
general consumer market. Mozilla.org is not set up for marketing, distribution
or support for the consumer market; we rely on companies building Mozilla
products to do that. So we're not expecting millions of consumers to rush out
and test Mozilla. The end-user applications in Mozilla (browsing, mail, news and
chat) are end-user quality, but we don't have the organization to reach this
market. So we're not expecting millions of consumers to download and review Mozilla.

"That being said, Mozilla does have an end-user community. It includes both
developers who use Mozilla technology for their projects, and people who simply
want the browsing, mail news and chat applications we offer. It's important that
Mozilla 1.0 be useful both to people who want to use the applications and to
people who use Mozilla technology to build products. Good reviews are one
measure of this."

See <http://newsforge.com/newsforge/02/05/10/1356208.shtml>. I'll leave the
interpretation to you, though it seems obvious enough to me.
Mitchell and I are in violent agreement.
Xft and fontconfig 2.0 is now available from: http://nexp.cs.pdx.edu/fontconfig/ .
Fontconfig 2.0 is supposed to be available from http://fontconfig.org, but the
DNS hasn't caught up yet.  The existing hostname (nexp.cs.pdx.edu) will probably
change in the next couple of days, so I was waiting for a more stable name
before making an official announcement.
What does "in violent agreement" mean?

Chris, you say: "Mozilla is not an end user application."

Michelle says: "Mozilla does have an end-user community. It includes ... people 
who simply want the browsing, mail news and chat applications we offer"

Aren't these in conflict?
> Chris, you say: "Mozilla is not an end user application."
> 
> Michelle says: "Mozilla does have an end-user community. It includes ... people 
> who simply want the browsing, mail news and chat applications we offer"
> 
> Aren't these in conflict?

(Mitchell, as a lawyer, would love me for this.)

No.  We don't produce Mozilla to be an end user product.  As a result of our QA
process we just happen to produce something that's usable by end users so we end
up with a community of people who look like end users.
Market share of IE:      96.0% (or something like that)
Market share of Mozilla:  0.4% (or something like that)

Does Mozilla has an end-user community?  Yes.
Is Mozilla an end-user application?  No.

That's one way to explain the agreement...
I donot know IE has such a large community.
Can you tell me where you got this statistic? Or you mean only on Windows  System?
I found most of the user of Unix/Linux are using Netscape/Mozilla.
The links:
    http://news.com.com/2100-1023-955734.html                                       
    http://zdnet.com.com/2100-1104-938865.html                                     
    http://maccentral.macworld.com/news/0112/19.linux.php

However, the actual numbers are not important.  I've been using
Mozilla since M18, and everyone here must also be a long-time Mozilla
user (or even developer).  However, the vast majority of "end users"
still uses IE.  The reason is _not_ that IE is 240 times better than
Mozilla.  It's because IE is bundled with the OS (updating through
Windows Update is also considered "bundled with ths OS", IMO).

And that's where distributions like Red Hat come in.  If/when Red Hat
grabs N% desktop users from MS, "the browser bundled with Red Hat"
simply gets N% market share (and becomes an "end-user application").
>> 9) Does Xft/FontConfig support Korean precomposed Hangul using hanterm fonts?

> Do you mean "composing Jamos on the fly" as opposed to using precposed
> syllables? This is basically a layout level issue, though depending on
> what fonts you are talking about, there might be some connection to
> the custom encoding question.

  Owen, you have this implemented in Pango (perhaps thanks to Changwoo Ryu) :-)
What Brian wrote about is on-the-fly generation of glyphs for Hangul syllables 
(both a full set of modern precomposed syllables in U+AC00 block and a subset of
pre-1933 orthography syllables) using a BDF font with glyphs for multiple sets
of glyphs for Hangul Jamos.  The relevant file in Mozilla source is
http://lxr.mozilla.org/seamonkey/source/intl/uconv/ucvko/nsUnicodeToX11Johab.cpp
As you wrote, there's a connection to the custom encoding (in this case,
'johab-0', 'johabs-0' and 'johabsh-0' : the last two fields of XLFD). 
Although it's nice to have this, the importance of this feature got diminished
with the availablity of iso10646-1 encoded (both as X11 core fonts and TTF)
fonts. (see http://jshin.net/i18n/korean/hunmin.html. the content of
the page is outdated in that it does not yet mention the changes brought about
by James Kass' new CODE2000 font that enabled Mozilla-Windows and
Opera-Windows to render the page more or less legibly.)



> I've never seen a TrueType or postscript
> font for use with combine-on-the-fly Jamos, so it's hard to say if 
> Xft could handle such a font or not. I suspect it could.

  In case of TTF/PS fonts with _custom_ encodings(there are some 
in Korean LaTeX package. MS Office 2000 also has a couple of 
such fonts for pre-1933 orthography syllables. Ogulim.ttf, Obatang.ttf,
Odotum.ttf), I'm not sure if Xft has to deal with it or a higher layer has to 
handle it (e.g. Pango).  

 BTW, I found that Mozilla-Xft (with Chris' patch) has a problem
not present in Mozilla-FT2(directly accessing truetype fonts) when
it comes to rendering pre-1933 Korean text with the newest
version of James Kass' CODE2000 font with glyphs
for Hangul Jamos(U+1100) made in such a way that
simple-minded overstriking them does the magic of forming
many (not all) syllables out of glyphs for Jamos (eventually,
gsub/morph and other OT tables have to be used)

http://linux.mizi.com/~ganadist/gedit.png            (gedit with gtk2 ,
fontconfig rc3)
http://linux.mizi.com/~ganadist/moz.png              (Mozilla-Xft,    fontconfig
rc3)
http://jshin.net/i18n/korean/hunmin_moz_ft2.jpg   (Mozilla-FT2)

U+115F(Hangul Choseong filler) and U+1160(Hangul Jungseong filler) 
in the first and third screenshots  are rendered as non-spacing(and empty) 
as they should be. In the second screenshot,they're apparently
rendered with '.notdef' glyph (hollow box). Because gedit works correctly
with the same version of fontconfig package as used for Mozilla-Xft,
I guess it's XFt patch that needs some fixing in this regards. Perhaps, it should
be a simple fix, but I couldn't figure out how to fix. Anyway, 
it'd be nice to see this taken care of because it's  important for Korean users 
who wish to view pre-1933 Korean text. 

G'd day, if this isn't the right place to ask, please, redirect me to the proper
URL.
Thank you very much in advance.

My goal is to compile Mozilla with XFT support like the RPM package provided by
Blizzard some time ago for Red Hat boxes (I'm using RH 7.2). I have not found any
RPM for the new Mozilla versions, so I have to built it myself. I've installed
Keith 
Packard's fcpackage-2.0 and then used the  following patch 
       http://fontconfig.org/mozilla/patches/mozilla.2002-08-02.diff
with Mozilla 1.1b (Mozilla refuses to apply the patch to a newer version).

So far so good, but when I type: 

             gmake -f client.mk build 

it starts building the Lizard until the following error appears:

../../../dist/include/gfx/nsRenderingContextImpl.h:137: warning:   by 
`nsRenderingContextImpl::DrawImage (imgIContainer *, const nsRect *, const
nsPoint *)'
In file included from /usr/include/gtk-1.2/gdk/gdktypes.h:33,
                 from /usr/include/gtk-1.2/gdk/gdk.h:31,
                 from /usr/include/gtk-1.2/gtk/gtk.h:31,
                 from nsDrawingSurfaceGTK.h:46,
                 from nsRenderingContextGTK.h:56,
                 from nsDeviceContextGTK.h:48,
                 from nsFontMetricsGTK.h:42,
                 from nsFreeType.cpp:45:
/usr/include/glib-1.2/glib.h:1308:23: warning: ISO C does not permit named
variadic macros
/usr/include/glib-1.2/glib.h:1311:25: warning: ISO C does not permit named
variadic macros
/usr/include/glib-1.2/glib.h:1314:26: warning: ISO C does not permit named
variadic macros
/usr/include/glib-1.2/glib.h:1317:25: warning: ISO C does not permit named
variadic macros
In file included from nsDrawingSurfaceGTK.h:56,
                 from nsRenderingContextGTK.h:56,
                 from nsDeviceContextGTK.h:48,
                 from nsFontMetricsGTK.h:42,
                 from nsFreeType.cpp:45:
/usr/X11R6/include/X11/Xft/Xft.h:236: type specifier omitted for 
parameter
/usr/X11R6/include/X11/Xft/Xft.h:236: parse error before `,'
gmake[5]: *** [nsFreeType.o] Error 1
gmake[5]: Saliendo directorio
`/home/chessy/appz/internet/navegadores/mozilla/mozilla-source-1.1a/mozilla/gfx/src/gtk'

Any help would be very much appreciated. 

   Juanan Pereira    (Chessy)
Attached file checkpointing changes (obsolete) —
Checkpointing changes again.  Catch up with the tip from a long absence.  Need
to re-merge the freetype code and fix some non-latin text issues.

(this is a gzipped patch)
Attachment #94891 - Attachment is obsolete: true
Any hope for a binary build or rpms now?
1) You claim copyright for code that was moved from existing files. This code 
was written by others; eg:

RCS file: /cvsroot/mozilla/gfx/src/gtk/nsFontMetricsGTK.cpp,v

- * The Initial Developer of the Original Code is 
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
+ * The Initial Developer of the Original Code Christopher Blizzard
+ * <blizzard@mozilla.org>.  Portions created by the Initial Developer
+ * are Copyright (C) 2001 the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
- *   Pierre Phaneuf <pp@ludusdesign.com> 
- *   Roland Mainz <roland.mainz@informatik.med.uni-giessen.de>
- *   Brian Stell <bstell@ix.netcom.com>
- *   Morten Nilsen <morten@nilsen.com>
- *
  *

These changes are factually incorrect, insulting to the developers who wrote 
this code, and attempt to steal copyright rights that belongs to others.

2) There is a large amount of moving of code from one file to another. By moving 
the code you lose the cvs history. There needs to be a very strong reason to 
justify losing the history.

3) You have renamed files which will make it much harder for others who have 
experience in the code to help fix bugs. Are you planning to take responsibility 
for fixing *all* font bugs? If not, there will need to be a strong reason
to rename files.

4) If you are really going to use FontConfig you probably do not want to use 
FFRE. That is a bit of history that is very related to historical X fonts. You 
probably to put the switch somewhere in the nsRenderingContextGTK.cpp code 
long before it calls into the nsFontMetricsGTK.cpp code.
> 1) You claim copyright for code that was moved from existing files. This code 
> was written by others; eg:
> [...]
> These changes are factually incorrect, insulting to the developers who wrote 
> this code, and attempt to steal copyright rights that belongs to others.

...and are almost certainly a simple error.  But you never know -- that blizzard
has been known to attempt to "steal copyright rights" from so many people in the
past!

You do yourself a disservice with lunacy like this, Brian.
> These changes are factually incorrect, insulting to the developers who wrote 
> this code, and attempt to steal copyright rights that belongs to others.

I meant to re-add the contributors, I just forgot.  Simple oversight there.  As
for the copyright assignment, when I started this patch I started with a
completely fresh nsFontMetricsGTK.cpp.  No code.  That's why the license header
is new - it's my template.  I pulled in bits and pieces from the old code here
and there but the code is almost entirely new.

> 
> 2) There is a large amount of moving of code from one file to another. By moving 
> the code you lose the cvs history. There needs to be a very strong reason to 
> justify losing the history.

It's totally worth it.

> 
> 3) You have renamed files which will make it much harder for others who have 
> experience in the code to help fix bugs. Are you planning to take responsibility 
> for fixing *all* font bugs? If not, there will need to be a strong reason
> to rename files.

Oh, come on.  One thing does not lead to the other.  The code that was in
nsFontMetricsGTK.cpp and nsRenderingContext.cpp are both in
nsFontInstanceCore.cpp.  If anything the code paths are cleaner than they were
before.  I've said it before and I'll say it again.  The code is largely the
same.  Anyone who was able to support the old code should be able to support
this as well, without problems.

> 
> 4) If you are really going to use FontConfig you probably do not want to use 
> FFRE. That is a bit of history that is very related to historical X fonts. You 
> probably to put the switch somewhere in the nsRenderingContextGTK.cpp code 
> long before it calls into the nsFontMetricsGTK.cpp code.

I think that's an artifact of wanting to support old preferences with the new
code.  I'll revisit it.
> I meant to re-add the contributors, I just forgot.  Simple oversight there.

Good, then there will be no issue correcting this.

> > 2) There is a large amount of moving of code from one file to another. By 
> > moving the code you lose the cvs history. There needs to be a very strong 
> > reason to justify losing the history.
> 
> It's totally worth it.

Why? there does not see to be much difference here; you even say:

> The code that was in nsFontMetricsGTK.cpp and nsRenderingContext.cpp 
> are both in nsFontInstanceCore.cpp. ... The code is largely the
> same.

What specifically justifies losing the cvs history?

> If anything the code paths are cleaner than they were before. 

Could you be specific on what "cleaner" means?

If losing the CVS history is really a showstopper, you can easily do some CVS
surgery to preserve it in the new files.
Doh.  my misunderstanding.  I thought that one file was being broken up into
two, not two being merged into one.  So at best you'd lose the history of one
file.  apologies for the spam.
>> > 2) There is a large amount of moving of code from one file to another. By 
>> > moving the code you lose the cvs history. There needs to be a very strong 
>> > reason to justify losing the history.
>> 
>> It's totally worth it.
> 
> Why? there does not see to be much difference here; you even say:
> 
>> The code that was in nsFontMetricsGTK.cpp and nsRenderingContext.cpp 
>> are both in nsFontInstanceCore.cpp. ... The code is largely the
>> same.
> 
> What specifically justifies losing the cvs history?

Adding Xft in a clean way.  Making sure that the rendering context doesn't have
to know any details about the specific types of fonts that are being used to do
the rendering or measurement.  Etc.

> 
>> If anything the code paths are cleaner than they were before. 
> 
> Could you be specific on what "cleaner" means?
> 

For example, sometimes when you draw instead of the code paths looking something
like:

rendering context -> font metrics -> xfont -> rendering context

now with some of this cleanup it looks like:

rendering context -> font metrics -> xfont

There are a couple of other things that I personally think are cleaner where the
code is less incestuous.

Why can't we maintain the Xft fontmetrics code in a seperate source&&header for
now (like nsFontMetricsGTKXft.cpp/nsFontMetricsGTKXft.h) and add Makefile.in
glue to make it switchable at compile time for now (a runtime switch would be
better to maintain "compatibility" to non-Xfree86 Xservers) ?
> Adding Xft in a clean way.  Making sure that the rendering context doesn't 
> have to know any details about the specific types of fonts that are being 
> used to do the rendering or measurement.  Etc.

This sounds like a change in the virtual layer; eg: the API. How exactly does 
this require a change in which file the code lives in?

> For example, sometimes when you draw instead of the code paths looking 
> something like:
> 
> rendering context -> font metrics -> xfont -> rendering context

Would you please point out this/these specific code path(s)?

> There are a couple of other things that I personally think are cleaner where 
> the code is less incestuous.

Would you please point these out?

> Why can't we maintain the Xft fontmetrics code in a seperate source&&header for
> now (like nsFontMetricsGTKXft.cpp/nsFontMetricsGTKXft.h) and add Makefile.in
> glue to make it switchable at compile time for now (a runtime switch would be
> better to maintain "compatibility" to non-Xfree86 Xservers) ?

That's exactly what I'm doing now, more or less.  That's why we have
nsFontInstanceCore and nsFontInstanceXft.  The nsFontMetricsGTK code is just a
big switch.

Plus, all this code should work with non-xfree86 servers.
> This sounds like a change in the virtual layer; eg: the API. How exactly does 
> this require a change in which file the code lives in?

No, there are no api changes here.

>> For example, sometimes when you draw instead of the code paths looking 
>> something like:
>> 
>> rendering context -> font metrics -> xfont -> rendering context
> 
> Would you please point out this/these specific code path(s)?

I'm not going to spend a huge amount of time on this but you can see it if you
follow the usage of nsRenderingContextGTK::my_gdk_draw_text().

> 
>> There are a couple of other things that I personally think are cleaner where 
>> the code is less incestuous.
> 
> Would you please point these out?
> 
> 

Yeah, sure - just architecture.  The rendering context doesn't know anything
about the specific font type or what fonts are being used to render, nor does it
have to walk the list of loaded fonts and do measurement on its own.  Xft
doesn't have to know anything about the core font code, core font code doesn't
have to know anything about xft.  The header files have been seperated out a bit
so that nsFontMetricsGTK.h and the .cpp file don't have include the huge mess
that is nsFontGTK and friends.
Christopher Blizzard wrote:
> Plus, all this code should work with non-xfree86 servers.

Does it use the plain X11 font API then instead or how is the "compatibility
mode" implemented ?
It works more or less like the freetype code does.  Sucks down an XImage,
scribbles, and puts it back.
Christopher Blizzard wrote:
> It works more or less like the freetype code does.  Sucks down an XImage,
> scribbles, and puts it back.

Please correct me if I am wrong:
- This will make font rendering awfull slow - and over remote X connections we
will make Mozilla a pain (I am sure Xterminal/SunRay/LTSP/etc. people will veto
here)
- We loose support for non-TrueType/non-PCF fonts (like F3 or other
vendor-specific fonts)
- There is no "compatibility", this is just a (very slow) emulation mode until
all vendors (except Xfree86) have "upgraded" their Xserver code (which will need
at least 2-5 years from now)
> - This will make font rendering awfull slow - and over remote X connections we
> will make Mozilla a pain (I am sure Xterminal/SunRay/LTSP/etc. people will veto
> here)

When you disable anti-aliasing, Xft draws text without GetImage/PutImage so that
performance returns to a reasonable level.

I've been providing this kind of client-side font support over the wire for
about six years in an X-terminal environment.

> - We loose support for non-TrueType/non-PCF fonts (like F3 or other
> vendor-specific fonts)

Bitstream is building a FreeType plugin to handle many more formats than the
current X servers are able to.  

Commercial fonts are moving towards OpenType and FreeType will be there to
support that while existing X systems again lag far behind.  Client-side font
support means that moving to a new format requires only changes in the FreeType
library; we can roll out a new library without requiring simultaneous rollout of
new X server functionality to match.

Xft provides significantly better forward compatibility than the existing
mechanisms; additional backward compatibilty may require additional code in the
client side font library, but will not require any changes to Xft, Mozilla or
the X server system.

> - There is no "compatibility", this is just a (very slow) emulation mode
> until all vendors (except Xfree86) have "upgraded" their Xserver code 
> (which will need at least 2-5 years from now)

Xft uses techniques for providing client side text that have been prevalent in X
applications for about 15 years.  If you've ever used FrameMaker under X, you've
experienced client-side font support just as Xft provides.  Open source
applications like Ghostscript and Xdvi also use client-side fonts.  Xft provides
a general API for client-side fonts and takes advantage of the Render extension
where possible to accelerate that.

HP is moving to XFree86 and Sun is currently studying how to get Render support
into their servers.  I don't know what other Unix workstation vendors are
planning on doing, but I think XFree86, Sun and HP together represent the vast
majority of current X-based desktops.

Client-side fonts is a lot more than just getting anti-aliasing into
applications.  It provides significantly better i18n support than the core fonts
could ever manage, including BIDI and GSUB/GPOS layout, and will make it
possible to print using precisely the same fonts as appear on the screen.
> Please correct me if I am wrong:
> - This will make font rendering awfull slow 

When I wrote the direct FreeType2 code using XGetImage/XPutImage I checked 
performance on a 266MHz Pentium running Redhat 6.2 and it was okay. The Mozilla 
page load performance numbers showed about a 13% slow down which is significant 
and it did feel a little bit slower. However, it definitely did not feel really 
slow. 
> > This sounds like a change in the virtual layer; eg: the API. How exactly 
> > does this require a change in which file the code lives in?
> 
> No, there are no api changes here.

Okay, then I still do not see an advantage im moving the code to a new file.
The patch is about 16,000 lines long of which about 10,000 lines are mostly
moving the code around.

What do we specifically gain by doing this? Is there a concrete example?
IMO "losing" the CVS history is not a concern. 

The full CVS history is still there, just in a deprecated filename. Standard
practice is to mention the original file's name in the initial commit message so
that this linkage is clear. 

One additional level of indirection, in the relatively unlikely event that
someone wants the obseleted code, is not much of a price to pay for better
functional separation.
> 
> Okay, then I still do not see an advantage im moving the code to a new file.
> The patch is about 16,000 lines long of which about 10,000 lines are mostly
> moving the code around.
> 
> What do we specifically gain by doing this? Is there a concrete example?
> 

I just gave you a set of concrete examples in terms of modularity.

Plus, it basically means that you can build without core support or without xft
support it you want.  Long term, it means the code base(s) are much easier to
support and it's much harder to step on each other's toes.  Why would you not
love that?

I certainly wouldn't have spent weeks working on this patch if I didn't think
there was concrete value involved.  Otherwise, I would have just used the
original patch that Keith and I worked out.
> >> For example, sometimes when you draw instead of the code paths looking 
> >> something like:
> >> 
> >> rendering context -> font metrics -> xfont -> rendering context
> > 
> > Would you please point out this/these specific code path(s)?
> 
> I'm not going to spend a huge amount of time on this but you can see it if you
> follow the usage of nsRenderingContextGTK::my_gdk_draw_text().

First, do you know why this code is there?

Second, would you please show me how/where the call stack could be:

 rendering context -> font metrics -> xfont -> rendering context

I do not see anywhere in nsRenderingContextGTK::my_gdk_draw_text() that 
calls back to the rendering context.

> I just gave you a set of concrete examples in terms of modularity.

How about something in the line of:

  I moved this function or block-of-code from this file to this file
  to achieve ...

The current patch is huge, 16628 lines, of which it looks like at least
10,000 lines are just moving code around with no clear functional change. The 
sheer size of the moves obscures the actual functional changes. If there is 
really some better code reorganization then it should be discussed and done in 
a separate step so that the Xft code changes can be reviewed. Right now the 
functional changes for the Xft code is buried in the code reorganization.
I thought you knew this code really really well? :)

> rendering context -> font metrics -> xfont -> rendering context

nsRenderingContextGTK::DrawString() ->

govels around in the internals of nsFontMetricsGTK, calls
nsFontGTK::DrawString() which in some cases calls:

nsXFontNormal::DrawText8()

which looks like this:

void
nsXFontNormal::DrawText8(GdkDrawable *aDrawable, GdkGC *aGC,
                         PRInt32 aX, PRInt32 aY,
                        const char *aString, PRUint32 aLength)
{
  nsRenderingContextGTK::my_gdk_draw_text(aDrawable, mGdkFont, aGC,
                                          aX, aY, aString, aLength);
}

...and the circle is complete.  Strange, eh?  Especially amusing considering
it's in x11shared and contains gdk specific calls. :)
> 
> How about something in the line of:
> 
>   I moved this function or block-of-code from this file to this file
>   to achieve ...
> 
> The current patch is huge, 16628 lines, of which it looks like at least
> 10,000 lines are just moving code around with no clear functional change. The 
> sheer size of the moves obscures the actual functional changes. If there is 
> really some better code reorganization then it should be discussed and done in 
> a separate step so that the Xft code changes can be reviewed. Right now the 
> functional changes for the Xft code is buried in the code reorganization.

The code that deals with Xft is clearly seperated from the core code.  There's
nothing obscure about it _at all_.  All the code is in a single file, which is
new: nsFontInstanceXft.cpp.  I couldn't possibly make it any easier to review.
I've opened bug 169695 to move nsRenderingContextGTK::my_gdk_draw_text() out
of nsRenderingContextGTK.cpp
the nsFontInstanceXft.cpp/h (1414 lines in the middle of a 16,628 line patch)
must have hooks in other parts. Would the hooks be say 1,000 lines or less?
The would leave 14,000 line of the patch that are not related to the Xft code.

Is there any specific reason why the review/super-review of these 14,000 lines 
must to be part of the Xft review/super-review?

Mixing non-functional changes with functional changes make the patch 
dramatically larger which makes the review/super-review much harder.
Blocks: 169695
No longer blocks: 169695
Depends on: 169695
Uh, excuse me of butting in...(I propably shouldn't be opening my mouth here)
I'm just a bit frustrated with the process of this bug (who isn't?)

A bit of benevolent proactiveness could help perhaps... eg. in Mr Stell's
(latest) questions I'm seeing a proposal for going further. Perhaps that should
have been verbalized already, instead of left to the guesswork of the reader...

So, is it that Mr Stell wants the huge patch split into phases along the lines of
1) rename/move files/contents without changing/adding any functionality
2) add hooks for Xft (if there are such)
3) add Xft (the two "independent" files).

These 3 steps could be done also slightly parallel or smth., and
reasons/justifications of these 3 discussed bit more separately of each other
(not that they are unrelated, but...)

I could also be totally wrong, but that's... well, human :)
Alias: xft
Hi,

I came here to see if I could get a simple question answered, but instead found
one of the most sordid and longest running streak of silly arguments I have seen
in a long time. Too bad to see so much time and energy wasted on what is
essentially a done deal. Xft is what we need, without much delay. Reading this
bug, at one point I actually had tea shooting out of my nose when an "ugly font"
blacklist was proposed. As it stands today, mozilla is (much to my dismay) one
big collection of ugly font display. If I had to choose between 3 more new and
useful features such as gestures/typeahead etc., and good, solid, intuitive, and
pretty looking font support, I'll settle for font support any day. Fonts on
mozilla are nothing to be proud of as-is.

Anyway, as there is little I can do about this, other then vote on the bug and
voice my support for an Xft enabled mozilla, here is my question (yes, I know I
probably ticked of most people likely to help me, but please take pity on me):

I have, sitting on my hard-disk, a shiny new 1.2a tarball, just waiting to be
compiled. I also have, sitting on my harddisk, an Xft library that was assaulted
  with david chester's xft slight hinting hack. I am rather pleased with the
resulting display of this particular configuration, and would be delighted if
the mozilla 1.2a source could be persuaded to make use of these facilities
already present on my system. Is a patch/hack/workaround in existance that will
enable me to do this? If so, where could find one? I appreciate your assistance
in helping me switch from konqueror to mozilla.
To answer your question, I think that you might be able to use keithp's patch
with 1.2a and get away with it.
Hi Chris, thanks! would that be the patch on fontconfig.org (for 2.0), or any of
the patches with this bug? thanks.
I'm talking about the one on fontconfig.org.
This is unfortunately not the case. Keithp's patches old and new are made
against the 1.0 branch (and happen  to work with the 1.1 branch) but the font
spacing calculation code added after 1.1 branched breaks his patch on 1.2 and
trunk. Updating keith's patch to support the new interface is non trivial,
though I think it wouldn't be difficult for someone who is familar with font
code; but I know it's rather beyond me. My attempt at kludging it resulted in a
mozilla that would choke and fail to render non ascii characters. whoops.
Thanks again. I applied it, but gfx/src/gtk/nsFontMetricsGTK.cpp was not too
happy with some of it, and spat hunk 4 back in my face. I'll watch the compile
break, though, and try and work it out from there.

Cheers,

Martijn
Oh well, thanks, Phillip - saved me a few hours there. I am certainly not the
right person to try and fix this. It's a pity we don't have decent xft support
in mozilla after all this time, while the vast majority of applications do this
natively, or with some slight prodding.

Unfortunately, my development skills are not on the same level as most others
here, so I must make myself useful in other ways, such as testing.hence my
desire to run 1.2a - an area where I can contribute. However, since I use my
browser an average of 12 to 14 hours per day, I can state it is my major
productivity application, and as such, I will refuse to use something that looks
plain ugly. The freetype extensions for mozilla just allows me to view ugly
truetype fonts, with many weird artifacts. 

I really wish that this will be sorted out soon, and if there is any area where
i can contribute in helping to make this happen, please let me know.

Cheers,

Martijn
Don't worry, I'll have a patch here soon that will work with the tip.
Chris, Red Hat 8.0 is coming out soon, so many of us want to know: Is this going
to be included in Red Hat's Mozilla RPMs, regardless of how this (endless)
discussion actually ends? 

I certainly hope the answer is yes.
Nope, but if I get a nice working approved patch here, I might do an errata that
includes it down the road since all the infastructure is there and it's quite
possibly our most requested feature for Mozilla.
Attached file checkpointing changes (obsolete) —
Checkpointing changes.	Fix FP exception if avecharwidth is zero (oops.)
Attachment #99562 - Attachment is obsolete: true
G'd day,

some thing that I don't understand well is that if I want to build Mozilla with
Xft support, supposedly I must download and install first Fontconfig 2.0 from
Keith's web site, then his Mozilla patch, then patch Mozilla source code
(supposedly only Mozilla 1.1, despite we are in 1.2a). Sooooo...my question is,
what must I do with Blizzard's patches presented with this bug??

I'm only a fan of Xft support, with less than a few coding practice, trying
desperatly to build the lizard with a good-looking fonts, sorry for my
inexperience and doubts, but is there anyone that would want to illuminate me?
Is it somewhere a quick & dirty tutorial to build *any* Mozilla branch with Xft
support?

Thank you very much in advance.
Keep up the good work.

        Juanan Pereira (Chessy)
This work is all against the tip at this point.  Sorry, there are no
instructions so far.
Attached file checkpointing changes (obsolete) —
Fix problems when drawing text with spacing, fix bug with reversed options to
FcFontRenderPrepare() (oops.)  Move nsFontGTK into its own header file so that
the freetype and the Xlib font code can effectively share it.  Re-merge all of
the freetype code back into nsFontInstanceCore.

Core code should be back to where it is normally on the tip.  Only a couple of
things left to clean up on the Xft code.
Attachment #100108 - Attachment is obsolete: true
With the patch from the 21st of September it's not possible to compile with GTK2
toolkit, the patch uses GdkRegionPrivate structs that are not defined in GTK2.
There was a patch kicking around at one point to get xft working with gtk2.  I
wonder where it went...
some gtk2-xft patches can be found from
http://www.istitutocolli.org/prosos/moz_xft/
Attached file checkpointing changes (obsolete) —
Checkpointing changes.	Unknown glyph rendering and measurement works,
pango-style.  Check for a pref works.  Problems with GetHints() fixed.	Cleaned
up what happens with a glyph is not found and for some reason the minifont can
not be loaded.	Remerge with the tip as well.
Attachment #100126 - Attachment is obsolete: true
Attached file patch (obsolete) —
Oops.  Helps if I include all of the files.
Attachment #101016 - Attachment is obsolete: true
This is a rework of the old gtk2 patch for kiethp's xft patch so that it
applies to blizzard's xft patch. Well, rather you apply it to mozilla *after*
applying blizzard's xft patch. Assuming the gtk2 impl is correct, it should be
merged into the main patch and then gtk2 stops being left behind.
Attached file checkpointing changes (obsolete) —
Add gtk2 support (untested, but different than the patch here.)  Fix problem
that owen pointed out with the math for the unknown glyph placement, add
support for enumerating fonts and reading prefs if they are set.  Not a lot
left to do here.
Attachment #101072 - Attachment is obsolete: true
OK.  There are some builds up that are built with the most recent patch here:

http://ftp.mozilla.org/pub/mozilla/nightly/experimental/xft/2002-09-30/

There are two directories there; the RH7 directory contains a build with the
patch included that does not have xft enabled:

./configure  --enable-optimize --disable-debug --disable-tests
--enable-extensions=default,irc --enable-crypto --without-system-nspr

The RH8 directory contains a build built on RH8 with the patch with Xft enabled
and gcc296 so that the usual plugins work.

CC=gcc296 CXX=g++296 ./configure  --enable-optimize --disable-debug
--disable-tests --enable-extensions=default,irc --enable-crypto
--without-system-nspr --disable-elf-dynstr-gc --enable-xft

Please take them out for a spin.  I'm most interested in any functionality that
might be broken in the RH7 build that doesn't have xft included.
Status: NEW → ASSIGNED
Here's a quick description of the way the new code is laid out:

The cast of characters:

nsIFontMetrics, implemented by nsFontMetricsGTK:

  Deals with font what are essentially font groups.  Returns basic metrics for
  that font collection, also handles font loading andm in the current impl,
  matching for languages and characters.

nsIRenderingContext, implemented by nsRenderingContextGTK:

  Deals with the mechanics of rendering onto the screen.  The current
  implementation does a lot of grovelling around inside of nsFontMetricsGTK,
  loading fonts when they are not found and whatnot.  This is also where
  text measurement takes place.

nsIDrawingSurface, impemented by nsDrawingSurfaceGTK:

  Essentially the only thing that we care about is that the clip region is
  stored here.

These are the toplevel interfaces that are used by external consumers.  There
are no changes to these interfaces, just how the internal implementations
interact a little bit.

Here's a diagram that describes how all the major bits interact:

        |------ nsIRenderingContext::SetFont() ------>|
--------------------            -----------------------
| nsFontMetricsGTK |            |nsRenderingContextGTK|
--------------------            -----------------------
         |     |<----- nsFontHandle (interface) ------|
         |
         |
         V
   nsFontInstance (interface) ----------------------
      |                                            |
      |                                            |
      |                                            |
      |                                            |
      V                                            |
  nsFontInstanceCore -------------------           |
   |                 |                 |           |
   |                 |                 |           |
   V                 V                 V           |
  Xlib            FreeType         XGetImage/      |
   |                 |             XPutImage       |
   |                 |                 |           |
 .pcf fonts        TT fonts            |           |
 (many encodings)  and others          V           |
                                    Xserver        |
                                                   |
                                            nsFontInstanceXft
                                                   |
                                   -------------- Xft ------------
                                   |                 |           |
                                   V                 V           V
                                FreeType           XRender      XGetImage/
                                  |                   |         XPutImage
                                  |                   |           |
                                  V                   V           V
                             ISO10646 .pcf fonts   Xserver      Xserver
                             TT fonts and others

That's a pretty good start.  Here's the highlights for reviewers:

o nsFontMetricsGTK is pretty scaled down.  That is, it contains some elements
that are common to the two font instance classes, like the family of fonts that
were part of the original font query, the language group, pixel size, and that's
about it.  It's pretty much been turned into a dispatch tree to send requests to
the right font instance.  A traffic cop, if you will.

It also contains the implementation of the nsFontHandle class.  This class is
what is handed to the nsRenderingContextGTK class via its users.  It hides the
internals of the font metrics class from the rendering context.  If we didn't
have this, we would have to teach the rendering context about the font instances
which is messy.

It dispatches calls (like draw, measure, etc) to the individual font instance
classes.

o nsFontGtk has been moved to its own header since it's shared in between the
freetype code and the Xlib code.  This is done so that we don't need to teach
everyone about the nsFontInstanceCore code, just to get the structure of the
nsFontGtk class.

o All of the code that was in nsFontMetricsGTK has been moved wholesale to
nsFontInstanceCore.  There were no real code changes here, except to clean up
indendation and to declare functions that are actually static, static.  Also,
the order of the functions has been cleaned up so that they follow declaration
order.  Other than that, there aren't any real functional changes.  I'm pretty
sure that most of the function names are even the same.  Because of this, there
isn't much to say here about the structure of this since it's largely the same.

o nsFontInstanceXft is pretty new code, partially taken from the code that Keith
and I sat down and wrote together many months ago.  It's not 100% yet - there
are a couple of things that I would like to add - but it's certainly good enough
for day-to-day usage.  I think the biggest things that are missing are that
GetTextDimensions()(s) and GetBoundingMetrics()(s) aren't impelemeted yet.  I'll
get to those soon enough.

I'd like to see some reviews here.  I think that the architecture is pretty
sound and acheives the goals set out earlier in this bug and is non-disruptive
as I can be to the current code.
I just downloaded the rh 8.0 build you linked to in comment #163.  It looks
great, but I've noticed 1 problem:  long urls overflow the urlbar.  so do
ctrl-shift-l, and type in a pretty long url, and hit enter.  notice that the url
overwrites the stuff to the right of the url bar.

i'm actually running redhat (null) fully updated using up2date, but I bet this
isn't null's problem.
I had some difficulty using the builds mentioned in <a
href="http://bugzilla.mozilla.org/show_bug.cgi?id=126919#c163">Comment 163</a>

I'm using debian/unstable, which lacks GLIBC2.3, so the RH8 version doesn't work.

The RH7 version segfaults(though TestGtkEmbed works).

I've been using the 1.0 Xft build and loving it.

Don't know if you want to bother supporting other platforms with these
experimental builds, but I thought you might be interested.
Attached file patch (obsolete) —
Fix crash on startup with just xlib, support GDK_USE_XFT, fix a memory leak or
two.  Should be good to go here, folks.
Attachment #101086 - Attachment is obsolete: true
OK.  Ready for reviews.
Comment on attachment 101375 [details]
patch

This patch, attachment 101375 [details], is exteremly large, 17,432 lines and mixes new 
features, function changes, and general code reorganization.

Please open a separate bug so we can address the code reorganization
separately.

The current patch has too many different issues all muddled together.
Attachment #101375 - Flags: needs-work+
Attached file patch (obsolete) —
Actually make clip regions work in Xft again (duh, bad ifdef name.)
Attachment #101375 - Attachment is obsolete: true
I can check in the unbuilt parts instead.  That would make it really easy to review.
Comment on attachment 101405 [details]
patch

The class design in http://bugzilla.mozilla.org/show_bug.cgi?id=126919#c164
needs work.

For example the direct FreeType2 code is not related to the core X fonts
and should not be subclassed under them or used by them.

The XGetImage/XPutImage code is a rendering method not a font. It is used
by the AASB code and the Direct FreeType2 code and should not be directly
called by a virtual font layer.

There has been a long standing request to support 3rd party font
renderers. Any major rewrite should at the bare minimum define the API
that would support this.
Attachment #101405 - Flags: needs-work+
The patch appears to make the decision at to use/not-use Xft at configure
time. If this is correct then this means that trying to run a Xft enabled build 
on a system without Xft will fail to even start and complain that Xft is 
missing. This needs to be changed otherwise we will have a great deal of user 
confusion as people find some versions of Mozilla fail to start up on some 
systems.
Any reviewer should come from the list of developers who regularily work on
the font code:

The primary active developers are:

  shanjian@netscape.com
  bstell@ix.netcom.com
  roland.mainz@informatik.med.uni-giessen.de

Developers who work on the font code on a semi regular basis are:

  katakai@japan.sun.com
  rbs@maths.uq.edu.au
  smontagu@netscape.com
  prabhat.hegde@sun.com
  pete.zha@sun.com
  Louie.Zhao@sun.com
There needs to be a plan to address Xft's deployment especially with regard
to bug fixes.

Xft is a relatively new piece of code and as is common for all new code there
will be bugs. Lets assume that when bugs in Xft are identified they are
rapidly fixed. The issue is how will users get the fixed version on their
systems?

The current model seems to be that the bug will be fixed in the Xft cvs
repository. At some later point the OSes that ship Xft will deploy the new
version. At some point after that users will get and install a new version 
from the vendor or upgrade their OS. This is very likely to introduce months
of delays to getting a fix out.

Another way would be to tell users to pull the source from the Xft cvs 
repository, build it, and install it. This seems like an unacceptable burden 
for a non-technical user.

Another way would be to have code in Xft checked for a new version and
then automatically downloaded and installed the new version. This is a
workable solution but I do not know where the infrastructure will come from.

Another way would be to put a Xft into the Mozilla cvs repository and distribute
it with Mozilla. This will put a burden on the build and distribution systems
and will make the Mozilla release even bigger. However, assuming we could get
people in Mozilla and Netscape to approve this it would be a way to address
the deployment issue and would immediately make Xft/FontConfig available on
all the Linux/Unix platforms that Mozilla ships on.
>The patch appears to make the decision at to use/not-use Xft at configure
>time. If this is correct then this means that trying to run a Xft enabled build 
>on a system without Xft will fail to even start and complain that Xft is 
>missing. This needs to be changed otherwise we will have a great deal of user 
>confusion as people find some versions of Mozilla fail to start up on some 
>systems.

But which is really worse? There is the other side of the coin as well:

If Xft is "silently disabled" when appropriate libraries are not found, it is
very well possible that many hours are spent on "why my mozilla does not look
the same as the other guys?".

As I understand it, the goal, at the moment, is not to make Xft be built on
default, but just to get it into the tree, so that further development can take
place. Thus, if Xft-enabled versions are built, they are supposed to only work
on the certain environment it was built for (eg. RedHat8), not for "all
environments" (eg. RH7 et al.). The "default build" situation may change in the
future, but in my opinion now is not the time for that.

Isn't the GTK2 in similar situation to Xft? That a mozilla build for GTK2 does
not work in GTK1.x or QT or MacOSX and thus fails to even start ?
I would handle XFT the same way it's handled for GTK. (?)

I wish being told to download CVS was unnaceptable, but as a Linux user, I can
say that Linux just isn't at that point yet.  I have had to pull CVS for
everything from X windows (DVI flat panel support in Nvidia driver) to GTK+2
(xinerama).

What happened to the whole "Mozilla isn't an end user product" thing anyhow? 
Distribution is a problem for distributors (RedHat).
> For example the direct FreeType2 code is not related to the core X fonts
> and should not be subclassed under them or used by them.

They are blitted to the screen using the core X protocols.  I could have called
the class "Legacy" or "Old" or "Obsolete" or something else, but I was trying
not to offend.  I don't think the name matters all that much.

The way that the Core X fonts and the freetype code currently work is so closely
linked, it's silly.  There's no way that I'm going to touch that at this time
since it's not a problem that I'm trying to solve.

> 
> The XGetImage/XPutImage code is a rendering method not a font. It is used
> by the AASB code and the Direct FreeType2 code and should not be directly
> called by a virtual font layer.

Great, when we add a virtual font layer, we'll worry about it.

> 
> There has been a long standing request to support 3rd party font
> renderers. Any major rewrite should at the bare minimum define the API
> that would support this.
> 

Problem is, I'm not just adding a renderer here.  I'm adding a complete drop in
replacement for the font querying, loading and rendering.  This requires hooking
in at a higher level than the code that's there now - that's what all this code
is all about.

If you want to drop in another type of renderer into the Core code, that's fine.
 Xft already supports all the renderers in production right now, so I don't need
to worry about adding anything like that at the moment to the Xft code.

As is the case with refactoring, we do it in small steps.  I've refactored what
I need in order to drop in a new querying and rendering system and not much
else.  I'm trying my best to avoid breakage in other people's code as best I
can, as I should be.

> The patch appears to make the decision at to use/not-use Xft at configure
> time. If this is correct then this means that trying to run a Xft enabled build 
> on a system without Xft will fail to even start and complain that Xft is 
> missing. This needs to be changed otherwise we will have a great deal of user 
> confusion as people find some versions of Mozilla fail to start up on some 
> systems.
> 

Yep.  I haven't written the vtable code yet because the current code that's in
there is probably going to change a little bit, but not much.  Once it's stable
and well tested, I'll add the vtable stuff.  I would like to have that in there
very much.  But, as I've said, I'm taking baby steps here.  One thing at a time.
>There needs to be a plan to address Xft's deployment especially with regard
>to bug fixes.

While a plan wouldn't hurt, the idea of the Xft is (as I understand it) to be a
OS-wide font system. As such, it's not anymore "just a library", but a library
that many parts of the OS use, not just mozilla. It sure gives a warm,
comfortable feeling if everything is controlled "in-house", but especially in
open-source world, there definately is a limit to it.

In my world view, I put Xft along with glibc, libstd etc. that mozilla also
depends on, but does not ship "in-house". Sure, it's new piece of code, but
since its the main element in GNOME2 of RedHat8 (and other future distros), I'm
sure it's not just mozilla that suffers bugs, if (when) such are found. And then
(eg. RedHat) probably issues an update, as with other similar things.

It is always possible to add a line to release notes that "due to bugs in xxxx a
 Xft-library version xxxx is required." and then provide a link to that library
(even custom-built, if necessary).

There are of course exceptions, like freetype, which I'd rather not have
'in-house', but I don't know the details...
> 
> Xft is a relatively new piece of code and as is common for all new code there
> will be bugs. Lets assume that when bugs in Xft are identified they are
> rapidly fixed. The issue is how will users get the fixed version on their
> systems?

I'm amazed that you didn't use this logic to try to write your own freetype font
loader.  :)

Seriously, I don't think this is a problem that we need to figure out in the
short term.  Right now there are so few systems that include real fontconfig and
Xft support (although Red Hat's flooded OC3s are an indication of how many
people are about to have support, not to mention the dozens of mirrors.)  I'm
perfect happy adding a vtable system the fact that will allow it to be loaded at
runtime without linking hard to it.

Of course, having it installed properly and having it _configured_ properly are
two seperate issues.

Anyway, this isn't something that I think we need to worry about for the time being.
bstell:
it's full disclosure time:  do you have some interest in preventing linux from
having a uniform nice looking desktop?  do you have some interest in some other
competing font system?  do you have some personal problem with the developers of
this font system?  is there anything else we should know that would prevent you
from reviewing this code on its technical merits alone?

I only ask because it seems like there might be some non-technical issues
interfering with getting this code into the mozilla tree, and I really like the
effects of this code.

BTW, when you listed the people you were going to allow to review this code,
were you subverting the mozilla review process or implying that blizzard was
going to do so?  shouldn't a reviewer either know he is qualified to review font
code or know that he isn't, without you telling him one way or another?
Bstell: I think that maybe you should remove yourself from this bug. 
You obviously have issues beyond the technical merits of this patch. 
It is very obvious that you take this patch personally. For what reasons
I don't know. But your comments accomplish nothing but wasting
everyones time. You are making a fool out of yourself as everyone can see.
Please save yourself from looking even more foolish and stop commenting
on this patch. Your suggestions for this patch are ridiculas, we better not
make mozilla depend on glibc because what if there is a bug in glibc and
people download mozilla and it doesn't run. Lets keep extending this
to the whole linux kernel. You are only hurting yourself.
ash and John M.: That kind of angry fingerpointing gets nowhere.

This isn't a black&white issue, there isn't one "right" solution. Several are
better, some other less so. The idea is to discuss about the merits of different
approaches and then agree on the one that _feels_ like the right one, at the
moment. Blizzard has written a huge amount of code, it's no wonder it is hard to
understand, especially since it mixes changes to the current code and adds new
things.

As for emotions, I'd be surprised, if there weren't any. After all, this is
open-source, in which most people (as I understand) work because of a motivation
other than money (or at least money is not the main/only motivator). Also, the
code is often one's own work and thus something to be proud of, or attached to.

The bottom line is just to try to get along with many very different people, in
co-operation for a common goal. The difficult part is that not all are able to
put as much effort as each wants. Since this work is "voluntary", it is not
possible to transfer "wishes" for others to work on, unless that is felt
reasonable or is also according to the others "wishes".

Oh, and there are no stupid questions. 
Attached file patch (obsolete) —
Fix memory leak in the xft code.  No config changes here since they are checked
into the tree, now.
Attachment #101405 - Attachment is obsolete: true
You should be able to pick up builds from here:

http://komodo.mozilla.org/pub/mozilla/nightly/experimental/xft/2002-10-03/

There's a vanilla build there, for reference, a build on rh7 with the patch
without xft, for testing and an rh8 build with xft and xlib in it.  Please take
them out for a spin.
> As I understand it, the goal, at the moment, is not to make Xft be
> built on default, but just to get it into the tree

If requires a explicitly set config setting to enable this then
we can postpone the requirement until the time when this changes.

> I wish being told to download CVS was unacceptable

Is any serious gecko embedder going to want to use a library if they
have to tell their users to use cvs/build/install when the users
has a problem?


> The way that the Core X fonts and the freetype code currently work is
> so closely linked, it's silly.  There's no way that I'm going to
> touch that at this time since it's not a problem that I'm trying to
> solve.

About 15,000+ lines are unnecessarily changing code in this are.
Please remove this from the patch.

> In my world view, I put Xft along with glibc, libstd etc. that
> mozilla also depends on, but does not ship "in-house".

The significant difference is these have had plenty of time to work
their most serious bug out.

> I'm amazed that you didn't use this logic to try to write your own
> freetype font loader.  :)

Its the other way around. Although I dearly wanted to I did not add
FreeType to mozilla 4 years ago because it was not ready.

> it's full disclosure time:
> do you have some interest in preventing linux from having a uniform
> nice looking desktop?

No, of course not. What I do care about is having a product that works
well for all users including international users. Everyone wants better
text support in the Unix/Linux world. However, making a tradeoff that
make western users happier and international users unhappier is not
attractive. There has and continues to be a long discussion where in I
ask that international features not be regressed and the reply is that
they are not important. I know that most western users do not feel that
international feature are important but I do.

> do you have some interest in some other competing font system?

I have interest in many things.

Xft is interesting but is just now developing.

Sun's STSF is interesting and seems to have better international text
support and has printing support.

ICU's layout library seems to have the most extensive support for
complex text languages (CTL) such as Indic, Thai, Vietnamese, Arabic,
etc., but I am still evaluating this and it only appears to provide a
part of the needs for international text support.

> do you have some personal problem with the developers of this font
> system?

No, Keith is a very smart person but I often find I have the same
problem that Jim Gettys complained of: getting Keith to do some
things, even if they are relatively simple, can be extremely
difficult and slow. It makes me reticent to use a library that has
not had time to mature and where there has been difficulty getting
issues addressed.

Chris and I agree in some areas and disagree in others. The big issue
for this bug is 1st there has been no evaluation of readyness of Xft,
2nd there has been no evaluation of other solutions, 3rd this solution
being proposed is basically a Redhat only solution, 4th there is no
discussion of how to address the fact that getting fixes out will slower
and more difficult, 5th the patches affect a lot of code unnecessarily,
6th international requirements are being brushed aside.

> is there anything else we should know that would prevent you from
> reviewing this code on its technical merits alone?

no

> ... we better not make mozilla depend on glibc because what if there
> is a bug in glibc and people download mozilla and it doesn't run.

A significant difference being that glibc is fairly mature.

Its been a long time but my recollection is that switching to glibc (or
was it glib?) took a very long time and required multiple build 
parallel builds. It was a mess for users trying to figure out which one
they needed to use.

Comment on attachment 101500 [details]
patch

This patch is 17,222 lines long of which is appears that about 15,000 
lines are not directly necessary.
Attachment #101500 - Flags: needs-work+
Comment on attachment 101500 [details]
patch

This patch is 17,222 lines long of which it appears that about 15,000 
lines are not directly necessary.
<q class=offtopic>we switched from nmake to gmake, but that's a build tool not a
runtime issue. and yes it took a very long time. In fact it's not done, because
the 1.0 branch happened before the landing so 1.0 still uses nmake.  It's
actually likely that until the 1.0 branch is retired (and it's a long lived
branch, so that won't be for a while) that nmake will still be around.

the mozilla runtime doesn't use glib. part of the build system is xpidl, a
standalone tool like gmake, and it uses glib. its glib requirement is actually
annoying for some of us who build on strange ports.
> If requires a explicitly set config setting to enable this then
> we can postpone the requirement until the time when this changes.
> 

Yes, --enable-xft.

> There has and continues to be a long discussion where in I
> ask that international features not be regressed and the reply is that
> they are not important. I know that most western users do not feel that
> international feature are important but I do.

They aren't being regressed.  I am not removing the X core code.  Period.  It
still exists.  People that have specific need of it can still use it.  However,
if they already have options as part of an Xft-based desktop, then they can use
the xft code.  Simple as that.  If they had problems with Xft then they wouldn't
be using it in the first place.  They can always disable it with a pref or an
environmental variable.

Second, it's all new code.  You can't have regressions in code that doesn't even
exist yet.  What a bunch of hooey.

Third, pango does all of the language layouts that you are talking about using
Xft and fontconfig.  So I know it works.  It just might take a little more
coding, that's all.  This is certainly not a reason to keep this first pass at
the code out of the tree and certianly not a reason to keep the infastructure
out that will allow you choose between xft and the core code that's in the tree
right now.

> Xft is interesting but is just now developing.

Xft has been shipping in Red Hat since the early 7.x days.  The rendering bits
are in pretty good shape.

fontconfig, which you say is still very immature, is being shipped in the
thousands (tens or hundreds if you want to count,) so it's good enough for
people to use right now.  In terms of the quality of what we've shipped in the
past, this is the best so far - especially in terms if i18n support, text
rendering, performance and stability.  It works, basically.

> Chris and I agree in some areas and disagree in others. The big issue
> for this bug is 1st there has been no evaluation of readyness of Xft,

It's pretty good - good enough for sure.

> 2nd there has been no evaluation of other solutions,

There are no other solutions in production.

> 3rd this solution
> being proposed is basically a Redhat only solution,

Chicken and egg.  Red Hat has always shipped things before other people.  This
will not remain this way for very long.  Others will be shipping this, and soon.
 I'm sure the Ximian folks will pop up and say that they are shipping this as well.

> 4th there is no
> discussion of how to address the fact that getting fixes out will slower
> and more difficult

I'm not sure who has to get the fixes out but I imagine that nothing will change
in this area.  The distributors (including Red Hat and Netscape) can make their
own support decisions.

> 5th the patches affect a lot of code unnecessarily,

Incorrect.  The infastructure has to change in order to get this code cleanly
into the tree.

> 6th international requirements are being brushed aside.

No, they aren't.  This is new code and I _do_ care, but I'm trying to solve one
problem at a time.  This code doesn't do everything that the current X code does
and it might not, unless things in freetype change, but it doesn't mean that I
don't have an interest in making sure they are supported, and well.

Basically, if this code doesn't work for you, don't freaking use it.  This is
open source and I've been pretty damn careful to make sure the impact on the
current code (besides moving it) is minimal.  Please don't stand in the way of
other people using it and improving it for their situtation.  It's just being
obstructionist.
> The big issue for this bug is 1st there has been no evaluation of readyness of
> Xft, 2nd there has been no evaluation of other solutions, 3rd this solution
> being proposed is basically a Redhat only solution, 4th there is no
> discussion of how to address the fact that getting fixes out will slower
> and more difficult, 5th the patches affect a lot of code unnecessarily,
> 6th international requirements are being brushed aside.

Regarding issues #1 and #2: GNOME/GTK and KDE/Qt have chosen Xft, therefore Xft
IS the future of X fonts for the vast majority of Unix desktops, whether you or
I like it or not and regardless of what Mozilla does. Therefore if Mozilla is to
buck the trend and not use Xft on GNOME2 or KDE3 systems, the burden of proof is
on you to explain why we must not use it.

Regarding issue #3: That is simply false. Find me a major Linux vendor who isn't
planning to base their desktop on GNOME2 or KDE3.

Regarding issue #4: The vendors who distribute Xft are responsible for
distributing Xft updates. It is not our problem. The comparison with glibc is
perfectly accurate in this respect.

Regarding issue #6: I18n requirements are secondary to getting actual working
code into the tree where people can test and hack on it. I doubt we'll ever make
Xft mandatory, but if we ever do, then I promise you it won't happen until it
meets all the i18n requirements.

Maybe there's something to issue #5, I'll have to read the code for myself.
> No, of course not. What I do care about is having a product that works
> well for all users including international users. Everyone wants better
> text support in the Unix/Linux world. However, making a tradeoff that
> make western users happier and international users unhappier is not
> attractive. There has and continues to be a long discussion where in I
> ask that international features not be regressed and the reply is that
> they are not important. I know that most western users do not feel that
> international feature are important but I do.

I think this is a completely unfair characterization of the discussion. First,
no one is talking about regressing *anything* but about adding an alternative
renderer that will be *disabled* by default but which many users or distributors
may chose to enable if it is appropriate for them. It seems that initially, this
renderer may not be appropriate for people using certain Asian fonts; then again
it will also not be an appropriate choice for people using old X servers and
libraries. But for all these people, the existing, default code will continue to
work fine. Their experience will not regress. Meanwhile, in response to your
repeatedly voiced concerns about these issues, no one claimed they are not
important, but instead the patch developers offered a step by step case for how
all of the suggested features could be incorporated fairly easily into the Xft
framework. The question is only, must all these changes be made before the patch
can progress?

As for tradeoffs, the fact is that for many users, these patches do indeed
already represent an excellent tradeoff; judging from the comments here,
blizzard's binary builds are fantastically popular. This is the ultimate proof
of the real utility of these patches for many people, and this is why people are
frustrated that you seem to be attempting to block their progress on largely
procedural grounds. Moreover, many features to Xft have been added seemingly in
direct response to your objections dating all the way back to the time that your
freetype rendering patches were under discussion in other bugzilla bugs (these
included removing XRender dependence, adding glyph substitution, etc.) and it is
hard to escape the conclusion that you just keep moving the goalposts. Indeed,
most of your suggestions have been helpful and several have already moved the
project forward, but at this point it's hard to see why further ones can't be
addressed after the patch is committed.

Finally, I strongly resent you characterizing this as a "redhat-only solution,"
simply because redhat are the first to ship the Xft infrastructure (which will,
in any case, be part of the next release of XFree86 for everybody). Just in
these comment pages, we have seen Ximian voice their intention to support the
patches on all of their platforms, we have seen slackware binary packages and
debian users and on and on.
For what it's worth, I just downloaded the xft-enabled nightly Chris just posted
a link to, and the visual difference (from anti-aliasing, I presume) is
stunning.  Looking at the standard build is now too painful to bear.

While I'm not using GNOME or KDE on my desktop, legions of RH8.0 users are (or
will soon be) using those.  They default to antialiased fonts with Xft support
built in, so mozilla without that support will stick out like a sore thumb. 
Getting some option in there which can fix this will deflect a lot of criticism. 

PS - having simple font names in the preferences font chooser (instead of the
complete font spec) is a very nice side effect, too.
It is truly unfortunate to read this page, and to see this stuff going on. 
Mozilla looks like ****, and it has *always* looked like ****. This is sad. 
Mozilla is, in every respect, a superiour browser and platform to anything 
else out there, bar none. However, looking at jagged fonts, or the half-baked 
attempt of a FreeType-only rendering solutions is simply painful on the eyes. 
 
Not to say that Brian Stell does not raise some valid concerns, he certainly 
does in some cases. However, I don't think I am alone in thinking that there 
are other, more personal issues at play here. The work that Keith and Chris 
have shown so-far is simply excellent. To raise the issue that "Keith does not 
respond fast enough" is simply not on. Is he on Netscape's payroll or 
something? Didn't think so.  
 
A big deal is made of the fact that code is moved between files, and that 
infrastructure is added. If this were a core, showstopping issue, without 
which mozilla would not start, yes, then a very conservative approach to 
change management would be prudent. But it seems that this is optional code, 
to be enabled either at compile time by someone who can actually get far 
enough to go ahead an compile mozilla, and thus can be expected to know what 
is going on, or it is enabled by a distributor, who hopefully has the skill 
and know-how to make sure it all works nicely. Not to mention that they would 
likely have some sort of support process in place. 
 
The obstructionst attitude shown in this issue is unprofessional, and 
unbecoming to the the community as whole.  
 
Brian, the code Chris has produced seems to work, at least it seems to do so 
for me and many others following this issue. This is open source. As far as I 
can tell, that leaves you with 3 options: 
 
- Rapidly code something that meets or exceeds the functionality that Chris 
was so kind to give as a gift for all our benefit; 
- Come to the conclusion that the work Chris has provided works, and is more 
or less good to go. The shuffeling of code seems to be your biggest issue - is 
it *really* all that probelematic as you make it out to be? What current 
functionality did Chris *break* with his code? 
- Try and prioritise the issues you see with the code, in order of 
"showstopper", "critical", "important", and "nice to have", and try to work 
with Chris to come to some sort of common ground. 
 
Whichever way, today there is working code providing real funcionality that 
many people want to have. Try and put your ego aside for 10 minutes, and 
really rationalise this issue. What broke? What will break? How is this *bad* 
for Mozilla? What is the worst-case scenario, and is that worst-case scenario 
as bad as the current horrible look and feel that make this product so truly 
unpleasant an experience to use on *nix? 
I have installed and am sucessfully using the XFT ebabled build under Redhat 8
Psyche.

I LOVE it!!!  Mozilla doesn't look like it fell out of the ugly tree any more!
Finally!

And as a fantastic side effect it gets rid of bug 136362 for me, which locked up
my browser almost hourly until now!

Thanks so much!
I did a bit of testing of the build blizzard provided (comment 185), and I also
applied his patch to my main development tree and have thus been using it (with
xft) for most of today.  I also did a build (separate objtree) with the default
xft-related build options.

In my own xft build, I disabled (after hacking configure.in to make it a proper
build option, basically by using what was in attachment 101375 [details], except with the
corexfonts vs. core-xfonts typo fixed -- I'd like to see this checked in,
although it was cls who requested the change in the other direction) the core
xfonts code to make sure that what I was seeing was actually Xft being used.  I
am seeing it, and it looks quite good.  I like the antialiasing, and I did hit a
bunch of Chinese and Hebrew sites to see that they displayed OK.  (I admit I'm
not an expert, but the sites are certainly readable.)  That said, I have my font
configuration pointed at the TT fonts on my Windows partition (via directories
in /usr/share/fonts/ with symlinks, and running of fc-cache), so I probably have
some additional fonts that I'm using in addition to the ones that ship with RH8.

While testing the default-options build, I did notice one regression that needs
to be fixed before this lands.  The intrinsic sizing of text inputs is broken. 
This is very visible on http://bugzilla.mozilla.org/query.cgi .  I think inputs
are one of the few users of one of the more obscure font API methods (I suspect
either GetAveCharWidth or GetMaxAdvance), which probably isn't hooked up quite
right to the old code in nsFontInstanceCore code or related code.  This needs to
be fixed before the patch lands.

A problem that I'm seeing with the xft build is that there are certain cases
where fonts don't resize correctly (and are displayed at a very small size). 
This happens, for example, on the pages:
  http://www.people.fas.harvard.edu/~dbaron/css/test/sec1803  (see test
    item that uses a larger font)
  http://www.0xdeadbeef.com/html/2002/09/ (use text zoom)
The line spacing changes, but the glyphs stay very small.  I think this bug
would need to be fixed before an Xft-enabled build would be usable for dogfood,
but not necessarily before the Xft code lands disabled.

I'm seeing roughly the same size small glyphs in the fonts that are derived from
system fonts, and thus that are being used for Menus, etc.  I suspect this is
the same problem as the one mentioned in the previous paragraph.

Another more subtle issue that may (although may not) need to be addressed at
some poin in the future is that font family prefs don't persist well between the
old code and the Xft code since the font names have changed.  This may just a
cost we pay, although it could end up being a problem for users who have an Xft
build in their distro but download non-Xft nightlies from mozilla.org.

One other issue with prefs is that the defaults for the prefs aren't very
sensibly initialized -- I think they were in the core code.  This is also
something that can be address with later changes.
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attachment #101017 - Attachment is obsolete: true
Attachment #101500 - Attachment is obsolete: true
Attachment #101578 - Attachment is obsolete: true
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Attached file patch (obsolete) —
Patch that includes dbaron's find (I was just going to look for that exact
problem myself. :))
Uhh.  I'm not sure what happened there.
I've seen lots of confusion over why I split this up in the way that I did,
resulting in a huge patch.  Here are the reasons:

1.  It's important that the fonts guys are able to work unimpeded.  Adding
another layer that they need to worry about is going to hinder their ability to
fix bugs and judge impact.

2.  It's important that I am able to work unimpeded as well in the Xft code. 
(Remember, this is replacement for the current matching and rendering code - not
just "a different rendering method")

3.  You can now build without xft or without core font support.  This is just a
nice side effect and wasn't the primary goal.  But, since I was there...

4.  I don't want to have to load all of the core code support in order to use
Xft, since most users on the next generation desktops are going to be using Xft
as their only rendering method.
One note, since dbaron mentioned default config - the 
default sans/serif/monospace fonts in the UI (menus, etc.) should always be the
aliases fontconfig defines for that purpose (sans-serif, serif, monospace, I
believe). These aliases are defined by convention to be the preferred local UI
fonts. So e.g. Qt and GTK+ will also be defaulting to "sans-serif" as the
primary UI font. These aliases are also the only font names that are 
guaranteed to exist on a given system.
Yeah, there's still some things that I need to do wtf prefs and even probably
the prefs UI to get things working right (we need a "use system font" setting of
some kind.)  Once again, though, not important enough to prevent people from not
checking this in.
blizzard wrote:
> 3.  You can now build without xft or without core font support.  This is just 
> a nice side effect and wasn't the primary goal.  But, since I was there...

You are aware that removing "core" X font support will add _major_
interoperability problems between Unix/Linux, right ?
Xtf's emulation code does not count here since it (AFAIK) doesn't make use of
the fonts provided by the "core" X font system and regresses text rendering
performance a lot on non-Xrender-aware Xservers.
s/wtf/wrt/

:)
Roland, people who want to use core fonts shouldn't disable core fonts.  This
patch doesn't do anything to affect the current core font support, unless the
builder chooses explicitly to exclude it.  And I expect that people who are
planning to distribute to environments that don't have RENDER-capable servers --
poor folk -- won't so choose.  But that's just a hunch. :-))))))

(RH8 only uses core fonts for some legacy gtk 1.2 apps, like Mozilla, and I
expect those apps to be dropped or evolved in the next release or two.  I don't
expect Sun and HP to be far behind, honestly.)
Ok, the XFT Mozilla up and dissapears (*poof*) on me shortly after (briefly)
displaying some serious weirdness at: http://www.zdnet.com/zdnn/

RH8 Psyche, XFT build, and a "whole whack" of Windows True Type fonts installed.
It doesn't fold /every/ time.  I made it through twice.  The other 5 times it
crashed.  It slows down a whole lot before it goes, feels like heavy CPU load. 
I managed to grab a screenshot before it dissapeared:

http://www.hubick.com/temp/bugtests/mozfont1.png

I don't know if this attachment helps you (?).
Hrm.  I seem to be having some difficulty reading the news :)

Clicking on the following link also folds the browser:
http://www.internetwk.com/breakingNews/INW20021003S0005
I've isolated the font size problem in comment 196 to being associated with the
helvetica font.  If a web page, or our chrome (which defaults, on my system, to
"Adobe-Helvetica-ISO8859-1,Helvetica" as the name value in
nsSystemFontsGTK::GetSystemFontInfo) asks for Helvetica, it gets a tiny font
that can only be displayed at one size (about 8px, I'd say).
> I've isolated the font size problem in comment 196 to being associated with the
> helvetica font.  If a web page, or our chrome (which defaults, on my system, to
> "Adobe-Helvetica-ISO8859-1,Helvetica" as the name value in
> nsSystemFontsGTK::GetSystemFontInfo) asks for Helvetica, it gets a tiny font
> that can only be displayed at one size (about 8px, I'd say).

Yeah, that's exactly what I found when I looked at it.  It needs either a more
sane default or needs some fixing in the xft code - we'll see.
I'm not seeing crashes on either of those sites.  Are you sure you're not
stumbling across a flash or java problem?

Are you seeing an X error or a segfault or something else?  A stack trace (those
builds might have simple symbols in them) is way more helpful than strace output.
I don't have either Java or Flash installed.

I get no error message at all.  The browser goes to the site, "slows down",
possibly displays it for a short <= 10 second period of time, the *poof* the
process dissapears with no messages or anything.  I grabbed the screen shot I
linked to during that short time before it folds - just so I can show you I
wasn't imagining it :-)
What's the exit status on the browser?  (From a shell echo $? will tell you.)
[hubick@CHWorkstation hubick]$ /usr/local/mozilla/mozilla
[hubick@CHWorkstation hubick]$ echo $?
11
After I installed RH8, I was trying to figure out how to configure my fonts. 
After reading the RedHat reference guide fonts section, I went looking in 
/etc/X11/fs/config, and saw that it pointed at a directory for TTF fonts.  So I
copied all my TTF fonts to /usr/X11R6/lib/X11/fonts/TTF.  I then ran the lower
casing script on them, created a fonts.scale and fonts.dir file.  After finding
out that this wasn't taking effect for xft applications, I scrounged around some
more on the RH mailing lists, and found out about /etc/fonts.conf.  Which did
not reference the same directory.  I then filed:
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=74952
and
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=74953

I added the fonts dir where I put my TTF fonts to fonts.conf and restarted. 
This worked as expected.

Owen then closed the latter of those two bugs saying I put the fonts in the
wrong place (should be /usr/share/fonts).  I figured it wouldn't really matter,
and since they were already there, I just left them.

Just now I tried removing my TTF folder from fonts.conf which I had added, and
tried the ZDNN site, and I no longer see the lockup.

I have a bunch of fonts in that dir - over a hundred that came with my Windows
and CorelDraw distributions, etc.

So, what does that say?
Most likely freetype or possibly a higher layer is crashing on a particular
font. We fixed several bugs along those lines during the Red Hat Linux 8 beta
cycle, but there may be more. A backtrace from gdb ought to turn up the problem.
Or if you can isolate which font is causing the issue.
Just for the record, Mandrake will switch to Xft2/fontconfig for Mdk Linux 9.1..

About the crashes, check patch at
http://www.freetype.org/pipermail/devel/2002-September/004015.html for freetype
2.1.2, it fixes a common crashes with some fonts (like BlueHighway..)
I've installed fontconfig/Xft2/Xft1.1 and I tried to use the build provided by
blizzard and also the build on keithp's page and none of them use xft on my
system (ie they render using core fonts).. But the rest of my gnome2 desktop is
xft'ed... I tried using FC_DEBUG=1 and I get zero output from it for moz (but it
works from gtk2 apps) .. As if moz was not able to find my fontconfig/xft
installation...
Attachment #101579 - Attachment is obsolete: true
Attachment #101581 - Attachment is obsolete: true
Attachment #101583 - Attachment is obsolete: true
Attachment #101584 - Attachment is obsolete: true
Attachment #101585 - Attachment is obsolete: true
Attachment #101586 - Attachment is obsolete: true
Attachment #101588 - Attachment is obsolete: true
> I've installed fontconfig/Xft2/Xft1.1 and I tried to use the build provided by
> blizzard and also the build on keithp's page and none of them use xft on my
> system (ie they render using core fonts).. But the rest of my gnome2 desktop is
> xft'ed... I tried using FC_DEBUG=1 and I get zero output from it for moz (but it
> works from gtk2 apps) .. As if moz was not able to find my fontconfig/xft
> installation...

I'm assuming you pulled down the rh7-xft-patch build?  If so, that's built with
the patch, but doesn't actually have xft turned on since rh7 doesn't have
fontconfig on it.  That's just to test the patch's effect on the core code. (I
guess the name is kind of misleading - sorry.)

Anyway, new rh7 builds should be appearing shortly at:

http://komodo.mozilla.org/pub/mozilla/nightly/experimental/xft/2002-10-04/

that include the ifdef fix.
I've tried compiling from Mozilla CVS several times--if I don't apply Chris's
patch, it works fine, but of course, then it has the core fonts.  If I patch it
before compiling, it will exit with a message the libgfx.so has an undefined
reference to NcFontPattern.  I'm using Slackware 8.1 with the standard XFree86
4.2 packages, and FreeType 2.1.3-RC2.  I'll try it again later with Freetype
2.1.2 and post the exact error message if the problem doesn't go away.
The rendering code, now separated into Xft, is a straight forward task.
Part of this has been maturing for a while and part of it is fairly new; eg:
the support for existing X servers was only put in this spring. Even though
there is a relatively new part in the rendering code, rendering is a relatively
well defined task so Xft is probably ready enough to use in Mozilla. I do want
to note that since the there does not appear to have been any discussion of
printing, the APIs may well require changes when printing is finally considered.

The FontConfig code is fairly new and fonts are a somewhat messy business.
Fonts are about 90-95% order and 5-10% chaos. This makes it much harder
to work out some bugs. As best I can tell, FontConfig uses Unicode ranges to
map languages which works fairly well for some languages but quite poorly for
others (especially Han disambiguation). FontConfig will take some time to
mature. However, some people seem bound and determined to put it in regardless
of its maturity.

If this must be put in before it has had time to mature then put it in with
a pref so *users* can choose.

The current patches are huge and their extreme size make analyzing and
discussing the parts unnecessarily difficult.

These  patches appear to have 3 parts:

1) changes to the API between the rendering layer, metrics layer, and font
   layer

2) code to use Xft

3) moving code to different files

Please separate out the virtual layer changes into a separate bug so this can
be more readily discussed. It should have stubs for the Xft code so the
details of how that Xft/FontConfig is integrated can be clearly seen.
> As best I can tell, FontConfig uses Unicode ranges to
> map languages which works fairly well for some languages but quite poorly for
> others (especially Han disambiguation).

Fontconfig advertises "language" support using RFC 3066 compatible identifiers
which include both ISO 639 language codes and ISO 3166 country codes.  This
allows unambiguous identification of the desired Han glyph shapes.

To compute coverage, Fontconfig uses Unicode coverage tables for each language
generated from various sources.  Many languages have official orthographies
making the task relatively easy.  The Han orthographies were generated by
analysing legacy encoding transformations to Unicode.  This effectively
separates most Han fonts into their respective languages.  The only fonts
presenting difficulty here were the newer chinese encoding (GB18030) which
happen to cover the older simplified chinese encoding (GB2312) as well as the
traditional chinese encoding (Big5).

To disambiguate these fonts, fontconfig looks at an OS/2 code page range table
if present.  If the table indicates support for only one Han language, then
languages mapping to other Han OS/2 code page range bits will not be included in
the list of supported languages.

Using the Unicode coverage also effectively separates fonts with support for the
Hong Kong supplimentary character set from those with only Big5 support.  It
also permits the identification of language support for fonts without OS/2 code
page range information, something provided only by relatively new fonts in
TrueType format.

Fontconfig currently has orthographic information for 122 of the 139 languages
named by ISO 639-1 along with 30 additional languages named only in ISO 639-2.
For Chinese, fontconfig has separate orthographies for China, Hong Kong and
Taiwan.  It uses the orthography from Taiwan for Macau and the orthography from
China for Singapore.

I'm very interested in finding orthographic information for the remaining
languages in ISO 639-1.
> If this must be put in before it has had time to mature then put it in with
> a pref so *users* can choose.

+    rv = prefService->GetBoolPref("fonts.xft.enabled", &enabled);

+        char *val = PR_GetEnv("GDK_USE_XFT");

Lots of way to choose in this patch.

> The current patches are huge and their extreme size make analyzing and
> discussing the parts unnecessarily difficult.

I gave you an easy to use guide in comment 164 that should make it super-easy to
 look at the patch.

> 
> These  patches appear to have 3 parts:
> 
> 1) changes to the API between the rendering layer, metrics layer, and font
>    layer

There are no changes to the APIs of the rendering layer, metrics layer or the
font layer.  All of the calls from the rendering layer through to the fonts
layer are in nsFontHandleGtk.h.

> 
> 2) code to use Xft

The only code that uses Xft is in nsFontInstanceXft.h/cpp.

> 
> 3) moving code to different files
> 
> Please separate out the virtual layer changes into a separate bug so this can
> be more readily discussed. It should have stubs for the Xft code so the
> details of how that Xft/FontConfig is integrated can be clearly seen.

If you want, I can break up the current patch since this is apparently too much
for you to handle.  However, outside of the scope of Xft there isn't a lot of
value talking about changes since they are driven by Xft.

Really, I don't think the layers need much discussion - certainly not enough to
waste time with opening a seperate bug.  If you have a problem with the way that
the nsFontHandleGtk interface works, feel free to discuss it here.  That's why
we have this bug!
re: comment #227
todd: i had a similar problem, i was going to report it as well but didn't get
to it.  it seems that $(MOZ_XFT_LIBS) isn't getting set properly somewhere, as
my libgfx_gtk.so wasn't being linked (at compile time) to libXft or libfreetype
(and i suspect libfontconfig as well, but i don't remember).  i ended up opening
up gfx/src/gtk/Makefile.in and replacing all instances of $(MOZ_XFT_LIBS) with
`xft-config --libs`.  then doing 'make' in that directory should fix it up. 
this isn't a real fix of course, but it should get you going.

blizzard:  any idea why this problem is occurring (tho apparently not all the
time)?  i'm running a generally-fully-updated gentoo 1.2 system with the
Xft2/fontconfig package self-compiled that i got from fontconfig.org.
re: comment #227
same problem with slack8.1 here.
I sort of solved adding in gfx/src/gtk/Makefile:
-lfontconfig -lXft
in line 137 (148 if you build with gtk2).
Have you run autoconf after applying the patch ? This seemed necessary here
> 
> blizzard:  any idea why this problem is occurring (tho apparently not all the
> time)?  i'm running a generally-fully-updated gentoo 1.2 system with the
> Xft2/fontconfig package self-compiled that i got from fontconfig.org.

You have an up-to-date tree, right?  The toplevel configure contains the Xft
changes in it already and should set the proper variables, assuming you have
fontconfig and pkgconfig installed even somewhat properly.
I've read much of the patch in attachment 101589 [details] by this point.  I've
done some cross-tree diffing of moved code, but haven't done enough
quite yet.  However, I *think* I've read most of the patch by this
point, so I'll post my comments so far.  I'll do some more cross-diffing
and such tomorrow, but I probably won't have too many more comments
(although I might have some general ones after having more time to think
about it and stare at it).

Some of these are nits, and not all of the nits really need to be
addressed to land the patch.  However, many of them are pretty easy to
fix.  (And, for that matter, some of the more serious issues, like my
comment about |mWesternFont|, probably don't need to be fixed
immediately, although they do need to be fixed sometime.)

And I haven't really proofread these comments either, so I may have written
some things that make absolutely no sense.


Comments on this patch:

Many of the new files have an sentence with no verb in the license,
which looks like it was copied from some of the old ones:

  nsFontGTK.h: * The Original Code mozilla.org code.
  nsFontHandleGtk.h: * The Original Code mozilla.org code.
  nsFontInstanceCore.cpp: * The Original Code mozilla.org code.
  nsFontInstanceCore.h: * The Original Code mozilla.org code.
  nsFontInstanceFactory.h: * The Original Code mozilla.org code.
  nsFontInstance.h: * The Original Code mozilla.org code.
  nsFontInstanceXft.cpp: * The Original Code mozilla.org code.
  nsFontInstanceXft.h: * The Original Code mozilla.org code.
  nsFontMetricsGTK.cpp: * The Original Code mozilla.org code.
  nsFontMetricsGTK.h: * The Original Code mozilla.org code.

I think the new files should also be copyright 2002, rather than 2001.

Also, shouldn't the files that contain moved code (nsFontInstanceCore)
have the same license as the files the code was moved from (triple-NPL
rather than triple-MPL)?  Or has Netscape agreed that files can be
changed from NPL to MPL?  I never remember.

gfx/src/gtk/Makefile.in:
  Should the addition of XFT build flags to CFLAGS, CXXFLAGS, and
  EXTRA_DSO_LDOPTS be conditional on MOZ_ENABLE_XFT?  (It might help
  ensure people don't add Xft code outside the ifdefs.)

  This still builds the stuff in x11shared even with core x fonts
  disabled, which causes linker warnings when disabling core X fonts.

widget/src/gtk/Makefile.in:
  Why are these changes needed?

nsDrawingSurfaceGTK.h:
  Should the typedef of XftDraw be |#ifdef|ed?  (It might help ensure
  people don't add Xft code outside the ifdefs.)

nsFontInstance.h:

  For the various metrics-getting methods, I think would it be better
  (i.e., faster) to have all these virtual method getters be non-virtual
  inline methods on nsFontInstance that return the values from protected
  member variables of nsFontInstance that are filled in by the derived
  class (just as they are now, but into members of the derived class
  rather than the base class)?  This would reduce a bit of the overhead
  of the reorganization.  (Virtual function calls are bad, especially on
  heavily pipelined processors.)  It looks like the member variables and
  virtual functions are almost, if not completely, identical already.

nsFontInstanceCore.cpp:

  It's a little hard to follow exactly what was moved into this file.
  (diff isn't too helpful since it's not all in the same order as it was
  in nsFontMetricsGTK.cpp).

  XXX I need to comment more on this file.

nsFontInstanceXft.cpp:

  All of the casts to |FcChar8*|, throughout the file, should use
  NS_REINTERPRET_CAST so that you don't unnecessarily cast away |const|
  (which you do in many many places -- hopefully all the function
  signatures put it right back, but I didn't check all of them).  The
  same goes for |FcChar16*|.

  | static const struct XftLangGroup* FindFCLangGroup (nsACString &aLangGroup);
  In C++ rather than C, this can (and should) be just:
  | static const XftLangGroup* FindFCLangGroup (nsACString &aLangGroup);
  The same goes for the definition of |XftLangGroups[]|.

  And while I'm at it, the definition of XftLangGroup should probably
  have additional |const|s in it so that we don't cast string literals
  (in the text section, or wherever to non-const |char| or non-const
  |FcChar8|.  (This would require the addition of |const|s in the casts
  in the definition of |XftLangGroups[]| as well.)

  Should XftLangGroup have a name that makes it's clear it's a Mozilla
  struct rathen than an Xft struct?  (nsXftLangGroup?)

  [ Ignore this paragraph if you want. ]  If I want add a bunch of style
  nits, I'd say that I prefer member initializers to all the assignments
  in the nsFontInstanceXft constructor (but see my comment on
  nsFontInstance.h), and I'd also like to cite bug 78032 comment 1
  (prefer ++i over i++) for the benefit of any future code you might
  write, but I don't see a need to bother cleaning up this patch for
  either.

  In the destructor of nsFontInstanceXft, you can simplify these two
  lines:
    | int end = mLoadedFonts.Count() - 1;
    | for (int i=end; i >= 0; i--) {
  to
    | for (PRInt32 i=mLoadedFonts.Count() - 1; i >= 0; --i) {
  (and I think PRInt32 is probably preferred since that's what the
  parameter to nsVoidArray::ElementAt is).

  You could also pull the RemoveElementAt out of that loop and make it a
  mLoadedFonts.Clear() after the loop, or not bother at all since you're
  about to be destroyed anyway.

  gNumInstances and all its uses should be |#ifdef DEBUG_XFT_MEMORY|

  There are a few odd mixes of coding style in this file -- in
  particular, some function calls have a space between the function name
  and opening parenthesis, which is not Mozilla style.  (e.g., one of
  the calls to AddLangGroup).  I think I've noticed this in some other
  files as well.

  Do we need to load a separate "MiniFont" for every font that's
  requested?  Would one font suffice?  If not, could we delay loading it
  until it's known to be necessary?  (How do other implementations
  handle filling numbers into unknown glyphs?  Is there a better way?)

  I wonder if all the uses of |mWesternFont| are legitimate (such as the
  direct uses in |GetWidth| taking |char*|, etc.).  Is it possible for a
  font to have some but not all ISO-8859-1 characters?  I'd think it
  would be (especially if it were an ISO-8859-x font, for x != 1).  I'm
  seeing a bug that may be related.  In the testcase (you probably don't
  have this font):

  <p style="font-family: 'glyph systems-david-iso8859-8', serif;">
    &Aacute;B&Ccedil;D&Eacute;FGH&Iacute;JKLMN&Ouml;
    &aacute;b&ccedil;d&eacute;fgh&iacute;jklmn&ouml;
  </p>

  I see Hebrew characters in place of the capital A-acute and the
  capital I-acute.  That's bad.  I'm not sure if it's related to this
  particular problem.  (The character positions don't make sense.)

  The printf at the start of nsFontInstanceXft::DrawString should be an
  NS_ASSERTION (or, if that's not what you meant, at the very least
  |#ifdef DEBUG|).  But if that's the case, why do you need the code
  after the early return |if (!aSpacing)|?

  There's so much in common between the two DrawString methods that I
  wish there were a nice way to reduce the amount of copied code, but I
  don't really see a good one (aside, perhaps, from putting the color
  conversion into its own function).

  In the DrawString functions, it would be much nicer to use new[] and
  delete[] than the multi-line arguments to nsMemory::Alloc plus casts.

  In the second DrawString and in GetTextDimensions and in RawGetWidth,
  the |while (j < end)| loop should probably be condensed into a |for|
  loop (no need to declare j so early, or, for that matter |end|, which
  is declared and then assigned into two lines below in a rather odd
  fashion), and again |j| should probably be PRInt32 for consistency.

  There are probably some significant performance improvements that
  could be made to the second DrawString, but we can worry about that
  later.

  The |printf("GetBoundingMetrics")| should be a NS_NOTREACHED.

  nsFontInstanceXft::FindFont calls |mLoadedFonts.Count()| every time
  through the loop.  This needs an |end|.

  In GetTextDimensions, it might be good to save double-calls to
  GetMaxAscent / GetMaxDescent.  You can also pull the declaration of
  |i| into the for-expression.

  The unimplemented GetTextDimensions methods should have an
  NS_NOTREACHED.

  nsFontInstanceXft::CacheFontMetrics uses the expression |(mMaxAscent +
  mMaxDescent)| tons of times -- you could use a variable called
  |lineSpacing| (like nsFontInstanceCore), or just set |mMaxHeight| a
  little earlier and then use it more.

  I think you need a minus sign for the backup code for initializing
  |mUnderlineOffset|.

  How often is nsFontInstanceXft::SetupFCPattern called?  I'd think it's
  a lot, and I'd think you'd want to cache the results of the pref
  lookups (although maybe they're not as slow as I think).

  The comment about adding the language group before the generic seems
  to belong above |AddLangGroup| rather than 30 lines down below all the
  pref code.

  How about an NS_ASSERTION if nsFontInstanceXft::DoMatch enters the
  "loser:" code?  (I ask for things this obvious because I've spent too
  much time finding bugs in really old layout code that would have been
  obvious if people had done things like this.)

  The "FoundFont:" sections of GetTextDimensions and RawGetWidth could be
  simplified a bit by switching the nesting of the |if (prevFont)| and
  the |if (currFont != prevFont)| conditions.

  In SetupMiniFont, I think
    | char str[2] = "\0";
    | str[0] = c;
  would be more clearly (and perhaps faster) written as:
    | char str[2];
    | str[0] = c;
    | str[1] = '\0';

  In SetupMiniFont, shouldn't you use PR_MAX instead of MAX (which may
  not be defined on all platforms)?

  The constructor and destructor of nsXftFont have more of the space
  before "(" in function calls.  Also GetXftFont.

  In nsFontXft::GetXftFont, should you have additional error handling:
    |         mXftFont = XftFontOpenPattern (GDK_DISPLAY(), pat);
    |+
    |+        if (!mXftFont)
    |+            FcPatternDestroy(pat);
    |     }
  or do we assume that never happens?  (Some of the internal Xft code
  does it.)

  The nsFontXft::GetBoundingMetrics{8,16} should use NS_NOTREACHED
  instead of printf.

  The way you use GetXftFont is inconsistent between
  GetMaxAscent/GetMaxDescent (which I think I prefer) and
  GetWidth{8,16}.  The latter seems to be the only place you null-check
  the result.  If you need to, then you should elsewhere.  If you don't
  need to, then don't.  And why have a long comment about getting the
  font that escribes the obvious only in |GetMaxDescent|?  (I'd prefer
  none.)

  I think NS_FamilyExistsXft needs to call FcPatternDestroy.

  The two tests leading to |goto end;| in NS_FamilyExistsXft could be
  combined into a single |if (!set || !set->nfont)|.

  (Eek, the signature of FcPatternGetString really should have a |const|
  for the out parameter!)  You might want to use a |const| for
  |tmpname| anyway, since the source of it makes it look like that's
  what is meant.

  In |NS_EnumFontsXft|, there are some cases (nfont == 0) where you
  return a success result without initializing the out parameters.  You
  might want to initialize them in all cases, but you certainly should
  when returning success.

  |CalculateSlant| might be clearer if the default were a "default:".

  In the following in |CalculateWeight|:
    |    /* Map from weight value to fcWeights index */
    |    static int fcWeightLookup[10] = {
    |        0, 0, 0, 0, 1, 1, 2, 3, 3, 4,
    |    };
  I think you may want to change the second of the 3's to a 4, so that
  an 800 font-weight maps to BLACK rather than BOLD.  This seems more in
  conformance with http://www.w3.org/TR/REC-CSS2/fonts.html#q46 .  (Or
  was there some other reason that led you to pick what you did?)

  In |AddLangGroup|, you can save a string copy (and an nsAutoString
  constructor, which is far worse) by changing the first 4 lines to:

    const PRUnichar *name;
    aLangGroup->GetUnicode(&name);
    nsCAutoString cname;
    cname.AssignWithConversion(nsDependentString(name));

  |AddFFRE| -- another space before (.
    Also, are you doing anything evil here when casting away const?
    (See one of my first comments on this file.)

  In FFREToFamily, you can use
    oFamily.Append(Substring(aFFREName, familyHyphen,
                             registryHyphen-familyHyphen));
  instead of the long thing that does an extra string copy.

  I'd tell you to use |CountCharInReadable| instead of writing your own
  |FFRECountHyphens|, except |CountCharInReadable| is slower than the
  way you wrote it (unless you have a multifragment string of many
  fragments and high density of the target character).  Aargh.  I should
  file a bug.

XXX I need to comment more on the files below, and on the files I
haven't mentioned.

nsRenderingContextGTK.cpp:

  This patch adds an unused member variable, mFontCachedOffset, which
  should be removed.

nsFontHandleGtk.h:

  I don't really understand why this layer is needed.  It seems to me
  that you could avoid a good bit of extra layers while keeping the
  abstration by adding an nsIFontMetricsGTK between nsIFontMetrics and
  nsFontMetricsGTK, and putting the stuff that's on nsFontHandleGtk
  there rather than having a separate object.

nsFontMetricsGTK.{h,cpp}:

  I don't see any reason you need separate variables for
  |mFontInstanceCore| and |mFontInstanceXft|.  Can't you just make this
  a single |mFontInstance|?  I think this would allow removing of some
  null checks.  (Or is there still a possibility of these methods being
  called after failure?  If so, can it be eliminated?)


An addendum to some of my previous comments, which probably doesn't need
to be addressed on the Mozilla end:

The Helvetica problem, which I mentioned in comment 196 and comment 216,
seems to be an Xft bug -- I can reproduce it in other programs by
selecting Helvetica as my Application Font.  (I need to figure out where
my Helvetica font comes from and file an Xft bug in RedHat bugzilla.)


Comments on the moved code that should probably be addressed by its
owner:

nsFontGTK.h

    typedef struct nsFontCharSetInfo nsFontCharSetInfo;
  That's C, not C++.  There are many other things like this.  For C++,
    struct nsFontCharSetInfo;
  is sufficient and preferred (at least in my opinion).

nsFontInstanceCore.cpp:

  No need for PR_{BEGIN,END}_EXTERN_C -- that's for headers that can be
  included by either C or C++.  Here you can just use |extern "C" {| and
  |}|.
> Or has Netscape agreed that files can be changed from NPL to MPL?  I never 
> remember.

They have, yes.  We can tri-MPL-license Netscape-copyrighted code at will, and
should.

>   In SetupMiniFont, I think
>     | char str[2] = "\0";
>     | str[0] = c;
>   would be more clearly (and perhaps faster) written as:
>     | char str[2];
>     | str[0] = c;
>     | str[1] = '\0';

char str[2] = { c, '\0' }; // ?

>     typedef struct nsFontCharSetInfo nsFontCharSetInfo;
>   That's C, not C++.  There are many other things like this.  For C++,
>     struct nsFontCharSetInfo;
>  is sufficient and preferred (at least in my opinion).

It's definitely better C++ and Mozilla style, but I don't think we need the
forward declaration at all; the typedef doesn't provide that on its own, unless
my C-brain is blearier than I think at this hour.

Thanks for the great review, dbaron.  I think you've made blizzard's weekend. =)
i didn't run autoconf, could that actually be it?  i thought configure should
rebuild all the Makefiles from the Makefile.ins.  too tired to play with it now...

blizzard:  yeah, tree was freshly updated before i patched it.  actually i did
make distclean && cd .. && cvs update mozilla/client.mk && make -f
mozilla/client.mk checkout && cd mozilla && zcat
../mozilla-xft-blizzard.diff.gz|patch -p0 && configure && make
or something along those lines.  i'll do a little more playing in the next
couple days to see if i can figure it out myself.

otherwise, moz looks beautiful, other than the location bar text writing over
past the end of the box and onto the buttons to the right (don't know if you
fixed that yet, i'm running i think the last 'checkpointing changes' patch. 
will try the latest soon.  great work; i'm very pleased.

random OT question: what happened to the native gtk widgets?  i noticed native
widgets in i think either 1.2a or something recent, but nothing on the tip now,
just the moz xpwidgets for scrollbars, buttons, etc.
> Have you run autoconf after applying the patch ? This seemed necessary here

Actually, I found that a "sh allmakefiles.sh" was what I needed.  It works great
now :]
For the record, the problem I was having with Helvetica was because I have had
(for a long time) the Mathematica fonts from
http://support.wolfram.com/mathematica/systems/unix/interface/pcf.html installed
in /usr/share/fonts/Mathematica/.  These fonts have a Helvetica
(wri-helvetica-iso8859-1) that is only available at 2 sizes.  I had two other
Helvetica fonts, both bitmap fonts, one available in a wider range of sizes, but
they were both in /usr/X11R6/lib/X11/fonts/.  So I moved the Mathematica fonts
to /usr/X11R6/lib/X11/fonts/ and made the appropriate configuration changes and
the problem went away (since Xft no longer finds any font called Helvetica). 
The lesson, I guess, is that it's probably not a good idea to install bitmap
fonts with common names like Helvetica in /usr/share/fonts/ when Xft is
searching there.

On another note, the Hebrew mixing with ISO-8859-1 problem that I mentioned
yesterday doesn't seem to be related to mWesternFont overuse, but rather some
more general problem.  I see the problem even if I put &#x9000; within the same
run of characters, which I would expect to trigger the 16-bit character codepath
for the whole bunch (although I could be wrong about that, in which case it
could be related to overuse of mWesternFont).
>> bstell wrote:
>>
>> Please separate out the virtual layer changes into a separate bug so this can
>> be more readily discussed. It should have stubs for the Xft code so the
>> details of how that Xft/FontConfig is integrated can be clearly seen.

> blizzard wrote:
>
>If you want, I can break up the current patch since this is apparently too much
>for you to handle.  However, outside of the scope of Xft there isn't a lot of
>value talking about changes since they are driven by Xft.

Blizzard, I hope you that you do understand that it's quite reasonable to ask
for a patch/diff that shows the _actual_ differences.

The diff (tool) ceases to be the useful tool it is, when the code is moved or
re-organized. Here's an example:

1) When moving the code around, you get a diff like this:

Index: xxx.cpp
---------------
- blaa blaa whole 
- license text
- blaa blaa
-
- lots of code
- with (almost) all 
- the stuff in the file
- int fontclass :: somefunc() {
-      stuff...
-      if (fontid == 1) {
(and so on...)

Index: yyy.cpp
---------------
+ blaa blaa whole 
+ license text
+ blaa blaa
+
+ lots of code
+ with (almost) all 
+ the stuff in the file
+ int fontclass :: somefunc() {
+      stuff...
+      if (fontid == 1 && xftfontid ==2) {
(and so on...)

2) without moving/reorg we get only the interesting part, i.e.:

Index: xxx.cpp
---------------
-      if (fontid == 1) {
+      if (fontid == 1 && xftfontid ==2) {


So, it's so much easier for the reviewers to do their work. In the case 1), each
and every reviewer has to do some sort of de-moving and de-ordering in order to
be able to diff the diffs and to get into the case 2).

You would have made yourself a huge favour if you had in some way or another
kept the move/reorganization, changes and additions as separate patches in the
beginning, or at least split the patch later, when realizing this is toying
around lots of code.

The ability to easily review this stuff also contributes better quality; one can
spend more time on finding bugs/typos (which are already easier to spot) and
thinking what would be the best way to organize/integrate/interface the old/new
code.
A few more comments:

nsFontMetricsGTK.cpp:

  You should cache the result of IsXftEnabled so you don't have to do a
  getenv and a pref lookup so often.

nsXFont.h:
nsFontFreetype.cpp:

  The include changes here seem like they're adding gdk dependencies from
  things that shouldn't have them.

nsXFontAAScaledBitmap.cpp:

  Was there a reason you removed that little chunk of code?
Attached file patch (obsolete) —
Patch after dbaron's first set of comments.
Attachment #101589 - Attachment is obsolete: true
Testing the 2002-10-04 rh8-xft binary and using Verdana as my Serif font and
LucidaTypewriter as my monospace font, the only problem I have seen so far is
the rendering of the MARC mailing list archives, in particular the underline
seems to be raised slightly higher and eats into the text. I don't see this
behaviour if I switch to other fixed width fonts such as Andale
Mono,Courier,Luxi Mono

URL for the linux-kernel archive at MARC is

http://marc.theaimsgroup.com/?l=linux-kernel&r=1&b=200210&w=2

I will attach a screenshot also
For the record, underlined text also looks weird on
http://www.python.org/doc/current/modindex.html
screenshot showing underline being raised slightly and cutting into the text
Fonts configured in Mozilla-xft at the time of screenshot
Serif->Verdana
Monospace->LucidaTypewriter
Perhaps the underline offset issue is related to my comment in comment 235 about
the backup underline offset being the negative of what it should be.  Or maybe
the non-backup one is?  (That would surprise me, though, unless Xft is worse at
getting underline metrics than xfsft was, since many of my fonts have an
underline offset that clearly does have the correct sign.)
Yes, I just tested the minus sign change in my tree, and it does fix
http://www.python.org/doc/current/modindex.html , which did display badly for
me.  Since that minus sign fix is in attachment 101865 [details], the problem is fixed in
the latest version of the patch.
Comment on attachment 101865 [details]
patch

A few comments on this patch (in addition to the ones in coment 241), on the
things that changed since the previous patch:

You can save 4 bytes (an extra vtable pointer) on the size of nsFontMetricsGTK
objects by making nsIFontMetricsGTK inherit from nsIFontMetrics and then making
nsFontMetricsGTK inherit only from nsIFontMetricsGTK.

The nsFontMetricsGTK methods that forward to mFontInstance are inconsistent
about null-checking mFontInstance.  I would hope that now that you only have
one, there wouldn't be a need to null-check it in most places, since the font
metrics Init method would have returned failure and the font metrics object
wouldn't be used.

MozXftLangGroup::mozLangGroup should be |const char*|, not just |char*|.

Once I get jprof working again I'll try to profile and see which of my
performance comments are more important and file bugs on those (depending on
bug 172768).
I'm using the build of this chris put up on october 4th on RedHat 8, and I'm
seeing a symptom similar to that in comment #47, except for me, the browser
doesn't crash, it just hangs forever.  the problem happened to me when viewing
CNET url:
http://news.com.com/2100-1023-959537.html although I've seen it on several
other pages as well.  I've attached the stack trace.  Note, hang is in
malloc...
sorry for spamming, my problem seems to have been related to a plugin...I
disabled all plugins and it went away.  I suspect either the java or flash plugin
I tested blizzard's experimental builds at
ftp://ftp.mozilla.org/pub/mozilla/nightly/experimental/xft/2002-10-04/ and found
that there was no impact at all to existing code paths comparing the vanilla
build and the build with the xft patch.  The scores were 560ms and 561ms,
respectively, on my 1.5GHz RH 7.3 machine with 512 MB RAM.
[ Comments from the first review.  If something isn't listed here it's because I
went ahead and change it after the review. ]

> Also, shouldn't the files that contain moved code (nsFontInstanceCore)
> have the same license as the files the code was moved from (triple-NPL
> rather than triple-MPL)?  Or has Netscape agreed that files can be
> changed from NPL to MPL?  I never remember.

Yes, they agreed to change the license a long time ago.

> gfx/src/gtk/Makefile.in:
>   Should the addition of XFT build flags to CFLAGS, CXXFLAGS, and
>   EXTRA_DSO_LDOPTS be conditional on MOZ_ENABLE_XFT?  (It might help
>   ensure people don't add Xft code outside the ifdefs.)

If Xft isn't enabled, those are empty so I didn't think that's a big
deal.

> widget/src/gtk/Makefile.in:
>   Why are these changes needed?

They aren't (left over from an earlier version of the patch.)

> nsFontInstance.h:
> 
>   For the various metrics-getting methods, I think would it be better
>   (i.e., faster) to have all these virtual method getters be non-virtual
>   inline methods on nsFontInstance that return the values from protected
>   member variables of nsFontInstance that are filled in by the derived
>   class (just as they are now, but into members of the derived class
>   rather than the base class)?  This would reduce a bit of the overhead
>   of the reorganization.  (Virtual function calls are bad, especially on
>   heavily pipelined processors.)  It looks like the member variables and
>   virtual functions are almost, if not completely, identical already.

Yeah, I originally did that seperation for other reasons and they just
ended up the same.  All of those getters are now merged into the
nsFontInstance class.

> nsFontInstanceXft.cpp:
> 
>   All of the casts to |FcChar8*|, throughout the file, should use
>   NS_REINTERPRET_CAST so that you don't unnecessarily cast away |const|
>   (which you do in many many places -- hopefully all the function
>   signatures put it right back, but I didn't check all of them).  The
>   same goes for |FcChar16*|.

We talked about this.  It should be safe to cast away const here, even
though the functions in question don't take const.  Plus, it's all
critical path code so adding the extra code and possible allocations
(even with a fixed size static buffer) might add some serious pain.

I've asked Keith about the safeness of doing this since he knows the
internals of the functions more than I do - I'll fix it if I need to.

>   There are a few odd mixes of coding style in this file -- in
>   particular, some function calls have a space between the function name
>   and opening parenthesis, which is not Mozilla style.  (e.g., one of
>   the calls to AddLangGroup).  I think I've noticed this in some other
>   files as well.

Yeah, as a programmer I still haven't figured out what I'm happy with
here and the results are that I don't have a consistent style yet. :P
I'm not going to try to fix all of these yet.

>   Do we need to load a separate "MiniFont" for every font that's
>   requested?  Would one font suffice?  If not, could we delay loading it
>   until it's known to be necessary?  (How do other implementations
>   handle filling numbers into unknown glyphs?  Is there a better way?)

No, it's needed for each instances since the size of the bounding box
is based on the size of the font.  I don't think that other
implementations fill in the unknown box with the number of the missing
glyph.  This is the pango style, which I'm duplicating since it gives
a little better information than just drawing an empty box.

>   There's so much in common between the two DrawString methods that I
>   wish there were a nice way to reduce the amount of copied code, but I
>   don't really see a good one (aside, perhaps, from putting the color
>   conversion into its own function).

Yeah, there are are lot of similarities.  For that matter there's a
lot of similarities between DrawString() and GetTextDimensions().

>   There are probably some significant performance improvements that
>   could be made to the second DrawString, but we can worry about that
>   later.

Yeah, I thought about it for a bit, but there didn't seem an obvious
way so I just left it as something that "just works."

>   In GetTextDimensions, it might be good to save double-calls to
>   GetMaxAscent / GetMaxDescent.  You can also pull the declaration of
>   |i| into the for-expression.

No, the i is used later after the for loop.  I fixed the double calls,
though.

>   I think you need a minus sign for the backup code for initializing
>   |mUnderlineOffset|.

Yep.  Good catch.

>   How often is nsFontInstanceXft::SetupFCPattern called?  I'd think it's
>   a lot, and I'd think you'd want to cache the results of the pref
>   lookups (although maybe they're not as slow as I think).

It's called once per the lifetime of the nsFontInstanceXft object,
which isn't often at all.  I'm not worried about it.

>   The "FoundFont:" sections of GetTextDimensions and RawGetWidth could be
>   simplified a bit by switching the nesting of the |if (prevFont)| and
>   the |if (currFont != prevFont)| conditions.

I don't think so.  I looked at this for a long time when I was writing
this code and didn't see a way to express it such that it was clearer.
The problem is that for the first character, currFont != prevFont so
you would always enter into the wrong block.  Maybe I'm
mis-understanding what you're saying here - I'm not sure.

>   I think NS_FamilyExistsXft needs to call FcPatternDestroy.

Yeah, I did.  Plusm there was another chance to leak an object in that
code as well that I just fixed.

>   In the following in |CalculateWeight|:
>     |    /* Map from weight value to fcWeights index */
>     |    static int fcWeightLookup[10] = {
>     |        0, 0, 0, 0, 1, 1, 2, 3, 3, 4,
>     |    };
>   I think you may want to change the second of the 3's to a 4, so that
>   an 800 font-weight maps to BLACK rather than BOLD.  This seems more in
>   conformance with http://www.w3.org/TR/REC-CSS2/fonts.html#q46 .  (Or
>   was there some other reason that led you to pick what you did?)

Let's file a seperate bug to look at that.  There are a couple of
other weight-related issues that I need to deal with, too - might as
well kill them all at once.

> nsFontHandleGtk.h:
> 
>   I don't really understand why this layer is needed.  It seems to me
>   that you could avoid a good bit of extra layers while keeping the
>   abstration by adding an nsIFontMetricsGTK between nsIFontMetrics and
>   nsFontMetricsGTK, and putting the stuff that's on nsFontHandleGtk
>   there rather than having a separate object.

I totally agree.  The handle started out as doing more but it's just
forwarding calls now.  Renamed to nsIFontMetricsGTK and pulled
directly into nsFontMetricsGTK.

> 
> nsFontMetricsGTK.{h,cpp}:
> 
>   I don't see any reason you need separate variables for
>   |mFontInstanceCore| and |mFontInstanceXft|.  Can't you just make this
>   a single |mFontInstance|?  I think this would allow removing of some
>   null checks.  (Or is there still a possibility of these methods being
>   called after failure?  If so, can it be eliminated?)
> 
> 

Agreed.  Once upon a time they were slightly different, but in the end
they ended up not being different.
> nsFontMetricsGTK.cpp:
> 
>   You should cache the result of IsXftEnabled so you don't have to do a
>   getenv and a pref lookup so often.

Added in a patch that I've got in my tree now - will upload soon.

> nsXFont.h:
> nsFontFreetype.cpp:
> 
>   The include changes here seem like they're adding gdk dependencies from
>   things that shouldn't have them.

Those files already have gdk dependencies.  Now they're just self-hosting.

> nsXFontAAScaledBitmap.cpp:
> 
>   Was there a reason you removed that little chunk of code?

Organic patch.  Didn't need it.  It's removed now.
> You can save 4 bytes (an extra vtable pointer) on the size of nsFontMetricsGTK
> objects by making nsIFontMetricsGTK inherit from nsIFontMetrics and then making
> nsFontMetricsGTK inherit only from nsIFontMetricsGTK.
> 
> The nsFontMetricsGTK methods that forward to mFontInstance are inconsistent
> about null-checking mFontInstance.  I would hope that now that you only have
> one, there wouldn't be a need to null-check it in most places, since the font
> metrics Init method would have returned failure and the font metrics object
> wouldn't be used.
> 
> MozXftLangGroup::mozLangGroup should be |const char*|, not just |char*|.
> 

All fixed in the patch I'm about to upload.
Attached file patch (obsolete) —
Patch with all of dbaron's comments addressed.
Attachment #101865 - Attachment is obsolete: true
blizzard asked me to act as reviewer for his patch. I have been travelling and
it is just now that I am having a chance to dig into the patch. Reading the
numerous comments ate plenty of the time. It is however unfortunate that most of
these weren't constructive comments. There were some points that bstell made and
which blizzard responded adequately (comment 94), and this seemed to have
essentially provided a point of consensus: separate Xft support although bstell
isn't totally agreable with all the nitty-gritty details -- without
unfortunately being as constructive as he was in bug 132759. bstell, since you
obviously have a vested interest on fonts, and Xft is poised to supersede what
you did (at some stage), you could have iterated on the proposed patch (as you
did in bug 132759) to contribute your desired alterations for others to chew
upon. Only blizzard's patch is here for us to review.

Unfortunately it is long past midnight here at the moment, and I can only
continue tomorrow (local time).

Something this large has usually been an early milestone material. So it is
probably more realistic to target the upcoming one where less restricted
checkins would allow rapid resolution of issues that my arise, thereby allowing
people to rejoice with a more stable support when the target milestone is
released. In the meantime, s/nsFontInstance/nsFontMetrics/g would make the patch
stay closer to its memory lane.
> In the meantime, s/nsFontInstance/nsFontMetrics/g would make the patch
> stay closer to its memory lane.

Would you really want to give two different layers the same name?


I don't see a large risk to existing codepaths to landing this for 1.2b, and
drivers will be willing to accept changes to the Xft-only (not part of the
default build) code during the closure so that it can be improved quickly. 
Linux distributions need this code a few months ago, or now, or very soon,
depending on the distribution, and I'd rather see the development happen in the
Mozilla tree than force a fork that might be long-lasting.
> bstell, ... you could have iterated on the proposed patch 

The patches have around 2,500 patch lines of real change and about 14,000+ patch 
lines which bascially move functions unchanged from one file to another.  These 
14,000+ lines appear to be not directly related to the Xft changes and obscure it. 
I have been requesting a patch without the file moves for 2 months. I still think
this separation should be done for the reasons listed in comment 240.
Compare the code to check if Xft is enabled. The "A:" lines are from the current 
patch and the "B:" lines are what a simplified patch could look like.

A: -nsFontGTK*
A: -nsFontMetricsGTK::FindLangGroupFont(nsIAtom* aLangGroup, PRUnichar aChar,
nsCString *aName)
A: +/* static */
A: +PRBool
A: +IsXftEnabled(void)
A:  {
A: -  nsFontGTK* font;
A: -
A: -  FIND_FONT_PRINTF(("      lang group = %s", atomToName(aLangGroup)));
A:  
A: -  //  scan gCharSetMap for encodings with matching lang groups
A: -  nsFontCharSetMap* charSetMap;
A: -  for (charSetMap=gCharSetMap; charSetMap->mName; charSetMap++) {
A: -    nsFontLangGroup* mFontLangGroup = charSetMap->mFontLangGroup;
A: +    static PRBool been_here = PR_FALSE;
A: +    static PRBool cachedXftSetting = PR_TRUE;
A:  
A: -    if ((!mFontLangGroup) || (!mFontLangGroup->mFontLangGroupName)) {
A: -      continue;
A: -    }
A: +    if (!been_here) {
A: +        been_here = PR_TRUE;
A: +        nsCOMPtr<nsIPref> prefService;
A: +        prefService = do_GetService(NS_PREF_CONTRACTID);
A: +        if (!prefService)
A: +            return PR_TRUE;
A:  
A: -    if (!charSetMap->mInfo->mLangGroup) {
A: -      SetCharsetLangGroup(charSetMap->mInfo);
A: -    }
A: +        nsresult rv;
A:  
A: -    if (!mFontLangGroup->mFontLangGroupAtom) {
A: -      SetFontLangGroupInfo(charSetMap);
A: -    }
A: +        rv = prefService->GetBoolPref("fonts.xft.enabled", &cachedXftSetting);
A:  
A: -    if ((aLangGroup != mFontLangGroup->mFontLangGroupAtom) 
A: -       && (aLangGroup != charSetMap->mInfo->mLangGroup)) {
A: -      continue;
A: -    }
A: -    // look for a font with this charset (registry-encoding) & char
A: -    //
A: -    nsCAutoString ffreName;
A: -    if(aName) {
A: -      // if aName was specified so call TryNode() not TryNodes()
A: -      ffreName.Assign(*aName);
A: -      FFRESubstituteCharset(ffreName, charSetMap->mName); 
A: -      FIND_FONT_PRINTF(("      %s ffre = %s", charSetMap->mName,
ffreName.get()));
A: -      if(aName->First() == '*') {
A: -         // called from TryFamily()
A: -         font = TryNodes(ffreName, aChar);
A: -      } else {
A: -         font = TryNode(&ffreName, aChar);
A: -      }
A: -      NS_ASSERTION(font ? font->SupportsChar(aChar) : 1, "font supposed to
support this char");
A: -    } else {
A: -      // no name was specified so call TryNodes() for this charset
A: -      ffreName.Assign("*-*-*-*");
A: -      FFRESubstituteCharset(ffreName, charSetMap->mName); 
A: -      FIND_FONT_PRINTF(("      %s ffre = %s", charSetMap->mName,
ffreName.get()));
A: -      font = TryNodes(ffreName, aChar);
A: -      NS_ASSERTION(font ? font->SupportsChar(aChar) : 1, "font supposed to
support this char");
A: -    }
A: -    if (font) {
A: -      NS_ASSERTION(font->SupportsChar(aChar), "font supposed to support this
char");
A: -      return font;
A: -    }
A: -  }
A: +        // Yes, this makes sense.  If xft is compiled in and there's no
A: +        // pref, it's automatically enabled.  If there's no pref, check
A: +        // the environment.
A: +        if (NS_FAILED(rv)) {
A: +            char *val = PR_GetEnv("GDK_USE_XFT");
A:  
A: -  return nsnull;
A: -}
A: -
A: -/*
A: - * First we try to load the user-defined font, if the user-defined charset
A: - * has been selected in the menu.
A: - *
A: - * Next, we try the fonts listed in the font-family property
(FindStyleSheetSpecificFont).
A: - *
A: - * Next, we try any CSS generic font encountered in the font-family list and
A: - * all of the fonts specified by the user for the generic
(FindStyleSheetGenericFont).
A: - *
A: - * Next, we try all of the fonts on the system (FindAnyFont). This is
A: - * expensive on some Unixes.
A: - *
A: - * Finally, we try to create a substitute font that offers substitute glyphs
A: - * for the characters (FindSubstituteFont).
A: - */
A: -nsFontGTK*
A: -nsFontMetricsGTK::FindFont(PRUnichar aChar)
A: -{
A: -  FIND_FONT_PRINTF(("\nFindFont(%c/0x%04x)", aChar, aChar));
A: +            if (val && val[0] == '0') {
A: +                cachedXftSetting = PR_FALSE;
A: +                goto end;
A: +            }
A:  
A: -  nsFontGTK* font = FindUserDefinedFont(aChar);
A: -  if (!font) {
A: -    font = FindStyleSheetSpecificFont(aChar);
A: -    if (!font) {
A: -      font = FindStyleSheetGenericFont(aChar);
A: -      if (!font) {
A: -        font = FindAnyFont(aChar);
A: -        if (!font) {
A: -          font = FindSubstituteFont(aChar);
A: +            cachedXftSetting = PR_TRUE;
A:          }
A: -      }
A: -    }
A: -  }
A: -
A: -#ifdef NS_FONT_DEBUG_CALL_TRACE
A: -  if (gFontDebug & NS_FONT_DEBUG_CALL_TRACE) {
A: -    printf("FindFont(%04X)[", aChar);
A: -    for (PRInt32 i = 0; i < mFonts.Count(); i++) {
A: -      printf("%s, ", mFonts.CStringAt(i)->get());
A: -    }
A: -    printf("]\nreturns ");
A: -    if (font) {
A: -      printf("%s\n", font->mName ? font->mName : "(substitute)");
A: -    }
A: -    else {
A: -      printf("NULL\n");
A: -    }
A: -  }
A: -#endif
A: -
A: -  return font;
A: -}
A: -
A: -
A: -// The Font Enumerator
A: -
A: -nsFontEnumeratorGTK::nsFontEnumeratorGTK()
A: -{
A: -  NS_INIT_ISUPPORTS();
A: -}
A: -
A: -NS_IMPL_ISUPPORTS1(nsFontEnumeratorGTK, nsIFontEnumerator)
A: -
A: -typedef struct EnumerateNodeInfo
A: -{
A: -  PRUnichar** mArray;
A: -  int         mIndex;
A: -  nsIAtom*    mLangGroup;
A: -} EnumerateNodeInfo;
A: -
A: -static PRIntn
A: -EnumerateNode(void* aElement, void* aData)
A: -{
A: -  nsFontNode* node = (nsFontNode*) aElement;
A: -  EnumerateNodeInfo* info = (EnumerateNodeInfo*) aData;
A: -  if (info->mLangGroup != gUserDefined) {
A: -    if (node->mCharSetInfo == &Unknown) {
A: -      return PR_TRUE; // continue
A: -    }
A: -    else if (info->mLangGroup != gUnicode) {
A: -      if (node->mCharSetInfo->mLangGroup != info->mLangGroup) {
A: -        return PR_TRUE; // continue
A: -      }
A: -    }
A: -    // else {
A: -    //   if (lang == add-style-field) {
A: -    //     consider it part of the lang group
A: -    //   }
A: -    //   else if (a Unicode font reports its lang group) {
A: -    //     consider it part of the lang group
A: -    //   }
A: -    //   else if (lang's ranges in list of ranges) {
A: -    //     consider it part of the lang group
A: -    //     // Note: at present we have no way to do this test but we 
A: -    //     // could in the future and this would be the place to enable
A: -    //     // to make the font show up in the preferences dialog
A: -    //   }
A: -    // }
A: -
A: -  }
A: -  PRUnichar** array = info->mArray;
A: -  int j = info->mIndex;
A: -  PRUnichar* str = ToNewUnicode(node->mName);
A: -  if (!str) {
A: -    for (j = j - 1; j >= 0; j--) {
A: -      nsMemory::Free(array[j]);
A:      }
A: -    info->mIndex = 0;
A: -    return PR_FALSE; // stop
A: -  }
A: -  array[j] = str;
A: -  info->mIndex++;
A: -
A: -  return PR_TRUE; // continue
A: -}
A: -
A: -PR_BEGIN_EXTERN_C
A: -static int
A: -CompareFontNames(const void* aArg1, const void* aArg2, void* aClosure)
A: -{
A: -  const PRUnichar* str1 = *((const PRUnichar**) aArg1);
A: -  const PRUnichar* str2 = *((const PRUnichar**) aArg2);
A: -
A: -  // XXX add nsICollation stuff
A: -
A: -  return nsCRT::strcmp(str1, str2);
A: -}
A: -PR_END_EXTERN_C
A: -
A: -static nsresult
A: -EnumFonts(nsIAtom* aLangGroup, const char* aGeneric, PRUint32* aCount,
A: -  PRUnichar*** aResult)
A: -{
A: -  nsresult res = GetAllFontNames();
A: -  if (NS_FAILED(res)) {
A: -    return res;
A: -  }
A: -
A: -  PRUnichar** array =
A: -    (PRUnichar**) nsMemory::Alloc(gGlobalList->Count() * sizeof(PRUnichar*));
A: -  if (!array) {
A: -    return NS_ERROR_OUT_OF_MEMORY;
A: -  }
A: -  EnumerateNodeInfo info = { array, 0, aLangGroup };
A: -  if (!gGlobalList->EnumerateForwards(EnumerateNode, &info)) {
A: -    nsMemory::Free(array);
A: -    return NS_ERROR_OUT_OF_MEMORY;
A: -  }
A: -
A: -  NS_QuickSort(array, info.mIndex, sizeof(PRUnichar*), CompareFontNames,
A: -               nsnull);
A: -
A: -  *aCount = info.mIndex;
A: -  if (*aCount) {
A: -    *aResult = array;
A: -  }
A: -  else {
A: -    nsMemory::Free(array);
A: -  }
A:  
A: -  return NS_OK;
A: -}
A: -
A: -NS_IMETHODIMP
A: -nsFontEnumeratorGTK::EnumerateAllFonts(PRUint32* aCount, PRUnichar*** aResult)
A: -{
A: -  NS_ENSURE_ARG_POINTER(aResult);
A: -  *aResult = nsnull;
A: -  NS_ENSURE_ARG_POINTER(aCount);
A: -  *aCount = 0;
A: + end:
A:  
A: -  return EnumFonts(nsnull, nsnull, aCount, aResult);
A: +    return cachedXftSetting;
A:  }
A:  
A: 

========================================================================

B: +/* static */
B: +PRBool
B: +IsXftEnabled(void)
B: + {
B: + 
B: +    static PRBool been_here = PR_FALSE;
B: +    static PRBool cachedXftSetting = PR_TRUE;
B: + 
B: +    if (!been_here) {
B: +        been_here = PR_TRUE;
B: +        nsCOMPtr<nsIPref> prefService;
B: +        prefService = do_GetService(NS_PREF_CONTRACTID);
B: +        if (!prefService)
B: +            return PR_TRUE;
B: + 
B: +        nsresult rv;
B: + 
B: +        rv = prefService->GetBoolPref("fonts.xft.enabled", &cachedXftSetting);
B: + 
B: +        // Yes, this makes sense.  If xft is compiled in and there's no
B: +        // pref, it's automatically enabled.  If there's no pref, check
B: +        // the environment.
B: +        if (NS_FAILED(rv)) {
B: +            char *val = PR_GetEnv("GDK_USE_XFT");
B: +
B: +            if (val && val[0] == '0') {
B: +                cachedXftSetting = PR_FALSE;
B: +                goto end;
B: +            }
B: + 
B: + 
B: + end:
B: + 
B: +
B: +    return cachedXftSetting;
B: +}
B: + 
B: +

How is this patch any more complicated than the reorganization patch, that you
insist should be a separate (and necessarily first) patch, would be?  Yes, the
"hook" code in this patch hooks into both the Core and the Xft font instance
code, which is an additional few lines of code, but it doesn't make the diff any
harder to read.  For either patch, you'd need to apply it to make sense of some
parts of it.
Why would the reorganization need to be "necessarily first"?

Regardless of which comes first there are 2 issues in this example:

 The functional change is 38 new lines but the "A:" patch is 268 lines.

 The functional change adds one new function but the "A:" patch mixes in
 7 unlreated functions, 1 typedef, and 1 XPCOM declaration.
Would the name "xftIsEnabled" be more descriptive than "cachedXftSetting"?

How does this pref work?

I see IsXftEnabled called in LoadFont, GetHints, EnumerateAllFonts, and
EnumerateFonts. In the current code these are all after the font is
already selected.
>  The functional change is 38 new lines but the "A:" patch is 268 lines.
> 
>  The functional change adds one new function but the "A:" patch mixes in
>  7 unlreated functions, 1 typedef, and 1 XPCOM declaration.
> 

It sounds to me like your complaint is with the author of patch, not with me. 
If you're really that concerned, apply this to your tree.  It's much easier to
read the code that way.

Like I've said, if you really want me to pull out the code for
nsFontInstanceXft.h/cpp, I can, but it's going to buy you exactly nothing.

> Would the name "xftIsEnabled" be more descriptive than "cachedXftSetting"?

You call IsXftEnabled, you don't check it from outside of the function. 
cachedXftSetting is an internal static to that function and is a cached value.

> 
> How does this pref work?

It checks the pref:

rv = prefService->GetBoolPref("fonts.xft.enabled", &cachedXftSetting);

If the pref doesn't exist, it checks the environment.  GDK_USE_XFT=0 turns it
off, GDK_USE_XFT=1 turns it on.  This is the same setting that all other
Xft-enabled gtk apps use.

> 
> I see IsXftEnabled called in LoadFont, GetHints, EnumerateAllFonts, and
> EnumerateFonts. In the current code these are all after the font is
> already selected.

That's fine.  This is just to select the correct code path (whether or not you
use the Core code path or the Xft code path.)
Blocks: 1.2b
davidb & blizzard:

why is it so hard to see that (at this point) bstell is only interested in the
_real_ differences, not all the fluff that comes with re-organisation?

The real differences are possible to see in a patch, if:
a) no re-organisation is done and the new xft-hooks and files are just "added"
   against current mozilla tree
b) re-organisation is separated to another patch (which is not that interesting)  
   and then the real changes can be examined in the much smaller patch.

Either a) or b) is the way I think it should have been done (I'm pretty sure in
similar situation Linus wouldn't accept anything else to his kernel-tree...).

HOWEVER, since this already has been a titanic operation and super-reviewed and
since blizzard doesn't seem to want to do either a) or b), I think it would be
best to just to go through the whole patch (either as diff or as applied to
personal tree). The point has been made already.
I see you're moving lots of stuff around.  Some of my comments will apply to
stuff you didn't actually produce as new code for this patch.  You may feel like
addressing some of these `old code' comments, others not.  Use your own
judgement.  I don't feel I caught as much as the others, the only must fixes are
the |printf|s, and possible some string optimizations.


You might want to wrap

  +#define NS_TO_GDK_RGB(ns) \
  +  (ns & 0xff) << 16 | (ns & 0xff00) | ((ns >> 16) & 0xff)
  
in an extra set of parentheses to avoid unexpected precedence problems, i.e.,

  +#define NS_TO_GDK_RGB(ns) \
  +  ((ns & 0xff) << 16 | (ns & 0xff00) | ((ns >> 16) & 0xff))
  


  +// *wretch* I love it when classes contain elements that are
  +// superclasses

I was slightly confused by this comment, since |nsFontGTK| doesn't actually
contain a |nsFontGTKUserDefined|; rather it has a pointer to one.


  [[comments about nsFontInstanceCore.cpp, .h elided]]

  [[my usual babbling about ++i vs i++]]


wrt |nsFontInstanceXft|, T::T() mX(0) {} is preferred over T::T() { mx = 0; },
though for Plain-Old-Data members (that is, in this case, members that have no
constructor of their own) this might be considered only a style issue


  +    if (aLength == 0) {

  +    if (nsnull != aFontID)


  if ( !aLength )
  
  if ( !aFontID )


  +nsresult
  +nsFontInstanceXft::DrawString(const char *aString, PRUint32 aLength,
  +                              nscoord aX, nscoord aY,
  +                              const nscoord* aSpacing,
  +                              nsRenderingContextGTK *aContext,
  +                              nsDrawingSurfaceGTK *aSurface)
  +{
  +    if (aSpacing) {
  +        printf("XXX DrawString(8) spacing!\n");
  +    }
  +

Yikes!  What's a |printf| doing in there?  Maybe this was in


  +        specBuffer =
  +            (XftCharFontSpec *)nsMemory::Alloc(sizeof(XftCharFontSpec) *
  +                                               aLength);

C-style casts always compile, even when you don't want them to.  Using modern
casts through our macros catches errors and saves lives.  Here you probably want

  NS_STATIC_CAST(XftCharFontSpec*, nsMemory::Alloc(...))


hmmm, more |printf|s


examining the |goto|s and |continue| in the big loop in
|nsFontInstanceXft::GetTextDimensions|, (and several other close to identical
loops) I feel like I want to say something... but a convincingly better solution
is not immediately apparent to me



A lot of these getters and setters look like they would have been good
candidates for inlining.  They're probably all virtual, though, huh.  Still,
does the pattern in which they are used lend itself to inlining?  That is, where
they are called, could the compiler know for certain that the static type of the
object was an |nsFontInstanceXft|?  If so, they could be both inline and
virtual, perhaps for a speed win.


  +        nsCString name;
  +        name += "font.name.";
  +        name += mFontMetrics->mGenericFont->get();
  +        name += ".";
  +
  +        nsString langGroup;
  +        mFontMetrics->mLangGroup->ToString(langGroup);
  +

prefer

  nsString langGroup;
  mFontMetrics->mLangGroup->ToString(langGroup);

  nsCString name = NS_LITERAL_CSTRING("font.name.")
                 + mFontMetrics->mGenericFont->get()
                 + NS_LITERAL_CSTRING(".")
                 + NS_ConvertUCS2toUTF8(langGroup);


more old-style casts, maybe a search for /\*\)/ will help find them all

extremely minor nit: inconsistent forms of labels

  goto end;
  goto loser;
  goto FoundFont;


|nsFontInstanceXft::DrawUnknownGlyph| --- magic numbers 5, 3, and maybe 2
4 is OK, I see the // Draw the four characters
comments for the other numbers would help


hmmm, more |printf|s


In |NS_FamilyExistsXft|, your work with |name| may be way too high in the
function.  I guess if you _almost_always_ expect the search to find a match,
it's OK to do this work at the top.  But if not, you may want to defer this till
you know you need it.  Perhaps you could even avoid it by using a case
insensitive comparison, e.g.,

  if ( !Compare(nsDependentCString(tmpname), name,
nsCaseInsensitiveCStringComparator) )

If you expect to hit this comparison only once, use the above.  Else stick with
your version, but in any case, I probably would have declared |name| as

  NS_ConvertUCS2toUTF8 name(aName);

(if I recall the name correctly) since that is a kind of |nsAutoCString| and
saves a heap allocation.  And saved that conversion and the down-casing till the
point when I new I wasn't going to jump past its use.

alright ... well, that's the stuff that caught my attention.

Hope this helps
Comment on attachment 101942 [details]
patch

r=scc
Attachment #101942 - Flags: review+
> > I see IsXftEnabled called in LoadFont, GetHints, EnumerateAllFonts, and
> > EnumerateFonts. In the current code these are all after the font is
> > already selected.
> 
> That's fine.  This is just to select the correct code path (whether or not
> you use the Core code path or the Xft code path.)

Where does the decision to use / not use Xft happen?

GetHints doesn't seem like the place.

EnumerateAllFonts and EnumerateFonts are (at least were) used when
generating the list of fonts for displaying in the font prefs dialog.

LoadFont used to happen after the font had been selected but before it was
used for display. This point seems too late to control the font selection.
rbs: FYI, as I understand it when Xft is enabled MathML be disabled.
There is a pref to disable Xft but if the MOZ_ENABLE_COREXFONTS is not
set then it seems unlikely that it would have any effect.

blizzard: will redhat have MOZ_ENABLE_COREXFONTS enabled or disabled?

>   +#define NS_TO_GDK_RGB(ns) \
>   +  (ns & 0xff) << 16 | (ns & 0xff00) | ((ns >> 16) & 0xff)
>   
> in an extra set of parentheses to avoid unexpected precedence problems, i.e.,

Fixed.

> wrt |nsFontInstanceXft|, T::T() mX(0) {} is preferred over T::T() { mx = 0; },
> though for Plain-Old-Data members (that is, in this case, members that have no
> constructor of their own) this might be considered only a style issue

Are you sure you're looking at the right version of the patch?  The most recent
version in the bug has:

nsFontInstanceXft::nsFontInstanceXft() :
    mFontMetrics(nsnull),
    mWesternFont(nsnull),
    [...]

or are you talking about something else?

>   +    if (aLength == 0) {
> 
>   +    if (nsnull != aFontID)
> 
> 
>   if ( !aLength )
>   
>   if ( !aFontID )

Fixed.

> 
> 
>   +nsresult
>   +nsFontInstanceXft::DrawString(const char *aString, PRUint32 aLength,
>   +                              nscoord aX, nscoord aY,
>   +                              const nscoord* aSpacing,
>   +                              nsRenderingContextGTK *aContext,
>   +                              nsDrawingSurfaceGTK *aSurface)
>   +{
>   +    if (aSpacing) {
>   +        printf("XXX DrawString(8) spacing!\n");
>   +    }
>   +
> 
> Yikes!  What's a |printf| doing in there?  Maybe this was in

I'm pretty sure you're looking at an older version of the patch.  This has
already been removed.

>   +        specBuffer =
>   +            (XftCharFontSpec *)nsMemory::Alloc(sizeof(XftCharFontSpec) *
>   +                                               aLength);
> 
> C-style casts always compile, even when you don't want them to.  Using modern
> casts through our macros catches errors and saves lives.  Here you probably want
> 
>   NS_STATIC_CAST(XftCharFontSpec*, nsMemory::Alloc(...))

This bit of code isn't in the patch anymore, but I updated the other
nsMemory::Alloc() in the patch.

> 
> 
> hmmm, more |printf|s

I think you're looking at an old version.  I had a couple of commented out
|printf|s that I just removed.

> examining the |goto|s and |continue| in the big loop in
> |nsFontInstanceXft::GetTextDimensions|, (and several other close to identical
> loops) I feel like I want to say something... but a convincingly better solution
> is not immediately apparent to me
> 

Yeah.  It's a well tested algorithm and reasonably fast and I'd rather not touch
it at this point.  I hope you don't have a visceral and unreasonable hatred of
gotos. :)

> A lot of these getters and setters look like they would have been good
> candidates for inlining.  They're probably all virtual, though, huh.  Still,
> does the pattern in which they are used lend itself to inlining?  That is, where
> they are called, could the compiler know for certain that the static type of the
> object was an |nsFontInstanceXft|?  If so, they could be both inline and
> virtual, perhaps for a speed win.

I think the most recent patches has the getters you're looking at all as
non-virtual inlines.  I'm not sure, though.

> 
> 
>   +        nsCString name;
>   +        name += "font.name.";
>   +        name += mFontMetrics->mGenericFont->get();
>   +        name += ".";
>   +
>   +        nsString langGroup;
>   +        mFontMetrics->mLangGroup->ToString(langGroup);
>   +
> 
> prefer
> 
>   nsString langGroup;
>   mFontMetrics->mLangGroup->ToString(langGroup);
> 
>   nsCString name = NS_LITERAL_CSTRING("font.name.")
>                  + mFontMetrics->mGenericFont->get()
>                  + NS_LITERAL_CSTRING(".")
>                  + NS_ConvertUCS2toUTF8(langGroup);

That doesn't even come close to compiling.

nsFontInstanceXft.cpp:849: no match for `nsDependentCString + const char*' 
   operator
../../../dist/include/string/nsDependentConcatenation.h:219: candidates are: 
   const nsDependentConcatenation operator+(const nsDependentConcatenation&, 
   const nsAString&)
../../../dist/include/string/nsDependentConcatenation.h:226:                 
   const nsDependentCConcatenation operator+(const nsDependentCConcatenation&, 
   const nsACString&)
../../../dist/include/string/nsDependentConcatenation.h:233:                 
   const nsDependentConcatenation operator+(const nsAString&, const nsAString&)
../../../dist/include/string/nsDependentConcatenation.h:240:                 
   const nsDependentCConcatenation operator+(const nsACString&, const 
   nsACString&)

> extremely minor nit: inconsistent forms of labels
> 
>   goto end;

Normal exit.

>   goto loser;

Loser exit (usually memory allocation failure.)

>   goto FoundFont;

History. :)

> |nsFontInstanceXft::DrawUnknownGlyph| --- magic numbers 5, 3, and maybe 2
> 4 is OK, I see the // Draw the four characters
> comments for the other numbers would help
> 

I added some comments there.

> 
> hmmm, more |printf|s

I don't think that I have any left in the file now...

> In |NS_FamilyExistsXft|, your work with |name| may be way too high in the
> function.  I guess if you _almost_always_ expect the search to find a match,
> it's OK to do this work at the top.  But if not, you may want to defer this till
> you know you need it.  Perhaps you could even avoid it by using a case
> insensitive comparison, e.g.,
>
>   if ( !Compare(nsDependentCString(tmpname), name,
> nsCaseInsensitiveCStringComparator) )

Close, but fixed. :)

> If you expect to hit this comparison only once, use the above.  Else stick with
> your version, but in any case, I probably would have declared |name| as
> 
>   NS_ConvertUCS2toUTF8 name(aName);
> 
> (if I recall the name correctly) since that is a kind of |nsAutoCString| and
> saves a heap allocation.  And saved that conversion and the down-casing till the
> point when I new I wasn't going to jump past its use.

Fixed.
> why is it so hard to see that (at this point) bstell is only interested in the
> _real_ differences, not all the fluff that comes with re-organisation?
> 

OK.  The bulk of this patch _is_ the reorganization.  If you don't want to see
the Xft bits, ignore nsFontInstanceXft.*.  There's a pretty clear seperation,
here, and it's easy to seperate the parts.  patch is messy, but new files are
clearly defined in the patch.

> Where does the decision to use / not use Xft happen?
> 
> GetHints doesn't seem like the place.

Are you wondering why IsXftEnabled() is called from the GetHints() call?  The
answer is pretty simple.  GetHints() is sometimes called in the rendering
context before the font is set on that rendering context, so you need to call
into a global symbol instead of into any specific font instance.  I didn't feel
like trying to fix that in this run since it would further obscure the changes
in question.

> EnumerateAllFonts and EnumerateFonts are (at least were) used when
> generating the list of fonts for displaying in the font prefs dialog.

Yep, I know that.

> 
> LoadFont used to happen after the font had been selected but before it was
> used for display. This point seems too late to control the font selection.

LoadFont() in nsFontMetricsGTK is called after the font information is stored in
the font metrics class.  Once you save that information, you need to know
whether or not you need to create an Xft object or a Core object as the font
instance for that metrics object.  That's why it's called from there.

> rbs: FYI, as I understand it when Xft is enabled MathML be disabled.
> There is a pref to disable Xft but if the MOZ_ENABLE_COREXFONTS is not
> set then it seems unlikely that it would have any effect.

Only because I haven't added support for it yet.

> 
> blizzard: will redhat have MOZ_ENABLE_COREXFONTS enabled or disabled?

I don't expect to disable it for quite a while.  We're talking years here, not
months.  Certainly not for the 8.x release(s), anyway.  It depends on how long
it takes the Xft code in Mozilla to come up to spec and when Red Hat and XFree86
decide to drop support for core fonts, as they exist today.*

* We will probably see a drop in replacement for the Xlib fonts apis that will
use fontconfig under the covers and won't use any of the old X font paths. 
That's just rumor, though.  We'll see how it goes.
Attached file patch (obsolete) —
Patch after scc's comments.
Attachment #101942 - Attachment is obsolete: true
Comment on attachment 102108 [details]
patch

carrying forward reviews
Attachment #102108 - Flags: superreview+
Attachment #102108 - Flags: review+
> * We will probably see a drop in replacement for the Xlib fonts apis that will
> use fontconfig under the covers and won't use any of the old X font paths. 
> That's just rumor, though.  We'll see how it goes.

I can't imagine admiting a patch into XFree86 which would change the Xlib APIs
or the protocol generated thereby.  Compatibility with legacy applications and X
servers can best be served by not disturbing the foundations they rest upon.

I do plan to eliminate the current bitmap font file format in favor of TrueType
files which include only bitmaps and no outlines.  Early experiments with that
change see some significant space savings over the compressed .pcf files as we
can store multiple sizes and encodings in the same file.  This
change would also permit Xft applications to share these bitmap fonts without
needing to provide full support for the existing .pcf format in FreeType2.

Another likely project is to permit the X server to use fontconfig to discover
available fonts as that would eliminate yet another custom font configuration
mechanism.  I haven't figured out exactly how that would work as XLFD names and
properties contain some data not provided by TrueType fonts.

> I don't expect to disable it for quite a while.  We're talking years here, not
> months.  Certainly not for the 8.x release(s), anyway.  It depends on how long
> it takes the Xft code in Mozilla to come up to spec and when Red Hat and XFree86
> decide to drop support for core fonts, as they exist today.*

X is a network protocol with semantics which include the existing core fonts. 
Changing Xlib would have no effect on the requirements within the X server, and
so would not reduce the ongoing support burden for XFree86.  However, migrating
the server to build upon FreeType2 and fontconfig instead of custom libraries
will, while at the same time preserving required functionality.
rbs@maths.uq.edu.au wrote:
> Something this large has usually been an early milestone material. So it is
> probably more realistic to target the upcoming one where less restricted
> checkins would allow rapid resolution of issues that my arise, thereby 
> allowing people to rejoice with a more stable support when the target 
> milestone is released.

I agree here with rbs. IMHO we should wait until the 1.2beta freeze is over
before checking the patch "in". The patch should be able to cook at _least_ a
month in "trunk" before we should ship a "final" milestone with that - we're
having enougth problem reports in this bug which indicates that there is still
lots of work to-do...

... I'll take a closer look at the patch tomorrow evening (MET; I am now too
tired to do a usefull review tonight), doing quick look shows (at least) lots of
small nits which will turn half Seamonkey-Ports into flames... ;-(
The problem reports in this bug are almost entirely from those who are enabling
the Xft code, and it will not be enabled by default.  (Most of the problems have
been fixed already, too.)  I thus still stand by my comment 258.
David Baron wrote:
> The problem reports in this bug are almost entirely from those who are 
> enabling the Xft code, and it will not be enabled by default. 
> (Most of the problems have been fixed already, too.) 
> I thus still stand by my comment 258.

Again, I don't think this is a wise idea to ship a "final" milestone with an
all-new, unfinished code. For example - did anyone do tests with Rational Purify
yet and check for problems ? The current code in "trunk" has been extensively
tested since _years_ and is known to work without problems - and doing the
testing+fixing with the requirement of an a= for each single patch would be a
pain.
Without problems?  As I already mentioned, the current code actually works less
well for me than does this new code, thanks to my using Xinerama.  For a project
that professes to be so concerned with stability, bug 136362 hasn't had so much
as an acknowledgement in 6 months.   (yet another blatant plug to wave font
developers in that direction :)
>> Mox:
>> why is it so hard to see that (at this point) bstell is only interested in 
>> the _real_ differences, not all the fluff that comes with re-organisation?
>> 
>Blizzard:
>OK.  The bulk of this patch _is_ the reorganization.  If you don't want to see
>the Xft bits, ignore nsFontInstanceXft.*.  There's a pretty clear seperation,
>here, and it's easy to seperate the parts.  patch is messy, but new files are
>clearly defined in the patch.

Well, the interesting parts are the actual changes to the old ("corefonts")
code. I.e. the stuff that changes the code in current tree. The re-organisation
of that code is not interesting, and it effectively hides the actual changes.

This patching issue is very similar to indentation; although one could argue
that amounts of whitespaces are irrelevant (no compile or runtime differences),
it does improve code readability and is thus generally part of CodingStyle.

Similarly, keeping re-organisation and (functional) code changes separate
improves patch readability, but apparently that rule is not part of mozilla
Coding/PatchingStyle.

The milestones raised yet another reason for PatchingStyle. It's very
understandable people don't want to have 14k lines patch to the upcoming moz1.2
for the fear of regressions (and not that start of 1.3alpha is so far
anyways...). If you had just the small patch making the changes to the old code
(either before or after reorganization), it would be very easy to convince that
the impact is minimal. With a single large patch the reviewers have to do either
huge amount of review work or have faith in you when you say "really, almost
nothing has changed."
Just a couple of anecdotal comments, and a possible bug report:

This all refers to the 08Oct2002 rh8 build, under rh8.

1) First, this looks great.  Even looks tons better than the old Xft patches
from 0.9.9/1.0rc days.  Definately in the same league as Mozilla with Quartz
rendering on OSX.  

2) Generally, it has worked very well for me, relatively stable, good choices
for fonts, etc (but I'm no artist).  Printing has also worked very well, on the
2 documents I printed.  They both came out laid-out well, with crisp fonts, etc.

3) Some things are definately slower.  I haven't done any benchmarks on page
load times, but they might be a bit slower.  Doesn't bother me, though.  

4) The one place where there is an annoyance related to speed (I think) is if
you hit (and hold) the down-arrow in a long document, the scrolling can't keep
up with the keyboard repeat-rate, so you always end up overshooting.  Maybe
there's some tuning that can be done here to ignore scrolling requests while the
browser is working on a current scroll request -- the overshoot is very annoying
(and oddly, it doesn't happen on _this_ page).

5) I've gotten some odd crashes, which I don't seem to be able to repeat, but
just a few minutes ago, here's what I got in stdout or err:

Warning:
    Name: HorScrollBar
    Class: XmScrollBar
    The specified scrollbar value is greater than the maximum
    scrollbar value minus the scrollbar slider size.

Gdk-ERROR **: BadLength (poly request too large or internal Xlib length erro
  serial 1382940 error_code 16 request_code 76 minor_code 0
Gdk-ERROR **: BadRequest (invalid request code or no such operation)
  serial 1382941 error_code 1 request_code 0 minor_code 0

I got this while mouse-wheel scrolling in a bugzilla page.


Attached file patch (obsolete) —
Re-merge with the tip after changes last night.
Attachment #102108 - Attachment is obsolete: true
Comment on attachment 102206 [details]
patch

Carrying forward reviews.
Attachment #102206 - Flags: superreview+
Attachment #102206 - Flags: review+
Attached file patch (obsolete) —
Re-merge with the tip.	Again.
Attachment #102206 - Attachment is obsolete: true
Comment on attachment 102273 [details]
patch

...
Attachment #102273 - Flags: superreview+
Attachment #102273 - Flags: review+
OK, I have read the patch and see the motivation of what the patch is doing
(comment 125 and comment 164). Other reviewers have caught most of the edgy
stuff, but there is remaining architectural point which might greatly simplify
the patch (and ease maintainance of both codes and the the final switch over to
Xft). 

> ------- Additional Comment #258 From David Baron  2002-10-07 08:52 -------
>
> > In the meantime, s/nsFontInstance/nsFontMetrics/g would make the patch
> > stay closer to its memory lane.
>
> Would you really want to give two different layers the same name?

That's because of the approach of the patch. I think there might be a simpler
(and maybe less contentious approach). It would avoid the need for
nsFontInstanceFactory, etc.

There can be a dispatch mechanism in gfx/src/gtk/nsGfxFactoryGTK.cpp.
With that, it would be possible to setup nsFontMetricsXftGTK (or some other
name), and override the default behavior in nsGfxFactoryGTK.cpp, e.g., by doing:

// objects that just require generic constructors

+//override the generic constructor
+//NS_GENERIC_FACTORY_CONSTRUCTOR(nsFontMetricsGTK)

static nsresult
nsFontMetricsGTKConstructor(nsISupports* aOuter, REFNSIID aIID, void** aResult)
{
  *aResult = nsnull;
  if (aOuter)
    return NS_ERROR_NO_AGGREGATION;
  result = IsXftEnabled() ? new nsXftFontMetricsGTK() : new nsFontMetricsGTK();
  if (!result)
    return NS_ERROR_OUT_OF_MEMORY;

  NS_ADDREF(result);
  nsresult rv = result->QueryInterface(aIID, aResult);
  NS_RELEASE(result);
  return rv;
}

This would allow getting Xft on demand, while retaining nsFontMetricsGTK pretty
much as it is now (modulo some cleanup to ease the Xft integration). It seems to
me that this might appeal to all parties involved since the Xft codepath would
have a life of its own, without the need for a big moving patch for the old code.
Just naming nsFontMetricsXft is OK. s/ns[Xft]FontMetrics[Xft]Gtk/nsFontMetricsXft/g
Such a design wouldn't allow the code to be changed so that a failure of Xft to
find a font would allow falling back to the Core font code.  Although the
current code doesn't do that, I *think* blizzard wants it to be able to do that
(I remember reading a comment somewhere saying that it should do that).  If
things were done that way, there wouldn't be any point to distributions building
the core code once Xft was enabled, would there?  (unless they wanted their
users to be able to use the pref or environment variable)

Is that an important goal?
> This would allow getting Xft on demand, while retaining nsFontMetricsGTK pretty
> much as it is now (modulo some cleanup to ease the Xft integration). It seems to
> me that this might appeal to all parties involved since the Xft codepath would
> have a life of its own, without the need for a big moving patch for the old code.
> 

I was trying my best to avoid a total fork of the code.  There's still a little
bit of code that is shared - some of the attributes, etc.

> Such a design wouldn't allow the code to be changed so that a failure of Xft to
> find a font would allow falling back to the Core font code.

No, that wasn't really one of my design goals.  fontconfig almost always returns
some font.
Falling back to core fonts if a fontconfig font is not available is 
highly undesirable - it would not produce consistent behavior with 
the other applications on the operating system, and would mean that 
/etc/fonts/fonts.conf did not 100% control the font configuration, producing
weirdness.

If we have a problem in fontconfig configuration, we want to know about it, 
we don't want to start loading a big hunk o' legacy code and 
getting ugly fonts.

So basically mozilla should pick a font backend on startup and stick to it.
In fontconfig mode we want fontconfig fonts _only_.
> > Such a design wouldn't allow the code to be changed so that a failure of Xft
> > to find a font would allow falling back to the Core font code.
>
> No, that wasn't really one of my design goals.  fontconfig almost always
> returns some font.
[...]
> If we have a problem in fontconfig configuration, we want to know about it, 
> we don't want to start loading a big hunk o' legacy code and 
> getting ugly fonts.
>
> So basically mozilla should pick a font backend on startup and stick to it.
> In fontconfig mode we want fontconfig fonts _only_.

Indeed, that's how I understood (and saw) it. Since Xft and the legacy code are
meant to be mutually exclusive, you want to mess with it as little as possible.
If there are too much entanglements between the two, you will have to maintain
both rather than concentrating on improving the Xft code. With the proposed
design, the old code may phase out (if deemed necessary when Xft is in parity
with the features currently offered by the legacy code - comment 82).
If its true that this patch won't affect Mozilla until the end user takes action
to enable xft, I think it would be really desireable to see it go in for
1.2beta.  Its perfect timing with Redhat 8.0's release for early adopter types
to play with and shake out any bugs, and if it goes well, allowing a little
blurb in 1.2final's release notes about how to enable this for those 8.0 users
and others willing to install the correct bits.

If this is felt to be "too risky" for inclusion during the 1.2beta freeze, it
seems unlikely it'll be included until after 1.2 branches.
Not everybody (myself included) is convinced that the patch is ready yet in its
present form. An alternative way of moving the Xft integration forward has been
made. Please do not flood the bug with further advocacy comments. It makes
wading through the bug extremely difficult. Everytime I click, I seem to wait
forever to get the page. It has already been made clear that the Xft support is
important and should be integrated sooner or later.
Quick bug report against the current (Oct 8) rh8 build: the browser
chooses correct defaults when started without a user configuration,
but the font properties dialog fails to recognize these.  Instead, it
shows the first Xft font found (In my case, a nasty cursive font
called Amaze) in each of the combo boxes.

Additionally, the Xft default font names (serif, mono, sans, I
believe) fail to appear in the dialogs.  Since these are intended to
be settable via the user's theme, they really should be choosable via
browser configuration.  I'm fuzzy on the details here...
I'm working on an alternative patch.
> Additionally, the Xft default font names (serif, mono, sans, I
> believe) fail to appear in the dialogs.

For the current code, the fonts on the dialog are queried from
nsFontEnumeratorGTK (currently implemented in nsFontMetricsGTK). So the Xft
integration would need its own nsFontEnumeratorXft that will talk with the Xft
engine to figure out what to say for the Fonts preference dialog, etc. But that
can wait. Anyway, there is some way to go before matching the legacy code. Only
the hooks are important at this stage.
Attached patch patch (obsolete) — Splinter Review
Patch that implements rbs' suggestion.	Lots less churn here.  Seems to work
really well here.
Attachment #102273 - Attachment is obsolete: true
Comment on attachment 102418 [details] [diff] [review]
patch

Looking much neater and less scary indeed. Some code-review comments:

+PRBool
+nsFontMetricsGTK::GetHints(void)
+{
+  PRUint32 result = 0;
[...]
+  return result;
 }

Should be |PRUint32| GetHints(void).

+// Class nsFontXft is an actual instance of a font.  The
+// 'nsFontInstance' class is made up of a collection of these little
+// fonts, really.

Outdated comments now that nsFontInstance is gone.

+struct MozXftLangGroup {
+static const MozXftLangGroup MozXftLangGroups[] = {

Some places inside these structs have a weird indentation.

 nsFontMetricsGTK::nsFontMetricsGTK()
-  : mFonts() // I'm not sure what the common size is here - I generally
+  : mFonts(), mCurrentFont(nsnull) // I'm not sure what the common
[...]
+nsFontMetricsXft::nsFontMetricsXft() : mDeviceContext(nsnull),
+					mGenericFont(nsnull),
+					mFont(nsnull),
+					mPixelSize(0),
[...]

These explicit initialization to zero aren't needed since the classes
are using the much cleaner NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW which
will take care of zeroing the whole object at its creation.

+nsFontMetricsXft::~nsFontMetricsXft()
+{
[...]
+	 if (mPattern)
+	 FcPatternDestroy(mPattern);

Another weird indentation.

 NS_IMETHODIMP	nsFontMetricsGTK::GetFontHandle(nsFontHandle &aHandle)
 {
-  aHandle = (nsFontHandle)mWesternFont;
+  aHandle = (nsFontHandle)(nsIFontMetricsGTK *)this;
   return NS_OK;
 }
[...]
+NS_IMETHODIMP
+nsFontMetricsXft::GetFontHandle(nsFontHandle &aHandle)
+{
+    aHandle = (nsFontHandle)(nsIFontMetricsGTK *)this;
+    return NS_OK;
+}
[...]
-  nsFontGTK		 *mCurrentFont;
+  nsIFontMetricsGTK	 *mFontHandle;

I think these are incorrect. You want to return the _native_ handle of the 
mWesternFont here (nsFonGTK or nsFonXft as in the old code shown above).
If somebody wanted the "this" -- they would have done the cast themselves
straightaway rather than using this_font_metrics->GetFontHandle() to re-get 
this_font_metrics).

With that...
+NS_IMETHODIMP
+nsRenderingContextGTK::GetTextDimensions(const PRUnichar* aString,
+					  PRUint32 aLength,
+					  nsTextDimensions& aDimensions, 
+					  PRInt32* aFontID)
+{
+  return mFontHandle->GetTextDimensions(aString, aLength, aDimensions,
+					 aFontID, this);
 }
becomes...
+  return mFontMetrics->GetTextDimensions(), etc. Since mFontMetrics
is nsIFontMetricsGTK by design.

(Note: the 'true' font hande itself, i.e., mWesternFont, is used somewhere
higher up the UI for certain shortcuts, c.f. nsWidget::SetFont. I think
this old design should be cleaned up since it doesn't seem to be used
anymore, but that's another story for another time...).

+nsresult
+nsFontMetricsXft::DrawString(const char *aString, PRUint32 aLength,
+			      nscoord aX, nscoord aY,
+			      const nscoord* aSpacing,
+			      nsRenderingContextGTK *aContext,
+			      nsDrawingSurfaceGTK *aSurface)
+{
+    // Set our color
+    XftColor color;
+    nscolor rccolor;
+
+    aContext->GetColor(rccolor);
+
+    color.pixel = gdk_rgb_xpixel_from_rgb(NS_TO_GDK_RGB(rccolor));
+    color.color.red = (NS_GET_R(rccolor) << 8) | NS_GET_R(rccolor);
+    color.color.green = (NS_GET_G(rccolor) << 8) | NS_GET_G(rccolor);
+    color.color.blue = (NS_GET_B(rccolor) << 8) | NS_GET_B(rccolor);
+    color.color.alpha = 0xffff;
+
+    XftDraw *draw = aSurface->GetXftDraw();
+
+    nsCOMPtr<nsIRegion> lastRegion;
+    nsCOMPtr<nsIRegion> clipRegion;
+
+    aSurface->GetLastXftClip(getter_AddRefs(lastRegion));
+    aContext->GetClipRegion(getter_AddRefs(clipRegion));
+
+    // avoid setting the clip, if possible
+    if (!lastRegion || !clipRegion || !lastRegion->IsEqual(*clipRegion)) {
+	 aSurface->SetLastXftClip(clipRegion);
+
+	 GdkRegion *rgn = nsnull;
+	 clipRegion->GetNativeRegion((void *&)rgn);
+
+#ifdef MOZ_WIDGET_GTK
+	 GdkRegionPrivate  *priv = (GdkRegionPrivate *)rgn;
+	 XftDrawSetClip(draw, priv->xregion);
+#endif
+
+#ifdef MOZ_WIDGET_GTK2
+	 GdkRegionSetXftClip(rgn, draw);
+#endif
+    }
+
[...]
+    return NS_OK;
+}

====================

+nsresult
+nsFontMetricsXft::DrawString(const PRUnichar* aString, PRUint32 aLength,
+			      nscoord aX, nscoord aY,
+			      PRInt32 aFontID,
+			      const nscoord* aSpacing,
+			      nsRenderingContextGTK *aContext,
+			      nsDrawingSurfaceGTK *aSurface)
+{
+    // Set our color
+    XftColor color;
+    nscolor rccolor;
+
+    aContext->GetColor(rccolor);
+
+    color.pixel = gdk_rgb_xpixel_from_rgb(NS_TO_GDK_RGB(rccolor));
+    color.color.red = (NS_GET_R(rccolor) << 8) | NS_GET_R(rccolor);
+    color.color.green = (NS_GET_G(rccolor) << 8) | NS_GET_G(rccolor);
+    color.color.blue = (NS_GET_B(rccolor) << 8) | NS_GET_B(rccolor);
+    color.color.alpha = 0xffff;
+
+    XftDraw *draw = aSurface->GetXftDraw();
+
+    nsCOMPtr<nsIRegion> lastRegion;
+    nsCOMPtr<nsIRegion> clipRegion;
+
+    aSurface->GetLastXftClip(getter_AddRefs(lastRegion));
+    aContext->GetClipRegion(getter_AddRefs(clipRegion));
+
+    // avoid setting the clip, if possible
+    if (!lastRegion || !clipRegion || !lastRegion->IsEqual(*clipRegion)) {
+	 aSurface->SetLastXftClip(clipRegion);
+
+	 GdkRegion *rgn = nsnull;
+	 clipRegion->GetNativeRegion((void *&)rgn);
+
+#ifdef MOZ_WIDGET_GTK
+	 GdkRegionPrivate  *priv = (GdkRegionPrivate *)rgn;
+	 XftDrawSetClip(draw, priv->xregion);
+#endif
+
+#ifdef MOZ_WIDGET_GTK2
+	 GdkRegionSetXftClip(rgn, draw);
+#endif
+    }
+
[...]
+    return NS_OK;
+}

====================

Common big chunk of code. Need a re-usable helper function, e.g.,
nsFontMetricsXft::PrepareToDraw(aContext, aSurface).
Index: gfx/src/gtk/nsFontMetricsUtils.h
===================================================================
+#ifndef __nsIFontMetricsUtils_h
+#define __nsIFontMetricsUtils_h
[...]
+#endif /* __nsIFontMetricsUtils_h */

s/nsIFontMetricsUtils_h/nsFontMetricsUtils_h/g
   ^^^
Just one note:

-EXTRA_DSO_LDOPTS += $(MOZ_GTK_LDFLAGS) $(MOZ_GTK2_LIBS)
-CXXFLAGS	+= $(MOZ_GTK_CFLAGS) $(MOZ_GTK2_CFLAGS)
-CFLAGS		+= $(MOZ_GTK_CFLAGS) $(MOZ_GTK2_CFLAGS)
+EXTRA_DSO_LDOPTS += $(MOZ_GTK_LDFLAGS) $(MOZ_GTK2_LIBS) $(MOZ_XFT_LIBS)
+CXXFLAGS	+= $(MOZ_GTK_CFLAGS) $(MOZ_GTK2_CFLAGS) $(MOZ_XFT_CFLAGS)
+CFLAGS		+= $(MOZ_GTK_CFLAGS) $(MOZ_GTK2_CFLAGS) $(MOZ_XFT_CFLAGS)
 
WHen you do this, it is breaking on my machine on the compile

since GTK_CFLAGS are first, -I/usr/X11R6/include is first, with
-I/usr/include/Xft2 to be later

This is causing the build to find the xft1 headers in XF4.2 before the new XFt2
headers. If you put MOZ_XFT_CFLAGS first, this won't happen.

> Should be |PRUint32| GetHints(void).

Fixed.

> +struct MozXftLangGroup {
> +static const MozXftLangGroup MozXftLangGroups[] = {
> 
> Some places inside these structs have a weird indentation.

I'm not sure what you're talking about here.  They look OK here.

> These explicit initialization to zero aren't needed since the classes
> are using the much cleaner NS_DECL_AND_IMPL_ZEROING_OPERATOR_NEW which
> will take care of zeroing the whole object at its creation.

Fixed.

> +	 FcPatternDestroy(mPattern);
> 
> Another weird indentation.
> 

Cut-n-paste.  Fixed.

> I think these are incorrect. You want to return the _native_ handle of the 
> mWesternFont here (nsFonGTK or nsFonXft as in the old code shown above).
> If somebody wanted the "this" -- they would have done the cast themselves
> straightaway rather than using this_font_metrics->GetFontHandle() to re-get 
> this_font_metrics).
> 
> With that...
> +NS_IMETHODIMP
> +nsRenderingContextGTK::GetTextDimensions(const PRUnichar* aString,
> +					  PRUint32 aLength,
> +					  nsTextDimensions& aDimensions, 
> +					  PRInt32* aFontID)
> +{
> +  return mFontHandle->GetTextDimensions(aString, aLength, aDimensions,
> +					 aFontID, this);
>  }
> becomes...
> +  return mFontMetrics->GetTextDimensions(), etc. Since mFontMetrics
> is nsIFontMetricsGTK by design.

Actually, mFontMetrics is an nsIFontMetrics pointer, not an nsIFontMetricsGTK
object.

> (Note: the 'true' font hande itself, i.e., mWesternFont, is used somewhere
> higher up the UI for certain shortcuts, c.f. nsWidget::SetFont. I think
> this old design should be cleaned up since it doesn't seem to be used
> anymore, but that's another story for another time...).

Yeah, I removed that bit of code from nsWidget.cpp since it's not used anywhere
in the entire tree.

I'd rather not allow nsFontGtk or nsFontXft get passed back through
GetFontHandle() since that can add all kinds of nasty dependencies throughout
calling code.  Instead, I'd rather stick with the interface defined in
nsFontInstanceGTK.  This is why I moved all of those functions into
nsFontMetricsGTK, anyway.  Otherwise I could have just left them out and
peppered them with ifdefs.  That starts to get _really_ ugly, though.  This is
much cleaner and easier to understand.

I should really rename nsIFontMetricsGTK to something a little more different
than nsIFontMetrics and nsFontMetricsGTK.  Maybe I can use nsIFontHandleGTK! :)

> 
> Common big chunk of code. Need a re-usable helper function, e.g.,
> nsFontMetricsXft::PrepareToDraw(aContext, aSurface).

Fixed.

> 
> s/nsIFontMetricsUtils_h/nsFontMetricsUtils_h/g
>    ^^^

Fixed.

> This is causing the build to find the xft1 headers in XF4.2 before the new XFt2
> headers. If you put MOZ_XFT_CFLAGS first, this won't happen.

Oh.  That problem.  I changed it.  (Of course, RH8 only has one Xft.h on the
whole system.)
Attached patch patch (obsolete) — Splinter Review
Lucky number 16.
Attachment #102418 - Attachment is obsolete: true
Comment on attachment 102460 [details] [diff] [review]
patch

A few nits:

>Index: gfx/src/gtk/nsFontMetricsXft.cpp
>+    // hang onto the pref service

You're not really hanging on to it, and there's no need for the comment anyway.

>Index: gfx/src/gtk/nsRenderingContextGTK.h
>+  // Get the pointer to twip conversion for this rendering context

*Pixels* to twips.

I didn't look very closely at the stuff that looked the same as previous
versions of the patch, but the new stuff looks fine.  sr=dbaron still stands.
Attachment #102460 - Flags: superreview+
Those are fixed in my local tree.  Not worth uploading a whole patch for it. 
I'll see what scc and rbs come back with first.
Comment on attachment 102460 [details] [diff] [review]
patch

 nsFontMetricsGTK::nsFontMetricsGTK()
-  : mFonts() // I'm not sure what the common size is here - I generally
-  // see 2-5 entries.	For now, punt and let it be allocated later.  We can't
-  // make it an nsAutoVoidArray since it's a cString array.
-  // XXX mFontIsGeneric will generally need to be the same size; right now
-  // it's an nsAutoVoidArray.	If the average is under 8, that's ok.
+  : mFonts() // I'm not sure what the common
+  // size is here - I generally see 2-5 entries.  For now, punt and
+  // let it be allocated later.  We can't make it an nsAutoVoidArray
+  // since it's a cString array.  XXX mFontIsGeneric will generally
+  // need to be the same size; right now it's an nsAutoVoidArray.  If
+  // the average is under 8, that's ok.

What about just copy-pasting the old comment to save CVS from generating
a diff block that isn't meaningful.

> > Some places inside these structs have a weird indentation.
>
> I'm not sure what you're talking about here.  They look OK here.

Below is what I see from my end:

+struct MozXftLangGroup {
+    const char   *mozLangGroup;
+    FcChar32	    character;
+    const FcChar8 *XftLang;
+};
+
+static const MozXftLangGroup MozXftLangGroups[] = {
+    { "x-western",	 0x0041,	(const FcChar8 *)"en" },
+    { "x-central-euro", 0x0100,	(const FcChar8 *)"pl" },
+    { "x-cyrillic",	 0x0411, (const FcChar8 *)"ru" },
+    { "x-baltic",	 0x0104, (const FcChar8 *)"lv" },
+    { "x-unicode",	 0x0000,		  0    },
+    { "x-user-def",	 0x0000,			0    },
+};

> Since mFontMetrics is nsIFontMetricsGTK by design.
>
> Actually, mFontMetrics is an nsIFontMetrics pointer, not an nsIFontMetricsGTK
> object.

Actually, it is an nsIFontMetricsGTK object because the rendering context's
mFontMetrics is created with the nsGfxFactoryGTK's nsFontMetricsConstructor
which hands back an nsFontMetricsGTK (or Xft) -- which is nsIFontMetricsGTK and 
nsIFontMetrics by design:

+class nsIFontMetricsGTK : public nsIFontMetrics {
+class nsFontMetricsGTK : public nsIFontMetricsGTK
+class nsFontMetricsXft : public nsIFontMetricsGTK

> Yeah, I removed that bit of code from nsWidget.cpp since it's not used anywhere
> in the entire tree.

Since you have already double-checked that it isn't used at all, I suggest
changing

 NS_IMETHODIMP	nsFontMetricsGTK::GetFontHandle(nsFontHandle &aHandle)
 {
-  aHandle = (nsFontHandle)mWesternFont;
+  aHandle = (nsFontHandle)(nsIFontMetricsGTK *)this;
   return NS_OK;
 }

to

 NS_IMETHODIMP	nsFontMetricsGTK::GetFontHandle(nsFontHandle &aHandle)
 {
  return NS_ERROR_NOT_IMPLEMENTED;
 }

and having another bug to remove the API nsIFontMetrics::GetFontHandle() 
altogether. The platform-specific nsWidget::SetFont() are the sole consumers
of nsIFontMetrics::GetFontHandle(), e.g.,
widget/src/gtk/nsWidget::SetFont(const nsFont &aFont)
widget/src/windows/nsWindow::SetFont(const nsFont &aFont)

If nobody uses nsWidget::SetFont(), then it would be good to remove
nsIFontMetrics::GetFontHandle() since it introduces nasty dependencies
as you pointed out. On the other hand, I don't like your current return
of the 'this' pointer either, as I pointed out earlier.

> I should really rename nsIFontMetricsGTK to something a little more different
> than nsIFontMetrics and nsFontMetricsGTK.  Maybe I can use nsIFontHandleGTK! :)

Purists will say nsPI...something :-) But nsIFontHandleGTK would be a
misnomer. The mFontHandle that you added isn't needed since it is redundant
with mFontMetrics as I mentioned earlier. Simply change the declaration 
of the nsRenderingContextGTK's mFontMetrics to nsIFontMetricsGTK.

+  // Get the pointer to twip conversion for this rendering context
+  float GetP2T() {
+    return mP2T;
+  }

This function isn't needed since you can get the P2T factor by just using an
existing function to that effect in nsIDeviceContext:

  float p2t;
  deviceContext->GetDevUnitsToAppUnits(p2t);
  (and you already have a hold to the device context within the font metrics)


+    // Get a GdkFont for this handle, if there is one.  This can
+    // return 0, which means there is no GdkFont associated with this
+    // particular handle.
+    virtual GdkFont* GetGDKFont(void) = 0;

Suggesting to rename it as GetCurrentGDKFont() since it will reflect better
what the function is doing.
> This function isn't needed since you can get the P2T factor by just using an
> existing function to that effect in nsIDeviceContext:

Do we really need to insist on making a virtual function call just to get a float?
Do you instead want to pollute the other classes and defeat the purpose of other
APIs. Yo can remove nsIDeviceContext::* if you don't like that instead. 
> What about just copy-pasting the old comment to save CVS from generating
> a diff block that isn't meaningful.

Fixed.  Silly mistake.

> 
> +struct MozXftLangGroup {
> +    const char   *mozLangGroup;
> +    FcChar32	    character;
> +    const FcChar8 *XftLang;
> +};
> 
> Some k

Some hidden tabs in there.  Fixed.

> Actually, it is an nsIFontMetricsGTK object because the rendering context's
> mFontMetrics is created with the nsGfxFactoryGTK's nsFontMetricsConstructor
> which hands back an nsFontMetricsGTK (or Xft) -- which is nsIFontMetricsGTK and 
> nsIFontMetrics by design:
> 

All right. You sold me.  Fixed.  We can file a new bug once this is checked in
to remove that interface since it doesn't seem to be needed since there are no
users now.

> 
> This function isn't needed since you can get the P2T factor by just using an
> existing function to that effect in nsIDeviceContext:
> 

Fixed.

> Suggesting to rename it as GetCurrentGDKFont() since it will reflect better
> what the function is doing.

Fixed.
Attached patch patchSplinter Review
Fix rbs' latest suggestions.
Attachment #102460 - Attachment is obsolete: true
Comment on attachment 102543 [details] [diff] [review]
patch

r=rbs
Attachment #102543 - Flags: superreview+
Attachment #102543 - Flags: review+
Comment on attachment 102543 [details] [diff] [review]
patch

a=roc,shaver for 1.2b.	Lux fiat.
Attachment #102543 - Flags: approval+
Checked in.  No apparent affect on leaks, page load times or other automated tests.
Status: ASSIGNED → RESOLVED
Closed: 22 years ago
Resolution: --- → FIXED
Big thanks to everybody who worked on this :)
Halleluja!
Usually I do not want to spam here, but I've got to say, too:
THANKS A LOT !!! THIS IS ABSOLUTELY AWESOME !!!
Thanks for the wonderful work. I've been using Xft-enabled build for a week and
it's great. 

I've got a question or two. I considered just emailing Chris off-line or
opening a new bug, but
decided to write here(before opening a new bug) because some other people here
may be interested in what I'm gonna write. 

My question is whether it's possible to provide a 'dumb' TTF 
with some intelligence. What do I mean by this? It's kinda like 'font-hack'
for X11 core fonts with (non-)standard/custom encoding. (see comment #112).

There are some Korean TTFs included in Old Korean tools from Microsoft
for pre-1933 orthography text. They're just
plain TTFs with no intelligence in the sense that they don't have any
opentype tables (gsub, gpos, etc) for the proper rendering of Hangul Jamos
(U+1100). However, they sorta have more or less all the necessary glyphs 
in PUA (and some bad ones have glyphs assigned code space of BMP).
What's missing is a *font-specific* mapping from a sequence of Unicode 
code points to a sequence of glyphs in PUA. I added these mappings
to Yudit(http://www.yudit.org) and Lambda(Unicode-enabled LaTeX) and
have been working on adding them to Pango
1.1(http://bugzilla.gnome.org/show_bug.cgi?id=95708). 

With X11 core fonts,
it's relatively easy to support this custom-encoding and it can be done
pretty quickly (as is done for 'johab*-1' fonts mentioned in comment #112).
Now, I'm wondering whether it's doable with Xft and how hard it would be and
where I have to look if possible. 

The reason I thought this might be of interest to others is:  
until OTF support is in place and working OTFs are available,
the proper support of Indic script is hard to come by. However,
recently a set of free fonts for various Indic scripts were released
under GPL. Unfortunately, they're not OTFs but plain TTFs with
custome-encoding. Still they have necessary glyphs for rendering
of the target script, but without mapping from a seq. of
Unicode char. to a seq. of glyphs, they're useless. The situation seems to be
similar to Korean situation aforementioned. 

Any idea or comment would be appreciated. 
 
comment #87 by Owen gave a generic answer (ans. to q. 4, for example) and
it reminded me that Mathml is another area in which some sort of 'font-specific'
hack is needed (at least for now).
 

> If fonts are encoded using some sort of standard,it should just be
> a layout level issue. If it involves recognizing specific fonts, and
> knowing how they are encoded, it will be a little bit difficult to
> fit that sort of hackery on top o fthe fontconifg framework, 

> though Mozilla 
> could certainly just ask for those fonts specifically.

  Suppose a specific font with custom encoding (i.e. the mapping
from a seq. of Unicode characters to a seq. of glyphs in the font
is not trivial one-to-one, but the font is dumb and is not an
OTF but a plain TTF) is explicitly specified via CSS font-family 
in a html document. fontconfig would just hand in that font to
Mozilla.. then, taking care of this font-specific mapping/encoding
is  the responsibility of what you're refering to as layout... 
I've gotta figure out how it's done with hopefully some help ...
 
one little thing: it would be nice if the menus/dialogs used the Gnome
application font instead of the mozilla default font. right now, my mozilla
menus don't quite match the rest of my system because i use a bold font for
them, which cannot be specified by the mozilla font preferences. should i open
an enhancement request, or can we just reuse this bug, since the CC: people may
be interested?

please give yourselves a pat on the back; you guys do a great job, but we users
are never satisfied! :)
Alvin, I believe you are interested in bug 175025. Please, no more comments in
this bug.
Just installed the 1.1 beta build with xft support for RedHat 8.0 from the RPM
files provided at the mozilla ftp site. The xft support is OK. I only have the
following remark.

When I go to select Mozilla fonts in Appearance / Fonts I can't chose any other
font than "Palatino Linotype" for Cyrillic and Greek encodings. In other
encodings I can select all the fonts. And - yes I'we got some Cyrillic and Greek
fonts instaled and properly configured - including the MS fonts from Windows. 

The cyrillic fonts are working fine with other xft2 applications like GNOME and
KDE from RH8. Also the Cyrillic fonts are working fine with the very same
mozilla in the main window when you surf - so I can see Cyrillic Verdana on
www.mksoftver.org or www.bagra.net.mk so I suppose this is a tiny bug.

Hope I hellped - have fun.

EVERYONE READ THIS:

If you have a bug report, FILE A NEW BUG. Don't add more comments to an 
already-closed bug. You need to create a new bug so it gets tracked.

If you have support requests, mail the mailing lists or newsgroups or 
ask on IRC.

No more comments!
Depends on: xft_triage
Depends on: 209626
Restrict Comments: true
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: