6342aa6c66
and cid#1545364 COPY_INSTEAD_OF_MOVE cid#1545363 COPY_INSTEAD_OF_MOVE cid#1545344 COPY_INSTEAD_OF_MOVE cid#1545299 COPY_INSTEAD_OF_MOVE cid#1545287 COPY_INSTEAD_OF_MOVE cid#1545267 COPY_INSTEAD_OF_MOVE cid#1545256 COPY_INSTEAD_OF_MOVE cid#1545226 COPY_INSTEAD_OF_MOVE cid#1545500 COPY_INSTEAD_OF_MOVE cid#1545538 COPY_INSTEAD_OF_MOVE cid#1545618 COPY_INSTEAD_OF_MOVE cid#1545681 COPY_INSTEAD_OF_MOVE cid#1545750 COPY_INSTEAD_OF_MOVE cid#1545778 COPY_INSTEAD_OF_MOVE cid#1545785 COPY_INSTEAD_OF_MOVE cid#1545799 COPY_INSTEAD_OF_MOVE cid#1545847 COPY_INSTEAD_OF_MOVE cid#1545958 COPY_INSTEAD_OF_MOVE cid#1545963 COPY_INSTEAD_OF_MOVE cid#1545990 COPY_INSTEAD_OF_MOVE cid#1546013 COPY_INSTEAD_OF_MOVE cid#1546029 COPY_INSTEAD_OF_MOVE cid#1546079 COPY_INSTEAD_OF_MOVE cid#1546104 COPY_INSTEAD_OF_MOVE cid#1546127 COPY_INSTEAD_OF_MOVE cid#1546133 COPY_INSTEAD_OF_MOVE cid#1546155 COPY_INSTEAD_OF_MOVE cid#1546190 COPY_INSTEAD_OF_MOVE cid#1546216 COPY_INSTEAD_OF_MOVE cid#1546273 COPY_INSTEAD_OF_MOVE cid#1546315 COPY_INSTEAD_OF_MOVE cid#1546326 COPY_INSTEAD_OF_MOVE cid#1546387 COPY_INSTEAD_OF_MOVE accept some reasonable suggestions Change-Id: I7b004086d490c7618d8fe7a21a53cfa8ac1f8408 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/161748 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolan.mcnamara@collabora.com> |
||
---|---|---|
.. | ||
inc | ||
qa/unit | ||
source | ||
CppunitTest_drawinglayer_border.mk | ||
CppunitTest_drawinglayer_processors.mk | ||
drawinglayer.component | ||
IwyuFilter_drawinglayer.yaml | ||
Library_drawinglayer.mk | ||
Library_drawinglayercore.mk | ||
Makefile | ||
Module_drawinglayer.mk | ||
README.md |
Drawing API
Drawing API that can specify what to draw via a kind of display list.
Example of the DrawingLayer use is eg. in svx/source/xoutdev/xtabhtch.cxx:121
.
A stripped down version with extended comments:
// Create a hatch primitive (here a rectangle that will be filled with
// the appropriate hatching, but has no border).
// This will not draw it yet; it's so far only constructed to add it to a
// display list later.
const drawinglayer::primitive2d::Primitive2DReference aHatchPrimitive(
new drawinglayer::primitive2d::PolyPolygonHatchPrimitive2D(...));
// Create a rectangle around the hatch, to give it a border.
const drawinglayer::primitive2d::Primitive2DReference aBlackRectanglePrimitive(
new drawinglayer::primitive2d::PolygonHairlinePrimitive2D(...));
// Here we want to render to a virtual device (to later obtain the bitmap
// out of that), so prepare it.
VirtualDevice aVirtualDevice;
// Create processor and draw primitives, to get it ready for rendering.
std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor2D(
drawinglayer::processor2d::createPixelProcessor2DFromOutputDevice(...));
// Fill-in the display list.
drawinglayer::primitive2d::Primitive2DSequence aSequence(2);
aSequence[0] = aHatchPrimitive;
aSequence[1] = aBlackRectanglePrimitive;
// Render it to the virtual device.
pProcessor2D->process(aSequence);
pProcessor2D.reset();
// Obtain the bitmap that was rendered from the virtual device, to re-use
// it in the widget.
aRetval = aVirtualDevice.GetBitmap(Point(0, 0), aVirtualDevice.GetOutputSizePixel());
DrawingLayer Glossary
Primitives - classes that represent what should be drawn. It holds the data what to draw, but does not contain any kind of the rendering. Some of the primitives are 'Basic primitives', that are primitives that cannot be decomposed. The rest of the primitives can be decomposed to the basic primitives.
Decomposition - a way how to break down the more complicated primitives into
the basic primitives, and represent them via them; this logically makes the
plain Primitive2DSequence
display list a hierarchy.
Eg. PolygonMarkerPrimitive2D
can be decomposed to 2 hairlines
PolyPolygonHairlinePrimitive2D
's, each with different color.
Processor - a class that goes through the hierarchy of the Primitives, and
renders it some way. Various processors, like VclPixelProcessor2D
(renders to
the screen), VclMetafileProcessor2D
(renders to the VCL metafile, eg. for
printing), etc.
How to Implement a New Primitive ("Something New to Draw")
-
Create an ancestor of
BasePrimitive2D
(or of its ancestor if it fits the purpose better)-
Assign it an ID [in
drawinglayer_primitivetypes2d.hxx
] -
Implement its decomposition [
virtual Primitive2DSequence create2DDecomposition(...)
]
-
-
Extend the (various) processor(s) If you need more than relying on just the decomposition
Where is DrawingLayer Used
-
SdrObject
(s) (rectangles, Circles, predefined shapes etc.) -
Selections
-
Various smaller cases to 'just draw something'
- Draw to a virtual device, and use the resulting bitmap (like the example above)
-
Custom widgets (like the Header / Footer indicator button)
Dumping DrawingLayer Primitives as XML
For debugging purposes, it is possible to dump the drawinglayer primitives as an xml file. The drawinglayer xml dump can show possible problems with the rendering.
For example, in emfio/qa/cppunit/emf/EmfImportTest.cxx
, one can write:
Primitive2DSequence aSequence = parseEmf(u"emfio/qa/cppunit/wmf/data/stockobject.emf");
drawinglayer::Primitive2dXmlDump dumper;
Primitive2DContainer aContainer(aSequence);
dumper.dump(aContainer, "/tmp/drawyinglayer.xml");
Then, after invoking make CppunitTest_emfio_emf
, /tmp/drawyinglayer.xml
will
be the dump of the drawinglayer primitives used to draw the emf file in
LibreOffice. The top level tag will be .