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: */
|