File: cairopixelprocessor2d.hxx

package info (click to toggle)
libreoffice 4%3A26.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 3,833,120 kB
  • sloc: cpp: 4,395,780; xml: 499,109; java: 254,438; python: 81,820; ansic: 33,823; perl: 30,297; javascript: 19,722; sh: 12,050; makefile: 10,854; cs: 8,865; yacc: 8,549; objc: 2,131; lex: 1,385; asm: 1,231; awk: 996; pascal: 914; csh: 20; sed: 5
file content (268 lines) | stat: -rw-r--r-- 11,177 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

#pragma once

#include <drawinglayer/processor2d/baseprocessor2d.hxx>
#include <basegfx/color/bcolormodifier.hxx>
#include <tools/long.hxx>
#include <sal/config.h>
#include <vcl/vclptr.hxx>

// cairo-specific
#include <cairo.h>

namespace drawinglayer::primitive2d
{
class PolyPolygonColorPrimitive2D;
class PolygonHairlinePrimitive2D;
class BitmapPrimitive2D;
class UnifiedTransparencePrimitive2D;
class BackgroundColorPrimitive2D;
class TransparencePrimitive2D;
class InvertPrimitive2D;
class MaskPrimitive2D;
class ModifiedColorPrimitive2D;
class TransformPrimitive2D;
class PointArrayPrimitive2D;
class MarkerArrayPrimitive2D;
class PolygonStrokePrimitive2D;
class LineRectanglePrimitive2D;
class FilledRectanglePrimitive2D;
class SingleLinePrimitive2D;
class FillGradientPrimitive2D;
class PolyPolygonRGBAGradientPrimitive2D;
class FillGraphicPrimitive2D;
class PolyPolygonRGBAPrimitive2D;
class PolyPolygonAlphaGradientPrimitive2D;
class BitmapAlphaPrimitive2D;
class ControlPrimitive2D;
class TextSimplePortionPrimitive2D;
class TextDecoratedPortionPrimitive2D;
class TextLayouterDevice;
class SvgLinearGradientPrimitive2D;
class SvgRadialGradientPrimitive2D;
class SvgGradientHelper;
class PatternFillPrimitive2D;
}

namespace basegfx
{
class B2DPolyPolygon;
}

namespace basegfx::utils
{
class B2DHomMatrixBufferedOnDemandDecompose;
}

class Bitmap;
class OutputDevice;
class SalLayout;

namespace drawinglayer::processor2d
{
class UNLESS_MERGELIBS(DRAWINGLAYER_DLLPUBLIC) CairoPixelProcessor2D final : public BaseProcessor2D
{
    // the OutputDevice if this renderer is associated with one, else nullptr
    VclPtr<OutputDevice> mpTargetOutputDevice;

    // the modifiedColorPrimitive stack
    basegfx::BColorModifierStack maBColorModifierStack;

    // cairo_surface_t created when initial clip from the constructor
    // parameters is requested, or by the constructor that creates an
    // owned surface
    cairo_surface_t* mpOwnedSurface;

    // cairo specific data, the render target
    cairo_t* mpRT;

    // get text render config settings
    bool mbRenderSimpleTextDirect;
    bool mbRenderDecoratedTextDirect;

    // recursion counter for CairoPixelProcessor2D::processMaskPrimitive2D,
    // see comment there
    sal_uInt16 mnClipRecursionCount;

    // calculated result of if we are in outsideCairoCoordinateLimits mode
    bool mbCairoCoordinateLimitWorkaroundActive;

    // helpers for direct paints
    void paintPolyPolygonRGBA(const basegfx::B2DPolyPolygon& rPolyPolygon,
                              const basegfx::BColor& rColor, double fTransparency = 0.0);
    void processPolygonHairlinePrimitive2D(
        const primitive2d::PolygonHairlinePrimitive2D& rPolygonHairlinePrimitive2D);
    void processPolyPolygonColorPrimitive2D(
        const primitive2d::PolyPolygonColorPrimitive2D& rPolyPolygonColorPrimitive2D);
    void processBitmapPrimitive2D(const primitive2d::BitmapPrimitive2D& rBitmapCandidate);
    void
    processTransparencePrimitive2D(const primitive2d::TransparencePrimitive2D& rTransCandidate);
    void processInvertPrimitive2D(const primitive2d::InvertPrimitive2D& rTransCandidate);
    void processUnifiedTransparencePrimitive2D(
        const primitive2d::UnifiedTransparencePrimitive2D& rTransCandidate);
    void processMaskPrimitive2D(const primitive2d::MaskPrimitive2D& rMaskCandidate);
    void processModifiedColorPrimitive2D(
        const primitive2d::ModifiedColorPrimitive2D& rModifiedCandidate);
    void processTransformPrimitive2D(const primitive2d::TransformPrimitive2D& rTransformCandidate);
    void
    processPointArrayPrimitive2D(const primitive2d::PointArrayPrimitive2D& rPointArrayCandidate);
    void
    processMarkerArrayPrimitive2D(const primitive2d::MarkerArrayPrimitive2D& rMarkerArrayCandidate);
    void processBackgroundColorPrimitive2D(
        const primitive2d::BackgroundColorPrimitive2D& rBackgroundColorCandidate);
    void processPolygonStrokePrimitive2D(
        const primitive2d::PolygonStrokePrimitive2D& rPolygonStrokeCandidate);
    void processLineRectanglePrimitive2D(
        const primitive2d::LineRectanglePrimitive2D& rLineRectanglePrimitive2D);
    void processFilledRectanglePrimitive2D(
        const primitive2d::FilledRectanglePrimitive2D& rFilledRectanglePrimitive2D);
    void
    processSingleLinePrimitive2D(const primitive2d::SingleLinePrimitive2D& rSingleLinePrimitive2D);
    void processFillGradientPrimitive2D(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);
    void processPatternFillPrimitive2D(const primitive2d::PatternFillPrimitive2D& rPrimitive);
    void processFillGraphicPrimitive2D(
        const primitive2d::FillGraphicPrimitive2D& rFillGraphicPrimitive2D);
    void processPolyPolygonRGBAPrimitive2D(
        const primitive2d::PolyPolygonRGBAPrimitive2D& rPolyPolygonRGBAPrimitive2D);
    void processPolyPolygonAlphaGradientPrimitive2D(
        const primitive2d::PolyPolygonAlphaGradientPrimitive2D&
            rPolyPolygonAlphaGradientPrimitive2D);
    void paintBitmapAlpha(const Bitmap& rBitmap, const basegfx::B2DHomMatrix& rTransform,
                          double fTransparency = 0.0);
    void processBitmapAlphaPrimitive2D(
        const primitive2d::BitmapAlphaPrimitive2D& rBitmapAlphaPrimitive2D);
    void processControlPrimitive2D(const primitive2d::ControlPrimitive2D& rControlPrimitive);

    void processTextSimplePortionPrimitive2D(
        const primitive2d::TextSimplePortionPrimitive2D& rCandidate);
    void processTextDecoratedPortionPrimitive2D(
        const primitive2d::TextDecoratedPortionPrimitive2D& rCandidate);

    // helpers for text rendering
    void renderTextSimpleOrDecoratedPortionPrimitive2D(
        const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate,
        const primitive2d::TextDecoratedPortionPrimitive2D* pDecoratedCandidate);
    void renderTextBackground(const primitive2d::TextSimplePortionPrimitive2D& rTextCandidate,
                              double fAscent, double fDescent,
                              const basegfx::B2DHomMatrix& rTransform, double fTextWidth);
    void renderSalLayout(const std::unique_ptr<SalLayout>& rSalLayout,
                         const basegfx::BColor& rTextColor, const basegfx::B2DHomMatrix& rTransform,
                         bool bAntiAliase) const;
    void renderTextDecorationWithOptionalTransformAndColor(
        const primitive2d::TextDecoratedPortionPrimitive2D& rDecoratedCandidate,
        const basegfx::utils::B2DHomMatrixBufferedOnDemandDecompose& rDecTrans,
        const basegfx::B2DHomMatrix* pOptionalObjectTransform = nullptr,
        const basegfx::BColor* pReplacementColor = nullptr);

    // support for SVG gradients
    void processSvgLinearGradientPrimitive2D(
        const primitive2d::SvgLinearGradientPrimitive2D& rCandidate);
    void processSvgRadialGradientPrimitive2D(
        const primitive2d::SvgRadialGradientPrimitive2D& rCandidate);
    bool handleSvgGradientHelper(const primitive2d::SvgGradientHelper& rCandidate);

    /*  the local processor for BasePrimitive2D-Implementation based primitives,
        called from the common process()-implementation
     */
    virtual void processBasePrimitive2D(const primitive2d::BasePrimitive2D& rCandidate) override;

    // helpers for gradients
    void processFillGradientPrimitive2D_fallback_decompose(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);
    void processFillGradientPrimitive2D_drawOutputRange(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);
    bool processFillGradientPrimitive2D_isCompletelyBordered(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);
    void processFillGradientPrimitive2D_linear_axial(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);
    void processFillGradientPrimitive2D_radial_elliptical(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);
    void processFillGradientPrimitive2D_square_rect(
        const primitive2d::FillGradientPrimitive2D& rFillGradientPrimitive2D);

    // check if CairoCoordinateLimitWorkaround is needed
    void evaluateCairoCoordinateLimitWorkaround();

    basegfx::BColor getLineColor(const basegfx::BColor& rColor) const;
    basegfx::BColor getFillColor(const basegfx::BColor& rColor) const;
    basegfx::BColor getTextColor(const basegfx::BColor& rColor) const;
    basegfx::BColor getGradientColor(const basegfx::BColor& rColor) const;

protected:
    bool hasError() const { return cairo_status(mpRT) != CAIRO_STATUS_SUCCESS; }
    bool hasRenderTarget() const { return nullptr != mpRT; }

    // allow to react on changes of ViewInformation2D
    virtual void onViewInformation2DChanged() override;

    // constructor to create a CairoPixelProcessor2D for
    // the given cairo_surface_t pTarget. pTarget will not
    // be owned and not destroyed, but be used as render
    // target. You should check the result using valid()
    CairoPixelProcessor2D(
        // take over current BColorModifierStack
        const basegfx::BColorModifierStack& rBColorModifierStack,

        // the ViewInformation
        const geometry::ViewInformation2D& rViewInformation,

        // the cairo render target
        cairo_surface_t* pTarget);

public:
    bool valid() const { return hasRenderTarget() && !hasError(); }

    // read access to CairoCoordinateLimitWorkaround mechanism
    bool isCairoCoordinateLimitWorkaroundActive() const
    {
        return mbCairoCoordinateLimitWorkaroundActive;
    }

    // constructor to create a CairoPixelProcessor2D which
    // allocates and owns a cairo surface of given size. You
    // should check the result using valid()
    CairoPixelProcessor2D(

        // the initial ViewInformation
        const geometry::ViewInformation2D& rViewInformation,

        // the pixel size
        tools::Long nWidthPixel, tools::Long nHeightPixel,

        // define RGBA (true) or RGB (false)
        bool bUseRGBA);

    // constructor to create a CairoPixelProcessor2D
    // associated with an OutputDevice. You should
    // check the result using valid()
    CairoPixelProcessor2D(

        // the OutputDevice this processor shall be associated with
        OutputDevice& rOutputDevice,

        // the initial ViewInformation
        const geometry::ViewInformation2D& rViewInformation);

    virtual ~CairoPixelProcessor2D() override;

    // access to BColorModifierStack
    const basegfx::BColorModifierStack& getBColorModifierStack() const
    {
        return maBColorModifierStack;
    }

    // try to extract current content as Bitmap
    Bitmap extractBitmap() const;
};
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */