1
0
Fork 0
libreoffice/vcl/source/gdi/metaact.cxx
Daniel Baumann 8e63e14cf6
Adding upstream version 4:25.2.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 16:20:04 +02:00

2266 lines
60 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <stdio.h>
#include <string.h>
#include <osl/thread.h>
#include <sal/log.hxx>
#include <tools/stream.hxx>
#include <tools/vcompat.hxx>
#include <tools/helpers.hxx>
#include <utility>
#include <vcl/dibtools.hxx>
#include <vcl/filter/SvmReader.hxx>
#include <vcl/filter/SvmWriter.hxx>
#include <vcl/outdev.hxx>
#include <vcl/metaact.hxx>
#include <vcl/graphictools.hxx>
#include <comphelper/configuration.hxx>
#include <unotools/fontdefs.hxx>
#include <vcl/TypeSerializer.hxx>
namespace
{
void ImplScalePoint( Point& rPt, double fScaleX, double fScaleY )
{
rPt.setX(basegfx::fround<tools::Long>(fScaleX * rPt.X()));
rPt.setY(basegfx::fround<tools::Long>(fScaleY * rPt.Y()));
}
void ImplScaleRect( tools::Rectangle& rRect, double fScaleX, double fScaleY )
{
Point aTL( rRect.TopLeft() );
Point aBR( rRect.BottomRight() );
ImplScalePoint( aTL, fScaleX, fScaleY );
ImplScalePoint( aBR, fScaleX, fScaleY );
rRect = tools::Rectangle( aTL, aBR );
rRect.Normalize();
}
void ImplScalePoly( tools::Polygon& rPoly, double fScaleX, double fScaleY )
{
for( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
ImplScalePoint( rPoly[ i ], fScaleX, fScaleY );
}
void ImplScaleLineInfo( LineInfo& rLineInfo, double fScaleX, double fScaleY )
{
if( !rLineInfo.IsDefault() )
{
const double fScale = ( fabs(fScaleX) + fabs(fScaleY) ) * 0.5;
rLineInfo.SetWidth(fScale * rLineInfo.GetWidth());
rLineInfo.SetDashLen(fScale * rLineInfo.GetDashLen());
rLineInfo.SetDotLen(fScale * rLineInfo.GetDotLen());
rLineInfo.SetDistance(fScale * rLineInfo.GetDistance());
}
}
} //anonymous namespace
MetaAction::MetaAction() :
mnType( MetaActionType::NONE )
{
}
MetaAction::MetaAction( MetaActionType nType ) :
mnType( nType )
{
}
MetaAction::MetaAction( MetaAction const & rOther ) :
SimpleReferenceObject(), mnType( rOther.mnType )
{
}
MetaAction::~MetaAction()
{
}
void MetaAction::Execute( OutputDevice* )
{
}
rtl::Reference<MetaAction> MetaAction::Clone() const
{
return new MetaAction;
}
void MetaAction::Move( tools::Long, tools::Long )
{
}
void MetaAction::Scale( double, double )
{
}
MetaPixelAction::MetaPixelAction() :
MetaAction(MetaActionType::PIXEL)
{}
MetaPixelAction::~MetaPixelAction()
{}
MetaPixelAction::MetaPixelAction( const Point& rPt, const Color& rColor ) :
MetaAction ( MetaActionType::PIXEL ),
maPt ( rPt ),
maColor ( rColor )
{}
void MetaPixelAction::Execute( OutputDevice* pOut )
{
pOut->DrawPixel( maPt, maColor );
}
rtl::Reference<MetaAction> MetaPixelAction::Clone() const
{
return new MetaPixelAction( *this );
}
void MetaPixelAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaPixelAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
}
MetaPointAction::MetaPointAction() :
MetaAction(MetaActionType::POINT)
{}
MetaPointAction::~MetaPointAction()
{}
MetaPointAction::MetaPointAction( const Point& rPt ) :
MetaAction ( MetaActionType::POINT ),
maPt ( rPt )
{}
void MetaPointAction::Execute( OutputDevice* pOut )
{
pOut->DrawPixel( maPt );
}
rtl::Reference<MetaAction> MetaPointAction::Clone() const
{
return new MetaPointAction( *this );
}
void MetaPointAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaPointAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
}
MetaLineAction::MetaLineAction() :
MetaAction(MetaActionType::LINE)
{}
MetaLineAction::~MetaLineAction()
{}
MetaLineAction::MetaLineAction( const Point& rStart, const Point& rEnd ) :
MetaAction ( MetaActionType::LINE ),
maStartPt ( rStart ),
maEndPt ( rEnd )
{}
MetaLineAction::MetaLineAction( const Point& rStart, const Point& rEnd,
LineInfo aLineInfo ) :
MetaAction ( MetaActionType::LINE ),
maLineInfo (std::move( aLineInfo )),
maStartPt ( rStart ),
maEndPt ( rEnd )
{}
void MetaLineAction::Execute( OutputDevice* pOut )
{
if( maLineInfo.IsDefault() )
pOut->DrawLine( maStartPt, maEndPt );
else
pOut->DrawLine( maStartPt, maEndPt, maLineInfo );
}
rtl::Reference<MetaAction> MetaLineAction::Clone() const
{
return new MetaLineAction( *this );
}
void MetaLineAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maStartPt.Move( nHorzMove, nVertMove );
maEndPt.Move( nHorzMove, nVertMove );
}
void MetaLineAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maStartPt, fScaleX, fScaleY );
ImplScalePoint( maEndPt, fScaleX, fScaleY );
ImplScaleLineInfo( maLineInfo, fScaleX, fScaleY );
}
MetaRectAction::MetaRectAction() :
MetaAction(MetaActionType::RECT)
{}
MetaRectAction::~MetaRectAction()
{}
MetaRectAction::MetaRectAction( const tools::Rectangle& rRect ) :
MetaAction ( MetaActionType::RECT ),
maRect ( rRect )
{}
static bool AllowDim(tools::Long nDim)
{
static bool bFuzzing = comphelper::IsFuzzing();
if (bFuzzing)
{
if (nDim > 0x20000000 || nDim < -0x20000000)
{
SAL_WARN("vcl", "skipping huge dimension: " << nDim);
return false;
}
}
return true;
}
static bool AllowPoint(const Point& rPoint)
{
return AllowDim(rPoint.X()) && AllowDim(rPoint.Y());
}
static bool AllowRect(const tools::Rectangle& rRect)
{
return AllowPoint(rRect.TopLeft()) && AllowPoint(rRect.BottomRight());
}
void MetaRectAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maRect)))
return;
pOut->DrawRect( maRect );
}
rtl::Reference<MetaAction> MetaRectAction::Clone() const
{
return new MetaRectAction( *this );
}
void MetaRectAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaRectAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
}
MetaRoundRectAction::MetaRoundRectAction() :
MetaAction ( MetaActionType::ROUNDRECT ),
mnHorzRound ( 0 ),
mnVertRound ( 0 )
{}
MetaRoundRectAction::~MetaRoundRectAction()
{}
MetaRoundRectAction::MetaRoundRectAction( const tools::Rectangle& rRect,
sal_uInt32 nHorzRound, sal_uInt32 nVertRound ) :
MetaAction ( MetaActionType::ROUNDRECT ),
maRect ( rRect ),
mnHorzRound ( nHorzRound ),
mnVertRound ( nVertRound )
{}
void MetaRoundRectAction::Execute( OutputDevice* pOut )
{
pOut->DrawRect( maRect, mnHorzRound, mnVertRound );
}
rtl::Reference<MetaAction> MetaRoundRectAction::Clone() const
{
return new MetaRoundRectAction( *this );
}
void MetaRoundRectAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaRoundRectAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
mnHorzRound = basegfx::fround<sal_uInt32>(mnHorzRound * fabs(fScaleX));
mnVertRound = basegfx::fround<sal_uInt32>(mnVertRound * fabs(fScaleY));
}
MetaEllipseAction::MetaEllipseAction() :
MetaAction(MetaActionType::ELLIPSE)
{}
MetaEllipseAction::~MetaEllipseAction()
{}
MetaEllipseAction::MetaEllipseAction( const tools::Rectangle& rRect ) :
MetaAction ( MetaActionType::ELLIPSE ),
maRect ( rRect )
{}
void MetaEllipseAction::Execute( OutputDevice* pOut )
{
pOut->DrawEllipse( maRect );
}
rtl::Reference<MetaAction> MetaEllipseAction::Clone() const
{
return new MetaEllipseAction( *this );
}
void MetaEllipseAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaEllipseAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
}
MetaArcAction::MetaArcAction() :
MetaAction(MetaActionType::ARC)
{}
MetaArcAction::~MetaArcAction()
{}
MetaArcAction::MetaArcAction( const tools::Rectangle& rRect,
const Point& rStart, const Point& rEnd ) :
MetaAction ( MetaActionType::ARC ),
maRect ( rRect ),
maStartPt ( rStart ),
maEndPt ( rEnd )
{}
void MetaArcAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maRect)))
return;
pOut->DrawArc( maRect, maStartPt, maEndPt );
}
rtl::Reference<MetaAction> MetaArcAction::Clone() const
{
return new MetaArcAction( *this );
}
void MetaArcAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
maStartPt.Move( nHorzMove, nVertMove );
maEndPt.Move( nHorzMove, nVertMove );
}
void MetaArcAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
ImplScalePoint( maStartPt, fScaleX, fScaleY );
ImplScalePoint( maEndPt, fScaleX, fScaleY );
}
MetaPieAction::MetaPieAction() :
MetaAction(MetaActionType::PIE)
{}
MetaPieAction::~MetaPieAction()
{}
MetaPieAction::MetaPieAction( const tools::Rectangle& rRect,
const Point& rStart, const Point& rEnd ) :
MetaAction ( MetaActionType::PIE ),
maRect ( rRect ),
maStartPt ( rStart ),
maEndPt ( rEnd )
{}
void MetaPieAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maRect)))
return;
pOut->DrawPie( maRect, maStartPt, maEndPt );
}
rtl::Reference<MetaAction> MetaPieAction::Clone() const
{
return new MetaPieAction( *this );
}
void MetaPieAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
maStartPt.Move( nHorzMove, nVertMove );
maEndPt.Move( nHorzMove, nVertMove );
}
void MetaPieAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
ImplScalePoint( maStartPt, fScaleX, fScaleY );
ImplScalePoint( maEndPt, fScaleX, fScaleY );
}
MetaChordAction::MetaChordAction() :
MetaAction(MetaActionType::CHORD)
{}
MetaChordAction::~MetaChordAction()
{}
MetaChordAction::MetaChordAction( const tools::Rectangle& rRect,
const Point& rStart, const Point& rEnd ) :
MetaAction ( MetaActionType::CHORD ),
maRect ( rRect ),
maStartPt ( rStart ),
maEndPt ( rEnd )
{}
void MetaChordAction::Execute( OutputDevice* pOut )
{
pOut->DrawChord( maRect, maStartPt, maEndPt );
}
rtl::Reference<MetaAction> MetaChordAction::Clone() const
{
return new MetaChordAction( *this );
}
void MetaChordAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
maStartPt.Move( nHorzMove, nVertMove );
maEndPt.Move( nHorzMove, nVertMove );
}
void MetaChordAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
ImplScalePoint( maStartPt, fScaleX, fScaleY );
ImplScalePoint( maEndPt, fScaleX, fScaleY );
}
MetaPolyLineAction::MetaPolyLineAction() :
MetaAction(MetaActionType::POLYLINE)
{}
MetaPolyLineAction::~MetaPolyLineAction()
{}
MetaPolyLineAction::MetaPolyLineAction( tools::Polygon aPoly ) :
MetaAction ( MetaActionType::POLYLINE ),
maPoly (std::move( aPoly ))
{}
MetaPolyLineAction::MetaPolyLineAction( tools::Polygon aPoly, LineInfo aLineInfo ) :
MetaAction ( MetaActionType::POLYLINE ),
maLineInfo (std::move( aLineInfo )),
maPoly (std::move( aPoly ))
{}
void MetaPolyLineAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maPoly.GetBoundRect())))
return;
if( maLineInfo.IsDefault() )
pOut->DrawPolyLine( maPoly );
else
pOut->DrawPolyLine( maPoly, maLineInfo );
}
rtl::Reference<MetaAction> MetaPolyLineAction::Clone() const
{
return new MetaPolyLineAction( *this );
}
void MetaPolyLineAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPoly.Move( nHorzMove, nVertMove );
}
void MetaPolyLineAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoly( maPoly, fScaleX, fScaleY );
ImplScaleLineInfo( maLineInfo, fScaleX, fScaleY );
}
MetaPolygonAction::MetaPolygonAction() :
MetaAction(MetaActionType::POLYGON)
{}
MetaPolygonAction::~MetaPolygonAction()
{}
MetaPolygonAction::MetaPolygonAction( tools::Polygon aPoly ) :
MetaAction ( MetaActionType::POLYGON ),
maPoly (std::move( aPoly ))
{}
void MetaPolygonAction::Execute( OutputDevice* pOut )
{
pOut->DrawPolygon( maPoly );
}
rtl::Reference<MetaAction> MetaPolygonAction::Clone() const
{
return new MetaPolygonAction( *this );
}
void MetaPolygonAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPoly.Move( nHorzMove, nVertMove );
}
void MetaPolygonAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoly( maPoly, fScaleX, fScaleY );
}
MetaPolyPolygonAction::MetaPolyPolygonAction() :
MetaAction(MetaActionType::POLYPOLYGON)
{}
MetaPolyPolygonAction::~MetaPolyPolygonAction()
{}
MetaPolyPolygonAction::MetaPolyPolygonAction( tools::PolyPolygon aPolyPoly ) :
MetaAction ( MetaActionType::POLYPOLYGON ),
maPolyPoly (std::move( aPolyPoly ))
{}
void MetaPolyPolygonAction::Execute( OutputDevice* pOut )
{
pOut->DrawPolyPolygon( maPolyPoly );
}
rtl::Reference<MetaAction> MetaPolyPolygonAction::Clone() const
{
return new MetaPolyPolygonAction( *this );
}
void MetaPolyPolygonAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPolyPoly.Move( nHorzMove, nVertMove );
}
void MetaPolyPolygonAction::Scale( double fScaleX, double fScaleY )
{
for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
}
MetaTextAction::MetaTextAction() :
MetaAction ( MetaActionType::TEXT ),
mnIndex ( 0 ),
mnLen ( 0 )
{}
MetaTextAction::~MetaTextAction()
{}
MetaTextAction::MetaTextAction( const Point& rPt, OUString aStr,
sal_Int32 nIndex, sal_Int32 nLen ) :
MetaAction ( MetaActionType::TEXT ),
maPt ( rPt ),
maStr (std::move( aStr )),
mnIndex ( nIndex ),
mnLen ( nLen )
{}
void MetaTextAction::Execute( OutputDevice* pOut )
{
if (!AllowDim(pOut->LogicToPixel(maPt).Y()))
return;
pOut->DrawText( maPt, maStr, mnIndex, mnLen );
}
rtl::Reference<MetaAction> MetaTextAction::Clone() const
{
return new MetaTextAction( *this );
}
void MetaTextAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaTextAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
}
MetaTextArrayAction::MetaTextArrayAction() :
MetaAction ( MetaActionType::TEXTARRAY ),
mnIndex ( 0 ),
mnLen ( 0 )
{}
MetaTextArrayAction::MetaTextArrayAction(const MetaTextArrayAction& rAction)
: MetaAction(MetaActionType::TEXTARRAY)
, maStartPt(rAction.maStartPt)
, maStr(rAction.maStr)
, maDXAry(rAction.maDXAry)
, maKashidaAry(rAction.maKashidaAry)
, mnIndex(rAction.mnIndex)
, mnLen(rAction.mnLen)
, mnLayoutContextIndex(rAction.mnLayoutContextIndex)
, mnLayoutContextLen(rAction.mnLayoutContextLen)
{
}
MetaTextArrayAction::MetaTextArrayAction( const Point& rStartPt,
OUString aStr,
KernArray aDXAry,
std::vector<sal_Bool> aKashidaAry,
sal_Int32 nIndex,
sal_Int32 nLen ) :
MetaAction ( MetaActionType::TEXTARRAY ),
maStartPt ( rStartPt ),
maStr (std::move( aStr )),
maDXAry (std::move( aDXAry )),
maKashidaAry(std::move( aKashidaAry )),
mnIndex ( nIndex ),
mnLen ( nLen )
{
}
MetaTextArrayAction::MetaTextArrayAction( const Point& rStartPt,
OUString aStr,
KernArraySpan pDXAry,
std::span<const sal_Bool> pKashidaAry,
sal_Int32 nIndex,
sal_Int32 nLen ) :
MetaAction ( MetaActionType::TEXTARRAY ),
maStartPt ( rStartPt ),
maStr (std::move( aStr )),
maKashidaAry( pKashidaAry.begin(), pKashidaAry.end() ),
mnIndex ( nIndex ),
mnLen ( nLen )
{
maDXAry.assign(pDXAry.begin(), pDXAry.end());
}
MetaTextArrayAction::MetaTextArrayAction(const Point& rStartPt, OUString aStr, KernArraySpan pDXAry,
std::span<const sal_Bool> pKashidaAry, sal_Int32 nIndex,
sal_Int32 nLen, sal_Int32 nLayoutContextIndex,
sal_Int32 nLayoutContextLen)
: MetaAction(MetaActionType::TEXTARRAY)
, maStartPt(rStartPt)
, maStr(std::move(aStr))
, maKashidaAry(pKashidaAry.begin(), pKashidaAry.end())
, mnIndex(nIndex)
, mnLen(nLen)
, mnLayoutContextIndex(nLayoutContextIndex)
, mnLayoutContextLen(nLayoutContextLen)
{
maDXAry.assign(pDXAry.begin(), pDXAry.end());
}
MetaTextArrayAction::~MetaTextArrayAction()
{
}
void MetaTextArrayAction::Execute( OutputDevice* pOut )
{
if (!AllowPoint(pOut->LogicToPixel(maStartPt)))
return;
if (mnLayoutContextIndex >= 0)
{
pOut->DrawPartialTextArray(maStartPt, maStr, maDXAry, maKashidaAry, mnLayoutContextIndex,
mnLayoutContextLen, mnIndex, mnLen);
}
else
{
pOut->DrawTextArray(maStartPt, maStr, maDXAry, maKashidaAry, mnIndex, mnLen);
}
}
rtl::Reference<MetaAction> MetaTextArrayAction::Clone() const
{
return new MetaTextArrayAction( *this );
}
void MetaTextArrayAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maStartPt.Move( nHorzMove, nVertMove );
}
void MetaTextArrayAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maStartPt, fScaleX, fScaleY );
if ( !maDXAry.empty() && mnLen )
{
for ( sal_uInt16 i = 0, nCount = mnLen; i < nCount; i++ )
maDXAry[i] *= fabs(fScaleX);
}
}
void MetaTextArrayAction::SetDXArray(KernArray aArray)
{
maDXAry = std::move(aArray);
}
void MetaTextArrayAction::SetKashidaArray(std::vector<sal_Bool> aArray)
{
maKashidaAry = std::move(aArray);
}
MetaStretchTextAction::MetaStretchTextAction() :
MetaAction ( MetaActionType::STRETCHTEXT ),
mnWidth ( 0 ),
mnIndex ( 0 ),
mnLen ( 0 )
{}
MetaStretchTextAction::~MetaStretchTextAction()
{}
MetaStretchTextAction::MetaStretchTextAction( const Point& rPt, sal_uInt32 nWidth,
OUString aStr,
sal_Int32 nIndex, sal_Int32 nLen ) :
MetaAction ( MetaActionType::STRETCHTEXT ),
maPt ( rPt ),
maStr (std::move( aStr )),
mnWidth ( nWidth ),
mnIndex ( nIndex ),
mnLen ( nLen )
{}
void MetaStretchTextAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maPt, Size(mnWidth, pOut->GetTextHeight())))))
return;
static bool bFuzzing = comphelper::IsFuzzing();
if (bFuzzing && mnWidth > 10000)
{
FontLineStyle eUnderline = pOut->GetFont().GetUnderline();
FontLineStyle eOverline = pOut->GetFont().GetOverline();
if (eUnderline == LINESTYLE_SMALLWAVE || eUnderline == LINESTYLE_WAVE ||
eUnderline == LINESTYLE_DOUBLEWAVE || eUnderline == LINESTYLE_BOLDWAVE ||
eOverline == LINESTYLE_SMALLWAVE || eOverline == LINESTYLE_WAVE ||
eOverline == LINESTYLE_DOUBLEWAVE || eOverline == LINESTYLE_BOLDWAVE)
{
SAL_WARN("vcl.gdi", "MetaStretchTextAction::Execute, skipping suspicious WaveTextLine of length: "
<< mnWidth << " for fuzzing performance");
return;
}
}
pOut->DrawStretchText( maPt, mnWidth, maStr, mnIndex, mnLen );
}
rtl::Reference<MetaAction> MetaStretchTextAction::Clone() const
{
return new MetaStretchTextAction( *this );
}
void MetaStretchTextAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaStretchTextAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
mnWidth = basegfx::fround<sal_uInt32>(mnWidth * fabs(fScaleX));
}
MetaTextRectAction::MetaTextRectAction() :
MetaAction ( MetaActionType::TEXTRECT ),
mnStyle ( DrawTextFlags::NONE )
{}
MetaTextRectAction::~MetaTextRectAction()
{}
MetaTextRectAction::MetaTextRectAction( const tools::Rectangle& rRect,
OUString aStr, DrawTextFlags nStyle ) :
MetaAction ( MetaActionType::TEXTRECT ),
maRect ( rRect ),
maStr (std::move( aStr )),
mnStyle ( nStyle )
{}
void MetaTextRectAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maRect)))
return;
pOut->DrawText( maRect, maStr, mnStyle );
}
rtl::Reference<MetaAction> MetaTextRectAction::Clone() const
{
return new MetaTextRectAction( *this );
}
void MetaTextRectAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaTextRectAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
}
MetaTextLineAction::MetaTextLineAction() :
MetaAction ( MetaActionType::TEXTLINE ),
mnWidth ( 0 ),
meStrikeout ( STRIKEOUT_NONE ),
meUnderline ( LINESTYLE_NONE ),
meOverline ( LINESTYLE_NONE )
{}
MetaTextLineAction::~MetaTextLineAction()
{}
MetaTextLineAction::MetaTextLineAction( const Point& rPos, tools::Long nWidth,
FontStrikeout eStrikeout,
FontLineStyle eUnderline,
FontLineStyle eOverline ) :
MetaAction ( MetaActionType::TEXTLINE ),
maPos ( rPos ),
mnWidth ( nWidth ),
meStrikeout ( eStrikeout ),
meUnderline ( eUnderline ),
meOverline ( eOverline )
{}
void MetaTextLineAction::Execute( OutputDevice* pOut )
{
if (mnWidth < 0)
{
SAL_WARN("vcl", "skipping line with negative width: " << mnWidth);
return;
}
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maPos, Size(mnWidth, pOut->GetTextHeight())))))
return;
pOut->DrawTextLine( maPos, mnWidth, meStrikeout, meUnderline, meOverline );
}
rtl::Reference<MetaAction> MetaTextLineAction::Clone() const
{
return new MetaTextLineAction( *this );
}
void MetaTextLineAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPos.Move( nHorzMove, nVertMove );
}
void MetaTextLineAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPos, fScaleX, fScaleY );
mnWidth = basegfx::fround<tools::Long>(mnWidth * fabs(fScaleX));
}
MetaBmpAction::MetaBmpAction() :
MetaAction(MetaActionType::BMP)
{}
MetaBmpAction::~MetaBmpAction()
{}
MetaBmpAction::MetaBmpAction( const Point& rPt, const Bitmap& rBmp ) :
MetaAction ( MetaActionType::BMP ),
maBmp ( rBmp ),
maPt ( rPt )
{}
void MetaBmpAction::Execute( OutputDevice* pOut )
{
pOut->DrawBitmap( maPt, maBmp );
}
rtl::Reference<MetaAction> MetaBmpAction::Clone() const
{
return new MetaBmpAction( *this );
}
void MetaBmpAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaBmpAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
}
MetaBmpScaleAction::MetaBmpScaleAction() :
MetaAction(MetaActionType::BMPSCALE)
{}
MetaBmpScaleAction::~MetaBmpScaleAction()
{}
MetaBmpScaleAction::MetaBmpScaleAction( const Point& rPt, const Size& rSz,
const Bitmap& rBmp ) :
MetaAction ( MetaActionType::BMPSCALE ),
maBmp ( rBmp ),
maPt ( rPt ),
maSz ( rSz )
{}
static bool AllowScale(const Size& rSource, const Size& rDest)
{
static bool bFuzzing = comphelper::IsFuzzing();
if (bFuzzing)
{
constexpr int nMaxScaleWhenFuzzing = 128;
auto nSourceHeight = rSource.Height();
auto nDestHeight = rDest.Height();
if (nSourceHeight && std::abs(nDestHeight / nSourceHeight) > nMaxScaleWhenFuzzing)
{
SAL_WARN("vcl", "skipping large vertical scaling: " << nSourceHeight << " to " << nDestHeight);
return false;
}
if (nDestHeight && std::abs(nSourceHeight / nDestHeight) > nMaxScaleWhenFuzzing)
{
SAL_WARN("vcl", "skipping large vertical scaling: " << nSourceHeight << " to " << nDestHeight);
return false;
}
auto nSourceWidth = rSource.Width();
auto nDestWidth = rDest.Width();
if (nSourceWidth && std::abs(nDestWidth / nSourceWidth) > nMaxScaleWhenFuzzing)
{
SAL_WARN("vcl", "skipping large horizontal scaling: " << nSourceWidth << " to " << nDestWidth);
return false;
}
if (nDestWidth && std::abs(nSourceWidth / nDestWidth) > nMaxScaleWhenFuzzing)
{
SAL_WARN("vcl", "skipping large horizontal scaling: " << nSourceWidth << " to " << nDestWidth);
return false;
}
}
return true;
}
void MetaBmpScaleAction::Execute( OutputDevice* pOut )
{
Size aPixelSize(pOut->LogicToPixel(maSz));
if (!AllowRect(tools::Rectangle(pOut->LogicToPixel(maPt), aPixelSize)) ||
!AllowScale(maBmp.GetSizePixel(), aPixelSize))
{
return;
}
pOut->DrawBitmap( maPt, maSz, maBmp );
}
rtl::Reference<MetaAction> MetaBmpScaleAction::Clone() const
{
return new MetaBmpScaleAction( *this );
}
void MetaBmpScaleAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaBmpScaleAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maPt, maSz);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maPt = aRectangle.TopLeft();
maSz = aRectangle.GetSize();
}
MetaBmpScalePartAction::MetaBmpScalePartAction() :
MetaAction(MetaActionType::BMPSCALEPART)
{}
MetaBmpScalePartAction::~MetaBmpScalePartAction()
{}
MetaBmpScalePartAction::MetaBmpScalePartAction( const Point& rDstPt, const Size& rDstSz,
const Point& rSrcPt, const Size& rSrcSz,
const Bitmap& rBmp ) :
MetaAction ( MetaActionType::BMPSCALEPART ),
maBmp ( rBmp ),
maDstPt ( rDstPt ),
maDstSz ( rDstSz ),
maSrcPt ( rSrcPt ),
maSrcSz ( rSrcSz )
{}
void MetaBmpScalePartAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maDstPt, maDstSz))))
return;
pOut->DrawBitmap( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmp );
}
rtl::Reference<MetaAction> MetaBmpScalePartAction::Clone() const
{
return new MetaBmpScalePartAction( *this );
}
void MetaBmpScalePartAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maDstPt.Move( nHorzMove, nVertMove );
}
void MetaBmpScalePartAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maDstPt, maDstSz);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maDstPt = aRectangle.TopLeft();
maDstSz = aRectangle.GetSize();
}
MetaBmpExAction::MetaBmpExAction() :
MetaAction(MetaActionType::BMPEX)
{}
MetaBmpExAction::~MetaBmpExAction()
{}
MetaBmpExAction::MetaBmpExAction( const Point& rPt, const BitmapEx& rBmpEx ) :
MetaAction ( MetaActionType::BMPEX ),
maBmpEx ( rBmpEx ),
maPt ( rPt )
{}
void MetaBmpExAction::Execute( OutputDevice* pOut )
{
pOut->DrawBitmapEx( maPt, maBmpEx );
}
rtl::Reference<MetaAction> MetaBmpExAction::Clone() const
{
return new MetaBmpExAction( *this );
}
void MetaBmpExAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaBmpExAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
}
MetaBmpExScaleAction::MetaBmpExScaleAction() :
MetaAction(MetaActionType::BMPEXSCALE)
{}
MetaBmpExScaleAction::~MetaBmpExScaleAction()
{}
MetaBmpExScaleAction::MetaBmpExScaleAction( const Point& rPt, const Size& rSz,
const BitmapEx& rBmpEx ) :
MetaAction ( MetaActionType::BMPEXSCALE ),
maBmpEx ( rBmpEx ),
maPt ( rPt ),
maSz ( rSz )
{}
void MetaBmpExScaleAction::Execute( OutputDevice* pOut )
{
if (!AllowScale(maBmpEx.GetSizePixel(), pOut->LogicToPixel(maSz)))
return;
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maPt, maSz))))
return;
pOut->DrawBitmapEx( maPt, maSz, maBmpEx );
}
rtl::Reference<MetaAction> MetaBmpExScaleAction::Clone() const
{
return new MetaBmpExScaleAction( *this );
}
void MetaBmpExScaleAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaBmpExScaleAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maPt, maSz);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maPt = aRectangle.TopLeft();
maSz = aRectangle.GetSize();
}
MetaBmpExScalePartAction::MetaBmpExScalePartAction() :
MetaAction(MetaActionType::BMPEXSCALEPART)
{}
MetaBmpExScalePartAction::~MetaBmpExScalePartAction()
{}
MetaBmpExScalePartAction::MetaBmpExScalePartAction( const Point& rDstPt, const Size& rDstSz,
const Point& rSrcPt, const Size& rSrcSz,
const BitmapEx& rBmpEx ) :
MetaAction ( MetaActionType::BMPEXSCALEPART ),
maBmpEx ( rBmpEx ),
maDstPt ( rDstPt ),
maDstSz ( rDstSz ),
maSrcPt ( rSrcPt ),
maSrcSz ( rSrcSz )
{}
void MetaBmpExScalePartAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maDstPt, maDstSz))))
return;
pOut->DrawBitmapEx( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmpEx );
}
rtl::Reference<MetaAction> MetaBmpExScalePartAction::Clone() const
{
return new MetaBmpExScalePartAction( *this );
}
void MetaBmpExScalePartAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maDstPt.Move( nHorzMove, nVertMove );
}
void MetaBmpExScalePartAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maDstPt, maDstSz);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maDstPt = aRectangle.TopLeft();
maDstSz = aRectangle.GetSize();
}
MetaMaskAction::MetaMaskAction() :
MetaAction(MetaActionType::MASK)
{}
MetaMaskAction::~MetaMaskAction()
{}
MetaMaskAction::MetaMaskAction( const Point& rPt,
const Bitmap& rBmp,
const Color& rColor ) :
MetaAction ( MetaActionType::MASK ),
maBmp ( rBmp ),
maColor ( rColor ),
maPt ( rPt )
{}
void MetaMaskAction::Execute( OutputDevice* pOut )
{
pOut->DrawMask( maPt, maBmp, maColor );
}
rtl::Reference<MetaAction> MetaMaskAction::Clone() const
{
return new MetaMaskAction( *this );
}
void MetaMaskAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaMaskAction::Scale( double fScaleX, double fScaleY )
{
ImplScalePoint( maPt, fScaleX, fScaleY );
}
MetaMaskScaleAction::MetaMaskScaleAction() :
MetaAction(MetaActionType::MASKSCALE)
{}
MetaMaskScaleAction::~MetaMaskScaleAction()
{}
MetaMaskScaleAction::MetaMaskScaleAction( const Point& rPt, const Size& rSz,
const Bitmap& rBmp,
const Color& rColor ) :
MetaAction ( MetaActionType::MASKSCALE ),
maBmp ( rBmp ),
maColor ( rColor ),
maPt ( rPt ),
maSz ( rSz )
{}
void MetaMaskScaleAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maPt, maSz))))
return;
pOut->DrawMask( maPt, maSz, maBmp, maColor );
}
rtl::Reference<MetaAction> MetaMaskScaleAction::Clone() const
{
return new MetaMaskScaleAction( *this );
}
void MetaMaskScaleAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPt.Move( nHorzMove, nVertMove );
}
void MetaMaskScaleAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maPt, maSz);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maPt = aRectangle.TopLeft();
maSz = aRectangle.GetSize();
}
MetaMaskScalePartAction::MetaMaskScalePartAction() :
MetaAction(MetaActionType::MASKSCALEPART)
{}
MetaMaskScalePartAction::~MetaMaskScalePartAction()
{}
MetaMaskScalePartAction::MetaMaskScalePartAction( const Point& rDstPt, const Size& rDstSz,
const Point& rSrcPt, const Size& rSrcSz,
const Bitmap& rBmp,
const Color& rColor ) :
MetaAction ( MetaActionType::MASKSCALEPART ),
maBmp ( rBmp ),
maColor ( rColor ),
maDstPt ( rDstPt ),
maDstSz ( rDstSz ),
maSrcPt ( rSrcPt ),
maSrcSz ( rSrcSz )
{}
void MetaMaskScalePartAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(tools::Rectangle(maDstPt, maDstSz))))
return;
pOut->DrawMask( maDstPt, maDstSz, maSrcPt, maSrcSz, maBmp, maColor, MetaActionType::MASKSCALE );
}
rtl::Reference<MetaAction> MetaMaskScalePartAction::Clone() const
{
return new MetaMaskScalePartAction( *this );
}
void MetaMaskScalePartAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maDstPt.Move( nHorzMove, nVertMove );
}
void MetaMaskScalePartAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maDstPt, maDstSz);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maDstPt = aRectangle.TopLeft();
maDstSz = aRectangle.GetSize();
}
MetaGradientAction::MetaGradientAction() :
MetaAction(MetaActionType::GRADIENT)
{}
MetaGradientAction::~MetaGradientAction()
{}
MetaGradientAction::MetaGradientAction( const tools::Rectangle& rRect, Gradient aGradient ) :
MetaAction ( MetaActionType::GRADIENT ),
maRect ( rRect ),
maGradient (std::move( aGradient ))
{}
void MetaGradientAction::Execute( OutputDevice* pOut )
{
pOut->DrawGradient( maRect, maGradient );
}
rtl::Reference<MetaAction> MetaGradientAction::Clone() const
{
return new MetaGradientAction( *this );
}
void MetaGradientAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaGradientAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
}
MetaGradientExAction::MetaGradientExAction() :
MetaAction ( MetaActionType::GRADIENTEX )
{}
MetaGradientExAction::MetaGradientExAction( tools::PolyPolygon aPolyPoly, Gradient aGradient ) :
MetaAction ( MetaActionType::GRADIENTEX ),
maPolyPoly (std::move( aPolyPoly )),
maGradient (std::move( aGradient ))
{}
MetaGradientExAction::~MetaGradientExAction()
{}
void MetaGradientExAction::Execute( OutputDevice* pOut )
{
if( pOut->GetConnectMetaFile() )
{
pOut->GetConnectMetaFile()->AddAction( this );
}
}
rtl::Reference<MetaAction> MetaGradientExAction::Clone() const
{
return new MetaGradientExAction( *this );
}
void MetaGradientExAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPolyPoly.Move( nHorzMove, nVertMove );
}
void MetaGradientExAction::Scale( double fScaleX, double fScaleY )
{
for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
}
MetaHatchAction::MetaHatchAction() :
MetaAction(MetaActionType::HATCH)
{}
MetaHatchAction::~MetaHatchAction()
{}
MetaHatchAction::MetaHatchAction( tools::PolyPolygon aPolyPoly, const Hatch& rHatch ) :
MetaAction ( MetaActionType::HATCH ),
maPolyPoly (std::move( aPolyPoly )),
maHatch ( rHatch )
{}
void MetaHatchAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maPolyPoly.GetBoundRect())))
return;
if (!AllowDim(pOut->LogicToPixel(Point(maHatch.GetDistance(), 0)).X()))
return;
pOut->DrawHatch( maPolyPoly, maHatch );
}
rtl::Reference<MetaAction> MetaHatchAction::Clone() const
{
return new MetaHatchAction( *this );
}
void MetaHatchAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPolyPoly.Move( nHorzMove, nVertMove );
}
void MetaHatchAction::Scale( double fScaleX, double fScaleY )
{
for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
}
MetaWallpaperAction::MetaWallpaperAction() :
MetaAction(MetaActionType::WALLPAPER)
{}
MetaWallpaperAction::~MetaWallpaperAction()
{}
MetaWallpaperAction::MetaWallpaperAction( const tools::Rectangle& rRect,
const Wallpaper& rPaper ) :
MetaAction ( MetaActionType::WALLPAPER ),
maRect ( rRect ),
maWallpaper ( rPaper )
{}
void MetaWallpaperAction::Execute( OutputDevice* pOut )
{
pOut->DrawWallpaper( maRect, maWallpaper );
}
rtl::Reference<MetaAction> MetaWallpaperAction::Clone() const
{
return new MetaWallpaperAction( *this );
}
void MetaWallpaperAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaWallpaperAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
}
MetaClipRegionAction::MetaClipRegionAction() :
MetaAction ( MetaActionType::CLIPREGION ),
mbClip ( false )
{}
MetaClipRegionAction::~MetaClipRegionAction()
{}
MetaClipRegionAction::MetaClipRegionAction( vcl::Region aRegion, bool bClip ) :
MetaAction ( MetaActionType::CLIPREGION ),
maRegion (std::move( aRegion )),
mbClip ( bClip )
{}
void MetaClipRegionAction::Execute( OutputDevice* pOut )
{
if( mbClip )
pOut->SetClipRegion( maRegion );
else
pOut->SetClipRegion();
}
rtl::Reference<MetaAction> MetaClipRegionAction::Clone() const
{
return new MetaClipRegionAction( *this );
}
void MetaClipRegionAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRegion.Move( nHorzMove, nVertMove );
}
void MetaClipRegionAction::Scale( double fScaleX, double fScaleY )
{
maRegion.Scale( fScaleX, fScaleY );
}
MetaISectRectClipRegionAction::MetaISectRectClipRegionAction() :
MetaAction(MetaActionType::ISECTRECTCLIPREGION)
{}
MetaISectRectClipRegionAction::~MetaISectRectClipRegionAction()
{}
MetaISectRectClipRegionAction::MetaISectRectClipRegionAction( const tools::Rectangle& rRect ) :
MetaAction ( MetaActionType::ISECTRECTCLIPREGION ),
maRect ( rRect )
{}
void MetaISectRectClipRegionAction::Execute( OutputDevice* pOut )
{
pOut->IntersectClipRegion( maRect );
}
rtl::Reference<MetaAction> MetaISectRectClipRegionAction::Clone() const
{
return new MetaISectRectClipRegionAction( *this );
}
void MetaISectRectClipRegionAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRect.Move( nHorzMove, nVertMove );
}
void MetaISectRectClipRegionAction::Scale( double fScaleX, double fScaleY )
{
ImplScaleRect( maRect, fScaleX, fScaleY );
}
MetaISectRegionClipRegionAction::MetaISectRegionClipRegionAction() :
MetaAction(MetaActionType::ISECTREGIONCLIPREGION)
{}
MetaISectRegionClipRegionAction::~MetaISectRegionClipRegionAction()
{}
MetaISectRegionClipRegionAction::MetaISectRegionClipRegionAction( vcl::Region aRegion ) :
MetaAction ( MetaActionType::ISECTREGIONCLIPREGION ),
maRegion (std::move( aRegion ))
{
}
void MetaISectRegionClipRegionAction::Execute( OutputDevice* pOut )
{
if (!AllowRect(pOut->LogicToPixel(maRegion.GetBoundRect())))
return;
pOut->IntersectClipRegion( maRegion );
}
rtl::Reference<MetaAction> MetaISectRegionClipRegionAction::Clone() const
{
return new MetaISectRegionClipRegionAction( *this );
}
void MetaISectRegionClipRegionAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maRegion.Move( nHorzMove, nVertMove );
}
void MetaISectRegionClipRegionAction::Scale( double fScaleX, double fScaleY )
{
maRegion.Scale( fScaleX, fScaleY );
}
MetaMoveClipRegionAction::MetaMoveClipRegionAction() :
MetaAction ( MetaActionType::MOVECLIPREGION ),
mnHorzMove ( 0 ),
mnVertMove ( 0 )
{}
MetaMoveClipRegionAction::~MetaMoveClipRegionAction()
{}
MetaMoveClipRegionAction::MetaMoveClipRegionAction( tools::Long nHorzMove, tools::Long nVertMove ) :
MetaAction ( MetaActionType::MOVECLIPREGION ),
mnHorzMove ( nHorzMove ),
mnVertMove ( nVertMove )
{}
void MetaMoveClipRegionAction::Execute( OutputDevice* pOut )
{
if (!AllowPoint(pOut->LogicToPixel(Point(mnHorzMove, mnVertMove))))
return;
pOut->MoveClipRegion( mnHorzMove, mnVertMove );
}
rtl::Reference<MetaAction> MetaMoveClipRegionAction::Clone() const
{
return new MetaMoveClipRegionAction( *this );
}
void MetaMoveClipRegionAction::Scale( double fScaleX, double fScaleY )
{
mnHorzMove = basegfx::fround<tools::Long>(mnHorzMove * fScaleX);
mnVertMove = basegfx::fround<tools::Long>(mnVertMove * fScaleY);
}
MetaLineColorAction::MetaLineColorAction() :
MetaAction ( MetaActionType::LINECOLOR ),
mbSet ( false )
{}
MetaLineColorAction::~MetaLineColorAction()
{}
MetaLineColorAction::MetaLineColorAction( const Color& rColor, bool bSet ) :
MetaAction ( MetaActionType::LINECOLOR ),
maColor ( rColor ),
mbSet ( bSet )
{}
void MetaLineColorAction::Execute( OutputDevice* pOut )
{
if( mbSet )
pOut->SetLineColor( maColor );
else
pOut->SetLineColor();
}
rtl::Reference<MetaAction> MetaLineColorAction::Clone() const
{
return new MetaLineColorAction( *this );
}
MetaFillColorAction::MetaFillColorAction() :
MetaAction ( MetaActionType::FILLCOLOR ),
mbSet ( false )
{}
MetaFillColorAction::~MetaFillColorAction()
{}
MetaFillColorAction::MetaFillColorAction( const Color& rColor, bool bSet ) :
MetaAction ( MetaActionType::FILLCOLOR ),
maColor ( rColor ),
mbSet ( bSet )
{}
void MetaFillColorAction::Execute( OutputDevice* pOut )
{
if( mbSet )
pOut->SetFillColor( maColor );
else
pOut->SetFillColor();
}
rtl::Reference<MetaAction> MetaFillColorAction::Clone() const
{
return new MetaFillColorAction( *this );
}
MetaTextColorAction::MetaTextColorAction() :
MetaAction(MetaActionType::TEXTCOLOR)
{}
MetaTextColorAction::~MetaTextColorAction()
{}
MetaTextColorAction::MetaTextColorAction( const Color& rColor ) :
MetaAction ( MetaActionType::TEXTCOLOR ),
maColor ( rColor )
{}
void MetaTextColorAction::Execute( OutputDevice* pOut )
{
pOut->SetTextColor( maColor );
}
rtl::Reference<MetaAction> MetaTextColorAction::Clone() const
{
return new MetaTextColorAction( *this );
}
MetaTextFillColorAction::MetaTextFillColorAction() :
MetaAction ( MetaActionType::TEXTFILLCOLOR ),
mbSet ( false )
{}
MetaTextFillColorAction::~MetaTextFillColorAction()
{}
MetaTextFillColorAction::MetaTextFillColorAction( const Color& rColor, bool bSet ) :
MetaAction ( MetaActionType::TEXTFILLCOLOR ),
maColor ( rColor ),
mbSet ( bSet )
{}
void MetaTextFillColorAction::Execute( OutputDevice* pOut )
{
if( mbSet )
pOut->SetTextFillColor( maColor );
else
pOut->SetTextFillColor();
}
rtl::Reference<MetaAction> MetaTextFillColorAction::Clone() const
{
return new MetaTextFillColorAction( *this );
}
MetaTextLineColorAction::MetaTextLineColorAction() :
MetaAction ( MetaActionType::TEXTLINECOLOR ),
mbSet ( false )
{}
MetaTextLineColorAction::~MetaTextLineColorAction()
{}
MetaTextLineColorAction::MetaTextLineColorAction( const Color& rColor, bool bSet ) :
MetaAction ( MetaActionType::TEXTLINECOLOR ),
maColor ( rColor ),
mbSet ( bSet )
{}
void MetaTextLineColorAction::Execute( OutputDevice* pOut )
{
if( mbSet )
pOut->SetTextLineColor( maColor );
else
pOut->SetTextLineColor();
}
rtl::Reference<MetaAction> MetaTextLineColorAction::Clone() const
{
return new MetaTextLineColorAction( *this );
}
MetaOverlineColorAction::MetaOverlineColorAction() :
MetaAction ( MetaActionType::OVERLINECOLOR ),
mbSet ( false )
{}
MetaOverlineColorAction::~MetaOverlineColorAction()
{}
MetaOverlineColorAction::MetaOverlineColorAction( const Color& rColor, bool bSet ) :
MetaAction ( MetaActionType::OVERLINECOLOR ),
maColor ( rColor ),
mbSet ( bSet )
{}
void MetaOverlineColorAction::Execute( OutputDevice* pOut )
{
if( mbSet )
pOut->SetOverlineColor( maColor );
else
pOut->SetOverlineColor();
}
rtl::Reference<MetaAction> MetaOverlineColorAction::Clone() const
{
return new MetaOverlineColorAction( *this );
}
MetaTextAlignAction::MetaTextAlignAction() :
MetaAction ( MetaActionType::TEXTALIGN ),
maAlign ( ALIGN_TOP )
{}
MetaTextAlignAction::~MetaTextAlignAction()
{}
MetaTextAlignAction::MetaTextAlignAction( TextAlign aAlign ) :
MetaAction ( MetaActionType::TEXTALIGN ),
maAlign ( aAlign )
{}
void MetaTextAlignAction::Execute( OutputDevice* pOut )
{
pOut->SetTextAlign( maAlign );
}
rtl::Reference<MetaAction> MetaTextAlignAction::Clone() const
{
return new MetaTextAlignAction( *this );
}
MetaMapModeAction::MetaMapModeAction() :
MetaAction(MetaActionType::MAPMODE)
{}
MetaMapModeAction::~MetaMapModeAction()
{}
MetaMapModeAction::MetaMapModeAction( const MapMode& rMapMode ) :
MetaAction ( MetaActionType::MAPMODE ),
maMapMode ( rMapMode )
{}
void MetaMapModeAction::Execute( OutputDevice* pOut )
{
pOut->SetMapMode( maMapMode );
}
rtl::Reference<MetaAction> MetaMapModeAction::Clone() const
{
return new MetaMapModeAction( *this );
}
void MetaMapModeAction::Scale( double fScaleX, double fScaleY )
{
Point aPoint( maMapMode.GetOrigin() );
ImplScalePoint( aPoint, fScaleX, fScaleY );
maMapMode.SetOrigin( aPoint );
}
MetaFontAction::MetaFontAction() :
MetaAction(MetaActionType::FONT)
{}
MetaFontAction::~MetaFontAction()
{}
MetaFontAction::MetaFontAction( vcl::Font aFont ) :
MetaAction ( MetaActionType::FONT ),
maFont (std::move( aFont ))
{
// #96876: because RTL_TEXTENCODING_SYMBOL is often set at the OpenSymbol font,
// we change the textencoding to RTL_TEXTENCODING_UNICODE here, which seems
// to be the right way; changing the textencoding at other sources
// is too dangerous at the moment
if ( IsOpenSymbol( maFont.GetFamilyName() )
&& ( maFont.GetCharSet() != RTL_TEXTENCODING_UNICODE ) )
{
SAL_WARN_IF(maFont.GetCharSet() == RTL_TEXTENCODING_SYMBOL, "vcl", "OpenSymbol should not have charset of RTL_TEXTENCODING_SYMBOL in new documents");
maFont.SetCharSet( RTL_TEXTENCODING_UNICODE );
}
}
void MetaFontAction::Execute( OutputDevice* pOut )
{
pOut->SetFont( maFont );
}
rtl::Reference<MetaAction> MetaFontAction::Clone() const
{
return new MetaFontAction( *this );
}
void MetaFontAction::Scale( double fScaleX, double fScaleY )
{
const Size aSize(
basegfx::fround<tools::Long>(maFont.GetFontSize().Width() * fabs(fScaleX)),
basegfx::fround<tools::Long>(maFont.GetFontSize().Height() * fabs(fScaleY)));
maFont.SetFontSize( aSize );
}
MetaPushAction::MetaPushAction() :
MetaAction ( MetaActionType::PUSH ),
mnFlags ( vcl::PushFlags::NONE )
{}
MetaPushAction::~MetaPushAction()
{}
MetaPushAction::MetaPushAction( vcl::PushFlags nFlags ) :
MetaAction ( MetaActionType::PUSH ),
mnFlags ( nFlags )
{}
void MetaPushAction::Execute( OutputDevice* pOut )
{
pOut->Push( mnFlags );
}
rtl::Reference<MetaAction> MetaPushAction::Clone() const
{
return new MetaPushAction( *this );
}
MetaPopAction::MetaPopAction() :
MetaAction(MetaActionType::POP)
{}
MetaPopAction::~MetaPopAction()
{}
void MetaPopAction::Execute( OutputDevice* pOut )
{
pOut->Pop();
}
rtl::Reference<MetaAction> MetaPopAction::Clone() const
{
return new MetaPopAction( *this );
}
MetaRasterOpAction::MetaRasterOpAction() :
MetaAction ( MetaActionType::RASTEROP ),
meRasterOp ( RasterOp::OverPaint )
{}
MetaRasterOpAction::~MetaRasterOpAction()
{}
MetaRasterOpAction::MetaRasterOpAction( RasterOp eRasterOp ) :
MetaAction ( MetaActionType::RASTEROP ),
meRasterOp ( eRasterOp )
{
}
void MetaRasterOpAction::Execute( OutputDevice* pOut )
{
pOut->SetRasterOp( meRasterOp );
}
rtl::Reference<MetaAction> MetaRasterOpAction::Clone() const
{
return new MetaRasterOpAction( *this );
}
MetaTransparentAction::MetaTransparentAction() :
MetaAction ( MetaActionType::Transparent ),
mnTransPercent ( 0 )
{}
MetaTransparentAction::~MetaTransparentAction()
{}
MetaTransparentAction::MetaTransparentAction( tools::PolyPolygon aPolyPoly, sal_uInt16 nTransPercent ) :
MetaAction ( MetaActionType::Transparent ),
maPolyPoly (std::move( aPolyPoly )),
mnTransPercent ( nTransPercent )
{}
void MetaTransparentAction::Execute( OutputDevice* pOut )
{
pOut->DrawTransparent( maPolyPoly, mnTransPercent );
}
rtl::Reference<MetaAction> MetaTransparentAction::Clone() const
{
return new MetaTransparentAction( *this );
}
void MetaTransparentAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPolyPoly.Move( nHorzMove, nVertMove );
}
void MetaTransparentAction::Scale( double fScaleX, double fScaleY )
{
for( sal_uInt16 i = 0, nCount = maPolyPoly.Count(); i < nCount; i++ )
ImplScalePoly( maPolyPoly[ i ], fScaleX, fScaleY );
}
MetaFloatTransparentAction::MetaFloatTransparentAction() :
MetaAction(MetaActionType::FLOATTRANSPARENT)
{}
MetaFloatTransparentAction::~MetaFloatTransparentAction()
{}
MetaFloatTransparentAction::MetaFloatTransparentAction( const GDIMetaFile& rMtf, const Point& rPos,
const Size& rSize, Gradient aGradient ) :
MetaAction ( MetaActionType::FLOATTRANSPARENT ),
maMtf ( rMtf ),
maPoint ( rPos ),
maSize ( rSize ),
maGradient (std::move( aGradient ))
{}
void MetaFloatTransparentAction::Execute( OutputDevice* pOut )
{
pOut->DrawTransparent( maMtf, maPoint, maSize, maGradient );
}
rtl::Reference<MetaAction> MetaFloatTransparentAction::Clone() const
{
return new MetaFloatTransparentAction( *this );
}
void MetaFloatTransparentAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPoint.Move( nHorzMove, nVertMove );
}
void MetaFloatTransparentAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maPoint, maSize);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maPoint = aRectangle.TopLeft();
maSize = aRectangle.GetSize();
}
void MetaFloatTransparentAction::addSVGTransparencyColorStops(const basegfx::BColorStops& rSVGTransparencyColorStops)
{
maSVGTransparencyColorStops = rSVGTransparencyColorStops;
}
MetaEPSAction::MetaEPSAction() :
MetaAction(MetaActionType::EPS)
{}
MetaEPSAction::~MetaEPSAction()
{}
MetaEPSAction::MetaEPSAction( const Point& rPoint, const Size& rSize,
GfxLink aGfxLink, const GDIMetaFile& rSubst ) :
MetaAction ( MetaActionType::EPS ),
maGfxLink (std::move( aGfxLink )),
maSubst ( rSubst ),
maPoint ( rPoint ),
maSize ( rSize )
{}
void MetaEPSAction::Execute( OutputDevice* pOut )
{
pOut->DrawEPS( maPoint, maSize, maGfxLink, &maSubst );
}
rtl::Reference<MetaAction> MetaEPSAction::Clone() const
{
return new MetaEPSAction( *this );
}
void MetaEPSAction::Move( tools::Long nHorzMove, tools::Long nVertMove )
{
maPoint.Move( nHorzMove, nVertMove );
}
void MetaEPSAction::Scale( double fScaleX, double fScaleY )
{
tools::Rectangle aRectangle(maPoint, maSize);
ImplScaleRect( aRectangle, fScaleX, fScaleY );
maPoint = aRectangle.TopLeft();
maSize = aRectangle.GetSize();
}
MetaRefPointAction::MetaRefPointAction() :
MetaAction ( MetaActionType::REFPOINT ),
mbSet ( false )
{}
MetaRefPointAction::~MetaRefPointAction()
{}
MetaRefPointAction::MetaRefPointAction( const Point& rRefPoint, bool bSet ) :
MetaAction ( MetaActionType::REFPOINT ),
maRefPoint ( rRefPoint ),
mbSet ( bSet )
{}
void MetaRefPointAction::Execute( OutputDevice* pOut )
{
if( mbSet )
pOut->SetRefPoint( maRefPoint );
else
pOut->SetRefPoint();
}
rtl::Reference<MetaAction> MetaRefPointAction::Clone() const
{
return new MetaRefPointAction( *this );
}
MetaCommentAction::MetaCommentAction() :
MetaAction ( MetaActionType::COMMENT ),
mnValue ( 0 )
{
ImplInitDynamicData( nullptr, 0UL );
}
MetaCommentAction::MetaCommentAction( const MetaCommentAction& rAct ) :
MetaAction ( MetaActionType::COMMENT ),
maComment ( rAct.maComment ),
mnValue ( rAct.mnValue )
{
ImplInitDynamicData( rAct.mpData.get(), rAct.mnDataSize );
}
MetaCommentAction::MetaCommentAction( OString aComment, sal_Int32 nValue, const sal_uInt8* pData, sal_uInt32 nDataSize ) :
MetaAction ( MetaActionType::COMMENT ),
maComment (std::move( aComment )),
mnValue ( nValue )
{
ImplInitDynamicData( pData, nDataSize );
}
MetaCommentAction::~MetaCommentAction()
{
}
void MetaCommentAction::ImplInitDynamicData( const sal_uInt8* pData, sal_uInt32 nDataSize )
{
if ( nDataSize && pData )
{
mnDataSize = nDataSize;
mpData.reset( new sal_uInt8[ mnDataSize ] );
memcpy( mpData.get(), pData, mnDataSize );
}
else
{
mnDataSize = 0;
mpData = nullptr;
}
}
void MetaCommentAction::Execute( OutputDevice* pOut )
{
if ( pOut->GetConnectMetaFile() )
{
pOut->GetConnectMetaFile()->AddAction( this );
}
}
rtl::Reference<MetaAction> MetaCommentAction::Clone() const
{
return new MetaCommentAction( *this );
}
void MetaCommentAction::Move( tools::Long nXMove, tools::Long nYMove )
{
if ( !(nXMove || nYMove) )
return;
if ( !(mnDataSize && mpData) )
return;
bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN");
if ( !(bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN") )
return;
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
SvMemoryStream aDest;
if ( bPathStroke )
{
SvtGraphicStroke aStroke;
ReadSvtGraphicStroke( aMemStm, aStroke );
tools::Polygon aPath;
aStroke.getPath( aPath );
aPath.Move( nXMove, nYMove );
aStroke.setPath( aPath );
tools::PolyPolygon aStartArrow;
aStroke.getStartArrow(aStartArrow);
aStartArrow.Move(nXMove, nYMove);
aStroke.setStartArrow(aStartArrow);
tools::PolyPolygon aEndArrow;
aStroke.getEndArrow(aEndArrow);
aEndArrow.Move(nXMove, nYMove);
aStroke.setEndArrow(aEndArrow);
WriteSvtGraphicStroke( aDest, aStroke );
}
else
{
SvtGraphicFill aFill;
ReadSvtGraphicFill( aMemStm, aFill );
tools::PolyPolygon aPath;
aFill.getPath( aPath );
aPath.Move( nXMove, nYMove );
aFill.setPath( aPath );
WriteSvtGraphicFill( aDest, aFill );
}
mpData.reset();
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
}
// SJ: 25.07.06 #i56656# we are not able to mirror certain kind of
// comments properly, especially the XPATHSTROKE and XPATHFILL lead to
// problems, so it is better to remove these comments when mirroring
// FIXME: fake comment to apply the next hunk in the right location
void MetaCommentAction::Scale( double fXScale, double fYScale )
{
if (( fXScale == 1.0 ) && ( fYScale == 1.0 ))
return;
if ( !(mnDataSize && mpData) )
return;
bool bPathStroke = (maComment == "XPATHSTROKE_SEQ_BEGIN");
if ( bPathStroke || maComment == "XPATHFILL_SEQ_BEGIN" )
{
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
SvMemoryStream aDest;
if ( bPathStroke )
{
SvtGraphicStroke aStroke;
ReadSvtGraphicStroke( aMemStm, aStroke );
aStroke.scale( fXScale, fYScale );
WriteSvtGraphicStroke( aDest, aStroke );
}
else
{
SvtGraphicFill aFill;
ReadSvtGraphicFill( aMemStm, aFill );
tools::PolyPolygon aPath;
aFill.getPath( aPath );
aPath.Scale( fXScale, fYScale );
aFill.setPath( aPath );
WriteSvtGraphicFill( aDest, aFill );
}
mpData.reset();
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
} else if( maComment == "EMF_PLUS_HEADER_INFO" ){
SvMemoryStream aMemStm( static_cast<void*>(mpData.get()), mnDataSize, StreamMode::READ );
SvMemoryStream aDest;
sal_Int32 nLeft(0), nRight(0), nTop(0), nBottom(0);
sal_Int32 nPixX(0), nPixY(0), nMillX(0), nMillY(0);
float m11(0), m12(0), m21(0), m22(0), mdx(0), mdy(0);
// read data
aMemStm.ReadInt32( nLeft ).ReadInt32( nTop ).ReadInt32( nRight ).ReadInt32( nBottom );
aMemStm.ReadInt32( nPixX ).ReadInt32( nPixY ).ReadInt32( nMillX ).ReadInt32( nMillY );
aMemStm.ReadFloat( m11 ).ReadFloat( m12 ).ReadFloat( m21 ).ReadFloat( m22 ).ReadFloat( mdx ).ReadFloat( mdy );
// add scale to the transformation
m11 *= fXScale;
m12 *= fXScale;
m22 *= fYScale;
m21 *= fYScale;
// prepare new data
aDest.WriteInt32( nLeft ).WriteInt32( nTop ).WriteInt32( nRight ).WriteInt32( nBottom );
aDest.WriteInt32( nPixX ).WriteInt32( nPixY ).WriteInt32( nMillX ).WriteInt32( nMillY );
aDest.WriteFloat( m11 ).WriteFloat( m12 ).WriteFloat( m21 ).WriteFloat( m22 ).WriteFloat( mdx ).WriteFloat( mdy );
// save them
ImplInitDynamicData( static_cast<const sal_uInt8*>( aDest.GetData() ), aDest.Tell() );
}
}
MetaLayoutModeAction::MetaLayoutModeAction() :
MetaAction ( MetaActionType::LAYOUTMODE ),
mnLayoutMode( vcl::text::ComplexTextLayoutFlags::Default )
{}
MetaLayoutModeAction::~MetaLayoutModeAction()
{}
MetaLayoutModeAction::MetaLayoutModeAction( vcl::text::ComplexTextLayoutFlags nLayoutMode ) :
MetaAction ( MetaActionType::LAYOUTMODE ),
mnLayoutMode( nLayoutMode )
{}
void MetaLayoutModeAction::Execute( OutputDevice* pOut )
{
pOut->SetLayoutMode( mnLayoutMode );
}
rtl::Reference<MetaAction> MetaLayoutModeAction::Clone() const
{
return new MetaLayoutModeAction( *this );
}
MetaTextLanguageAction::MetaTextLanguageAction() :
MetaAction ( MetaActionType::TEXTLANGUAGE ),
meTextLanguage( LANGUAGE_DONTKNOW )
{}
MetaTextLanguageAction::~MetaTextLanguageAction()
{}
MetaTextLanguageAction::MetaTextLanguageAction( LanguageType eTextLanguage ) :
MetaAction ( MetaActionType::TEXTLANGUAGE ),
meTextLanguage( eTextLanguage )
{}
void MetaTextLanguageAction::Execute( OutputDevice* pOut )
{
pOut->SetDigitLanguage( meTextLanguage );
}
rtl::Reference<MetaAction> MetaTextLanguageAction::Clone() const
{
return new MetaTextLanguageAction( *this );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */