3901e029bd
Communicate Kashida insertion positions in an explicit way. Rest of LibreOffice communicate adjustments to character widths (e.g. for justification or spacing) using so-called DX array. DX array is an array of absolute character positions (e.g. DX[n] is the position after character n from the start of the lines, and its widths is DX[n] - DX[n-1]). This DX array is modified also when Kashidas are inserted after a given character for Arabic justification, by expanding its width. VCL would use this to know where to insert the Kashidas and how many ones. But because DX array is used for both widths adjustments and kashida insertion, this turns out to be a source of bugs since VCL has tosecond guess the DX array to find which is pure width adjustment and which also involves Kashida insertion, and the heuristics it uses are fragile. This change adds a second array of booleans that records where Kashida is inserted and communicates it all the way from where Kashida insertion is decoded in Writer and down to VCL layout. This change passes the Kashida array only when it seems necessary (e.g. during drawing but not when measuring text since the DX array is enough in this case). Hopefully no places where Kashida insertion needs to be passed down were missed. A couple of glyph and layout flags that were used for old heuristics and no longer needed and are removed. This also fixes: tdf#87731 tdf#106309 tdf#108604 tdf#112849 tdf#114257 tdf#127176 tdf#145647 tdf#146199 Change-Id: I4ed0850ef2fdc3e9143341afac649e7e7d463c39 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138068 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> |
||
---|---|---|
.. | ||
inc | ||
qa/cppunit | ||
source | ||
CppunitTest_emfio_emf.mk | ||
CppunitTest_emfio_wmf.mk | ||
emfio.component | ||
IwyuFilter_emfio.yaml | ||
Library_emfio.mk | ||
Makefile | ||
Module_emfio.mk | ||
README.md |
WMF/EMF/EMF+ Reader
Introduction
The emfio module is used to read WMF (Windows Metafile), EMF (Enhanced Metafiles) and also EMF+ (enhanced EMF) files [1], which are binary formats for vector images from Microsoft. These files can contain vector graphics, bitmap components and text.
This folder contains emfio/source/reader
which is used for reading the
WMF/EMF/EMF+ files, either directly, or inside a document. For embedding Windows
Metafiles inside a document, one can use "Insert -> Picture -> From File" to put
such a file into the document. It is possible to export the Windows Metafile
by using right click and choose "save".
Most of the records of WMF/EMF formats come from the Windows Graphics Device. For Interface (GDI) API and EMF+ they come from the newer Windows GDI+.
More information about rendering Windows Metafiles can be found in the Visual Class Library (VCL) and also in the GDIMetaFile documentation.
An example demo that renders a metafile using vcl
be seen by invoking:
./bin/run mtfdemo odk/examples/basic/forms_and_controls/burger.wmf
This opens the burger.wmf file from the ODK examples.
It is also possible to dump metaactions created as the intermediary format before rendering the metafile using:
./bin/run mtfdemo -d odk/examples/basic/forms_and_controls/burger.wmf
If the command is successful, this message will be shown, and metadump.xml will be put in the current folder:
"Dumped metaactions as metadump.xml"
The demo code structure is described in GDIMetaFile documentation.
[1] Windows Meta File, Wikipedia
EMF+ Specifics
Handling EMF+ is to some extent different from handling WMF/EMF. More information can be found in the VCL documentation.
How does it work?
emfio
module takes a byte array and turns it into a drawinglayer
primitive container. The rendering is done via drawinglayer
primitives. For more information, you should refer to VCL documentation.
The drawinglayer primitives created to draw the emf/wmf files can be dumped as xml for debugging purposes. For more information, please refer to the drawinglayer documentation.
Limitations
Not all the WMF/EMF/EMF+ records are supported by this module. Unsupported records are marked as "not implemented", and a warning message will printed if they are actually read within a file. You can file a bug report for implementing these records.
Currently, these records are not implemented for WMF (specified in
wmfreader.cxx
):
W_META_SETRELABS W_META_SETPOLYFILLMODE W_META_SETSTRETCHBLTMODE
W_META_SETTEXTCHAREXTRA W_META_SETTEXTJUSTIFICATION W_META_FLOODFILL
W_META_FILLREGION W_META_FRAMEREGION W_META_INVERTREGION
W_META_PAINTREGION W_META_DRAWTEXT W_META_SETMAPPERFLAGS
W_META_SETDIBTODEV W_META_REALIZEPALETTE W_META_ANIMATEPALETTE
W_META_SETPALENTRIES W_META_RESIZEPALETTE W_META_EXTFLOODFILL
W_META_RESETDC W_META_STARTDOC W_META_STARTPAGE W_META_ENDPAGE
W_META_ABORTDOC W_META_ENDDOC
And these records are not implemented for EMF/EMF+ (specified in emfreader.cxx
):
EMR_MASKBLT EMR_PLGBLT EMR_SETDIBITSTODEVICE EMR_FRAMERGN
EMR_INVERTRGN EMR_FLATTENPATH EMR_WIDENPATH EMR_POLYDRAW
EMR_SETPALETTEENTRIES EMR_RESIZEPALETTE
EMR_EXTFLOODFILL EMR_ANGLEARC EMR_SETCOLORADJUSTMENT EMR_POLYDRAW16
EMR_CREATECOLORSPACE EMR_SETCOLORSPACE EMR_DELETECOLORSPACE
EMR_GLSRECORD EMR_GLSBOUNDEDRECORD EMR_PIXELFORMAT EMR_DRAWESCAPE
EMR_EXTESCAPE EMR_STARTDOC EMR_SMALLTEXTOUT EMR_FORCEUFIMAPPING
EMR_NAMEDESCAPE EMR_COLORCORRECTPALETTE EMR_SETICMPROFILEA
EMR_SETICMPROFILEW EMR_TRANSPARENTBLT EMR_TRANSPARENTDIB
EMR_GRADIENTFILL EMR_SETLINKEDUFIS EMR_SETMAPPERFLAGS EMR_SETICMMODE
EMR_CREATEMONOBRUSH EMR_SETBRUSHORGEX EMR_SETMETARGN EMR_SETMITERLIMIT
EMR_EXCLUDECLIPRECT EMR_REALIZEPALETTE EMR_SELECTPALETTE
EMR_CREATEPALETTE EMR_ALPHADIBBLEND EMR_SETTEXTJUSTIFICATION
Due to the difference on the fonts available on various platforms, the outcome of text rendering can be different on Linux, Windows, macOS and elsewhere.
Known Bugs
Known remaining bugs for this module is gathered here:
Dependencies
The direct dependency for emfio is drawinglayer. The complete list of dependencies including the indirect dependencies is as below:
basegfx drawinglayer cppu cppuhelper sal comphelper tl salhelper vcl svt utl
Tools
Several tools are available for inspecting WMF/EMF/EMF+ files, which are binary formats. Some of them are:
- mso-dumper: Reads and dumps various binary formats from Microsoft including WMF/EMF/EMF+. The output is in a custom XML format. emf-dump.py and wmf-dump.py are usable.
- RE-lab (Formerly OLEToy): Reads, dumps and modifies several binary formats from Microsoft including WMF/EMF/EMF+, and also other companies.
- EMF+ diagnostics reporting tool
- limerest: A new gui tool based on OLEToy for working with various binary formats
Related Software
References
Documentation for WMF/EMF/EMF+ formats are available on Microsoft website: