office-gobmx/drawinglayer
Luboš Luňák 8ca549ebc0 avoid Skia GPU surfaces for small virtual devices (bsc#1183308)
This is similar to the previous Cairo commit. Fetching pixels
from the GPU is not as slow as fetching them from the XServer,
but this still can make a visible difference. And small surfaces
should not need fast GPU rendering that much, so hopefully this
improves more cases than it regresses.

Change-Id: Ida031b38cd1ce14ded464747c20a38c6d094c5a0
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/128310
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
2022-01-24 14:40:22 +01:00
..
inc Recheck modules d* with IWYU 2022-01-14 12:32:21 +01:00
qa/unit Recheck modules d* with IWYU 2022-01-14 12:32:21 +01:00
source avoid Skia GPU surfaces for small virtual devices (bsc#1183308) 2022-01-24 14:40:22 +01:00
CppunitTest_drawinglayer_border.mk Separate core drawinglayer func. into drawinglayercore library 2021-12-22 12:10:10 +01:00
CppunitTest_drawinglayer_processors.mk Separate core drawinglayer func. into drawinglayercore library 2021-12-22 12:10:10 +01:00
drawinglayer.component drawinglayer: create instances with uno constructors 2020-07-07 11:56:41 +02:00
IwyuFilter_drawinglayer.yaml tdf#42949 Fix new IWYU warnings in directories d* 2020-11-09 16:04:18 +01:00
Library_drawinglayer.mk WASM --enable-wasm-strip now skips lots of LO code 2022-01-20 12:28:54 +01:00
Library_drawinglayercore.mk Separate core drawinglayer func. into drawinglayercore library 2021-12-22 12:10:10 +01:00
Makefile re-base on ALv2 code. Includes (at least) relevant parts of: 2012-11-06 11:58:16 +00:00
Module_drawinglayer.mk Separate core drawinglayer func. into drawinglayercore library 2021-12-22 12:10:10 +01:00
README.md createPixelProcessor2DFromOutputDevice won't return null 2021-04-28 21:37:43 +02:00

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)