From: John H. <jdh...@ac...> - 2004-01-08 03:33:16
|
I'd like to refactor text so that backends will no longer need to implement classes derived from AxisTextBase, but rather provide a RendererBackend.draw_text method (as Jeremy suggested many moons ago). This will enable easy switching of backends in midstream, as discussed in the last couple of days on matplotlib-users. One important limiting factor in the current implementation is the fact that axes, labels, etc.... instantiate derived AxisText classes. Thus backend specific implementations inadvertently creep into (what should be) backend-independent interface classes, like Axes, Legend, Tick, Axis, etc... I think we should implement a Text(Artist) class which is totally backend independent (analogous to Line2D and Patch) with most of protected attribute data defined in AxistTextBase. This class would store all the relevant text properties (fontsize, fontname, fontweight, etc) in a standardized way, and provides a few backend independent utility funcs. The renderer would implement get_text_bbox and draw_text, each of which take a text instance as an argument; these two funcs, are the workhorses of text implementations. Jeremy, do you see any major problems with this proposal vis-a-vis wx? On a related note, we should shoot for standardization of font names for the next major release. Which fonts does WX provide, and which should be part of the core? Thoughts? JDH |
From: Jeremy O'D. <je...@o-...> - 2004-01-08 12:56:22
|
John Hunter said: > > I'd like to refactor text so that backends will no longer need to > implement classes derived from AxisTextBase, but rather provide a > RendererBackend.draw_text method (as Jeremy suggested many moons ago). > This will enable easy switching of backends in midstream, as discussed > in the last couple of days on matplotlib-users. One important > limiting factor in the current implementation is the fact that axes, > labels, etc.... instantiate derived AxisText classes. Thus backend > specific implementations inadvertently creep into (what should be) > backend-independent interface classes, like Axes, Legend, Tick, Axis, > etc... > > I think we should implement a Text(Artist) class which is totally > backend independent (analogous to Line2D and Patch) with most of > protected attribute data defined in AxistTextBase. This class would > store all the relevant text properties (fontsize, fontname, > fontweight, etc) in a standardized way, and provides a few backend > independent utility funcs. The renderer would implement get_text_bbox > and draw_text, each of which take a text instance as an argument; > these two funcs, are the workhorses of text implementations. > > Jeremy, do you see any major problems with this proposal vis-a-vis wx? The trickiest problem is that WX requires a device context to be able to determine the size of a given piece of text, since in WX, GetTextExtent() is a member of wxDC. This was a major pain when implementing text in backend_wx, and is one of the messier pieces of code. Provided that the implementation only requires the calculation of text extent when there is a gc instantiated, we should not have much problem. From the sound of you= r proposal, this would be the case. > On a related note, we should shoot for standardization of font names > for the next major release. Which fonts does WX provide, and which > should be part of the core? WX provides the following aliases (you'll see some of them used in backend_wx): wxSWISS - a Sans-serif font wxROMAN - a Serif font wxSCRIPT - a cursive font wxDECORATIVE - not sure - never used it! wxMODERN - a fixed pitch font wxDEFAULT - default - seems to be same as wxMODERN on Windows The mapping to platform fonts depends on the WX platform, but there is a further complication: non-TrueType fonts cannot be rotated on Windows platforms, and some of the above are defined as non-TT fonts. I suppose that we should have a dictionary which should be populated by the backend. For backend_wx, I'm rather inclined to choose the some of th= e standard Windows fonts, rather than the WX defaults. On Linux, I really need to look into anti-aliased text, but it probably makes sense to use those nice new fonts supplied with Gnome 2 (as they are GPL). This means that I may have to introduce a platform dependency into backend_wx to ensure that a TT font is always chosen. We should also ensure that the user can specify platform fonts if they really wish (again, backend_wx allows for this by checking for a font name which is not in its dictionary). I should also remind you that (since the backend will no longer be responsible for scaling), WX does not cope properly with scaling/rotation of font sizes over 60 pts on all platforms. I currently simply clip the maximum font size at 60 in backend_wx (which works fine in practice since this is always readable) - it may be advisable to be able to cope with this (e.g. let the backend clip point sizes it cannot handle, provided that it correctly returns the text extent in such a case). Overall, it's a very good idea. I can't see any major issues, and I think I've outlined the minor ones. Regards Jeremy > Thoughts? > > JDH > > > > ------------------------------------------------------- > This SF.net email is sponsored by: Perforce Software. > Perforce is the Fast Software Configuration Management System offering > advanced branching capabilities and atomic changes on 50+ platforms. > Free Eval! http://www.perforce.com/perforce/loadprog.html > _______________________________________________ > Matplotlib-devel mailing list > Mat...@li... > https://lists.sourceforge.net/lists/listinfo/matplotlib-devel > |