2010-10-14 08:27:31 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2000-09-18 16:07:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 07:49:10 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:49:10 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:49:10 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:49:10 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:49:10 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
2008-04-11 07:49:10 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2000-09-18 16:07:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
2006-09-17 11:06:23 +00:00
|
|
|
// MARKER(update_precomp.py): autogen include statement, do not remove
|
|
|
|
#include "precompiled_vcl.hxx"
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <tools/ref.hxx>
|
|
|
|
#include <tools/debug.hxx>
|
2011-01-24 16:34:14 +01:00
|
|
|
#include <tools/poly.hxx>
|
|
|
|
|
2007-06-27 19:18:55 +00:00
|
|
|
#include <vcl/svapp.hxx>
|
2008-12-16 13:30:53 +00:00
|
|
|
#include <vcl/ctrl.hxx>
|
2007-06-27 19:18:55 +00:00
|
|
|
#include <vcl/region.hxx>
|
|
|
|
#include <vcl/virdev.hxx>
|
|
|
|
#include <vcl/window.hxx>
|
|
|
|
#include <vcl/metaact.hxx>
|
|
|
|
#include <vcl/gdimtf.hxx>
|
|
|
|
#include <vcl/print.hxx>
|
|
|
|
#include <vcl/outdev.hxx>
|
|
|
|
#include <vcl/unowrap.hxx>
|
2011-01-24 20:21:12 +01:00
|
|
|
// declare system types in sysdata.hxx
|
|
|
|
#include <svsys.h>
|
2008-06-24 10:40:49 +00:00
|
|
|
#include <vcl/sysdata.hxx>
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2011-01-24 16:34:14 +01:00
|
|
|
#include <salgdi.hxx>
|
|
|
|
#include <sallayout.hxx>
|
|
|
|
#include <salframe.hxx>
|
|
|
|
#include <salvd.hxx>
|
|
|
|
#include <salprn.hxx>
|
|
|
|
#include <svdata.hxx>
|
|
|
|
#include <window.h>
|
|
|
|
#include <outdev.h>
|
|
|
|
#include <region.h>
|
|
|
|
#include <outdata.hxx>
|
|
|
|
|
2008-05-30 09:06:09 +00:00
|
|
|
#include <basegfx/point/b2dpoint.hxx>
|
|
|
|
#include <basegfx/vector/b2dvector.hxx>
|
|
|
|
#include <basegfx/polygon/b2dpolygon.hxx>
|
|
|
|
#include <basegfx/polygon/b2dpolypolygon.hxx>
|
2007-05-09 12:35:18 +00:00
|
|
|
#include <basegfx/matrix/b2dhommatrix.hxx>
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
#include <basegfx/polygon/b2dpolygontools.hxx>
|
2009-07-27 16:24:52 +00:00
|
|
|
#include <basegfx/polygon/b2dpolypolygontools.hxx>
|
2009-07-30 10:40:37 +00:00
|
|
|
#include <basegfx/polygon/b2dlinegeometry.hxx>
|
2007-05-09 12:35:18 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
#include <com/sun/star/awt/XGraphics.hpp>
|
2008-06-24 10:40:49 +00:00
|
|
|
#include <com/sun/star/uno/Sequence.hxx>
|
|
|
|
#include <com/sun/star/rendering/XCanvas.hpp>
|
|
|
|
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
|
|
|
|
#include <vcl/unohelp.hxx>
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
#include <numeric>
|
|
|
|
|
2008-06-24 10:40:49 +00:00
|
|
|
using namespace ::com::sun::star;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2008-06-26 09:24:25 +00:00
|
|
|
DBG_NAME( OutputDevice )
|
|
|
|
DBG_NAME( Polygon )
|
|
|
|
DBG_NAME( PolyPolygon )
|
2006-06-19 18:27:44 +00:00
|
|
|
DBG_NAMEEX( Region )
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
#ifdef DBG_UTIL
|
|
|
|
const char* ImplDbgCheckOutputDevice( const void* pObj )
|
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
const OutputDevice* pOutDev = (OutputDevice*)pObj;
|
|
|
|
|
|
|
|
if ( (pOutDev->GetOutDevType() != OUTDEV_DONTKNOW) &&
|
|
|
|
(pOutDev->GetOutDevType() != OUTDEV_WINDOW) &&
|
|
|
|
(pOutDev->GetOutDevType() != OUTDEV_PRINTER) &&
|
|
|
|
(pOutDev->GetOutDevType() != OUTDEV_VIRDEV) )
|
|
|
|
return "OutputDevice data overwrite";
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
#define OUTDEV_POLYPOLY_STACKBUF 32
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
struct ImplObjStack
|
|
|
|
{
|
|
|
|
ImplObjStack* mpPrev;
|
|
|
|
MapMode* mpMapMode;
|
|
|
|
Region* mpClipRegion;
|
|
|
|
Color* mpLineColor;
|
|
|
|
Color* mpFillColor;
|
|
|
|
Font* mpFont;
|
|
|
|
Color* mpTextColor;
|
|
|
|
Color* mpTextFillColor;
|
|
|
|
Color* mpTextLineColor;
|
2009-01-05 17:49:45 +00:00
|
|
|
Color* mpOverlineColor;
|
2000-09-18 16:07:07 +00:00
|
|
|
Point* mpRefPoint;
|
|
|
|
TextAlign meTextAlign;
|
|
|
|
RasterOp meRasterOp;
|
2011-01-12 15:07:10 +01:00
|
|
|
sal_uLong mnTextLayoutMode;
|
2003-08-25 12:53:32 +00:00
|
|
|
LanguageType meTextLanguage;
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 mnFlags;
|
2000-09-18 16:07:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
static void ImplDeleteObjStack( ImplObjStack* pObjStack )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mnFlags & PUSH_LINECOLOR )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpLineColor )
|
|
|
|
delete pObjStack->mpLineColor;
|
|
|
|
}
|
|
|
|
if ( pObjStack->mnFlags & PUSH_FILLCOLOR )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpFillColor )
|
|
|
|
delete pObjStack->mpFillColor;
|
|
|
|
}
|
|
|
|
if ( pObjStack->mnFlags & PUSH_FONT )
|
|
|
|
delete pObjStack->mpFont;
|
|
|
|
if ( pObjStack->mnFlags & PUSH_TEXTCOLOR )
|
|
|
|
delete pObjStack->mpTextColor;
|
|
|
|
if ( pObjStack->mnFlags & PUSH_TEXTFILLCOLOR )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpTextFillColor )
|
|
|
|
delete pObjStack->mpTextFillColor;
|
|
|
|
}
|
|
|
|
if ( pObjStack->mnFlags & PUSH_TEXTLINECOLOR )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpTextLineColor )
|
|
|
|
delete pObjStack->mpTextLineColor;
|
|
|
|
}
|
2009-01-05 17:49:45 +00:00
|
|
|
if ( pObjStack->mnFlags & PUSH_OVERLINECOLOR )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpOverlineColor )
|
|
|
|
delete pObjStack->mpOverlineColor;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pObjStack->mnFlags & PUSH_MAPMODE )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpMapMode )
|
|
|
|
delete pObjStack->mpMapMode;
|
|
|
|
}
|
|
|
|
if ( pObjStack->mnFlags & PUSH_CLIPREGION )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpClipRegion )
|
|
|
|
delete pObjStack->mpClipRegion;
|
|
|
|
}
|
|
|
|
if ( pObjStack->mnFlags & PUSH_REFPOINT )
|
|
|
|
{
|
|
|
|
if ( pObjStack->mpRefPoint )
|
|
|
|
delete pObjStack->mpRefPoint;
|
|
|
|
}
|
|
|
|
|
|
|
|
delete pObjStack;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2008-12-16 13:30:53 +00:00
|
|
|
bool OutputDevice::ImplIsAntiparallel() const
|
|
|
|
{
|
|
|
|
bool bRet = false;
|
|
|
|
if( ImplGetGraphics() )
|
|
|
|
{
|
|
|
|
if( ( (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) && ! IsRTLEnabled() ) ||
|
|
|
|
( ! (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) && IsRTLEnabled() ) )
|
|
|
|
{
|
|
|
|
bRet = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return bRet;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2008-06-13 07:46:17 +00:00
|
|
|
bool OutputDevice::ImplSelectClipRegion( const Region& rRegion, SalGraphics* pGraphics )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2008-06-13 07:46:17 +00:00
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if( !pGraphics )
|
|
|
|
{
|
|
|
|
if( !mpGraphics )
|
|
|
|
if( !ImplGetGraphics() )
|
|
|
|
return false;
|
|
|
|
pGraphics = mpGraphics;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-12-03 16:21:36 +01:00
|
|
|
bool bClipRegion = pGraphics->SetClipRegion( rRegion, this );
|
|
|
|
OSL_ENSURE( bClipRegion, "OutputDevice::ImplSelectClipRegion() - can't cerate region" );
|
2000-09-18 16:07:07 +00:00
|
|
|
return bClipRegion;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
2002-06-19 10:43:25 +00:00
|
|
|
Polygon ImplSubdivideBezier( const Polygon& rPoly )
|
|
|
|
{
|
|
|
|
Polygon aPoly;
|
|
|
|
|
2002-07-04 12:11:45 +00:00
|
|
|
// #100127# Use adaptive subdivide instead of fixed 25 segments
|
|
|
|
rPoly.AdaptiveSubdivide( aPoly );
|
2002-06-19 10:43:25 +00:00
|
|
|
|
|
|
|
return aPoly;
|
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
PolyPolygon ImplSubdivideBezier( const PolyPolygon& rPolyPoly )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 i, nPolys = rPolyPoly.Count();
|
2002-07-04 12:11:45 +00:00
|
|
|
PolyPolygon aPolyPoly( nPolys );
|
|
|
|
for( i=0; i<nPolys; ++i )
|
2002-06-19 10:43:25 +00:00
|
|
|
aPolyPoly.Insert( ImplSubdivideBezier( rPolyPoly.GetObject(i) ) );
|
|
|
|
|
|
|
|
return aPolyPoly;
|
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
|
|
|
// #100127# Extracted from OutputDevice::DrawPolyPolygon()
|
2010-09-29 15:46:40 +08:00
|
|
|
void OutputDevice::ImplDrawPolyPolygon( sal_uInt16 nPoly, const PolyPolygon& rPolyPoly )
|
2002-06-19 10:43:25 +00:00
|
|
|
{
|
2008-08-19 23:32:41 +00:00
|
|
|
// AW: This crashes on empty PolyPolygons, avoid that
|
|
|
|
if(!nPoly)
|
|
|
|
return;
|
|
|
|
|
2006-03-16 11:54:58 +00:00
|
|
|
sal_uInt32 aStackAry1[OUTDEV_POLYPOLY_STACKBUF];
|
2002-06-19 10:43:25 +00:00
|
|
|
PCONSTSALPOINT aStackAry2[OUTDEV_POLYPOLY_STACKBUF];
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt8* aStackAry3[OUTDEV_POLYPOLY_STACKBUF];
|
2006-03-16 11:54:58 +00:00
|
|
|
sal_uInt32* pPointAry;
|
2002-06-19 10:43:25 +00:00
|
|
|
PCONSTSALPOINT* pPointAryAry;
|
2010-09-29 15:46:40 +08:00
|
|
|
const sal_uInt8** pFlagAryAry;
|
|
|
|
sal_uInt16 i = 0, j = 0, last = 0;
|
|
|
|
sal_Bool bHaveBezier = sal_False;
|
2002-06-19 10:43:25 +00:00
|
|
|
if ( nPoly > OUTDEV_POLYPOLY_STACKBUF )
|
|
|
|
{
|
2006-03-16 11:54:58 +00:00
|
|
|
pPointAry = new sal_uInt32[nPoly];
|
2002-06-19 10:43:25 +00:00
|
|
|
pPointAryAry = new PCONSTSALPOINT[nPoly];
|
2010-09-29 15:46:40 +08:00
|
|
|
pFlagAryAry = new const sal_uInt8*[nPoly];
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
pPointAry = aStackAry1;
|
|
|
|
pPointAryAry = aStackAry2;
|
2010-09-29 15:46:40 +08:00
|
|
|
pFlagAryAry = (const sal_uInt8**)aStackAry3;
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
do
|
|
|
|
{
|
|
|
|
const Polygon& rPoly = rPolyPoly.GetObject( i );
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 nSize = rPoly.GetSize();
|
2002-06-19 10:43:25 +00:00
|
|
|
if ( nSize )
|
|
|
|
{
|
2005-03-30 07:20:04 +00:00
|
|
|
pPointAry[j] = nSize;
|
|
|
|
pPointAryAry[j] = (PCONSTSALPOINT)rPoly.GetConstPointAry();
|
|
|
|
pFlagAryAry[j] = rPoly.GetConstFlagAry();
|
2002-06-19 10:43:25 +00:00
|
|
|
last = i;
|
|
|
|
|
2005-03-30 07:20:04 +00:00
|
|
|
if( pFlagAryAry[j] )
|
2002-06-19 10:43:25 +00:00
|
|
|
bHaveBezier = sal_True;
|
|
|
|
|
2005-03-30 07:20:04 +00:00
|
|
|
++j;
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
2005-03-30 07:20:04 +00:00
|
|
|
|
|
|
|
++i;
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
while ( i < nPoly );
|
|
|
|
|
2005-03-30 07:20:04 +00:00
|
|
|
if ( j == 1 )
|
2002-06-19 10:43:25 +00:00
|
|
|
{
|
|
|
|
// #100127# Forward beziers to sal, if any
|
|
|
|
if( bHaveBezier )
|
|
|
|
{
|
2002-08-29 14:42:38 +00:00
|
|
|
if( !mpGraphics->DrawPolygonBezier( *pPointAry, *pPointAryAry, *pFlagAryAry, this ) )
|
2002-06-19 10:43:25 +00:00
|
|
|
{
|
|
|
|
Polygon aPoly = ImplSubdivideBezier( rPolyPoly.GetObject( last ) );
|
2003-03-27 16:59:30 +00:00
|
|
|
mpGraphics->DrawPolygon( aPoly.GetSize(), (const SalPoint*)aPoly.GetConstPointAry(), this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawPolygon( *pPointAry, *pPointAryAry, this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// #100127# Forward beziers to sal, if any
|
|
|
|
if( bHaveBezier )
|
|
|
|
{
|
2005-03-30 07:20:04 +00:00
|
|
|
if( !mpGraphics->DrawPolyPolygonBezier( j, pPointAry, pPointAryAry, pFlagAryAry, this ) )
|
2002-06-19 10:43:25 +00:00
|
|
|
{
|
|
|
|
PolyPolygon aPolyPoly = ImplSubdivideBezier( rPolyPoly );
|
|
|
|
ImplDrawPolyPolygon( aPolyPoly.Count(), aPolyPoly );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2005-03-30 07:20:04 +00:00
|
|
|
mpGraphics->DrawPolyPolygon( j, pPointAry, pPointAryAry, this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pPointAry != aStackAry1 )
|
|
|
|
{
|
|
|
|
delete[] pPointAry;
|
|
|
|
delete[] pPointAryAry;
|
|
|
|
delete[] pFlagAryAry;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// =======================================================================
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
OutputDevice::OutputDevice() :
|
|
|
|
maRegion( REGION_NULL ),
|
|
|
|
maFillColor( COL_WHITE ),
|
2004-01-06 12:49:09 +00:00
|
|
|
maTextLineColor( COL_TRANSPARENT ),
|
|
|
|
maSettings( Application::GetSettings() )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_CTOR( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
mpGraphics = NULL;
|
|
|
|
mpUnoGraphicsList = NULL;
|
|
|
|
mpPrevGraphics = NULL;
|
|
|
|
mpNextGraphics = NULL;
|
|
|
|
mpMetaFile = NULL;
|
|
|
|
mpFontEntry = NULL;
|
|
|
|
mpFontCache = NULL;
|
|
|
|
mpFontList = NULL;
|
|
|
|
mpGetDevFontList = NULL;
|
|
|
|
mpGetDevSizeList = NULL;
|
|
|
|
mpObjStack = NULL;
|
|
|
|
mpOutDevData = NULL;
|
2002-07-15 11:04:39 +00:00
|
|
|
mpPDFWriter = NULL;
|
2003-11-24 16:32:23 +00:00
|
|
|
mpAlphaVDev = NULL;
|
2004-09-08 15:20:48 +00:00
|
|
|
mpExtOutDevData = NULL;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnOutOffX = 0;
|
|
|
|
mnOutOffY = 0;
|
|
|
|
mnOutWidth = 0;
|
|
|
|
mnOutHeight = 0;
|
|
|
|
mnDPIX = 0;
|
|
|
|
mnDPIY = 0;
|
|
|
|
mnTextOffX = 0;
|
|
|
|
mnTextOffY = 0;
|
2002-10-21 13:06:24 +00:00
|
|
|
mnOutOffOrigX = 0;
|
2002-11-19 17:22:29 +00:00
|
|
|
mnOutOffLogicX = 0;
|
2002-10-21 13:06:24 +00:00
|
|
|
mnOutOffOrigY = 0;
|
2002-11-19 17:22:29 +00:00
|
|
|
mnOutOffLogicY = 0;
|
2001-02-23 15:20:43 +00:00
|
|
|
mnEmphasisAscent = 0;
|
|
|
|
mnEmphasisDescent = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
mnDrawMode = 0;
|
2008-01-29 15:17:09 +00:00
|
|
|
mnTextLayoutMode = TEXT_LAYOUT_DEFAULT;
|
|
|
|
if( Application::GetSettings().GetLayoutRTL() ) //#i84553# tip BiDi preference to RTL
|
|
|
|
mnTextLayoutMode = TEXT_LAYOUT_BIDI_RTL | TEXT_LAYOUT_TEXTORIGIN_LEFT;
|
2000-09-18 16:07:07 +00:00
|
|
|
meOutDevType = OUTDEV_DONTKNOW;
|
2003-03-27 16:59:30 +00:00
|
|
|
meOutDevViewType = OUTDEV_VIEWTYPE_DONTKNOW;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbMap = sal_False;
|
|
|
|
mbMapIsDefault = sal_True;
|
|
|
|
mbClipRegion = sal_False;
|
|
|
|
mbBackground = sal_False;
|
|
|
|
mbOutput = sal_True;
|
|
|
|
mbDevOutput = sal_False;
|
|
|
|
mbOutputClipped = sal_False;
|
2004-11-03 07:31:04 +00:00
|
|
|
maTextColor = Color( COL_BLACK );
|
2009-01-05 17:49:45 +00:00
|
|
|
maOverlineColor = Color( COL_TRANSPARENT );
|
2000-09-18 16:07:07 +00:00
|
|
|
meTextAlign = maFont.GetAlign();
|
|
|
|
meRasterOp = ROP_OVERPAINT;
|
2001-02-23 15:20:43 +00:00
|
|
|
mnAntialiasing = 0;
|
2003-04-17 14:17:38 +00:00
|
|
|
meTextLanguage = 0; // TODO: get default from configuration?
|
2010-09-29 15:46:40 +08:00
|
|
|
mbLineColor = sal_True;
|
|
|
|
mbFillColor = sal_True;
|
|
|
|
mbInitLineColor = sal_True;
|
|
|
|
mbInitFillColor = sal_True;
|
|
|
|
mbInitFont = sal_True;
|
|
|
|
mbInitTextColor = sal_True;
|
|
|
|
mbInitClipRegion = sal_True;
|
|
|
|
mbClipRegionSet = sal_False;
|
|
|
|
mbKerning = sal_False;
|
|
|
|
mbNewFont = sal_True;
|
|
|
|
mbTextLines = sal_False;
|
|
|
|
mbTextSpecial = sal_False;
|
|
|
|
mbRefPoint = sal_False;
|
|
|
|
mbEnableRTL = sal_False; // mirroring must be explicitly allowed (typically for windows only)
|
2002-07-11 10:42:38 +00:00
|
|
|
|
|
|
|
// struct ImplMapRes
|
|
|
|
maMapRes.mnMapOfsX = 0;
|
|
|
|
maMapRes.mnMapOfsY = 0;
|
|
|
|
maMapRes.mnMapScNumX = 1;
|
|
|
|
maMapRes.mnMapScNumY = 1;
|
|
|
|
maMapRes.mnMapScDenomX = 1;
|
|
|
|
maMapRes.mnMapScDenomY = 1;
|
|
|
|
// struct ImplThresholdRes
|
|
|
|
maThresRes.mnThresLogToPixX = 0;
|
|
|
|
maThresRes.mnThresLogToPixY = 0;
|
|
|
|
maThresRes.mnThresPixToLogX = 0;
|
|
|
|
maThresRes.mnThresPixToLogY = 0;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
OutputDevice::~OutputDevice()
|
|
|
|
{
|
|
|
|
DBG_DTOR( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( GetUnoGraphicsList() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
UnoWrapperBase* pWrapper = Application::GetUnoWrapper( sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pWrapper )
|
|
|
|
pWrapper->ReleaseAllGraphics( this );
|
|
|
|
delete mpUnoGraphicsList;
|
|
|
|
mpUnoGraphicsList = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpOutDevData )
|
|
|
|
ImplDeInitOutDevData();
|
|
|
|
|
|
|
|
ImplObjStack* pData = mpObjStack;
|
|
|
|
if ( pData )
|
|
|
|
{
|
|
|
|
DBG_ERRORFILE( "OutputDevice::~OutputDevice(): OutputDevice::Push() calls != OutputDevice::Pop() calls" );
|
|
|
|
while ( pData )
|
|
|
|
{
|
|
|
|
ImplObjStack* pTemp = pData;
|
|
|
|
pData = pData->mpPrev;
|
|
|
|
ImplDeleteObjStack( pTemp );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-07-01 12:06:52 +00:00
|
|
|
// release the active font instance
|
|
|
|
if( mpFontEntry )
|
2000-09-18 16:07:07 +00:00
|
|
|
mpFontCache->Release( mpFontEntry );
|
2005-07-01 12:06:52 +00:00
|
|
|
// remove cached results of GetDevFontList/GetDevSizeList
|
|
|
|
// TODO: use smart pointers for them
|
|
|
|
if( mpGetDevFontList )
|
2000-09-18 16:07:07 +00:00
|
|
|
delete mpGetDevFontList;
|
2005-07-01 12:06:52 +00:00
|
|
|
if( mpGetDevSizeList )
|
2000-09-18 16:07:07 +00:00
|
|
|
delete mpGetDevSizeList;
|
2002-07-15 11:04:39 +00:00
|
|
|
|
2005-07-01 12:06:52 +00:00
|
|
|
// release ImplFontCache specific to this OutputDevice
|
|
|
|
// TODO: refcount ImplFontCache
|
|
|
|
if( mpFontCache
|
|
|
|
&& (mpFontCache != ImplGetSVData()->maGDIData.mpScreenFontCache)
|
|
|
|
&& (ImplGetSVData()->maGDIData.mpScreenFontCache != NULL) )
|
|
|
|
{
|
|
|
|
delete mpFontCache;
|
|
|
|
mpFontCache = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// release ImplFontList specific to this OutputDevice
|
|
|
|
// TODO: refcount ImplFontList
|
2003-04-24 09:27:08 +00:00
|
|
|
if( mpFontList
|
|
|
|
&& (mpFontList != ImplGetSVData()->maGDIData.mpScreenFontList)
|
|
|
|
&& (ImplGetSVData()->maGDIData.mpScreenFontList != NULL) )
|
2002-07-15 11:04:39 +00:00
|
|
|
{
|
|
|
|
mpFontList->Clear();
|
|
|
|
delete mpFontList;
|
2005-07-01 12:06:52 +00:00
|
|
|
mpFontList = NULL;
|
2002-07-15 11:04:39 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
delete mpAlphaVDev;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-19 14:51:46 +00:00
|
|
|
bool OutputDevice::supportsOperation( OutDevSupportType eType ) const
|
|
|
|
{
|
2008-05-30 09:06:09 +00:00
|
|
|
if( !mpGraphics )
|
|
|
|
if( !ImplGetGraphics() )
|
|
|
|
return false;
|
|
|
|
const bool bHasSupport = mpGraphics->supportsOperation( eType );
|
|
|
|
return bHasSupport;
|
2008-02-19 14:51:46 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
void OutputDevice::EnableRTL( sal_Bool bEnable )
|
2003-03-27 16:59:30 +00:00
|
|
|
{
|
|
|
|
mbEnableRTL = (bEnable != 0);
|
|
|
|
if( meOutDevType == OUTDEV_VIRDEV )
|
|
|
|
{
|
|
|
|
// virdevs default to not mirroring, they will only be set to mirroring
|
|
|
|
// under rare circumstances in the UI, eg the valueset control
|
|
|
|
// because each virdev has its own SalGraphics we can safely switch the SalGraphics here
|
|
|
|
// ...hopefully
|
2008-12-16 13:30:53 +00:00
|
|
|
if( ImplGetGraphics() )
|
|
|
|
mpGraphics->SetLayout( mbEnableRTL ? SAL_LAYOUT_BIDI_RTL : 0 );
|
2003-03-27 16:59:30 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
2008-12-16 13:30:53 +00:00
|
|
|
// convenience: for controls also switch layout mode
|
|
|
|
if( dynamic_cast<Control*>(this) != 0 )
|
|
|
|
SetLayoutMode( bEnable ? TEXT_LAYOUT_BIDI_RTL | TEXT_LAYOUT_TEXTORIGIN_LEFT : TEXT_LAYOUT_BIDI_LTR | TEXT_LAYOUT_TEXTORIGIN_LEFT);
|
|
|
|
|
|
|
|
Window* pWin = dynamic_cast<Window*>(this);
|
|
|
|
if( pWin )
|
|
|
|
pWin->StateChanged( STATE_CHANGE_MIRRORING );
|
|
|
|
|
2003-11-24 16:32:23 +00:00
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->EnableRTL( bEnable );
|
2003-03-27 16:59:30 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool OutputDevice::ImplHasMirroredGraphics()
|
2002-08-29 14:42:38 +00:00
|
|
|
{
|
2005-10-17 13:01:55 +00:00
|
|
|
// HOTFIX for #i55719#
|
|
|
|
if( meOutDevType == OUTDEV_PRINTER )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2005-10-17 13:01:55 +00:00
|
|
|
|
|
|
|
return ( ImplGetGraphics() && (mpGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL) );
|
2002-08-29 14:42:38 +00:00
|
|
|
}
|
|
|
|
|
2004-02-03 10:52:49 +00:00
|
|
|
// note: the coordiantes to be remirrored are in frame coordiantes !
|
|
|
|
|
2002-09-13 15:03:40 +00:00
|
|
|
void OutputDevice::ImplReMirror( Point &rPoint ) const
|
2002-09-08 14:22:57 +00:00
|
|
|
{
|
|
|
|
rPoint.X() = mnOutOffX + mnOutWidth - 1 - rPoint.X() + mnOutOffX;
|
|
|
|
}
|
2002-09-13 15:03:40 +00:00
|
|
|
void OutputDevice::ImplReMirror( Rectangle &rRect ) const
|
2002-09-08 14:22:57 +00:00
|
|
|
{
|
|
|
|
long nWidth = rRect.nRight - rRect.nLeft;
|
|
|
|
|
|
|
|
//long lc_x = rRect.nLeft - mnOutOffX; // normalize
|
|
|
|
//lc_x = mnOutWidth - nWidth - 1 - lc_x; // mirror
|
|
|
|
//rRect.nLeft = lc_x + mnOutOffX; // re-normalize
|
|
|
|
|
|
|
|
rRect.nLeft = mnOutOffX + mnOutWidth - nWidth - 1 - rRect.nLeft + mnOutOffX;
|
|
|
|
rRect.nRight = rRect.nLeft + nWidth;
|
|
|
|
}
|
2002-09-13 15:03:40 +00:00
|
|
|
void OutputDevice::ImplReMirror( Region &rRegion ) const
|
2002-09-08 14:22:57 +00:00
|
|
|
{
|
|
|
|
long nX;
|
|
|
|
long nY;
|
|
|
|
long nWidth;
|
|
|
|
long nHeight;
|
|
|
|
ImplRegionInfo aInfo;
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool bRegionRect;
|
2002-09-08 14:22:57 +00:00
|
|
|
Region aMirroredRegion;
|
|
|
|
|
|
|
|
bRegionRect = rRegion.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
|
|
|
|
while ( bRegionRect )
|
|
|
|
{
|
|
|
|
Rectangle aRect( Point(nX, nY), Size(nWidth, nHeight) );
|
|
|
|
ImplReMirror( aRect );
|
|
|
|
aMirroredRegion.Union( aRect );
|
|
|
|
bRegionRect = rRegion.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
|
|
|
|
}
|
|
|
|
rRegion = aMirroredRegion;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2002-08-29 14:42:38 +00:00
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2003-04-11 16:28:37 +00:00
|
|
|
int OutputDevice::ImplGetGraphics() const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if ( mpGraphics )
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitLineColor = sal_True;
|
|
|
|
mbInitFillColor = sal_True;
|
|
|
|
mbInitFont = sal_True;
|
|
|
|
mbInitTextColor = sal_True;
|
|
|
|
mbInitClipRegion = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
if ( meOutDevType == OUTDEV_WINDOW )
|
|
|
|
{
|
|
|
|
Window* pWindow = (Window*)this;
|
|
|
|
|
2005-01-13 17:00:22 +00:00
|
|
|
mpGraphics = pWindow->mpWindowImpl->mpFrame->GetGraphics();
|
2006-03-31 09:04:07 +00:00
|
|
|
// try harder if no wingraphics was available directly
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !mpGraphics )
|
|
|
|
{
|
2006-03-31 09:04:07 +00:00
|
|
|
// find another output device in the same frame
|
2000-09-18 16:07:07 +00:00
|
|
|
OutputDevice* pReleaseOutDev = pSVData->maGDIData.mpLastWinGraphics;
|
|
|
|
while ( pReleaseOutDev )
|
|
|
|
{
|
2005-01-13 17:00:22 +00:00
|
|
|
if ( ((Window*)pReleaseOutDev)->mpWindowImpl->mpFrame == pWindow->mpWindowImpl->mpFrame )
|
2000-09-18 16:07:07 +00:00
|
|
|
break;
|
|
|
|
pReleaseOutDev = pReleaseOutDev->mpPrevGraphics;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( pReleaseOutDev )
|
|
|
|
{
|
2006-03-31 09:04:07 +00:00
|
|
|
// steal the wingraphics from the other outdev
|
2000-09-18 16:07:07 +00:00
|
|
|
mpGraphics = pReleaseOutDev->mpGraphics;
|
2010-09-29 15:46:40 +08:00
|
|
|
pReleaseOutDev->ImplReleaseGraphics( sal_False );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-03-31 09:04:07 +00:00
|
|
|
// if needed retry after releasing least recently used wingraphics
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !pSVData->maGDIData.mpLastWinGraphics )
|
|
|
|
break;
|
|
|
|
pSVData->maGDIData.mpLastWinGraphics->ImplReleaseGraphics();
|
2005-01-13 17:00:22 +00:00
|
|
|
mpGraphics = pWindow->mpWindowImpl->mpFrame->GetGraphics();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-03-31 09:04:07 +00:00
|
|
|
// update global LRU list of wingraphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpGraphics )
|
|
|
|
{
|
|
|
|
mpNextGraphics = pSVData->maGDIData.mpFirstWinGraphics;
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpFirstWinGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpNextGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
mpNextGraphics->mpPrevGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pSVData->maGDIData.mpLastWinGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpLastWinGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( meOutDevType == OUTDEV_VIRDEV )
|
|
|
|
{
|
2003-04-11 16:28:37 +00:00
|
|
|
const VirtualDevice* pVirDev = (const VirtualDevice*)this;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( pVirDev->mpVirDev )
|
|
|
|
{
|
|
|
|
mpGraphics = pVirDev->mpVirDev->GetGraphics();
|
2006-03-31 09:04:07 +00:00
|
|
|
// if needed retry after releasing least recently used virtual device graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !pSVData->maGDIData.mpLastVirGraphics )
|
|
|
|
break;
|
|
|
|
pSVData->maGDIData.mpLastVirGraphics->ImplReleaseGraphics();
|
|
|
|
mpGraphics = pVirDev->mpVirDev->GetGraphics();
|
|
|
|
}
|
2006-03-31 09:04:07 +00:00
|
|
|
// update global LRU list of virtual device graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpGraphics )
|
|
|
|
{
|
|
|
|
mpNextGraphics = pSVData->maGDIData.mpFirstVirGraphics;
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpFirstVirGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpNextGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
mpNextGraphics->mpPrevGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pSVData->maGDIData.mpLastVirGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpLastVirGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if ( meOutDevType == OUTDEV_PRINTER )
|
|
|
|
{
|
2003-04-11 16:28:37 +00:00
|
|
|
const Printer* pPrinter = (const Printer*)this;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( pPrinter->mpJobGraphics )
|
|
|
|
mpGraphics = pPrinter->mpJobGraphics;
|
|
|
|
else if ( pPrinter->mpDisplayDev )
|
|
|
|
{
|
2003-04-11 16:28:37 +00:00
|
|
|
const VirtualDevice* pVirDev = pPrinter->mpDisplayDev;
|
2000-09-18 16:07:07 +00:00
|
|
|
mpGraphics = pVirDev->mpVirDev->GetGraphics();
|
2006-03-31 09:04:07 +00:00
|
|
|
// if needed retry after releasing least recently used virtual device graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !pSVData->maGDIData.mpLastVirGraphics )
|
|
|
|
break;
|
|
|
|
pSVData->maGDIData.mpLastVirGraphics->ImplReleaseGraphics();
|
|
|
|
mpGraphics = pVirDev->mpVirDev->GetGraphics();
|
|
|
|
}
|
2006-03-31 09:04:07 +00:00
|
|
|
// update global LRU list of virtual device graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpGraphics )
|
|
|
|
{
|
|
|
|
mpNextGraphics = pSVData->maGDIData.mpFirstVirGraphics;
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpFirstVirGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpNextGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
mpNextGraphics->mpPrevGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pSVData->maGDIData.mpLastVirGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpLastVirGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mpGraphics = pPrinter->mpInfoPrinter->GetGraphics();
|
2006-03-31 09:04:07 +00:00
|
|
|
// if needed retry after releasing least recently used printer graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
while ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !pSVData->maGDIData.mpLastPrnGraphics )
|
|
|
|
break;
|
|
|
|
pSVData->maGDIData.mpLastPrnGraphics->ImplReleaseGraphics();
|
|
|
|
mpGraphics = pPrinter->mpInfoPrinter->GetGraphics();
|
|
|
|
}
|
2006-03-31 09:04:07 +00:00
|
|
|
// update global LRU list of printer graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpGraphics )
|
|
|
|
{
|
|
|
|
mpNextGraphics = pSVData->maGDIData.mpFirstPrnGraphics;
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpFirstPrnGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpNextGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
mpNextGraphics->mpPrevGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( !pSVData->maGDIData.mpLastPrnGraphics )
|
2003-04-11 16:28:37 +00:00
|
|
|
pSVData->maGDIData.mpLastPrnGraphics = const_cast<OutputDevice*>(this);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpGraphics )
|
|
|
|
{
|
2008-12-01 13:29:22 +00:00
|
|
|
mpGraphics->SetXORMode( (ROP_INVERT == meRasterOp) || (ROP_XOR == meRasterOp), ROP_INVERT == meRasterOp );
|
CWS-TOOLING: integrate CWS aw059
2008-12-16 16:15:40 +0100 aw r265557 : #i95645# avoid expensive tries to stream in graphic data when stream is at end anyways
2008-12-15 16:49:58 +0100 wg r265512 : i97278
2008-12-12 16:02:15 +0100 aw r265427 : #i95645# new formulation was wrong in two places; thanks go to THB. Thanks!
2008-12-12 15:49:06 +0100 aw r265425 : #i95645# refined formulation of AA on/off constraints for VCLCanvas
2008-12-12 14:51:26 +0100 aw r265420 : #i95645# workaround for DrawTransparent of button hilighting when remote displayed; somehow GDI+ does bad dithering in that case
2008-12-12 13:23:00 +0100 aw r265414 : removed temporary build hack; it made it's way in using the rebase; with SVN the rebase is not based on pure checkouts, but uses local changes.
2008-12-11 19:35:59 +0100 aw r265352 : #i95645# need to switch off AA for WNT and UNX, the VCLCanvas is currently not able to handle AA correctly
2008-12-11 16:05:17 +0100 thb r265327 : #i95645# Changed defaults to on; as for the while svx dialog is not changed
2008-12-10 13:40:38 +0100 aw r265180 : #i95645# changed pixel snap to basegfx::fround
2008-12-10 13:25:45 +0100 aw r265177 : corrected linux warning
2008-12-10 12:28:02 +0100 aw r265167 : #i95645# added support for pixel snap/linux resp. no AA for mac (also pixel snap) when AA is switched off to the basegfx::B2DPolyPolygon painting VCL methods; needed for e.g. selection in SC and SW
2008-12-09 18:44:39 +0100 aw r265136 : #i95645# corrected filled path construction
2008-12-09 18:12:40 +0100 aw r265133 : #i95645# added support for non-AAd transparent paints
2008-12-09 18:11:58 +0100 aw r265132 : #i95645# forced selection without AA
2008-12-09 18:11:29 +0100 aw r265131 : #i88893# smoothed/corrected SW selection rects for transparent selection, forced selection without AA
2008-12-09 15:21:39 +0100 aw r265094 : #i95645# corrected FormControl full drag
2008-12-09 15:11:26 +0100 aw r265093 : #i95645# make gdiplus usages more safe when no line or fill color is selected
2008-12-09 14:30:09 +0100 aw r265085 : #i95645# added GDIPlus support
2008-12-09 13:41:06 +0100 aw r265081 : #i95645# added simple AA using GDIPlis to VCL
2008-12-09 13:40:46 +0100 aw r265080 : #i95645# added simple AA using GDIPlis to VCL
2008-12-09 13:40:29 +0100 aw r265079 : #i95645# added simple AA using GDIPlis to VCL
2008-12-09 13:33:16 +0100 aw r265078 : #i95645# changes to requirements, discussed with FPE
2008-12-08 14:11:39 +0100 aw r264995 : #i95646# added missing extra-wireframe for SdrDragObjOwn implementations when object has no border
2008-12-08 14:11:00 +0100 aw r264994 : #i95646# corrected RenderMarkerArrayPrimitive2D OutDev usage in VclProcessor2D
2008-12-08 12:15:10 +0100 ufi r264987 : aw059
2008-12-08 12:14:40 +0100 ufi r264986 : aw059
2008-12-05 13:16:18 +0100 aw r264905 : CWS-TOOLING: rebase CWS aw059 to trunk@264807 (milestone: DEV300:m37)
2008-12-04 11:29:48 +0100 aw r264827 : #i95645# corrected warning
2008-12-03 14:43:39 +0100 aw r264783 : #i95645# simplified overlay manager and objects to stl vector; added stuff to render some more overlay to primitive renderer to get AA support for WIN32
2008-12-03 14:42:43 +0100 aw r264782 : #i95645# added test for WIN32 for AA if cairo canvas is available
2008-12-03 14:42:13 +0100 aw r264781 : #i95645# removed unused options for writer selection overlay
2008-12-03 14:41:51 +0100 aw r264780 : #i95645# removed unused options for calc overlay
2008-12-03 14:41:21 +0100 aw r264779 : #i95645# small corrections in canvas renderer
2008-12-02 18:32:31 +0100 aw r264730 : #i95646# merged cairo version from THB's CWS cairosource01
2008-12-02 15:25:45 +0100 aw r264705 : #i95645# added helpers for the MarkerArrayPrimitive2D change which support buffered creation of the most used markers
2008-12-02 12:50:01 +0100 aw r264690 : #i95645# added a non-saved method IsAAPossibleOnThisSystem to SvtOptionsDrawinglayer to quickly test if AA can be offered on the system, added buffering of that check.
2008-12-02 12:48:51 +0100 aw r264689 : #i95645# unified MarkerArrayPrimitive2D to work bitmap-orientated, adapted usages. Added buffered preparation for needed markers. Minor adaptions for AA
2008-12-02 12:47:53 +0100 aw r264688 : #i95645# unified MarkerArrayPrimitive2D to no longer work on a enum and types of markers, but to use a BitmapEx (or any other Bitmap object) which will be displayed centerd and in discrete coordinates at positions. Adapted decomposition and all usages. Corrected minor stuff with grid primitive
2008-11-28 17:11:12 +0100 thb r264565 : #i95645# Added two more lists to config; to be able to differentiate canvas capabilities
2008-11-28 17:03:27 +0100 thb r264563 : #i95645# Added two more lists to config; to be able to differentiate canvas capabilities
2008-11-28 17:00:07 +0100 thb r264562 : #i95645# Added two more lists to config; to be able to differentiate canvas capabilities
2008-11-28 16:59:51 +0100 thb r264561 : #i95645# Added two more lists to config; to be able to differentiate canvas capabilities
2008-11-27 19:13:42 +0100 aw r264519 : #i95646# optimized getLength() a little bit
2008-11-27 19:12:50 +0100 aw r264518 : #i95646# corrected AA expansion of invalidate frame; buffered discrete distance at OM
2008-11-27 18:50:05 +0100 aw r264516 : #i95646# corrected fit to frame texts for WIN32
2008-11-27 15:32:15 +0100 aw r264496 : #i95646# helplines corrected
2008-11-27 15:32:05 +0100 aw r264495 : #i95646# helplines corrected
2008-11-27 15:01:30 +0100 aw r264492 : #i95646# enable AA support for old polygons, especially to get support for MetaFile output
2008-11-27 14:33:28 +0100 aw r264489 : #i95646# AA support for wireframe overlays
2008-11-27 13:40:54 +0100 aw r264485 : #i95646# added full repaint when AA option changes
2008-11-27 13:29:19 +0100 aw r264482 : #i95646# corrected handling of bSolidDragging config entries
2008-11-27 13:29:08 +0100 aw r264481 : #i95646# corrected handling of bSolidDragging config entries
2008-11-27 11:30:12 +0100 aw r264469 : #i95646# corrected IsAAPossibleOnThisSystem implementation
2008-11-26 16:33:04 +0100 aw r264420 : #i95646# adapted OfaViewTabPage to use disable mechanism for AA and HWAccel
2008-11-26 15:49:19 +0100 aw r264406 : #i95646# added DlgEdObj::getFullDragClone() to create specialized simple SdrUnoObj clones for solid dragging
2008-11-26 15:48:11 +0100 aw r264405 : #i95646# changed derivation of ViewObjectContactOfUnoControl to get a valid isPrimitiveVisible() implementation
2008-11-26 14:11:37 +0100 aw r264385 : #i88893# added new look for selection in sw
2008-11-26 11:32:33 +0100 aw r264360 : corrected compiler warning
2008-11-25 18:46:29 +0100 aw r264328 : #i95646# snapshot with FullDrag clones
2008-11-25 18:46:07 +0100 aw r264327 : #i95646# snapshot with FullDrag clones
2008-11-25 18:45:43 +0100 aw r264326 : #i95646# snapshot with FullDrag clones
2008-11-25 18:19:04 +0100 thb r264324 : #i96585# Added missing inline specifier
2008-11-25 13:16:25 +0100 aw r264285 : #i95646# next snapshot
2008-11-25 13:15:33 +0100 aw r264284 : #i95646# next snapshot
2008-11-25 13:15:12 +0100 aw r264283 : #i95646# next snapshot
2008-11-25 13:14:51 +0100 aw r264282 : #i95646# next snapshot
2008-11-20 13:40:49 +0100 aw r264045 : #i95646# stable snapshot
2008-11-20 13:40:29 +0100 aw r264044 : #i95646# stable snapshot
2008-11-20 13:40:06 +0100 aw r264043 : #i95646# stable snapshot
2008-11-20 13:39:45 +0100 aw r264042 : #i95646# stable snapshot
2008-11-18 11:53:39 +0100 aw r263758 : #i95646# snapshot for linux test build
2008-11-18 11:52:54 +0100 aw r263757 : #i95646# snapshot for linux test build
2008-11-18 11:52:02 +0100 aw r263756 : #i95646# snapshot for linux test build
2008-11-14 18:17:49 +0100 aw r263692 : #i95646# snapshot with most stuff working
2008-11-14 18:14:26 +0100 aw r263691 : #i95646# snapshot with most stuff working
2008-11-14 18:12:50 +0100 aw r263690 : #i95646# snapshot with most stuff working
2008-11-14 18:12:16 +0100 aw r263689 : #i95646# snapshot with most stuff working
2008-11-14 18:11:41 +0100 aw r263688 : #i95646# snapshot with most stuff working
2008-11-07 18:44:22 +0100 aw r263479 : #i95968# better support PrefMapMode; special for MAP_PIXEL was missing
2008-11-05 17:39:15 +0100 aw r263356 : #i95644# #i95645# #i95646# bigger change done, saving for another experiment
2008-11-05 17:39:02 +0100 aw r263355 : #i95644# #i95645# #i95646# bigger change done, saving for another experiment
2008-11-05 12:28:32 +0100 aw r263350 : #i95644# #i95645# #i95646# in-between state before bigger change
2008-11-05 12:27:51 +0100 aw r263349 : #i95644# #i95645# #i95646# in-between state before bigger change
2008-11-05 12:26:58 +0100 aw r263348 : #i95644# #i95645# #i95646# in-between state before bigger change
2008-11-05 12:26:17 +0100 aw r263347 : #i95644# #i95645# #i95646# in-between state before bigger change
2008-11-05 12:25:55 +0100 aw r263346 : #i95644# #i95645# #i95646# in-between state before bigger change
2009-01-05 13:44:12 +00:00
|
|
|
mpGraphics->setAntiAliasB2DDraw(mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW);
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
void OutputDevice::ImplReleaseGraphics( sal_Bool bRelease )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if ( !mpGraphics )
|
|
|
|
return;
|
|
|
|
|
2006-03-22 14:17:31 +00:00
|
|
|
// release the fonts of the physically released graphics device
|
|
|
|
if( bRelease )
|
|
|
|
{
|
2006-03-31 09:04:07 +00:00
|
|
|
#ifndef UNX
|
|
|
|
// HACK to fix an urgent P1 printing issue fast
|
|
|
|
// WinSalPrinter does not respect GetGraphics/ReleaseGraphics conventions
|
|
|
|
// so Printer::mpGraphics often points to a dead WinSalGraphics
|
|
|
|
// TODO: fix WinSalPrinter's GetGraphics/ReleaseGraphics handling
|
|
|
|
if( meOutDevType != OUTDEV_PRINTER )
|
|
|
|
#endif
|
2006-03-22 14:17:31 +00:00
|
|
|
mpGraphics->ReleaseFonts();
|
|
|
|
|
|
|
|
mbNewFont = true;
|
|
|
|
mbInitFont = true;
|
|
|
|
|
|
|
|
if ( mpFontEntry )
|
|
|
|
{
|
|
|
|
mpFontCache->Release( mpFontEntry );
|
|
|
|
mpFontEntry = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpGetDevFontList )
|
2006-03-31 09:04:07 +00:00
|
|
|
{
|
2006-03-22 14:17:31 +00:00
|
|
|
delete mpGetDevFontList;
|
|
|
|
mpGetDevFontList = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpGetDevSizeList )
|
|
|
|
{
|
|
|
|
delete mpGetDevSizeList;
|
|
|
|
mpGetDevSizeList = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplSVData* pSVData = ImplGetSVData();
|
|
|
|
if ( meOutDevType == OUTDEV_WINDOW )
|
|
|
|
{
|
|
|
|
Window* pWindow = (Window*)this;
|
|
|
|
|
|
|
|
if ( bRelease )
|
2005-01-13 17:00:22 +00:00
|
|
|
pWindow->mpWindowImpl->mpFrame->ReleaseGraphics( mpGraphics );
|
2006-03-31 09:04:07 +00:00
|
|
|
// remove from global LRU list of window graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpPrevGraphics )
|
|
|
|
mpPrevGraphics->mpNextGraphics = mpNextGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpFirstWinGraphics = mpNextGraphics;
|
|
|
|
if ( mpNextGraphics )
|
|
|
|
mpNextGraphics->mpPrevGraphics = mpPrevGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpLastWinGraphics = mpPrevGraphics;
|
|
|
|
}
|
|
|
|
else if ( meOutDevType == OUTDEV_VIRDEV )
|
|
|
|
{
|
|
|
|
VirtualDevice* pVirDev = (VirtualDevice*)this;
|
|
|
|
|
|
|
|
if ( bRelease )
|
|
|
|
pVirDev->mpVirDev->ReleaseGraphics( mpGraphics );
|
2006-03-31 09:04:07 +00:00
|
|
|
// remove from global LRU list of virtual device graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpPrevGraphics )
|
|
|
|
mpPrevGraphics->mpNextGraphics = mpNextGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpFirstVirGraphics = mpNextGraphics;
|
|
|
|
if ( mpNextGraphics )
|
|
|
|
mpNextGraphics->mpPrevGraphics = mpPrevGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpLastVirGraphics = mpPrevGraphics;
|
|
|
|
}
|
|
|
|
else if ( meOutDevType == OUTDEV_PRINTER )
|
|
|
|
{
|
|
|
|
Printer* pPrinter = (Printer*)this;
|
|
|
|
|
|
|
|
if ( !pPrinter->mpJobGraphics )
|
|
|
|
{
|
|
|
|
if ( pPrinter->mpDisplayDev )
|
|
|
|
{
|
|
|
|
VirtualDevice* pVirDev = pPrinter->mpDisplayDev;
|
|
|
|
if ( bRelease )
|
|
|
|
pVirDev->mpVirDev->ReleaseGraphics( mpGraphics );
|
2006-03-31 09:04:07 +00:00
|
|
|
// remove from global LRU list of virtual device graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpPrevGraphics )
|
|
|
|
mpPrevGraphics->mpNextGraphics = mpNextGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpFirstVirGraphics = mpNextGraphics;
|
|
|
|
if ( mpNextGraphics )
|
|
|
|
mpNextGraphics->mpPrevGraphics = mpPrevGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpLastVirGraphics = mpPrevGraphics;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( bRelease )
|
|
|
|
pPrinter->mpInfoPrinter->ReleaseGraphics( mpGraphics );
|
2006-03-31 09:04:07 +00:00
|
|
|
// remove from global LRU list of printer graphics
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpPrevGraphics )
|
|
|
|
mpPrevGraphics->mpNextGraphics = mpNextGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpFirstPrnGraphics = mpNextGraphics;
|
|
|
|
if ( mpNextGraphics )
|
|
|
|
mpNextGraphics->mpPrevGraphics = mpPrevGraphics;
|
|
|
|
else
|
|
|
|
pSVData->maGDIData.mpLastPrnGraphics = mpPrevGraphics;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mpGraphics = NULL;
|
|
|
|
mpPrevGraphics = NULL;
|
|
|
|
mpNextGraphics = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::ImplInitOutDevData()
|
|
|
|
{
|
|
|
|
if ( !mpOutDevData )
|
|
|
|
{
|
|
|
|
mpOutDevData = new ImplOutDevData;
|
|
|
|
mpOutDevData->mpRotateDev = NULL;
|
2003-03-27 16:59:30 +00:00
|
|
|
mpOutDevData->mpRecordLayout = NULL;
|
2007-05-09 12:35:18 +00:00
|
|
|
|
|
|
|
// #i75163#
|
|
|
|
mpOutDevData->mpViewTransform = NULL;
|
|
|
|
mpOutDevData->mpInverseViewTransform = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
// #i75163#
|
|
|
|
void OutputDevice::ImplInvalidateViewTransform()
|
|
|
|
{
|
|
|
|
if(mpOutDevData)
|
|
|
|
{
|
|
|
|
if(mpOutDevData->mpViewTransform)
|
|
|
|
{
|
|
|
|
delete mpOutDevData->mpViewTransform;
|
|
|
|
mpOutDevData->mpViewTransform = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(mpOutDevData->mpInverseViewTransform)
|
|
|
|
{
|
|
|
|
delete mpOutDevData->mpInverseViewTransform;
|
|
|
|
mpOutDevData->mpInverseViewTransform = NULL;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool OutputDevice::ImplIsRecordLayout() const
|
2003-03-27 16:59:30 +00:00
|
|
|
{
|
|
|
|
return mpOutDevData && mpOutDevData->mpRecordLayout;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void OutputDevice::ImplDeInitOutDevData()
|
|
|
|
{
|
|
|
|
if ( mpOutDevData )
|
|
|
|
{
|
|
|
|
if ( mpOutDevData->mpRotateDev )
|
|
|
|
delete mpOutDevData->mpRotateDev;
|
2007-05-09 12:35:18 +00:00
|
|
|
|
|
|
|
// #i75163#
|
|
|
|
ImplInvalidateViewTransform();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
delete mpOutDevData;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::ImplInitLineColor()
|
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if( mbLineColor )
|
|
|
|
{
|
|
|
|
if( ROP_0 == meRasterOp )
|
|
|
|
mpGraphics->SetROPLineColor( SAL_ROP_0 );
|
|
|
|
else if( ROP_1 == meRasterOp )
|
|
|
|
mpGraphics->SetROPLineColor( SAL_ROP_1 );
|
|
|
|
else if( ROP_INVERT == meRasterOp )
|
|
|
|
mpGraphics->SetROPLineColor( SAL_ROP_INVERT );
|
|
|
|
else
|
|
|
|
mpGraphics->SetLineColor( ImplColorToSal( maLineColor ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
mpGraphics->SetLineColor();
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitLineColor = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::ImplInitFillColor()
|
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if( mbFillColor )
|
|
|
|
{
|
|
|
|
if( ROP_0 == meRasterOp )
|
|
|
|
mpGraphics->SetROPFillColor( SAL_ROP_0 );
|
|
|
|
else if( ROP_1 == meRasterOp )
|
|
|
|
mpGraphics->SetROPFillColor( SAL_ROP_1 );
|
|
|
|
else if( ROP_INVERT == meRasterOp )
|
|
|
|
mpGraphics->SetROPFillColor( SAL_ROP_INVERT );
|
|
|
|
else
|
|
|
|
mpGraphics->SetFillColor( ImplColorToSal( maFillColor ) );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
mpGraphics->SetFillColor();
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitFillColor = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::ImplInitClipRegion()
|
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if ( GetOutDevType() == OUTDEV_WINDOW )
|
|
|
|
{
|
|
|
|
Window* pWindow = (Window*)this;
|
|
|
|
Region aRegion;
|
2002-09-08 14:22:57 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// Hintergrund-Sicherung zuruecksetzen
|
2005-01-13 17:00:22 +00:00
|
|
|
if ( pWindow->mpWindowImpl->mpFrameData->mpFirstBackWin )
|
2000-09-18 16:07:07 +00:00
|
|
|
pWindow->ImplInvalidateAllOverlapBackgrounds();
|
2005-01-13 17:00:22 +00:00
|
|
|
if ( pWindow->mpWindowImpl->mbInPaint )
|
|
|
|
aRegion = *(pWindow->mpWindowImpl->mpPaintRegion);
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2002-09-08 14:22:57 +00:00
|
|
|
{
|
2000-09-18 16:07:07 +00:00
|
|
|
aRegion = *(pWindow->ImplGetWinChildClipRegion());
|
2002-09-08 14:22:57 +00:00
|
|
|
// --- RTL -- only this region is in frame coordinates, so re-mirror it
|
2005-01-13 17:00:22 +00:00
|
|
|
// the mpWindowImpl->mpPaintRegion above is already correct (see ImplCallPaint()) !
|
2008-12-16 13:30:53 +00:00
|
|
|
if( ImplIsAntiparallel() )
|
2002-09-08 14:22:57 +00:00
|
|
|
ImplReMirror ( aRegion );
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mbClipRegion )
|
|
|
|
aRegion.Intersect( ImplPixelToDevicePixel( maRegion ) );
|
|
|
|
if ( aRegion.IsEmpty() )
|
2010-09-29 15:46:40 +08:00
|
|
|
mbOutputClipped = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbOutputClipped = sal_False;
|
2008-06-13 07:46:17 +00:00
|
|
|
ImplSelectClipRegion( aRegion );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegionSet = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( mbClipRegion )
|
|
|
|
{
|
|
|
|
if ( maRegion.IsEmpty() )
|
2010-09-29 15:46:40 +08:00
|
|
|
mbOutputClipped = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbOutputClipped = sal_False;
|
2010-12-03 16:21:36 +01:00
|
|
|
|
|
|
|
// #102532# Respect output offset also for clip region
|
|
|
|
Region aRegion( ImplPixelToDevicePixel( maRegion ) );
|
2011-02-14 16:17:22 +01:00
|
|
|
const bool bClipDeviceBounds( ! GetPDFWriter()
|
2010-12-03 16:21:36 +01:00
|
|
|
&& GetOutDevType() != OUTDEV_PRINTER );
|
|
|
|
if( bClipDeviceBounds )
|
|
|
|
{
|
2011-04-16 16:18:45 -03:00
|
|
|
// Perform actual rect clip against outdev
|
2010-12-03 16:21:36 +01:00
|
|
|
// dimensions, to generate empty clips whenever one of the
|
|
|
|
// values is completely off the device.
|
|
|
|
Rectangle aDeviceBounds( mnOutOffX, mnOutOffY,
|
|
|
|
mnOutOffX+GetOutputWidthPixel()-1,
|
|
|
|
mnOutOffY+GetOutputHeightPixel()-1 );
|
|
|
|
aRegion.Intersect( aDeviceBounds );
|
|
|
|
}
|
|
|
|
ImplSelectClipRegion( aRegion );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegionSet = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( mbClipRegionSet )
|
|
|
|
{
|
|
|
|
mpGraphics->ResetClipRegion();
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegionSet = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbOutputClipped = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitClipRegion = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::ImplSetClipRegion( const Region* pRegion )
|
|
|
|
{
|
|
|
|
DBG_TESTSOLARMUTEX();
|
|
|
|
|
|
|
|
if ( !pRegion )
|
|
|
|
{
|
|
|
|
if ( mbClipRegion )
|
|
|
|
{
|
|
|
|
maRegion = Region( REGION_NULL );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegion = sal_False;
|
|
|
|
mbInitClipRegion = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
maRegion = *pRegion;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegion = sal_True;
|
|
|
|
mbInitClipRegion = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetClipRegion()
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetClipRegion()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaClipRegionAction( Region(), sal_False ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
ImplSetClipRegion( NULL );
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetClipRegion();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetClipRegion( const Region& rRegion )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetClipRegion( rRegion )" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
DBG_CHKOBJ( &rRegion, Region, ImplDbgTestRegion );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaClipRegionAction( rRegion, sal_True ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( rRegion.GetType() == REGION_NULL )
|
|
|
|
ImplSetClipRegion( NULL );
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Region aRegion = LogicToPixel( rRegion );
|
|
|
|
ImplSetClipRegion( &aRegion );
|
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetClipRegion( rRegion );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Region OutputDevice::GetClipRegion() const
|
|
|
|
{
|
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
return PixelToLogic( maRegion );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Region OutputDevice::GetActiveClipRegion() const
|
|
|
|
{
|
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( GetOutDevType() == OUTDEV_WINDOW )
|
|
|
|
{
|
|
|
|
Region aRegion( REGION_NULL );
|
|
|
|
Window* pWindow = (Window*)this;
|
2005-01-13 17:00:22 +00:00
|
|
|
if ( pWindow->mpWindowImpl->mbInPaint )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2005-01-13 17:00:22 +00:00
|
|
|
aRegion = *(pWindow->mpWindowImpl->mpPaintRegion);
|
2000-09-18 16:07:07 +00:00
|
|
|
aRegion.Move( -mnOutOffX, -mnOutOffY );
|
|
|
|
}
|
|
|
|
if ( mbClipRegion )
|
|
|
|
aRegion.Intersect( maRegion );
|
|
|
|
return PixelToLogic( aRegion );
|
|
|
|
}
|
|
|
|
else
|
|
|
|
return GetClipRegion();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::MoveClipRegion( long nHorzMove, long nVertMove )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::MoveClipRegion()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mbClipRegion )
|
|
|
|
{
|
|
|
|
if( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaMoveClipRegionAction( nHorzMove, nVertMove ) );
|
|
|
|
|
|
|
|
maRegion.Move( ImplLogicWidthToDevicePixel( nHorzMove ),
|
|
|
|
ImplLogicHeightToDevicePixel( nVertMove ) );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitClipRegion = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->MoveClipRegion( nHorzMove, nVertMove );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::IntersectClipRegion( const Rectangle& rRect )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::IntersectClipRegion( rRect )" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaISectRectClipRegionAction( rRect ) );
|
|
|
|
|
|
|
|
Rectangle aRect = LogicToPixel( rRect );
|
|
|
|
maRegion.Intersect( aRect );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegion = sal_True;
|
|
|
|
mbInitClipRegion = sal_True;
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->IntersectClipRegion( rRect );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::IntersectClipRegion( const Region& rRegion )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::IntersectClipRegion( rRegion )" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
DBG_CHKOBJ( &rRegion, Region, ImplDbgTestRegion );
|
|
|
|
|
|
|
|
RegionType eType = rRegion.GetType();
|
|
|
|
|
|
|
|
if ( eType != REGION_NULL )
|
|
|
|
{
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaISectRegionClipRegionAction( rRegion ) );
|
|
|
|
|
|
|
|
Region aRegion = LogicToPixel( rRegion );
|
|
|
|
maRegion.Intersect( aRegion );
|
2010-09-29 15:46:40 +08:00
|
|
|
mbClipRegion = sal_True;
|
|
|
|
mbInitClipRegion = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->IntersectClipRegion( rRegion );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2011-01-12 15:07:10 +01:00
|
|
|
void OutputDevice::SetDrawMode( sal_uLong nDrawMode )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2011-03-07 13:13:24 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetDrawMode( %lx )", nDrawMode );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
mnDrawMode = nDrawMode;
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetDrawMode( nDrawMode );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetRasterOp( RasterOp eRasterOp )
|
|
|
|
{
|
2011-03-07 13:13:24 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetRasterOp( %d )", (int)eRasterOp );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaRasterOpAction( eRasterOp ) );
|
|
|
|
|
|
|
|
if ( meRasterOp != eRasterOp )
|
|
|
|
{
|
|
|
|
meRasterOp = eRasterOp;
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitLineColor = mbInitFillColor = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if( mpGraphics || ImplGetGraphics() )
|
2008-12-01 13:29:22 +00:00
|
|
|
mpGraphics->SetXORMode( (ROP_INVERT == meRasterOp) || (ROP_XOR == meRasterOp), ROP_INVERT == meRasterOp );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetRasterOp( eRasterOp );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetLineColor()
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetLineColor()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaLineColorAction( Color(), sal_False ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( mbLineColor )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitLineColor = sal_True;
|
|
|
|
mbLineColor = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
maLineColor = Color( COL_TRANSPARENT );
|
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetLineColor();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetLineColor( const Color& rColor )
|
|
|
|
{
|
2011-03-07 13:13:24 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetLineColor( %lx )", rColor.GetColor() );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
Color aColor( rColor );
|
|
|
|
|
|
|
|
if( mnDrawMode & ( DRAWMODE_BLACKLINE | DRAWMODE_WHITELINE |
|
2002-03-04 16:07:59 +00:00
|
|
|
DRAWMODE_GRAYLINE | DRAWMODE_GHOSTEDLINE |
|
|
|
|
DRAWMODE_SETTINGSLINE ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if( !ImplIsColorTransparent( aColor ) )
|
|
|
|
{
|
|
|
|
if( mnDrawMode & DRAWMODE_BLACKLINE )
|
|
|
|
{
|
|
|
|
aColor = Color( COL_BLACK );
|
|
|
|
}
|
|
|
|
else if( mnDrawMode & DRAWMODE_WHITELINE )
|
|
|
|
{
|
|
|
|
aColor = Color( COL_WHITE );
|
|
|
|
}
|
|
|
|
else if( mnDrawMode & DRAWMODE_GRAYLINE )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
const sal_uInt8 cLum = aColor.GetLuminance();
|
2000-09-18 16:07:07 +00:00
|
|
|
aColor = Color( cLum, cLum, cLum );
|
|
|
|
}
|
2002-03-04 16:07:59 +00:00
|
|
|
else if( mnDrawMode & DRAWMODE_SETTINGSLINE )
|
|
|
|
{
|
2003-03-27 16:59:30 +00:00
|
|
|
aColor = GetSettings().GetStyleSettings().GetFontColor();
|
2002-03-04 16:07:59 +00:00
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if( mnDrawMode & DRAWMODE_GHOSTEDLINE )
|
|
|
|
{
|
|
|
|
aColor = Color( ( aColor.GetRed() >> 1 ) | 0x80,
|
|
|
|
( aColor.GetGreen() >> 1 ) | 0x80,
|
|
|
|
( aColor.GetBlue() >> 1 ) | 0x80);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaLineColorAction( aColor, sal_True ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if( ImplIsColorTransparent( aColor ) )
|
|
|
|
{
|
|
|
|
if ( mbLineColor )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitLineColor = sal_True;
|
|
|
|
mbLineColor = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
maLineColor = Color( COL_TRANSPARENT );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if( maLineColor != aColor )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitLineColor = sal_True;
|
|
|
|
mbLineColor = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maLineColor = aColor;
|
|
|
|
}
|
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetLineColor( COL_BLACK );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetFillColor()
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetFillColor()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaFillColorAction( Color(), sal_False ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( mbFillColor )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitFillColor = sal_True;
|
|
|
|
mbFillColor = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
maFillColor = Color( COL_TRANSPARENT );
|
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetFillColor();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetFillColor( const Color& rColor )
|
|
|
|
{
|
2011-03-07 13:13:24 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetFillColor( %lx )", rColor.GetColor() );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
Color aColor( rColor );
|
|
|
|
|
|
|
|
if( mnDrawMode & ( DRAWMODE_BLACKFILL | DRAWMODE_WHITEFILL |
|
|
|
|
DRAWMODE_GRAYFILL | DRAWMODE_NOFILL |
|
2002-03-04 16:07:59 +00:00
|
|
|
DRAWMODE_GHOSTEDFILL | DRAWMODE_SETTINGSFILL ) )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
if( !ImplIsColorTransparent( aColor ) )
|
|
|
|
{
|
|
|
|
if( mnDrawMode & DRAWMODE_BLACKFILL )
|
|
|
|
{
|
|
|
|
aColor = Color( COL_BLACK );
|
|
|
|
}
|
|
|
|
else if( mnDrawMode & DRAWMODE_WHITEFILL )
|
|
|
|
{
|
|
|
|
aColor = Color( COL_WHITE );
|
|
|
|
}
|
|
|
|
else if( mnDrawMode & DRAWMODE_GRAYFILL )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
const sal_uInt8 cLum = aColor.GetLuminance();
|
2000-09-18 16:07:07 +00:00
|
|
|
aColor = Color( cLum, cLum, cLum );
|
|
|
|
}
|
|
|
|
else if( mnDrawMode & DRAWMODE_NOFILL )
|
|
|
|
{
|
|
|
|
aColor = Color( COL_TRANSPARENT );
|
|
|
|
}
|
2002-03-04 16:07:59 +00:00
|
|
|
else if( mnDrawMode & DRAWMODE_SETTINGSFILL )
|
|
|
|
{
|
|
|
|
aColor = GetSettings().GetStyleSettings().GetWindowColor();
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if( mnDrawMode & DRAWMODE_GHOSTEDFILL )
|
|
|
|
{
|
|
|
|
aColor = Color( (aColor.GetRed() >> 1) | 0x80,
|
|
|
|
(aColor.GetGreen() >> 1) | 0x80,
|
|
|
|
(aColor.GetBlue() >> 1) | 0x80);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaFillColorAction( aColor, sal_True ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
|
|
|
if ( ImplIsColorTransparent( aColor ) )
|
|
|
|
{
|
|
|
|
if ( mbFillColor )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitFillColor = sal_True;
|
|
|
|
mbFillColor = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
maFillColor = Color( COL_TRANSPARENT );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( maFillColor != aColor )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
mbInitFillColor = sal_True;
|
|
|
|
mbFillColor = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maFillColor = aColor;
|
|
|
|
}
|
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetFillColor( COL_BLACK );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetBackground()
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetBackground()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
maBackground = Wallpaper();
|
2010-09-29 15:46:40 +08:00
|
|
|
mbBackground = sal_False;
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetBackground();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetBackground( const Wallpaper& rBackground )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetBackground( rBackground )" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
maBackground = rBackground;
|
|
|
|
|
|
|
|
if( rBackground.GetStyle() == WALLPAPER_NULL )
|
2010-09-29 15:46:40 +08:00
|
|
|
mbBackground = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
else
|
2010-09-29 15:46:40 +08:00
|
|
|
mbBackground = sal_True;
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetBackground( rBackground );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetRefPoint()
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetRefPoint()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaRefPointAction( Point(), sal_False ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbRefPoint = sal_False;
|
2000-09-18 16:07:07 +00:00
|
|
|
maRefPoint.X() = maRefPoint.Y() = 0L;
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetRefPoint();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetRefPoint( const Point& rRefPoint )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::SetRefPoint( rRefPoint )" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
2010-09-29 15:46:40 +08:00
|
|
|
mpMetaFile->AddAction( new MetaRefPointAction( rRefPoint, sal_True ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
mbRefPoint = sal_True;
|
2000-09-18 16:07:07 +00:00
|
|
|
maRefPoint = rRefPoint;
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetRefPoint( rRefPoint );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawLine()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaLineAction( rStartPt, rEndPt ) );
|
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || !mbLineColor || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
if ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
|
2009-07-27 16:24:52 +00:00
|
|
|
// #i101598# support AA and snap for lines, too
|
|
|
|
if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
|
|
|
&& IsLineColor())
|
|
|
|
{
|
|
|
|
// at least transform with double precision to device coordinates; this will
|
|
|
|
// avoid pixel snap of single, appended lines
|
|
|
|
const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation());
|
|
|
|
const basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
|
|
|
|
basegfx::B2DPolygon aB2DPolyLine;
|
|
|
|
|
|
|
|
aB2DPolyLine.append(basegfx::B2DPoint(rStartPt.X(), rStartPt.Y()));
|
|
|
|
aB2DPolyLine.append(basegfx::B2DPoint(rEndPt.X(), rEndPt.Y()));
|
|
|
|
aB2DPolyLine.transform( aTransform );
|
|
|
|
|
|
|
|
if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
|
|
|
|
{
|
|
|
|
aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine);
|
|
|
|
}
|
|
|
|
|
2010-06-02 15:21:20 +02:00
|
|
|
if( mpGraphics->DrawPolyLine( aB2DPolyLine, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this))
|
2009-07-27 16:24:52 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const Point aStartPt(ImplLogicToDevicePixel(rStartPt));
|
|
|
|
const Point aEndPt(ImplLogicToDevicePixel(rEndPt));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawLine( aStartPt.X(), aStartPt.Y(), aEndPt.X(), aEndPt.Y(), this );
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawLine( rStartPt, rEndPt );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
void OutputDevice::impPaintLineGeometryWithEvtlExpand(
|
|
|
|
const LineInfo& rInfo,
|
|
|
|
basegfx::B2DPolyPolygon aLinePolyPolygon)
|
|
|
|
{
|
|
|
|
const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
|
|
|
&& IsLineColor());
|
|
|
|
basegfx::B2DPolyPolygon aFillPolyPolygon;
|
|
|
|
const bool bDashUsed(LINE_DASH == rInfo.GetStyle());
|
|
|
|
const bool bLineWidthUsed(rInfo.GetWidth() > 1);
|
|
|
|
|
|
|
|
if(bDashUsed && aLinePolyPolygon.count())
|
|
|
|
{
|
|
|
|
::std::vector< double > fDotDashArray;
|
|
|
|
const double fDashLen(rInfo.GetDashLen());
|
|
|
|
const double fDotLen(rInfo.GetDotLen());
|
|
|
|
const double fDistance(rInfo.GetDistance());
|
|
|
|
|
|
|
|
for(sal_uInt16 a(0); a < rInfo.GetDashCount(); a++)
|
|
|
|
{
|
|
|
|
fDotDashArray.push_back(fDashLen);
|
|
|
|
fDotDashArray.push_back(fDistance);
|
|
|
|
}
|
|
|
|
|
|
|
|
for(sal_uInt16 b(0); b < rInfo.GetDotCount(); b++)
|
|
|
|
{
|
|
|
|
fDotDashArray.push_back(fDotLen);
|
|
|
|
fDotDashArray.push_back(fDistance);
|
|
|
|
}
|
|
|
|
|
|
|
|
const double fAccumulated(::std::accumulate(fDotDashArray.begin(), fDotDashArray.end(), 0.0));
|
|
|
|
|
|
|
|
if(fAccumulated > 0.0)
|
|
|
|
{
|
|
|
|
basegfx::B2DPolyPolygon aResult;
|
|
|
|
|
|
|
|
for(sal_uInt32 c(0); c < aLinePolyPolygon.count(); c++)
|
|
|
|
{
|
|
|
|
basegfx::B2DPolyPolygon aLineTraget;
|
|
|
|
basegfx::tools::applyLineDashing(
|
|
|
|
aLinePolyPolygon.getB2DPolygon(c),
|
|
|
|
fDotDashArray,
|
|
|
|
&aLineTraget);
|
|
|
|
aResult.append(aLineTraget);
|
|
|
|
}
|
|
|
|
|
|
|
|
aLinePolyPolygon = aResult;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bLineWidthUsed && aLinePolyPolygon.count())
|
|
|
|
{
|
|
|
|
const double fHalfLineWidth((rInfo.GetWidth() * 0.5) + 0.5);
|
|
|
|
|
2010-05-10 15:15:32 +02:00
|
|
|
if(aLinePolyPolygon.areControlPointsUsed())
|
|
|
|
{
|
|
|
|
// #i110768# When area geometry has to be created, do not
|
|
|
|
// use the fallback bezier decomposition inside createAreaGeometry,
|
|
|
|
// but one that is at least as good as ImplSubdivideBezier was.
|
|
|
|
// There, Polygon::AdaptiveSubdivide was used with default parameter
|
|
|
|
// 1.0 as quality index.
|
|
|
|
aLinePolyPolygon = basegfx::tools::adaptiveSubdivideByDistance(aLinePolyPolygon, 1.0);
|
|
|
|
}
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
for(sal_uInt32 a(0); a < aLinePolyPolygon.count(); a++)
|
|
|
|
{
|
|
|
|
aFillPolyPolygon.append(basegfx::tools::createAreaGeometry(
|
|
|
|
aLinePolyPolygon.getB2DPolygon(a),
|
|
|
|
fHalfLineWidth,
|
|
|
|
rInfo.GetLineJoin()));
|
|
|
|
}
|
|
|
|
|
|
|
|
aLinePolyPolygon.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
GDIMetaFile* pOldMetaFile = mpMetaFile;
|
|
|
|
mpMetaFile = NULL;
|
|
|
|
|
|
|
|
if(aLinePolyPolygon.count())
|
|
|
|
{
|
|
|
|
for(sal_uInt32 a(0); a < aLinePolyPolygon.count(); a++)
|
|
|
|
{
|
|
|
|
const basegfx::B2DPolygon aCandidate(aLinePolyPolygon.getB2DPolygon(a));
|
|
|
|
bool bDone(false);
|
|
|
|
|
|
|
|
if(bTryAA)
|
|
|
|
{
|
2010-06-02 15:21:20 +02:00
|
|
|
bDone = mpGraphics->DrawPolyLine( aCandidate, 0.0, basegfx::B2DVector(1.0,1.0), basegfx::B2DLINEJOIN_NONE, this);
|
2009-10-15 14:27:12 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if(!bDone)
|
|
|
|
{
|
|
|
|
const Polygon aPolygon(aCandidate);
|
|
|
|
mpGraphics->DrawPolyLine(aPolygon.GetSize(), (const SalPoint*)aPolygon.GetConstPointAry(), this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(aFillPolyPolygon.count())
|
|
|
|
{
|
|
|
|
const Color aOldLineColor( maLineColor );
|
|
|
|
const Color aOldFillColor( maFillColor );
|
|
|
|
|
|
|
|
SetLineColor();
|
|
|
|
ImplInitLineColor();
|
|
|
|
SetFillColor( aOldLineColor );
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
|
|
|
bool bDone(false);
|
|
|
|
|
|
|
|
if(bTryAA)
|
|
|
|
{
|
|
|
|
bDone = mpGraphics->DrawPolyPolygon(aFillPolyPolygon, 0.0, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!bDone)
|
|
|
|
{
|
|
|
|
for(sal_uInt32 a(0); a < aFillPolyPolygon.count(); a++)
|
|
|
|
{
|
|
|
|
const Polygon aPolygon(aFillPolyPolygon.getB2DPolygon(a));
|
|
|
|
mpGraphics->DrawPolygon(aPolygon.GetSize(), (const SalPoint*)aPolygon.GetConstPointAry(), this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
SetFillColor( aOldFillColor );
|
|
|
|
SetLineColor( aOldLineColor );
|
|
|
|
}
|
|
|
|
|
|
|
|
mpMetaFile = pOldMetaFile;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt,
|
|
|
|
const LineInfo& rLineInfo )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawLine()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( rLineInfo.IsDefault() )
|
|
|
|
{
|
|
|
|
DrawLine( rStartPt, rEndPt );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaLineAction( rStartPt, rEndPt, rLineInfo ) );
|
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || !mbLineColor || ( LINE_NONE == rLineInfo.GetStyle() ) || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
if( !mpGraphics && !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
const Point aStartPt( ImplLogicToDevicePixel( rStartPt ) );
|
|
|
|
const Point aEndPt( ImplLogicToDevicePixel( rEndPt ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
const LineInfo aInfo( ImplLogicToDevicePixel( rLineInfo ) );
|
2009-10-15 14:27:12 +02:00
|
|
|
const bool bDashUsed(LINE_DASH == aInfo.GetStyle());
|
|
|
|
const bool bLineWidthUsed(aInfo.GetWidth() > 1);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2010-11-10 14:04:55 +01:00
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
if(bDashUsed || bLineWidthUsed)
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2009-10-15 14:27:12 +02:00
|
|
|
basegfx::B2DPolygon aLinePolygon;
|
|
|
|
aLinePolygon.append(basegfx::B2DPoint(aStartPt.X(), aStartPt.Y()));
|
|
|
|
aLinePolygon.append(basegfx::B2DPoint(aEndPt.X(), aEndPt.Y()));
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
impPaintLineGeometryWithEvtlExpand(aInfo, basegfx::B2DPolyPolygon(aLinePolygon));
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawLine( aStartPt.X(), aStartPt.Y(), aEndPt.X(), aEndPt.Y(), this );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
2003-11-24 16:32:23 +00:00
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawLine( rStartPt, rEndPt, rLineInfo );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::DrawRect( const Rectangle& rRect )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawRect()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaRectAction( rRect ) );
|
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
Rectangle aRect( ImplLogicToDevicePixel( rRect ) );
|
|
|
|
|
|
|
|
if ( aRect.IsEmpty() )
|
|
|
|
return;
|
|
|
|
aRect.Justify();
|
|
|
|
|
|
|
|
if ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
if ( mbInitFillColor )
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawRect( aRect.Left(), aRect.Top(), aRect.GetWidth(), aRect.GetHeight(), this );
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawRect( rRect );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::DrawPolyLine( const Polygon& rPoly )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawPolyLine()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
DBG_CHKOBJ( &rPoly, Polygon, NULL );
|
|
|
|
|
|
|
|
if( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPolyLineAction( rPoly ) );
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 nPoints = rPoly.GetSize();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || !mbLineColor || (nPoints < 2) || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
2009-07-27 16:24:52 +00:00
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
2009-07-30 10:40:37 +00:00
|
|
|
&& IsLineColor());
|
|
|
|
|
|
|
|
// use b2dpolygon drawing if possible
|
|
|
|
if(bTryAA && ImpTryDrawPolyLineDirect(rPoly.getB2DPolygon(), 0.0, basegfx::B2DLINEJOIN_NONE))
|
2008-05-30 09:06:09 +00:00
|
|
|
{
|
2009-07-27 16:24:52 +00:00
|
|
|
basegfx::B2DPolygon aB2DPolyLine(rPoly.getB2DPolygon());
|
2008-06-13 07:46:17 +00:00
|
|
|
const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
|
2008-05-30 09:06:09 +00:00
|
|
|
const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
|
2009-07-27 16:24:52 +00:00
|
|
|
// transform the polygon
|
|
|
|
aB2DPolyLine.transform( aTransform );
|
|
|
|
|
|
|
|
if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
{
|
|
|
|
aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine);
|
|
|
|
}
|
|
|
|
|
2010-06-02 15:21:20 +02:00
|
|
|
if(mpGraphics->DrawPolyLine( aB2DPolyLine, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this))
|
2009-07-27 16:24:52 +00:00
|
|
|
{
|
2008-05-30 09:06:09 +00:00
|
|
|
return;
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
2008-05-30 09:06:09 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
Polygon aPoly = ImplLogicToDevicePixel( rPoly );
|
2003-03-27 16:59:30 +00:00
|
|
|
const SalPoint* pPtAry = (const SalPoint*)aPoly.GetConstPointAry();
|
2002-06-19 10:43:25 +00:00
|
|
|
|
|
|
|
// #100127# Forward beziers to sal, if any
|
|
|
|
if( aPoly.HasFlags() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
const sal_uInt8* pFlgAry = aPoly.GetConstFlagAry();
|
2002-08-29 14:42:38 +00:00
|
|
|
if( !mpGraphics->DrawPolyLineBezier( nPoints, pPtAry, pFlgAry, this ) )
|
2002-06-19 10:43:25 +00:00
|
|
|
{
|
|
|
|
aPoly = ImplSubdivideBezier(aPoly);
|
2003-03-27 16:59:30 +00:00
|
|
|
pPtAry = (const SalPoint*)aPoly.GetConstPointAry();
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawPolyLine( aPoly.GetSize(), pPtAry, this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawPolyLine( nPoints, pPtAry, this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawPolyLine( rPoly );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawPolyLine()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
DBG_CHKOBJ( &rPoly, Polygon, NULL );
|
|
|
|
|
|
|
|
if ( rLineInfo.IsDefault() )
|
|
|
|
{
|
|
|
|
DrawPolyLine( rPoly );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
// #i101491#
|
|
|
|
// Try direct Fallback to B2D-Version of DrawPolyLine
|
|
|
|
if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
|
|
|
&& LINE_SOLID == rLineInfo.GetStyle())
|
|
|
|
{
|
2010-06-02 15:21:20 +02:00
|
|
|
DrawPolyLine( rPoly.getB2DPolygon(), (double)rLineInfo.GetWidth(), rLineInfo.GetLineJoin());
|
2009-07-30 10:40:37 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPolyLineAction( rPoly, rLineInfo ) );
|
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
ImpDrawPolyLineWithLineInfo(rPoly, rLineInfo);
|
|
|
|
}
|
|
|
|
|
|
|
|
void OutputDevice::ImpDrawPolyLineWithLineInfo(const Polygon& rPoly, const LineInfo& rLineInfo)
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 nPoints(rPoly.GetSize());
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || !mbLineColor || ( nPoints < 2 ) || ( LINE_NONE == rLineInfo.GetStyle() ) || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
2002-06-19 10:43:25 +00:00
|
|
|
Polygon aPoly = ImplLogicToDevicePixel( rPoly );
|
|
|
|
|
|
|
|
// #100127# LineInfo is not curve-safe, subdivide always
|
2009-10-15 14:27:12 +02:00
|
|
|
//
|
|
|
|
// What shall this mean? It's wrong to subdivide here when the
|
|
|
|
// polygon is a fat line. In that case, the painted geometry
|
|
|
|
// WILL be much different.
|
|
|
|
// I also have no idea how this could be related to the given ID
|
|
|
|
// which reads 'consolidate boost versions' in the task description.
|
|
|
|
// Removing.
|
|
|
|
//
|
|
|
|
//if( aPoly.HasFlags() )
|
|
|
|
//{
|
|
|
|
// aPoly = ImplSubdivideBezier( aPoly );
|
|
|
|
// nPoints = aPoly.GetSize();
|
|
|
|
//}
|
2002-06-19 10:43:25 +00:00
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
// we need a graphics
|
|
|
|
if ( !mpGraphics && !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
if ( mbInitLineColor )
|
2000-09-18 16:07:07 +00:00
|
|
|
ImplInitLineColor();
|
2009-07-30 10:40:37 +00:00
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
const LineInfo aInfo( ImplLogicToDevicePixel( rLineInfo ) );
|
|
|
|
const bool bDashUsed(LINE_DASH == aInfo.GetStyle());
|
|
|
|
const bool bLineWidthUsed(aInfo.GetWidth() > 1);
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
if(bDashUsed || bLineWidthUsed)
|
|
|
|
{
|
|
|
|
impPaintLineGeometryWithEvtlExpand(aInfo, basegfx::B2DPolyPolygon(aPoly.getB2DPolygon()));
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-12-03 12:33:17 +01:00
|
|
|
// #100127# the subdivision HAS to be done here since only a pointer
|
|
|
|
// to an array of points is given to the DrawPolyLine method, there is
|
|
|
|
// NO way to find out there that it's a curve.
|
|
|
|
if( aPoly.HasFlags() )
|
|
|
|
{
|
|
|
|
aPoly = ImplSubdivideBezier( aPoly );
|
|
|
|
nPoints = aPoly.GetSize();
|
|
|
|
}
|
|
|
|
|
2009-10-15 14:27:12 +02:00
|
|
|
mpGraphics->DrawPolyLine(nPoints, (const SalPoint*)aPoly.GetConstPointAry(), this);
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawPolyLine( rPoly, rLineInfo );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::DrawPolygon( const Polygon& rPoly )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawPolygon()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
DBG_CHKOBJ( &rPoly, Polygon, NULL );
|
|
|
|
|
|
|
|
if( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPolygonAction( rPoly ) );
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 nPoints = rPoly.GetSize();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || (nPoints < 2) || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
if ( mbInitFillColor )
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
2008-05-30 09:06:09 +00:00
|
|
|
// use b2dpolygon drawing if possible
|
2009-07-27 16:24:52 +00:00
|
|
|
if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
|
|
|
&& (IsLineColor() || IsFillColor()))
|
2008-05-30 09:06:09 +00:00
|
|
|
{
|
2008-06-13 07:46:17 +00:00
|
|
|
const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
|
2009-07-27 16:24:52 +00:00
|
|
|
basegfx::B2DPolygon aB2DPolygon(rPoly.getB2DPolygon());
|
|
|
|
bool bSuccess(true);
|
|
|
|
|
|
|
|
// transform the polygon and ensure closed
|
|
|
|
aB2DPolygon.transform(aTransform);
|
|
|
|
aB2DPolygon.setClosed(true);
|
|
|
|
|
|
|
|
if(IsFillColor())
|
|
|
|
{
|
|
|
|
bSuccess = mpGraphics->DrawPolyPolygon(basegfx::B2DPolyPolygon(aB2DPolygon), 0.0, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bSuccess && IsLineColor())
|
|
|
|
{
|
|
|
|
const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
|
|
|
|
|
|
|
|
if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
|
|
|
|
{
|
|
|
|
aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
|
|
|
|
}
|
|
|
|
|
2010-06-02 15:21:20 +02:00
|
|
|
bSuccess = mpGraphics->DrawPolyLine( aB2DPolygon, 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this);
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if(bSuccess)
|
|
|
|
{
|
2008-05-30 09:06:09 +00:00
|
|
|
return;
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
2008-05-30 09:06:09 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
Polygon aPoly = ImplLogicToDevicePixel( rPoly );
|
2003-03-27 16:59:30 +00:00
|
|
|
const SalPoint* pPtAry = (const SalPoint*)aPoly.GetConstPointAry();
|
2002-06-19 10:43:25 +00:00
|
|
|
|
|
|
|
// #100127# Forward beziers to sal, if any
|
|
|
|
if( aPoly.HasFlags() )
|
|
|
|
{
|
2010-09-29 15:46:40 +08:00
|
|
|
const sal_uInt8* pFlgAry = aPoly.GetConstFlagAry();
|
2002-08-29 14:42:38 +00:00
|
|
|
if( !mpGraphics->DrawPolygonBezier( nPoints, pPtAry, pFlgAry, this ) )
|
2002-06-19 10:43:25 +00:00
|
|
|
{
|
|
|
|
aPoly = ImplSubdivideBezier(aPoly);
|
2003-03-27 16:59:30 +00:00
|
|
|
pPtAry = (const SalPoint*)aPoly.GetConstPointAry();
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawPolygon( aPoly.GetSize(), pPtAry, this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-08-29 14:42:38 +00:00
|
|
|
mpGraphics->DrawPolygon( nPoints, pPtAry, this );
|
2002-06-19 10:43:25 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawPolygon( rPoly );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::DrawPolyPolygon( const PolyPolygon& rPolyPoly )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawPolyPolygon()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
DBG_CHKOBJ( &rPolyPoly, PolyPolygon, NULL );
|
|
|
|
|
|
|
|
if( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPolyPolygonAction( rPolyPoly ) );
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 nPoly = rPolyPoly.Count();
|
2000-09-18 16:07:07 +00:00
|
|
|
|
2003-03-27 16:59:30 +00:00
|
|
|
if ( !IsDeviceOutputNecessary() || (!mbLineColor && !mbFillColor) || !nPoly || ImplIsRecordLayout() )
|
2000-09-18 16:07:07 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if ( !mpGraphics )
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if ( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if ( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
if ( mbInitFillColor )
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
2008-05-30 09:06:09 +00:00
|
|
|
// use b2dpolygon drawing if possible
|
2009-07-27 16:24:52 +00:00
|
|
|
if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
|
|
|
&& (IsLineColor() || IsFillColor()))
|
2008-05-30 09:06:09 +00:00
|
|
|
{
|
2008-06-13 07:46:17 +00:00
|
|
|
const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
|
2009-07-27 16:24:52 +00:00
|
|
|
basegfx::B2DPolyPolygon aB2DPolyPolygon(rPolyPoly.getB2DPolyPolygon());
|
|
|
|
bool bSuccess(true);
|
|
|
|
|
|
|
|
// transform the polygon and ensure closed
|
|
|
|
aB2DPolyPolygon.transform(aTransform);
|
|
|
|
aB2DPolyPolygon.setClosed(true);
|
|
|
|
|
|
|
|
if(IsFillColor())
|
|
|
|
{
|
|
|
|
bSuccess = mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, 0.0, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bSuccess && IsLineColor())
|
|
|
|
{
|
|
|
|
const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
|
|
|
|
|
|
|
|
if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
|
|
|
|
{
|
|
|
|
aB2DPolyPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyPolygon);
|
|
|
|
}
|
|
|
|
|
|
|
|
for(sal_uInt32 a(0); bSuccess && a < aB2DPolyPolygon.count(); a++)
|
|
|
|
{
|
2010-06-02 15:21:20 +02:00
|
|
|
bSuccess = mpGraphics->DrawPolyLine( aB2DPolyPolygon.getB2DPolygon(a), 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this);
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bSuccess)
|
|
|
|
{
|
2008-05-30 09:06:09 +00:00
|
|
|
return;
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
2008-05-30 09:06:09 +00:00
|
|
|
}
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nPoly == 1 )
|
|
|
|
{
|
2002-06-19 10:43:25 +00:00
|
|
|
// #100127# Map to DrawPolygon
|
|
|
|
Polygon aPoly = rPolyPoly.GetObject( 0 );
|
|
|
|
if( aPoly.GetSize() >= 2 )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2002-06-19 10:43:25 +00:00
|
|
|
GDIMetaFile* pOldMF = mpMetaFile;
|
|
|
|
mpMetaFile = NULL;
|
|
|
|
|
|
|
|
DrawPolygon( aPoly );
|
|
|
|
|
2002-09-16 10:41:37 +00:00
|
|
|
mpMetaFile = pOldMF;
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2002-06-19 10:43:25 +00:00
|
|
|
// #100127# moved real PolyPolygon draw to separate method,
|
|
|
|
// have to call recursively, avoiding duplicate
|
|
|
|
// ImplLogicToDevicePixel calls
|
|
|
|
ImplDrawPolyPolygon( nPoly, ImplLogicToDevicePixel( rPolyPoly ) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->DrawPolyPolygon( rPolyPoly );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2008-08-19 23:32:41 +00:00
|
|
|
void OutputDevice::DrawPolygon( const ::basegfx::B2DPolygon& rB2DPolygon)
|
|
|
|
{
|
|
|
|
// AW: Do NOT paint empty polygons
|
|
|
|
if(rB2DPolygon.count())
|
|
|
|
{
|
|
|
|
::basegfx::B2DPolyPolygon aPP( rB2DPolygon );
|
|
|
|
DrawPolyPolygon( aPP );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
// Caution: This method is nearly the same as
|
|
|
|
// OutputDevice::DrawTransparent( const basegfx::B2DPolyPolygon& rB2DPolyPoly, double fTransparency),
|
|
|
|
// so when changes are made here do not forget to make change sthere, too
|
|
|
|
|
|
|
|
void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly )
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawPolyPolygon(B2D&)" );
|
2008-08-19 23:32:41 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
2010-10-18 16:52:05 +01:00
|
|
|
|
2008-08-19 23:32:41 +00:00
|
|
|
if( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPolyPolygonAction( PolyPolygon( rB2DPolyPoly ) ) );
|
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
// call helper
|
|
|
|
ImpDrawPolyPolygonWithB2DPolyPolygon(rB2DPolyPoly);
|
|
|
|
}
|
|
|
|
|
|
|
|
void OutputDevice::ImpDrawPolyPolygonWithB2DPolyPolygon(const basegfx::B2DPolyPolygon& rB2DPolyPoly)
|
|
|
|
{
|
2008-08-19 23:32:41 +00:00
|
|
|
// AW: Do NOT paint empty PolyPolygons
|
|
|
|
if(!rB2DPolyPoly.count())
|
|
|
|
return;
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if( !mpGraphics )
|
|
|
|
if( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
if( mbInitFillColor )
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
2009-07-27 16:24:52 +00:00
|
|
|
if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
|
|
|
&& (IsLineColor() || IsFillColor()))
|
2008-08-19 23:32:41 +00:00
|
|
|
{
|
2009-07-27 16:24:52 +00:00
|
|
|
const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation());
|
|
|
|
basegfx::B2DPolyPolygon aB2DPolyPolygon(rB2DPolyPoly);
|
|
|
|
bool bSuccess(true);
|
|
|
|
|
|
|
|
// transform the polygon and ensure closed
|
|
|
|
aB2DPolyPolygon.transform(aTransform);
|
|
|
|
aB2DPolyPolygon.setClosed(true);
|
|
|
|
|
|
|
|
if(IsFillColor())
|
|
|
|
{
|
|
|
|
bSuccess = mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, 0.0, this);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bSuccess && IsLineColor())
|
|
|
|
{
|
|
|
|
const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
|
|
|
|
|
|
|
|
if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
|
|
|
|
{
|
|
|
|
aB2DPolyPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyPolygon);
|
|
|
|
}
|
|
|
|
|
|
|
|
for(sal_uInt32 a(0);bSuccess && a < aB2DPolyPolygon.count(); a++)
|
|
|
|
{
|
2010-06-02 15:21:20 +02:00
|
|
|
bSuccess = mpGraphics->DrawPolyLine( aB2DPolyPolygon.getB2DPolygon(a), 0.0, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this);
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(bSuccess)
|
|
|
|
{
|
2008-08-19 23:32:41 +00:00
|
|
|
return;
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
2008-08-19 23:32:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// fallback to old polygon drawing if needed
|
|
|
|
const PolyPolygon aToolsPolyPolygon( rB2DPolyPoly );
|
|
|
|
const PolyPolygon aPixelPolyPolygon = ImplLogicToDevicePixel( aToolsPolyPolygon );
|
|
|
|
ImplDrawPolyPolygon( aPixelPolyPolygon.Count(), aPixelPolyPolygon );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
bool OutputDevice::ImpTryDrawPolyLineDirect(
|
|
|
|
const basegfx::B2DPolygon& rB2DPolygon,
|
|
|
|
double fLineWidth,
|
|
|
|
basegfx::B2DLineJoin eLineJoin)
|
|
|
|
{
|
|
|
|
const basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
|
|
|
|
basegfx::B2DVector aB2DLineWidth(1.0, 1.0);
|
|
|
|
|
|
|
|
// transform the line width if used
|
|
|
|
if( fLineWidth != 0.0 )
|
|
|
|
{
|
|
|
|
aB2DLineWidth = aTransform * ::basegfx::B2DVector( fLineWidth, fLineWidth );
|
|
|
|
}
|
|
|
|
|
|
|
|
// transform the polygon
|
|
|
|
basegfx::B2DPolygon aB2DPolygon(rB2DPolygon);
|
|
|
|
aB2DPolygon.transform(aTransform);
|
|
|
|
|
|
|
|
if((mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
|
|
|
|
&& aB2DPolygon.count() < 1000)
|
|
|
|
{
|
|
|
|
// #i98289#, #i101491#
|
|
|
|
// better to remove doubles on device coordinates. Also assume from a given amount
|
|
|
|
// of points that the single edges are not long enough to smooth
|
|
|
|
aB2DPolygon.removeDoublePoints();
|
|
|
|
aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
|
|
|
|
}
|
|
|
|
|
|
|
|
// draw the polyline
|
2010-06-02 15:21:20 +02:00
|
|
|
return mpGraphics->DrawPolyLine( aB2DPolygon, 0.0, aB2DLineWidth, eLineJoin, this);
|
2009-07-30 10:40:37 +00:00
|
|
|
}
|
|
|
|
|
2008-08-19 23:32:41 +00:00
|
|
|
void OutputDevice::DrawPolyLine(
|
|
|
|
const basegfx::B2DPolygon& rB2DPolygon,
|
|
|
|
double fLineWidth,
|
|
|
|
basegfx::B2DLineJoin eLineJoin)
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::DrawPolyLine(B2D&)" );
|
2008-08-19 23:32:41 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
(void)eLineJoin; // ATM used in UNX, but not in WNT, access it for warning-free
|
|
|
|
|
|
|
|
if( mpMetaFile )
|
|
|
|
{
|
|
|
|
LineInfo aLineInfo;
|
|
|
|
if( fLineWidth != 0.0 )
|
|
|
|
aLineInfo.SetWidth( static_cast<long>(fLineWidth+0.5) );
|
|
|
|
const Polygon aToolsPolygon( rB2DPolygon );
|
|
|
|
mpMetaFile->AddAction( new MetaPolyLineAction( aToolsPolygon, aLineInfo ) );
|
|
|
|
}
|
2010-10-18 16:52:05 +01:00
|
|
|
|
2008-08-19 23:32:41 +00:00
|
|
|
|
|
|
|
// AW: Do NOT paint empty PolyPolygons
|
|
|
|
if(!rB2DPolygon.count())
|
|
|
|
return;
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if( !mpGraphics )
|
|
|
|
if( !ImplGetGraphics() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if( mbInitClipRegion )
|
|
|
|
ImplInitClipRegion();
|
|
|
|
if( mbOutputClipped )
|
|
|
|
return;
|
|
|
|
|
|
|
|
if( mbInitLineColor )
|
|
|
|
ImplInitLineColor();
|
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW)
|
2009-07-27 16:24:52 +00:00
|
|
|
&& mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
|
|
|
|
&& ROP_OVERPAINT == GetRasterOp()
|
2009-07-30 10:40:37 +00:00
|
|
|
&& IsLineColor());
|
|
|
|
|
|
|
|
// use b2dpolygon drawing if possible
|
|
|
|
if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, eLineJoin))
|
2008-08-19 23:32:41 +00:00
|
|
|
{
|
2009-07-30 10:40:37 +00:00
|
|
|
return;
|
|
|
|
}
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
// #i101491#
|
|
|
|
// no output yet; fallback to geometry decomposition and use filled polygon paint
|
|
|
|
// when line is fat and not too complex. ImpDrawPolyPolygonWithB2DPolyPolygon
|
|
|
|
// will do internal needed AA checks etc.
|
|
|
|
if(fLineWidth >= 2.5
|
|
|
|
&& rB2DPolygon.count()
|
|
|
|
&& rB2DPolygon.count() <= 1000)
|
|
|
|
{
|
|
|
|
const double fHalfLineWidth((fLineWidth * 0.5) + 0.5);
|
|
|
|
const basegfx::B2DPolyPolygon aAreaPolyPolygon(basegfx::tools::createAreaGeometry(
|
|
|
|
rB2DPolygon, fHalfLineWidth, eLineJoin));
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
const Color aOldLineColor(maLineColor);
|
|
|
|
const Color aOldFillColor(maFillColor);
|
2009-07-27 16:24:52 +00:00
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
SetLineColor();
|
|
|
|
ImplInitLineColor();
|
|
|
|
SetFillColor(aOldLineColor);
|
|
|
|
ImplInitFillColor();
|
|
|
|
|
2009-10-14 13:55:31 +02:00
|
|
|
// draw usig a loop; else the topology will paint a PolyPolygon
|
|
|
|
for(sal_uInt32 a(0); a < aAreaPolyPolygon.count(); a++)
|
|
|
|
{
|
|
|
|
ImpDrawPolyPolygonWithB2DPolyPolygon(
|
|
|
|
basegfx::B2DPolyPolygon(aAreaPolyPolygon.getB2DPolygon(a)));
|
|
|
|
}
|
2009-07-30 10:40:37 +00:00
|
|
|
|
|
|
|
SetLineColor(aOldLineColor);
|
|
|
|
ImplInitLineColor();
|
|
|
|
SetFillColor(aOldFillColor);
|
|
|
|
ImplInitFillColor();
|
CWS-TOOLING: integrate CWS aw063
2009-02-12 13:10:24 +0100 aw r267649 : #i99123# when a primitive is invisible, it is not sufficient to produce no output when decomposing, but to add invisible data using HitTestPrimitive2D. This is needed for the slideshow which relies on geometry data in MetaFiles when painting invisible objects
2009-02-12 13:08:39 +0100 aw r267648 : #i99123# do not ignore HitTestPrimitive2D, but draw empty rectangles instead. This is needed since Slideshow is based on getting MetaFile content when painting invisible objects
2009-02-11 16:04:28 +0100 aw r267620 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:04:10 +0100 aw r267619 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:56 +0100 aw r267618 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:39 +0100 aw r267617 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:03:21 +0100 aw r267615 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:48 +0100 aw r267614 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:24 +0100 aw r267613 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:02:01 +0100 aw r267612 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:32 +0100 aw r267611 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:01:05 +0100 aw r267610 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 16:00:15 +0100 aw r267608 : #i98788# made SfxItemPool destructor protected, added static ::Free method
2009-02-11 11:27:33 +0100 aw r267585 : #i98788# added missing include for STL
2009-02-10 17:46:50 +0100 aw r267570 : #i98788# added reaction on pool destruction
2009-02-10 17:11:58 +0100 aw r267562 : #i98788# added messaging mechanism to register for pool destruction
2009-02-10 13:35:35 +0100 aw r267549 : #i98788# removing changes, too complicated and risky for 3.1
2009-02-10 12:13:48 +0100 aw r267546 : #i98788# 4th round
2009-02-10 12:13:37 +0100 aw r267545 : #i98788# 4th round
2009-02-10 12:13:26 +0100 aw r267544 : #i98788# 4th round
2009-02-10 12:13:14 +0100 aw r267543 : #i98788# 4th round
2009-02-10 12:13:03 +0100 aw r267542 : #i98788# 4th round
2009-02-10 12:12:50 +0100 aw r267541 : #i98788# 4th round
2009-02-10 12:12:37 +0100 aw r267540 : #i98788# 4th round
2009-02-08 14:38:22 +0100 aw r267495 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:38:06 +0100 aw r267494 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:48 +0100 aw r267493 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:37:17 +0100 aw r267492 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:56 +0100 aw r267491 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:44 +0100 aw r267490 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:29 +0100 aw r267489 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:16 +0100 aw r267488 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:36:02 +0100 aw r267487 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-08 14:35:46 +0100 aw r267486 : #i98788# 3rd round of changes to SfxItemPool handling
2009-02-05 12:20:39 +0100 aw r267415 : #i98788# 2nd batch of adaptions for SfxItemPoolHolder addition
2009-02-04 15:12:54 +0100 aw r267385 : #i98788# added newline at EOF
2009-02-04 13:26:04 +0100 aw r267379 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:40 +0100 aw r267378 : #i98788# make SfxItemPool holdable
2009-02-04 13:25:08 +0100 aw r267377 : #i98788# make SfxItemPool holdable
2009-02-04 13:24:42 +0100 aw r267376 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:14 +0100 aw r267375 : #i98788# make SfxItemPool holdable
2009-02-04 13:23:02 +0100 aw r267374 : #i98788# make SfxItemPool holdable
2009-01-29 17:08:31 +0100 aw r267159 : #i97628# completed the fix
2009-01-29 17:08:15 +0100 aw r267158 : #i97628# completed the fix
2009-01-29 14:09:07 +0100 aw r267132 : #i97628# Corrected usage of ParagraphData in headers
2009-01-29 14:06:58 +0100 iha r267131 : #i98344# incorrect font size in charts
2009-01-29 12:13:46 +0100 aw r267115 : #i97628# back to old state; triggers too many errors in other modules
2009-01-29 12:03:51 +0100 aw r267114 : #i97628# enabled exceptions due to STL vector include
2009-01-29 11:21:37 +0100 aw r267107 : #i97628# added needed include
2009-01-28 17:58:29 +0100 aw r267077 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:58:12 +0100 aw r267076 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:51 +0100 aw r267074 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-28 17:57:21 +0100 aw r267073 : #i97628# first version of newly implemented OutlinerParaObject and adaptions
2009-01-27 17:07:33 +0100 aw r267011 : #i98402# added support for ViewRange when exporting MetaFiles in ObjectContactOfPageView::DoProcessDisplay to avoid to paint too much
2009-01-27 11:45:48 +0100 aw r266973 : #i98404# Added a warning to a place where a conversion to rectangle should not be copied from
2009-01-26 21:44:36 +0100 iha r266949 : #i98497# 3D charts are rendered with wrong size
2009-01-26 20:47:07 +0100 aw r266947 : #i98404# handle BackgroundColorPrimitive2D directly in PixelRenderers and avoid AA under all circumstances
2009-01-26 14:50:36 +0100 aw r266926 : #i98386# secured cloning of SdrObject in IMapUserData by boost::shared_prt usage
2009-01-26 12:51:30 +0100 aw r266916 : #i96581# added separated FontStretching and fallback for small X!=Y scale differences
2009-01-23 16:14:55 +0100 aw r266834 : #i96475# added missing implementation of TextDecoratedPortionPrimitive2D::getB2DRange
2009-01-23 15:24:34 +0100 aw r266826 : #i98405# fixed fallback to DrawAlphaRect to use the correctly sized rectangle
2009-01-23 13:34:43 +0100 aw r266813 : #i96474# fixed impSplitSingleWords for an unexpected case
2009-01-23 10:47:31 +0100 aw r266786 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:20 +0100 aw r266785 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:47:09 +0100 aw r266783 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:58 +0100 aw r266782 : #i98289#,#i96474# tooling and new flags for tasks
2009-01-23 10:46:48 +0100 aw r266781 : #i98289#,#i96474# tooling and new flags for tasks
2009-03-04 14:16:02 +00:00
|
|
|
|
2009-07-30 10:40:37 +00:00
|
|
|
if(bTryAA)
|
2009-07-27 16:24:52 +00:00
|
|
|
{
|
2009-07-30 10:40:37 +00:00
|
|
|
// when AA it is necessary to also paint the filled polygon's outline
|
|
|
|
// to avoid optical gaps
|
|
|
|
for(sal_uInt32 a(0); a < aAreaPolyPolygon.count(); a++)
|
|
|
|
{
|
|
|
|
ImpTryDrawPolyLineDirect(aAreaPolyPolygon.getB2DPolygon(a), 0.0, basegfx::B2DLINEJOIN_NONE);
|
|
|
|
}
|
2009-07-27 16:24:52 +00:00
|
|
|
}
|
2008-08-19 23:32:41 +00:00
|
|
|
}
|
2009-10-14 13:55:31 +02:00
|
|
|
else
|
|
|
|
{
|
2009-10-15 14:27:12 +02:00
|
|
|
// fallback to old polygon drawing if needed
|
2009-10-14 13:55:31 +02:00
|
|
|
const Polygon aToolsPolygon( rB2DPolygon );
|
|
|
|
LineInfo aLineInfo;
|
|
|
|
if( fLineWidth != 0.0 )
|
|
|
|
aLineInfo.SetWidth( static_cast<long>(fLineWidth+0.5) );
|
|
|
|
ImpDrawPolyLineWithLineInfo( aToolsPolygon, aLineInfo );
|
|
|
|
}
|
2008-08-19 23:32:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-11-26 17:12:39 +01:00
|
|
|
sal_uInt32 OutputDevice::GetGCStackDepth() const
|
|
|
|
{
|
|
|
|
const ImplObjStack* pData = mpObjStack;
|
|
|
|
sal_uInt32 nDepth = 0;
|
|
|
|
while( pData )
|
|
|
|
{
|
|
|
|
nDepth++;
|
|
|
|
pData = pData->mpPrev;
|
|
|
|
}
|
|
|
|
return nDepth;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
void OutputDevice::Push( sal_uInt16 nFlags )
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::Push()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPushAction( nFlags ) );
|
|
|
|
|
|
|
|
ImplObjStack* pData = new ImplObjStack;
|
|
|
|
pData->mpPrev = mpObjStack;
|
|
|
|
mpObjStack = pData;
|
|
|
|
|
|
|
|
pData->mnFlags = nFlags;
|
|
|
|
|
|
|
|
if ( nFlags & PUSH_LINECOLOR )
|
|
|
|
{
|
|
|
|
if ( mbLineColor )
|
|
|
|
pData->mpLineColor = new Color( maLineColor );
|
|
|
|
else
|
|
|
|
pData->mpLineColor = NULL;
|
|
|
|
}
|
|
|
|
if ( nFlags & PUSH_FILLCOLOR )
|
|
|
|
{
|
|
|
|
if ( mbFillColor )
|
|
|
|
pData->mpFillColor = new Color( maFillColor );
|
|
|
|
else
|
|
|
|
pData->mpFillColor = NULL;
|
|
|
|
}
|
|
|
|
if ( nFlags & PUSH_FONT )
|
|
|
|
pData->mpFont = new Font( maFont );
|
|
|
|
if ( nFlags & PUSH_TEXTCOLOR )
|
|
|
|
pData->mpTextColor = new Color( GetTextColor() );
|
|
|
|
if ( nFlags & PUSH_TEXTFILLCOLOR )
|
|
|
|
{
|
|
|
|
if ( IsTextFillColor() )
|
|
|
|
pData->mpTextFillColor = new Color( GetTextFillColor() );
|
|
|
|
else
|
|
|
|
pData->mpTextFillColor = NULL;
|
|
|
|
}
|
|
|
|
if ( nFlags & PUSH_TEXTLINECOLOR )
|
|
|
|
{
|
|
|
|
if ( IsTextLineColor() )
|
|
|
|
pData->mpTextLineColor = new Color( GetTextLineColor() );
|
|
|
|
else
|
|
|
|
pData->mpTextLineColor = NULL;
|
|
|
|
}
|
2009-01-05 17:49:45 +00:00
|
|
|
if ( nFlags & PUSH_OVERLINECOLOR )
|
|
|
|
{
|
|
|
|
if ( IsOverlineColor() )
|
|
|
|
pData->mpOverlineColor = new Color( GetOverlineColor() );
|
|
|
|
else
|
|
|
|
pData->mpOverlineColor = NULL;
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nFlags & PUSH_TEXTALIGN )
|
|
|
|
pData->meTextAlign = GetTextAlign();
|
2003-08-25 12:53:32 +00:00
|
|
|
if( nFlags & PUSH_TEXTLAYOUTMODE )
|
|
|
|
pData->mnTextLayoutMode = GetLayoutMode();
|
|
|
|
if( nFlags & PUSH_TEXTLANGUAGE )
|
|
|
|
pData->meTextLanguage = GetDigitLanguage();
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( nFlags & PUSH_RASTEROP )
|
|
|
|
pData->meRasterOp = GetRasterOp();
|
|
|
|
if ( nFlags & PUSH_MAPMODE )
|
|
|
|
{
|
|
|
|
if ( mbMap )
|
|
|
|
pData->mpMapMode = new MapMode( maMapMode );
|
|
|
|
else
|
|
|
|
pData->mpMapMode = NULL;
|
|
|
|
}
|
|
|
|
if ( nFlags & PUSH_CLIPREGION )
|
|
|
|
{
|
|
|
|
if ( mbClipRegion )
|
|
|
|
pData->mpClipRegion = new Region( maRegion );
|
|
|
|
else
|
|
|
|
pData->mpClipRegion = NULL;
|
|
|
|
}
|
|
|
|
if ( nFlags & PUSH_REFPOINT )
|
|
|
|
{
|
|
|
|
if ( mbRefPoint )
|
|
|
|
pData->mpRefPoint = new Point( maRefPoint );
|
|
|
|
else
|
|
|
|
pData->mpRefPoint = NULL;
|
|
|
|
}
|
2003-11-24 16:32:23 +00:00
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->Push();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::Pop()
|
|
|
|
{
|
2011-03-08 13:47:42 +01:00
|
|
|
OSL_TRACE( "OutputDevice::Pop()" );
|
2000-09-18 16:07:07 +00:00
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if( mpMetaFile )
|
|
|
|
mpMetaFile->AddAction( new MetaPopAction() );
|
|
|
|
|
|
|
|
GDIMetaFile* pOldMetaFile = mpMetaFile;
|
|
|
|
ImplObjStack* pData = mpObjStack;
|
|
|
|
mpMetaFile = NULL;
|
|
|
|
|
|
|
|
if ( !pData )
|
|
|
|
{
|
|
|
|
DBG_ERRORFILE( "OutputDevice::Pop() without OutputDevice::Push()" );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2003-11-24 16:32:23 +00:00
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->Pop();
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
mpObjStack = pData->mpPrev;
|
|
|
|
|
|
|
|
if ( pData->mnFlags & PUSH_LINECOLOR )
|
|
|
|
{
|
|
|
|
if ( pData->mpLineColor )
|
|
|
|
SetLineColor( *pData->mpLineColor );
|
|
|
|
else
|
|
|
|
SetLineColor();
|
|
|
|
}
|
|
|
|
if ( pData->mnFlags & PUSH_FILLCOLOR )
|
|
|
|
{
|
|
|
|
if ( pData->mpFillColor )
|
|
|
|
SetFillColor( *pData->mpFillColor );
|
|
|
|
else
|
|
|
|
SetFillColor();
|
|
|
|
}
|
|
|
|
if ( pData->mnFlags & PUSH_FONT )
|
|
|
|
SetFont( *pData->mpFont );
|
|
|
|
if ( pData->mnFlags & PUSH_TEXTCOLOR )
|
|
|
|
SetTextColor( *pData->mpTextColor );
|
|
|
|
if ( pData->mnFlags & PUSH_TEXTFILLCOLOR )
|
|
|
|
{
|
|
|
|
if ( pData->mpTextFillColor )
|
|
|
|
SetTextFillColor( *pData->mpTextFillColor );
|
|
|
|
else
|
|
|
|
SetTextFillColor();
|
|
|
|
}
|
|
|
|
if ( pData->mnFlags & PUSH_TEXTLINECOLOR )
|
|
|
|
{
|
|
|
|
if ( pData->mpTextLineColor )
|
|
|
|
SetTextLineColor( *pData->mpTextLineColor );
|
|
|
|
else
|
|
|
|
SetTextLineColor();
|
|
|
|
}
|
2009-01-05 17:49:45 +00:00
|
|
|
if ( pData->mnFlags & PUSH_OVERLINECOLOR )
|
|
|
|
{
|
|
|
|
if ( pData->mpOverlineColor )
|
|
|
|
SetOverlineColor( *pData->mpOverlineColor );
|
|
|
|
else
|
|
|
|
SetOverlineColor();
|
|
|
|
}
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pData->mnFlags & PUSH_TEXTALIGN )
|
|
|
|
SetTextAlign( pData->meTextAlign );
|
2003-08-25 12:53:32 +00:00
|
|
|
if( pData->mnFlags & PUSH_TEXTLAYOUTMODE )
|
|
|
|
SetLayoutMode( pData->mnTextLayoutMode );
|
|
|
|
if( pData->mnFlags & PUSH_TEXTLANGUAGE )
|
|
|
|
SetDigitLanguage( pData->meTextLanguage );
|
2000-09-18 16:07:07 +00:00
|
|
|
if ( pData->mnFlags & PUSH_RASTEROP )
|
|
|
|
SetRasterOp( pData->meRasterOp );
|
|
|
|
if ( pData->mnFlags & PUSH_MAPMODE )
|
|
|
|
{
|
|
|
|
if ( pData->mpMapMode )
|
|
|
|
SetMapMode( *pData->mpMapMode );
|
|
|
|
else
|
|
|
|
SetMapMode();
|
|
|
|
}
|
|
|
|
if ( pData->mnFlags & PUSH_CLIPREGION )
|
|
|
|
ImplSetClipRegion( pData->mpClipRegion );
|
|
|
|
if ( pData->mnFlags & PUSH_REFPOINT )
|
|
|
|
{
|
|
|
|
if ( pData->mpRefPoint )
|
|
|
|
SetRefPoint( *pData->mpRefPoint );
|
|
|
|
else
|
|
|
|
SetRefPoint();
|
|
|
|
}
|
|
|
|
|
|
|
|
ImplDeleteObjStack( pData );
|
|
|
|
|
|
|
|
mpMetaFile = pOldMetaFile;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2003-11-24 16:32:23 +00:00
|
|
|
void OutputDevice::SetConnectMetaFile( GDIMetaFile* pMtf )
|
|
|
|
{
|
|
|
|
mpMetaFile = pMtf;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
void OutputDevice::EnableOutput( sal_Bool bEnable )
|
2003-11-24 16:32:23 +00:00
|
|
|
{
|
|
|
|
mbOutput = (bEnable != 0);
|
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->EnableOutput( bEnable );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
void OutputDevice::SetSettings( const AllSettings& rSettings )
|
|
|
|
{
|
|
|
|
maSettings = rSettings;
|
|
|
|
|
|
|
|
if( mpAlphaVDev )
|
|
|
|
mpAlphaVDev->SetSettings( rSettings );
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 OutputDevice::GetBitCount() const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( meOutDevType == OUTDEV_VIRDEV )
|
|
|
|
return ((VirtualDevice*)this)->mnBitCount;
|
|
|
|
|
|
|
|
// we need a graphics
|
|
|
|
if ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !((OutputDevice*)this)->ImplGetGraphics() )
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
return (sal_uInt16)mpGraphics->GetBitCount();
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_uInt16 OutputDevice::GetAlphaBitCount() const
|
2003-11-24 16:32:23 +00:00
|
|
|
{
|
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
|
|
|
if ( meOutDevType == OUTDEV_VIRDEV &&
|
|
|
|
mpAlphaVDev != NULL )
|
|
|
|
{
|
|
|
|
return mpAlphaVDev->GetBitCount();
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2011-01-12 15:07:10 +01:00
|
|
|
sal_uLong OutputDevice::GetColorCount() const
|
2000-09-18 16:07:07 +00:00
|
|
|
{
|
|
|
|
DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
const sal_uInt16 nBitCount = GetBitCount();
|
2011-01-12 15:07:10 +01:00
|
|
|
return( ( nBitCount > 31 ) ? ULONG_MAX : ( ( (sal_uLong) 1 ) << nBitCount) );
|
2000-09-18 16:07:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2010-09-29 15:46:40 +08:00
|
|
|
sal_Bool OutputDevice::HasAlpha()
|
2003-11-24 16:32:23 +00:00
|
|
|
{
|
|
|
|
return mpAlphaVDev != NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
2000-09-18 16:07:07 +00:00
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics > OutputDevice::CreateUnoGraphics()
|
|
|
|
{
|
|
|
|
UnoWrapperBase* pWrapper = Application::GetUnoWrapper();
|
|
|
|
return pWrapper ? pWrapper->CreateGraphics( this ) : ::com::sun::star::uno::Reference< ::com::sun::star::awt::XGraphics >();
|
|
|
|
}
|
2008-06-24 10:40:49 +00:00
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
SystemGraphicsData OutputDevice::GetSystemGfxData() const
|
|
|
|
{
|
|
|
|
if ( !mpGraphics )
|
|
|
|
{
|
|
|
|
if ( !ImplGetGraphics() )
|
|
|
|
return SystemGraphicsData();
|
|
|
|
}
|
|
|
|
|
|
|
|
return mpGraphics->GetGraphicsData();
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::uno::Any OutputDevice::GetSystemGfxDataAny() const
|
|
|
|
{
|
|
|
|
::com::sun::star::uno::Any aRet;
|
|
|
|
const SystemGraphicsData aSysData = GetSystemGfxData();
|
|
|
|
::com::sun::star::uno::Sequence< sal_Int8 > aSeq( (sal_Int8*)&aSysData,
|
|
|
|
aSysData.nSize );
|
|
|
|
|
|
|
|
return uno::makeAny(aSeq);
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
|
|
|
|
::com::sun::star::uno::Reference< ::com::sun::star::rendering::XCanvas > OutputDevice::GetCanvas() const
|
|
|
|
{
|
|
|
|
uno::Sequence< uno::Any > aArg(6);
|
|
|
|
|
|
|
|
aArg[ 0 ] = uno::makeAny( reinterpret_cast<sal_Int64>(this) );
|
|
|
|
aArg[ 2 ] = uno::makeAny( ::com::sun::star::awt::Rectangle( mnOutOffX, mnOutOffY, mnOutWidth, mnOutHeight ) );
|
|
|
|
aArg[ 3 ] = uno::makeAny( sal_False );
|
|
|
|
aArg[ 5 ] = GetSystemGfxDataAny();
|
|
|
|
|
|
|
|
uno::Reference<lang::XMultiServiceFactory> xFactory = vcl::unohelper::GetMultiServiceFactory();
|
|
|
|
|
|
|
|
uno::Reference<rendering::XCanvas> xCanvas;
|
|
|
|
|
|
|
|
// Create canvas instance with window handle
|
|
|
|
// =========================================
|
|
|
|
if ( xFactory.is() )
|
|
|
|
{
|
|
|
|
static uno::Reference<lang::XMultiServiceFactory> xCanvasFactory(
|
|
|
|
xFactory->createInstance(
|
|
|
|
OUString( RTL_CONSTASCII_USTRINGPARAM(
|
|
|
|
"com.sun.star."
|
|
|
|
"rendering.CanvasFactory") ) ),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
if(xCanvasFactory.is())
|
|
|
|
{
|
|
|
|
xCanvas.set(
|
|
|
|
xCanvasFactory->createInstanceWithArguments(
|
|
|
|
OUString( RTL_CONSTASCII_USTRINGPARAM(
|
|
|
|
"com.sun.star.rendering.Canvas" )),
|
|
|
|
aArg ),
|
|
|
|
uno::UNO_QUERY );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return xCanvas;
|
|
|
|
}
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------
|
2010-10-14 08:27:31 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|