From: Tomas Frydrych (tomas@frydrych.uklinux.net)
Date: Mon Feb 17 2003 - 06:13:44 EST
Hi Pat,
Excellent, this is a major step forward, and I greatly appreciate all
the work you have put into this -- just in case the following might
suggest otherwise :). I have not had a chance to look at the code
yet, but the message sparked a few thoughts.
> ::getResolution() now returns
> a constant 1440, while ::getDeviceResolution() returns something
> consistent with the zoom. [The graphics class is exclusively
> responsible for zoom scaling now.]
::getDeviceResolution handling the zoom is not right; device
resolution is a constant that has nothing to do with zoom, and doing
the zoom by pretending that the device resolution has changed is a
potential source of layout bugs similar to those we experienced in
the past. What we need, is to have proper transform functions in the
gr_Graphics class and zoom by changing the scaling factor of the
transform. Then the draw functions do not need to do any internal
conversions due to zoom (see pseudo code below).
> Finally, we did some work on fixing up fonts in Unix (where xft is
> mandatory now). What we wanted was to get two fonts, one
> corresponding to the current zoom, and one for 1440dpi,
This is again not right; we should get the font for the 1440 dpi only,
and for screen processing tell the system to apply a tranform to it
(which would include the zoom scaling factor). Under xft this should
not be too difficult, since FT2 has a neat transform handling
mechanism.
> ::drawGlyph needs to draw a font at ::getDeviceResolution (you may
> find it easier to request a 'screen font' of the appropriate size
> multiplied by getZoomPercentage()).
Again, this is not right. In particular, requesting screen font at
real_size = size*zoom results in incorrect scaling (because font
metric does not scale linearly with size). This seems to me to be
precisely what we have done in the past, and what does not work.
The following is a pseudo-code outline of how the graphics class
should be handling zoom (and anything to do with transforms we
might want to do in the future):
gr_Graphics::setTranform(transform)
{
system_set_transform(transform);
}
gr_Graphics::changeTranform(change)
{
new_transform = getTransform() + change;
system_set_transform(new_transform);
}
gr_Graphics::zoom(z)
{
if(is_screen_context())
{
changeTransform(z);
}
}
editmethod_zoom(z)
{
pGR->zoom(z);
}
the drawing would then simply be done by
drawChars(text, size)
{
device_size = tdu(size);
system_draw_text(text, device_size);
}
This approach would ensure correct scaling of text between screen
and printer once for all, and also remove the responsibility for
making any zoom adujustments from the gr_Graphics draw
functions.
I have started working on the transforms a while back, and there is a
very basic GR_Transform class and getTransform() and
gr_Graphics::setTransform() functions in gr_Graphics.h. The
tranform class needs some more methods, for now at least
setScale(double s), and the the virtual gr_Graphics::_setTransform()
needs to be implemented in platform code. Once this is done, the
zoom edit method needs to be hooked in, and the zoom handling
removed from the drawing functions, and that's basically it.
Tomas
This archive was generated by hypermail 2.1.4 : Mon Feb 17 2003 - 06:20:48 EST