This patch also fixes tdf#119951 and perhaps tdf#148039.
WARNING: This patch will likely resize the text line height
in every table imported from PPTX.
Someone must have figured out that Microsoft just ignores
the font metrics, and simply adds 20% to the font height
to achieve a "single spacing" line height.
In LO, that is either termed FontIndependentLineSpacing
(a misnomer because it DOES depend on the font ascent/descent)
or FixedCellHeight
(also a misnomer because it so far hasn't applied to cells/tables
and certainly is not restricted to cells/tables
since it was implemented for customShapes).
With this patch, my particular document
now has the right "text/table height" according to a PDF overlay.
The theory is that this change is needed for every document.
The reason this patch is needed is because
svx/source/table/viewcontactoftableobj.cxx's
createPrimitive2DSequenceImpl
passes rCellItemSet as the ItemSet
that will eventually be checked for
rSet.Get(SDRATTR_TEXT_USEFIXEDCELLHEIGHT),
which creates attribute::SdrTextAttribute(bFixedCellHeight)
which is used by SdrTextObj::impDecomposeBlockTextPrimitive
to set SdrOutliner (and thus EditDoc) with
SetFixedCellHeight(rSdrBlockTextPrimitive.isFixedCellHeight());
With FixedCellHeight, impedit3.cxx calculates text/line height
using ImplCalculateFontIndependentLineSpacing.
make CppunitTest_svx_unit \
CPPUNIT_TEST_NAME=testTdf165521_fixedCellHeight
I modified testTdf144092TableHeight,
and attached PDF overlay images to tdf#144092 as proof
the the table should be taller than originally stated.
Change-Id: Ibb4af395b77a3f4d30b5c2e8a08429b701f1ae95
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/183130
Tested-by: Jenkins
Reviewed-by: Justin Luth <jluth@mail.com>
Graphics Related Helper Code
Contains graphics related helper code. Lots of the draw and impress code is in this shared library.
-
xoutdevthis is where a lot of the work would happen to move to the canvas. (what does that mean?)
-
svdrawtransparent gradient stuff. [seriously? surely much more, too]
SdrObject
The shapes you can see in LibreOffice (like rectangle, etc.) are SdrObjects. They are declared as a hierarchy:
SdrObject <- SdrAttrObj <- E3dObject <- E3dCompoundObject <- E3dCubeObj
^ ^ ^ ^ ^ | | ^ ^
| | | | | | | | +--- E3dExtrudeObj
| | | | | | | +----- E3dLatheObj
| | | | | | +------- E3dPolygonObj
| | | | | +--------- E3dSphereObj
| | | | +--- E3dScene...
| | | |
| | | +--- SdrTextObj <- SdrObjCustomShape...
| | | ^ ^ ^ ^ ^
| | | | | | | +--- SdrEdgeObj...
| | | | | | +----- SdrMeasureObj...
| | | | | +------- SdrPathObj...
| | | | +--------- SdrRectObj...
| | | +----------- SdrTableObj...
| | +--- SdrObjGroup...
| + ---- SdrPageObj...
+------- SdrVirtObj...
The above is incomplete of course.
SdrModel / SdrView
Copied from svdview.hxx:
First of all the app creates a SdrModel.
Then it opens a Win and creates a SdrView.
ShowSdrPage() announces a page at SdrView.
It's possible to show SdrView in any Wins at once.
SdrView can show as many Wins as it wants at once. Pages are announced
or checked out with the help of ShowSdrPage()/HideSdrPage(). For every announced
page there is a SdrPageView instance in container aPages. If more than one page
is showed, you have to pay attention that the offset parameter of ShowSdrPage()
is conformed to the size of the page (to prevent overlapping of two pages).
SdrView itself is inherited from many objects in a chain of inheritance (all
that starts with SdrPaintView - that is itself inherited from few classes
too):
SdrPaintView <- SdrSnapView <- SdrMarkView <- SdrEditView <- SdrPolyEditView
^
+----------------------------------------------------------------+
|
SdrGlueEditView <- SdrObjEditView <- SdrExchangeView <- SdrDragView
^
+----------------------------------------------------------------+
|
SdrCreateView <- SdrView
From SdrView on, it is not flat, but a real hierarchy again.
Drawing Layer / SdrObject(s)
See drawinglayer/README.md for general information about drawinglayer.
Below is the class diagram that comes from https://web.archive.org/web/20160827020830if_/http://www.openoffice.org:80/marketing/ooocon2006/presentations/wednesday_g11.odp slide number 6.
.------- Model --------------. .------- View -----------------------------------------.
| SdrObject - ViewContact | 1..* | ViewObjectContact |
| getChild() |------| getPrimitiveList() -----> Object(s) ---> SdrView |
| getVOC() | | getRecPrimitiveList() Contact |
| getViewInd... | |________|_____________________________________________|
| ...ependentPrimitiveList() | |
|____________________________| generates
| ______
V / |
.----------------------. |
| basePrimitive | |
| getRange() |<---'
| getDecomposition() |
|______________________|
For SdrObjects, there are own DrawingLayer primitives in
svx/source/sdr/primitive2d
The ViewContact / ViewObject / ViewObjectContact are in svx/source/sdr/contact
Decomposes the SdrObjects, and does all sort of operations on them.
If the number of visualizable objects (e.g. SdrObjects) is X, and the number of
SdrViews is Y, then:
- there are
XViewContactinstances (1:1 relation with a visualizable object) - there are
YObjectContactinstances (1:1 relation with anSdrView) - there are
X*YViewObjectContactinstances (1:N relation to both visualizable objects andSdrViews)