Re: commit: huge layout patch

From: Martin Sevior (msevior@physics.unimelb.edu.au)
Date: Sat Feb 15 2003 - 20:49:11 EST

  • Next message: Patrick Lam: "commit: fix fjf errors, remove lotsa warnings"

    On Sat, 15 Feb 2003, Patrick Lam wrote:

    HI Pat and Dom,
                  Thanks VERY much for this code. Apart from the fixing
    numerous layout and non-WYSIWYG bugs this patch opens the way for
    significant improvements in AbiWord's performance whic will take it far
    beyond competing products.

    Since all the layout and container classes use just 1440 DPI layout units
    we can change zoom by just altering a single parameter in the graphics
    classes. With a bit of work so remove all the local ointers to the
    graphics classes we can have "instant zoom" even for massively huge
    documents. Simply do a clear screen set in new zoom level in the graphics
    classes and redraw.

    We can also potentially print far faster by creating a print graphics
    class and plugging the print graphics class into drawArguments passed to
    the container draw methods. Instaed of recreating an entire layout
    structure for printing as we do now.

    All in all this is going to take far beyond competing products.

    Great Work!

    Cheers

    Martin

    > Use layout units
    exclusively (mostly) - with Dom >
    > This commit will break other platforms. Here's what you have to do to
    > make them work again.
    >
    > Abi now, in principle, does all calculations at 1440 dpi. (in layout
    > units).
    > Previously, Abi was doing the calculation twice, both at screen
    > resolution
    > (~72dpi) and at layout resolution. This sucked, and caused various
    > weird
    > bugs, which should be resolved now.
    >
    > We've introduced functions gr_Graphics::tdu, ::tlu, ::tduD, and ::tluD.
    > ::tdu converts from layout To Device Units, while ::tlu converts To
    > Layout
    > Units. The *D versions use doubles, while the normal versions use
    > UT_sint32s. These replace the old _UL and _UD macros, which should no
    > longer be used. ::getResolution() now returns a constant 1440, while
    > ::getDeviceResolution() returns something consistent with the zoom.
    > [The graphics class is exclusively responsible for zoom scaling now.]
    >
    > Any constant '1 pixel' additions in the source need to say 'tlu(1)' now.
    > We've done this in unix and XP code, but there may be instances in
    > graphics classes.
    >
    > The graphics classes now communicate with the rest of Abi in layout
    > units.
    > That means that in the platform impls of the graphics classes, you need
    > to run ::tdu before you start drawing anything. You'll probably also
    > need
    > to change gr_*Image. Also, you need to change the event handling
    > mechanisms;
    > that should be in af/ev/*. When an event comes in, any pixels will be
    > in
    > device units, and they need to be wrapped with ::tlu before being passed
    > to the rest of abi. The frame also deals with pixels in terms of
    > heights.
    > The public API from the frame should give layout units.
    >
    > We also inserted some ::tlu calls in a Unix dialog which had image
    > previews, FileOpenSaveAs.
    >
    > 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, for measurement. We didn't quite succeed in
    > that
    > goal, because we didn't manage to get FontConfig to cooperate with us,
    > but
    > the public API is based on this assumption, and we internally do fixups
    > between the UnixFont and the UnixGraphics to make it work pretty well in
    > practice. There are three functions which return font metrics, in
    > platform
    > Graphics code: ::getAscent, ::getDescent, and ::measureUnRemappedChar.
    > If
    > possible, these should return metrics based on a font requested at 1440
    > dpi
    > [or they should pretend to]. ::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()).
    >
    > I'm not aware of any serious remaining issues. Sometimes the redraw
    > after
    > scroll isn't as pretty as it should be, but it's not blatantly broken
    > like it was before yesterday.
    >
    > I hope I've given enough information for platform maintainers to unbreak
    > their builds. Best of luck!
    >
    > pat
    >
    > CVS:
    > ----------------------------------------------------------------------
    > CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
    > CVS:
    > CVS: Committing in .
    > CVS:
    > CVS: Modified Files:
    > CVS: src/af/ev/unix/ev_UnixMouse.cpp
    > CVS: src/af/gr/unix/gr_UnixGraphics.cpp
    > CVS: src/af/gr/unix/gr_UnixGraphics.h
    > CVS: src/af/gr/unix/gr_UnixImage.cpp src/af/gr/unix/gr_UnixImage.h
    > CVS: src/af/gr/win/gr_Win32Graphics.cpp
    > CVS: src/af/gr/win/gr_Win32Graphics.h src/af/gr/xp/gr_Caret.cpp
    > CVS: src/af/gr/xp/gr_Graphics.cpp src/af/gr/xp/gr_Graphics.h
    > CVS: src/af/gr/xp/gr_Image.cpp src/af/gr/xp/gr_Image.h
    > CVS: src/af/util/xp/ut_svg.cpp src/af/util/xp/ut_types.h
    > CVS: src/af/util/xp/ut_units.cpp src/af/util/xp/ut_units.h
    > CVS: src/af/xap/unix/xap_UnixApp.cpp
    > CVS: src/af/xap/unix/xap_UnixDlg_FileOpenSaveAs.cpp
    > CVS: src/af/xap/unix/xap_UnixFont.cpp
    > CVS: src/af/xap/unix/xap_UnixFont.h
    > CVS: src/af/xap/unix/xap_UnixFontManager.cpp
    > CVS: src/af/xap/unix/xap_UnixFontManager.h
    > CVS: src/af/xap/unix/xap_UnixFrameImpl.cpp
    > CVS: src/af/xap/unix/xap_UnixNullGraphics.cpp
    > CVS: src/af/xap/unix/xap_UnixNullGraphics.h
    > CVS: src/af/xap/unix/xap_UnixPSFont.cpp
    > CVS: src/af/xap/unix/xap_UnixPSFont.h
    > CVS: src/af/xap/unix/xap_UnixPSGraphics.cpp
    > CVS: src/af/xap/unix/xap_UnixPSGraphics.h
    > CVS: src/af/xap/win/xap_Win32Dlg_FontChooser.cpp
    > CVS: src/af/xap/xp/xap_Dlg_FontChooser.cpp
    > CVS: src/af/xap/xp/xap_Draw_Symbol.cpp
    > CVS: src/af/xap/xp/xap_Preview_Zoom.cpp src/af/xap/xp/xav_View.cpp
    > CVS: src/text/fmt/xp/fb_Alignment.cpp
    > CVS: src/text/fmt/xp/fb_Alignment.h
    > CVS: src/text/fmt/xp/fb_ColumnBreaker.cpp
    > CVS: src/text/fmt/xp/fg_Graphic.h
    > CVS: src/text/fmt/xp/fg_GraphicRaster.cpp
    > CVS: src/text/fmt/xp/fg_GraphicRaster.h
    > CVS: src/text/fmt/xp/fg_GraphicVector.cpp
    > CVS: src/text/fmt/xp/fg_GraphicVector.h
    > CVS: src/text/fmt/xp/fl_BlockLayout.cpp
    > CVS: src/text/fmt/xp/fl_BlockLayout.h
    > CVS: src/text/fmt/xp/fl_DocLayout.cpp
    > CVS: src/text/fmt/xp/fl_DocLayout.h
    > CVS: src/text/fmt/xp/fl_FootnoteLayout.cpp
    > CVS: src/text/fmt/xp/fl_SectionLayout.cpp
    > CVS: src/text/fmt/xp/fl_SectionLayout.h
    > CVS: src/text/fmt/xp/fl_TableLayout.cpp
    > CVS: src/text/fmt/xp/fl_TableLayout.h src/text/fmt/xp/fp_Column.cpp
    > CVS: src/text/fmt/xp/fp_Column.h
    > CVS: src/text/fmt/xp/fp_ContainerObject.h
    > CVS: src/text/fmt/xp/fp_FmtMarkRun.cpp
    > CVS: src/text/fmt/xp/fp_FootnoteContainer.cpp
    > CVS: src/text/fmt/xp/fp_Line.cpp src/text/fmt/xp/fp_Line.h
    > CVS: src/text/fmt/xp/fp_Page.cpp src/text/fmt/xp/fp_Page.h
    > CVS: src/text/fmt/xp/fp_Run.cpp src/text/fmt/xp/fp_Run.h
    > CVS: src/text/fmt/xp/fp_TableContainer.cpp
    > CVS: src/text/fmt/xp/fp_TableContainer.h
    > CVS: src/text/fmt/xp/fp_TextRun.cpp src/text/fmt/xp/fp_TextRun.h
    > CVS: src/text/fmt/xp/fv_View.cpp src/text/fmt/xp/fv_View_cmd.cpp
    > CVS: src/text/fmt/xp/fv_View_protected.cpp
    > CVS: src/wp/ap/unix/ap_UnixApp.cpp src/wp/ap/unix/ap_UnixFrame.cpp
    > CVS: src/wp/ap/unix/ap_UnixFrameImpl.cpp
    > CVS: src/wp/ap/unix/ap_UnixLeftRuler.cpp
    > CVS: src/wp/ap/unix/ap_UnixTopRuler.cpp
    > CVS: src/wp/ap/xp/ap_Dialog_Columns.cpp
    > CVS: src/wp/ap/xp/ap_Dialog_FormatTable.cpp
    > CVS: src/wp/ap/xp/ap_Dialog_Lists.cpp
    > CVS: src/wp/ap/xp/ap_Dialog_PageNumbers.cpp
    > CVS: src/wp/ap/xp/ap_EditMethods.cpp src/wp/ap/xp/ap_LeftRuler.cpp
    > CVS: src/wp/ap/xp/ap_LeftRuler.h
    > CVS: src/wp/ap/xp/ap_Preview_Paragraph.cpp
    > CVS: src/wp/ap/xp/ap_Ruler.cpp src/wp/ap/xp/ap_TopRuler.cpp
    > CVS: src/wp/ap/xp/ap_TopRuler.h src/wp/impexp/xp/ie_exp_HTML.cpp
    > CVS:
    > ----------------------------------------------------------------------
    >
    >
    >



    This archive was generated by hypermail 2.1.4 : Sat Feb 15 2003 - 20:53:45 EST