Author: alg
Date: Wed May 8 17:00:00 2013
New Revision: 1480354
URL: http://svn.apache.org/r1480354
Log:
Securing older changes in CWS (just seen as not safed)
Modified:
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cacheable.hxx
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cmanager.hxx
openoffice/branches/alg/sysdepgs/main/basegfx/source/tools/cmanager.cxx
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx
openoffice/branches/alg/sysdepgs/main/vcl/inc/win/gdiplusobjectbuffer.hxx
openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx
Modified:
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cacheable.hxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cacheable.hxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
---
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cacheable.hxx
(original)
+++
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cacheable.hxx
Wed May 8 17:00:00 2013
@@ -31,17 +31,24 @@ namespace basegfx
{
namespace cache
{
- // helper class to allow caching of a c++ object with tooling. To
+ // Helper class to allow caching of a c++ object with tooling. To
// be able to use this, the object you want to cache needs to be
derived
// from this tooling class. It just adds a pointer for managing
purposes,
// but needs no virtuality and only this include file. For more info
on how
- // to cache these objects, see the coc::cmanager and node
- // clases in the same namespace (normally in the file coc_manager.hxx
in
- // the same dir as this file)
+ // to cache these objects, see the coc::cmanager and node clases in
the same
+ // namespace.
+ // To use cached instances of this class, ask your manager class
derived from
+ // the 'manager' class of this namespace for an entry, it will then
either have
+ // an instance or construct one and add it to the manager.
+ // You may still incarnate instances yourself without a manager, these
will just
+ // not get cached (and there is currently no way to add them to
caching after
+ // incarnation).
+ // The default constructor/destructor will do the needed handling, so
an instance
+ // can just be deleted, independent of being cached or not.
class cacheable
{
private:
- friend class cmanager;
+ friend class manager;
friend class node;
// the managing data node
@@ -52,8 +59,8 @@ namespace basegfx
const node* getNode() const { return mpNode; }
protected:
- // call this always when the original data changes, will remove
- // all evtl. cached instances
+ // this needs always to be called when the original data changes,
it will remove
+ // all evtl. cached instances from the manager
void onChange() { if(mpNode) delete mpNode; mpNode = 0; }
public:
Modified:
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cmanager.hxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cmanager.hxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
---
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cmanager.hxx
(original)
+++
openoffice/branches/alg/sysdepgs/main/basegfx/inc/basegfx/tools/cmanager.hxx
Wed May 8 17:00:00 2013
@@ -34,27 +34,36 @@ namespace basegfx
class node;
class cacheable;
- // the manager part to allow caching of any c++ object derived from
the helper class
- // cacheable, see this calss in the same namespace. normally in file
- // cacheable.hxx in the same dir as this file.
- // An object derived from cacheable can be cached with this manager
class. It
- // will allow you to access cached entries using getEntry() which also
resets the
- // lifetime counter if found. If not found the cached object should be
incarnated and
- // added to the cache.
- // This mechanism uses the helper class node where the management is
done. It
- // implements basic mechanisms for organizing this.
- // to use this, you need to derive own classes from cmanager and from
node.
+ // This caching mechanism for any C++ objects is based on three classes
+ // in this namespace, which are: manager, node, cacheable. The roles
of these
+ // and how to use will be explained below.
+
+ // This is the manager part of the caching mechanism. Any c++ object
derived from the
+ // helper class cacheable (see this class in the same namespace) can
be cached.
+ //
+ // An object derived from cacheable can be cached with a manager
derived from this manager
+ // class. It will allow you to access cached entries using getEntry()
which also resets the
+ // lifetime counter if found. If not found the cached object will be
incarnated and
+ // added to the cache. To do this, the constructor/destructor of the
class derived from
+ // cacheable is used, where the basic constructor implementation
inserts the instance to
+ // the manager and the destructor removes it.
+ //
+ // This mechanism uses the helper class node where the cache data
management is done. It
+ // implements basic mechanisms for organizing the caching mechanism.
+ // To use this, you need to derive your own classes from manager and
from node
+ // respectively.
//
- // On the cmanager derivation:
+ // On the manager derivation:
// - react on the cache being empty by overloading (onEmpty())
// - react on getting the first element by overloading (onFilled())
// - test if there are cached instances using empty()
// - try to get a cached entry using getEntry()
// - trigger the lifetime counter using trigger() which will remove
- // cached objects with zero count (probably timer based)
+ // cached objects with zero count (probably timer based in real
usages,
+ // but this is not a must).
// - implement a access method to your cached data type using
getEntry().
// When you get one, it's the cached instance. If not, construct your
- // instance of node (it will be added automatically) and return it
+ // instance of node (it will be added automatically) and return it.
//
// On the node derivation:
// - Add a data entry to hold the cached data
@@ -62,21 +71,38 @@ namespace basegfx
// constructor
// - destroy it in the destuctor
//
+ // On the cacheable derivation:
+ // - nothing to do, all managed from the namager/node combination
+ //
// To access your cached instance, you can use getEntry() at the
manager instance
// which may return the cached entry or a newly created one. On that
instance,
- // access your cached data.
- // The insertion to manager, access to the instance and the removal at
lifetime
- // end are all linear operations.
- // Usage examples would e.g. derive from cmanager and the Timer calss
in sal,
+ // access your cached data. If it was created or cached is transparent.
+ // The insertion at the manager, the access to the instance and the
removal at
+ // end of lifetime are all linear operations.
+ // Note that multiple derivations of cacheable can be cached by a
single derivation
+ // (and instance) of a manager; e.g. a manager might cache specialized
forms of bitmap
+ // data and polygon data at the same time (or even more classes).
+ // Usage examples would e.g. derive from manager and the Timer class
in sal,
// call trigger in the overloaded timer callback and switch the timer
on/off
// in overlods of onEmpty()/onFilled(). I will use it to e.g. cache
Widows-specific
- // data creatatble from system-independent bitmap data.
- class cmanager : protected comphelper::OBaseMutex
+ // data creatable from system-independent bitmap data and/or polygon
data.
+ class manager : protected comphelper::OBaseMutex
{
private:
friend class node;
+ // lifetime counter used as start value for existing touched or
+ // newly created cache entries
sal_uInt32 mnLifetime;
+
+ // the cache entries managed by this manager. This pointer is the
anchor
+ // to a double linked list. That double linked list uses pointers
directly
+ // in the node (mpNext, mpPrev), insertion and removal is done
safely in
+ // the private helpers removeNode/insertNode below. This is done
self here
+ // by purpose; any usage of an stl class would introduce some
search access
+ // to find the correct node in the removeNode case; this is *not*
needed
+ // when doing the list self since the node *is* already the entry
to work
+ // on and thus allows linear time operations.
node* mpNodes;
void removeNode(node& rNode);
@@ -84,15 +110,15 @@ namespace basegfx
protected:
public:
- // constructor allows to give lifetime count for newly
+ // constructor allows to give a default lifetime count for newly
// added cached objects
- cmanager(sal_uInt32 nLifetime = 60);
- virtual ~cmanager();
+ manager(sal_uInt32 nLifetime = 60);
+ virtual ~manager();
- // react on last cached object removed
+ // allow to react on last cached object removed (e.g. stop timer)
virtual void onEmpty();
- // react on first cached object added
+ // allow to react on first cached object added (e.g. start timer)
virtual void onFilled();
// ask if objects are cached
@@ -105,7 +131,7 @@ namespace basegfx
const node* getEntry(const cacheable& rCacheable);
// decrease lifetime, delete cached objects which
- // rech zero
+ // reached end of life
void trigger();
// return default lifetime
@@ -120,23 +146,36 @@ namespace basegfx
{
namespace cache
{
+ // The node part of the mechanism; it is the data needed to manage
+ // the cached data. It builds a double linked list of cached entries
+ // using mpNext/mpPrev to allow linear insertion/removal. It holds
+ // contact to the manager (cannot exxist without one, lifetime is bound
+ // to manager lifetime). It holds data to te cached data, it only
+ // exists if cached data exists for it.
class node
{
private:
- friend class cmanager;
+ friend class manager;
friend class cacheable;
+ // entries for the double linked list of cached nodes
node* mpNext;
node* mpPrev;
- cmanager& mrManager;
+ // the manager who created this node and to whom it belongs
+ manager& mrManager;
+
+ // the data cached by this node
const cacheable& mrCacheable;
+ // the remaining lifetime of this node. Zero means still alife,
+ // but will be deleted/removed in the next call to trigger() at
+ // the manager
sal_uInt32 mnLifetime;
protected:
public:
- node(cmanager& rManager, const cacheable& rCacheable);
+ node(manager& rManager, const cacheable& rCacheable);
virtual ~node();
void touch();
Modified:
openoffice/branches/alg/sysdepgs/main/basegfx/source/tools/cmanager.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/basegfx/source/tools/cmanager.cxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/basegfx/source/tools/cmanager.cxx
(original)
+++ openoffice/branches/alg/sysdepgs/main/basegfx/source/tools/cmanager.cxx Wed
May 8 17:00:00 2013
@@ -32,7 +32,7 @@ namespace basegfx
{
namespace cache
{
- void cmanager::removeNode(node& rNode)
+ void manager::removeNode(node& rNode)
{
::osl::MutexGuard aGuard(m_aMutex);
@@ -59,7 +59,7 @@ namespace basegfx
}
}
- void cmanager::insertNode(node& rNode)
+ void manager::insertNode(node& rNode)
{
::osl::MutexGuard aGuard(m_aMutex);
rNode.mpNext = rNode.mpPrev = 0;
@@ -87,13 +87,13 @@ namespace basegfx
}
}
- cmanager::cmanager(sal_uInt32 nLifetime)
+ manager::manager(sal_uInt32 nLifetime)
: mnLifetime(nLifetime),
mpNodes(0)
{
}
- cmanager::~cmanager()
+ manager::~manager()
{
::osl::MutexGuard aGuard(m_aMutex);
@@ -103,20 +103,20 @@ namespace basegfx
}
}
- void cmanager::onEmpty()
+ void manager::onEmpty()
{
}
- void cmanager::onFilled()
+ void manager::onFilled()
{
}
- const node* cmanager::getEntry(const cacheable& rCacheable)
+ const node* manager::getEntry(const cacheable& rCacheable)
{
return rCacheable.getNode();
}
- void cmanager::trigger()
+ void manager::trigger()
{
::osl::MutexGuard aGuard(m_aMutex);
node* pCurr = mpNodes;
@@ -137,7 +137,7 @@ namespace basegfx
}
}
- void cmanager::flush()
+ void manager::flush()
{
::osl::MutexGuard aGuard(m_aMutex);
@@ -155,7 +155,7 @@ namespace basegfx
{
namespace cache
{
- node::node(cmanager& rManager, const cacheable& rCacheable)
+ node::node(manager& rManager, const cacheable& rCacheable)
: mpNext(0),
mpPrev(0),
mrManager(rManager),
Modified:
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
---
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
(original)
+++
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
Wed May 8 17:00:00 2013
@@ -97,6 +97,7 @@ namespace drawinglayer
// tooling
void pushOutputDevice(OutputDevice& rNew);
void popOutputDevice();
+ OutputDevice* getInitialOutputDevice() const {
if(mnOutputDevices.empty()) return 0; return mnOutputDevices[0]; }
OutputDevice& getOutputDevice() const { OSL_ENSURE(0 !=
mpOutputDevice, "0 == mpOutputDevice (!)"); return *mpOutputDevice; }
// access to transformation stack
Modified:
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
---
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx
(original)
+++
openoffice/branches/alg/sysdepgs/main/drawinglayer/inc/drawinglayer/processor2d/win_pixelprocessor2d.hxx
Wed May 8 17:00:00 2013
@@ -28,7 +28,6 @@
#include <basegfx/color/bcolormodifier.hxx>
#include <svtools/optionsdrawinglayer.hxx>
#include <tools/svwin.h>
-#include <vector>
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
@@ -62,7 +61,6 @@ namespace drawinglayer
// the current Gdiplus::Graphics and the stack
Gdiplus::Graphics* mpGraphics;
- std::vector< Gdiplus::Graphics* > maGraphics;
// the modifiedColorPrimitive stack
basegfx::BColorModifierStack maBColorModifierStack;
@@ -78,122 +76,6 @@ namespace drawinglayer
protected:
//////////////////////////////////////////////////////////////////////////////
// tooling
- void pushGraphics(Gdiplus::Graphics& rNew);
- void popGraphics();
- Gdiplus::Graphics& getGraphics() const { OSL_ENSURE(0 !=
mpGraphics, "0 == mpGraphics (!)"); return *mpGraphics; }
-
- // access to transformation stack
- const basegfx::B2DHomMatrix& getCurrentTransformation() const {
return maCurrentTransformation; }
- void setCurrentTransformation(const basegfx::B2DHomMatrix& rNew) {
maCurrentTransformation = rNew; }
-
- // access to color modifyer stack
- basegfx::BColorModifierStack& getBColorModifierStack() { return
maBColorModifierStack; }
-
- // access to Drawinglayer configuration options
- const SvtOptionsDrawinglayer& getOptionsDrawinglayer() const {
return maDrawinglayerOpt; }
-
-
//////////////////////////////////////////////////////////////////////////////
- // the local processor for BasePrinitive2D-Implementation based
primitives,
- // called from the common process()-implementation
- virtual void processBasePrimitive2D(const
primitive2d::BasePrimitive2D& rCandidate);
-
- public:
- /// constructor/destructor
- Win_PixelProcessor2D(
- const geometry::ViewInformation2D& rViewInformation,
- OutputDevice& rOutDev);
- virtual ~Win_PixelProcessor2D();
- };
- } // end of namespace processor2d
-} // end of namespace drawinglayer
-
-//////////////////////////////////////////////////////////////////////////////
-
-#endif // INCLUDED_DRAWINGLAYER_PROCESSOR2D_WIN_PIXELPROCESSOR2D_HXX
-
-// eof
-/**************************************************************
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- *************************************************************/
-
-#ifndef INCLUDED_DRAWINGLAYER_PROCESSOR2D_WIN_PIXELPROCESSOR2D_HXX
-#define INCLUDED_DRAWINGLAYER_PROCESSOR2D_WIN_PIXELPROCESSOR2D_HXX
-
-#include <drawinglayer/drawinglayerdllapi.h>
-#include <drawinglayer/processor2d/baseprocessor2d.hxx>
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <basegfx/color/bcolormodifier.hxx>
-#include <svtools/optionsdrawinglayer.hxx>
-#include <tools/svwin.h>
-#include <vector>
-
-#ifndef min
-#define min(a,b) (((a) < (b)) ? (a) : (b))
-#endif
-#ifndef max
-#define max(a,b) (((a) > (b)) ? (a) : (b))
-#endif
-
-#include <GdiPlus.h>
-
-//////////////////////////////////////////////////////////////////////////////
-// predefines
-class OutputDevice;
-
-//////////////////////////////////////////////////////////////////////////////
-
-namespace drawinglayer
-{
- namespace processor2d
- {
- /** Win_PixelProcessor2D class
-
- This processor derived from BaseProcessor2D is the base class for
rendering
- system-dependent on Win, using GDI+ for now
- */
- class Win_PixelProcessor2D : public BaseProcessor2D
- {
- private:
- // the OutputDevice started with
- OutputDevice& mrOutDev;
-
- // the current Gdiplus::Graphics and the stack
- Gdiplus::Graphics* mpGraphics;
- std::vector< Gdiplus::Graphics* > maGraphics;
-
- // the modifiedColorPrimitive stack
- basegfx::BColorModifierStack maBColorModifierStack;
-
- // the current transformation. Since VCL pixel renderer transforms
to pixels
- // and VCL MetaFile renderer to World (logic) coordinates, the
local
- // ViewInformation2D cannot directly be used, but needs to be kept
up to date
- basegfx::B2DHomMatrix maCurrentTransformation;
-
- // SvtOptionsDrawinglayer incarnation to react on diverse settings
- const SvtOptionsDrawinglayer maDrawinglayerOpt;
-
- protected:
-
//////////////////////////////////////////////////////////////////////////////
- // tooling
- void pushGraphics(Gdiplus::Graphics& rNew);
- void popGraphics();
Gdiplus::Graphics& getGraphics() const { OSL_ENSURE(0 !=
mpGraphics, "0 == mpGraphics (!)"); return *mpGraphics; }
// access to transformation stack
Modified:
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
---
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
(original)
+++
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
Wed May 8 17:00:00 2013
@@ -93,10 +93,19 @@ namespace drawinglayer
VclPixelProcessor2D::~VclPixelProcessor2D()
{
// restore MapMode
- getOutputDevice().Pop();
+ OutputDevice* pOriginalDevice = getInitialOutputDevice();
- // restore AntiAliasing
-
getOutputDevice().SetAntialiasing(getOutputDevice().GetAntialiasing() &
~ANTIALIASING_ENABLE_B2DDRAW);
+ if(pOriginalDevice)
+ {
+ pOriginalDevice->Pop();
+
+ // restore AntiAliasing
+
pOriginalDevice->SetAntialiasing(getOutputDevice().GetAntialiasing() &
~ANTIALIASING_ENABLE_B2DDRAW);
+ }
+ else
+ {
+ OSL_ENSURE(false, "OOps, no initial OutputDevice (!)");
+ }
}
void VclPixelProcessor2D::processBasePrimitive2D(const
primitive2d::BasePrimitive2D& rCandidate)
Modified:
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
---
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx
(original)
+++
openoffice/branches/alg/sysdepgs/main/drawinglayer/source/processor2d/win_pixelprocessor2d.cxx
Wed May 8 17:00:00 2013
@@ -68,6 +68,20 @@ namespace
rGraphics.SetTransform(&aMatrix);
}
+
+ bool isVisible(Gdiplus::Graphics& rGraphics, const basegfx::B2DRange&
rRange)
+ {
+ if(rRange.isEmpty())
+ {
+ return false;
+ }
+
+ return rGraphics.IsVisible(
+ Gdiplus::REAL(rRange.getMinX()),
+ Gdiplus::REAL(rRange.getMinY()),
+ Gdiplus::REAL(rRange.getWidth()),
+ Gdiplus::REAL(rRange.getHeight()));
+ }
} // end of anonymous namespace
//////////////////////////////////////////////////////////////////////////////
@@ -82,7 +96,6 @@ namespace drawinglayer
: BaseProcessor2D(rViewInformation),
mrOutDev(rOutDev),
mpGraphics(0),
- maGraphics(),
maBColorModifierStack(),
maCurrentTransformation(),
maDrawinglayerOpt()
@@ -126,17 +139,14 @@ namespace drawinglayer
// create Gdiplus::Graphics entry for new OutputDevice
SystemGraphicsData
aSystemGraphicsData(mrOutDev.GetSystemGfxData());
- Gdiplus::Graphics* pGraphics = new
Gdiplus::Graphics(aSystemGraphicsData.hDC);
-
- pushGraphics(*pGraphics);
+ mpGraphics = new Gdiplus::Graphics(aSystemGraphicsData.hDC);
setAntialiasing(getGraphics(),
getOptionsDrawinglayer().IsAntiAliasing());
setMatrix(getGraphics(), getCurrentTransformation());
}
Win_PixelProcessor2D::~Win_PixelProcessor2D()
{
- popGraphics();
- OSL_ENSURE(maGraphics.empty(), "Mismatch in push/popGraphics (!)");
+ delete mpGraphics;
// restore MapMode
mrOutDev.Pop();
@@ -145,26 +155,6 @@ namespace drawinglayer
mrOutDev.SetAntialiasing(mrOutDev.GetAntialiasing() &
~ANTIALIASING_ENABLE_B2DDRAW);
}
- void Win_PixelProcessor2D::pushGraphics(Gdiplus::Graphics& rNew)
- {
- maGraphics.push_back(&rNew);
- mpGraphics = &rNew;
- }
-
- void Win_PixelProcessor2D::popGraphics()
- {
- if(maGraphics.empty())
- {
- OSL_ENSURE(false, "OOps, push/popGraphics mismatch (!)");
- }
- else
- {
- delete mpGraphics;
- mpGraphics = maGraphics.back();
- maGraphics.pop_back();
- }
- }
-
void Win_PixelProcessor2D::processBasePrimitive2D(const
primitive2d::BasePrimitive2D& rCandidate)
{
switch(rCandidate.getPrimitive2DID())
@@ -177,35 +167,40 @@ namespace drawinglayer
if(!rBitmapEx.IsEmpty())
{
- const boost::shared_ptr< Gdiplus::Bitmap >
aBitmap(getBufferedGdiPlusBitmapFromBitmapEx(rBitmapEx));
+ const basegfx::B2DRange
aRange(rBitmapPrimitive2D.getB2DRange(getViewInformation2D()));
- if(aBitmap.get())
+ if(isVisible(getGraphics(), aRange))
{
- const basegfx::B2DHomMatrix
aCurrent(getCurrentTransformation() * rBitmapPrimitive2D.getTransform());
- Gdiplus::PointF aDestPoints[3];
- Gdiplus::ImageAttributes aAttributes;
-
- setMatrix(getGraphics(), aCurrent);
- aDestPoints[0].X = Gdiplus::REAL(0.0);
- aDestPoints[0].Y = Gdiplus::REAL(0.0);
- aDestPoints[1].X = Gdiplus::REAL(1.0);
- aDestPoints[1].Y = Gdiplus::REAL(0.0);
- aDestPoints[2].X = Gdiplus::REAL(0.0);
- aDestPoints[2].Y = Gdiplus::REAL(1.0);
-
aAttributes.SetWrapMode(Gdiplus::WrapModeTileFlipXY);
- getGraphics().DrawImage(
- aBitmap.get(),
- aDestPoints,
- 3,
- Gdiplus::REAL(0.0),
- Gdiplus::REAL(0.0),
- Gdiplus::REAL(aBitmap->GetWidth()),
- Gdiplus::REAL(aBitmap->GetHeight()),
- Gdiplus::UnitPixel,
- &aAttributes,
- 0,
- 0);
- setMatrix(getGraphics(),
getCurrentTransformation());
+ const boost::shared_ptr< Gdiplus::Bitmap >
aBitmap(getBufferedGdiPlusBitmapFromBitmapEx(rBitmapEx));
+
+ if(aBitmap.get())
+ {
+ const basegfx::B2DHomMatrix
aCurrent(getCurrentTransformation() * rBitmapPrimitive2D.getTransform());
+ Gdiplus::PointF aDestPoints[3];
+ Gdiplus::ImageAttributes aAttributes;
+
+ setMatrix(getGraphics(), aCurrent);
+ aDestPoints[0].X = Gdiplus::REAL(0.0);
+ aDestPoints[0].Y = Gdiplus::REAL(0.0);
+ aDestPoints[1].X = Gdiplus::REAL(1.0);
+ aDestPoints[1].Y = Gdiplus::REAL(0.0);
+ aDestPoints[2].X = Gdiplus::REAL(0.0);
+ aDestPoints[2].Y = Gdiplus::REAL(1.0);
+
aAttributes.SetWrapMode(Gdiplus::WrapModeTileFlipXY);
+ getGraphics().DrawImage(
+ aBitmap.get(),
+ aDestPoints,
+ 3,
+ Gdiplus::REAL(0.0),
+ Gdiplus::REAL(0.0),
+ Gdiplus::REAL(aBitmap->GetWidth()),
+ Gdiplus::REAL(aBitmap->GetHeight()),
+ Gdiplus::UnitPixel,
+ &aAttributes,
+ 0,
+ 0);
+ setMatrix(getGraphics(),
getCurrentTransformation());
+ }
}
}
@@ -214,6 +209,12 @@ namespace drawinglayer
case PRIMITIVE2D_ID_POINTARRAYPRIMITIVE2D:
{
const primitive2d::PointArrayPrimitive2D&
rPointArrayPrimitive2D = static_cast< const primitive2d::PointArrayPrimitive2D&
>(rCandidate);
+ const basegfx::B2DRange
aRange(rPointArrayPrimitive2D.getB2DRange(getViewInformation2D()));
+
+ if(isVisible(getGraphics(), aRange))
+ {
+ }
+
break;
}
case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D:
@@ -223,15 +224,20 @@ namespace drawinglayer
if(rPolygon.count())
{
- const boost::shared_ptr< Gdiplus::GraphicsPath >
aPath(getBufferedGdiPlusGraphicsPathFromB2DPolygon(rPolygon));
+ const basegfx::B2DRange
aRange(rPolygonHairlinePrimitive2D.getB2DRange(getViewInformation2D()));
- if(aPath.get())
+ if(isVisible(getGraphics(), aRange))
{
- const basegfx::BColor
aBColor(getBColorModifierStack().getModifiedColor(rPolygonHairlinePrimitive2D.getBColor()));
- const Gdiplus::Color aColor(BYTE(aBColor.getRed()
* 255.0), BYTE(aBColor.getGreen() * 255.0), BYTE(aBColor.getBlue() * 255.0));
- const Gdiplus::Pen aPen(aColor, 1.0);
+ const boost::shared_ptr< Gdiplus::GraphicsPath >
aPath(getBufferedGdiPlusGraphicsPathFromB2DPolygon(rPolygon));
- getGraphics().DrawPath(&aPen, aPath.get());
+ if(aPath.get())
+ {
+ const basegfx::BColor
aBColor(getBColorModifierStack().getModifiedColor(rPolygonHairlinePrimitive2D.getBColor()));
+ const Gdiplus::Color
aColor(BYTE(aBColor.getRed() * 255.0), BYTE(aBColor.getGreen() * 255.0),
BYTE(aBColor.getBlue() * 255.0));
+ const Gdiplus::Pen aPen(aColor, 1.0);
+
+ getGraphics().DrawPath(&aPen, aPath.get());
+ }
}
}
@@ -244,15 +250,20 @@ namespace drawinglayer
if(rPolyPolygon.count())
{
- const boost::shared_ptr< Gdiplus::GraphicsPath >
aPath(getBufferedGdiPlusGraphicsPathFromB2DPolyPolygon(rPolyPolygon));
+ const basegfx::B2DRange
aRange(rPolyPolygonColorPrimitive2D.getB2DRange(getViewInformation2D()));
- if(aPath.get())
+ if(isVisible(getGraphics(), aRange))
{
- const basegfx::BColor
aBColor(getBColorModifierStack().getModifiedColor(rPolyPolygonColorPrimitive2D.getBColor()));
- const Gdiplus::Color aColor(BYTE(aBColor.getRed()
* 255.0), BYTE(aBColor.getGreen() * 255.0), BYTE(aBColor.getBlue() * 255.0));
- const Gdiplus::SolidBrush aBrush(aColor);
+ const boost::shared_ptr< Gdiplus::GraphicsPath >
aPath(getBufferedGdiPlusGraphicsPathFromB2DPolyPolygon(rPolyPolygon));
+
+ if(aPath.get())
+ {
+ const basegfx::BColor
aBColor(getBColorModifierStack().getModifiedColor(rPolyPolygonColorPrimitive2D.getBColor()));
+ const Gdiplus::Color
aColor(BYTE(aBColor.getRed() * 255.0), BYTE(aBColor.getGreen() * 255.0),
BYTE(aBColor.getBlue() * 255.0));
+ const Gdiplus::SolidBrush aBrush(aColor);
- getGraphics().FillPath(&aBrush, aPath.get());
+ getGraphics().FillPath(&aBrush, aPath.get());
+ }
}
}
break;
@@ -262,16 +273,218 @@ namespace drawinglayer
case PRIMITIVE2D_ID_TRANSPARENCEPRIMITIVE2D:
{
const primitive2d::TransparencePrimitive2D&
rTransparencePrimitive2D = static_cast< const
primitive2d::TransparencePrimitive2D& >(rCandidate);
+
+
if(rTransparencePrimitive2D.getTransparence().hasElements())
+ {
+ basegfx::B2DRange
aRange(rTransparencePrimitive2D.getB2DRange(getViewInformation2D()));
+
+ if(isVisible(getGraphics(), aRange))
+ {
+ const sal_uInt32
nFullWidth(mrOutDev.GetOutputSizePixel().Width());
+ const sal_uInt32
nFullHeight(mrOutDev.GetOutputSizePixel().Height());
+
+ aRange.transform(getCurrentTransformation());
+ aRange.intersect(basegfx::B2DRange(0.0, 0.0,
nFullWidth, nFullHeight));
+
+ if(!aRange.isEmpty())
+ {
+ // prepare bitmap and graphics for child
content
+ const sal_uInt32
nLeft(floor(aRange.getMinX()));
+ const sal_uInt32 nTop(floor(aRange.getMinY()));
+ const sal_uInt32
nRight(ceil(aRange.getMaxX()));
+ const sal_uInt32
nBottom(ceil(aRange.getMaxY()));
+ const sal_uInt32 nWidth(nRight - nLeft);
+ const sal_uInt32 nHeight(nBottom - nTop);
+ Gdiplus::Bitmap aBitmap(nWidth, nHeight,
PixelFormat32bppRGB);
+ Gdiplus::Graphics aBitmapGraphics(&aBitmap);
+
+ // create new transformation
+ const basegfx::B2DHomMatrix
aLastCurrentTransformation(getCurrentTransformation());
+ basegfx::B2DHomMatrix
aNewTransformation(aLastCurrentTransformation);
+ aNewTransformation.translate(nLeft * -1.0,
nTop * -1.0);
+ setCurrentTransformation(aNewTransformation);
+
+ // set clipping, AntiAliasing and
transformation
+ aBitmapGraphics.SetClip(&getGraphics(),
Gdiplus::CombineModeReplace);
+ setAntialiasing(aBitmapGraphics,
getOptionsDrawinglayer().IsAntiAliasing());
+ setMatrix(aBitmapGraphics,
getCurrentTransformation());
+
+ // make the Bitmap the graphics target
+ Gdiplus::Graphics* pOriginal = mpGraphics;
+ mpGraphics = &aBitmapGraphics;
+
+ // do process children
+
process(rTransparencePrimitive2D.getChildren());
+
+ // restore last target
+ mpGraphics = pOriginal;
+
+ // create bitmap and graphics for alpha
+ Gdiplus::Bitmap aAlphaBitmap(nWidth, nHeight,
PixelFormat32bppRGB);
+ Gdiplus::Graphics
aAlphaBitmapGraphics(&aAlphaBitmap);
+
+ // set clipping, AntiAliasing and
transformation
+ aAlphaBitmapGraphics.SetClip(&getGraphics(),
Gdiplus::CombineModeReplace);
+ setAntialiasing(aAlphaBitmapGraphics,
getOptionsDrawinglayer().IsAntiAliasing());
+ setMatrix(aAlphaBitmapGraphics,
getCurrentTransformation());
+
+ // make the Bitmap the graphics target
+ mpGraphics = &aAlphaBitmapGraphics;
+
+ // activate gray mode
+ //const basegfx::BColorModifier aGrayModifier(
+ // basegfx::BColor(),
+ // 0.5,
+ // basegfx::BCOLORMODIFYMODE_GRAY);
+ //getBColorModifierStack().push(aGrayModifier);
+
+ // do process children
+
process(rTransparencePrimitive2D.getTransparence());
+
+ // deactivate gray mode
+ //getBColorModifierStack().pop();
+
+ // restore last target
+ mpGraphics = pOriginal;
+
+ // restore transformations
+
setCurrentTransformation(aLastCurrentTransformation);
+
+ if(false)
+ {
+ // flush to ensure results
+
aBitmapGraphics.Flush(Gdiplus::FlushIntentionSync);
+
aAlphaBitmapGraphics.Flush(Gdiplus::FlushIntentionSync);
+
+ // copy aAlphaBitmap content as alpha to
aBitmapGraphics
+ Gdiplus::ImageAttributes aImageAttributes;
+ const Gdiplus::REAL aWeight(1.0f / 3.0f);
+ const Gdiplus::ColorMatrix colorMatrix = {
+ 0.0f, 0.0f, 0.0f, aWeight, 0.0f,
+ 0.0f, 0.0f, 0.0f, aWeight, 0.0f,
+ 0.0f, 0.0f, 0.0f, aWeight, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 0.0f, 1.0f};
+
+ aImageAttributes.SetColorMatrix(
+ &colorMatrix,
+ Gdiplus::ColorMatrixFlagsDefault,
+ Gdiplus::ColorAdjustTypeDefault);
+ setMatrix(aBitmapGraphics,
basegfx::B2DHomMatrix());
+
aBitmapGraphics.SetCompositingMode(Gdiplus::CompositingModeSourceCopy);
+ aBitmapGraphics.DrawImage(
+ &aAlphaBitmap,
+ Gdiplus::Rect(0, 0, nWidth, nHeight),
+ 0, 0, nWidth, nHeight,
+ Gdiplus::UnitPixel,
+ &aImageAttributes);
+ }
+ else
+ {
+ // mix aAlphaBitmap's colors as alpha
channel to aBitmap
+ Gdiplus::Color aColor;
+ Gdiplus::Color aAlphaColor;
+ static bool bDoCopy(true);
+
+ if(bDoCopy)
+ {
+ for(INT y(0); y < nHeight; y++)
+ {
+ for(INT x(0); x < nWidth; x++)
+ {
+ aBitmap.GetPixel(x, y,
&aColor);
+ //const sal_uInt16
aAlphaA(aColor.GetAlpha());
+ //
+ //if(aAlphaA)
+ //{
+ aAlphaBitmap.GetPixel(x,
y, &aAlphaColor);
+ sal_uInt16 aAlpha((
+ (aAlphaColor.GetRed()
* 77) +
+
(aAlphaColor.GetGreen() * 151) +
+ (aAlphaColor.GetBlue()
* 28)) >> 8);
+
+ // if(0xff != aAlphaA)
+ // {
+ // aAlpha = 256 -
(((256 - aAlpha) * (256 - aAlphaA)) >> 8);
+ // }
+
+ aBitmap.SetPixel(
+ x,
+ y,
+ Gdiplus::Color(
+ aAlpha,
+ aColor.GetRed(),
+ aColor.GetGreen(),
+ aColor.GetBlue()));
+ //}
+ }
+ }
+ }
+ }
+
+ // copy content
+ setMatrix(getGraphics(),
basegfx::B2DHomMatrix());
+ getGraphics().DrawImage(
+ &aBitmap,
+ INT(nLeft),
+ INT(nTop),
+ INT(aBitmap.GetWidth()),
+ INT(aBitmap.GetHeight()));
+ setMatrix(getGraphics(),
getCurrentTransformation());
+ }
+ }
+ }
+
break;
}
case PRIMITIVE2D_ID_INVERTPRIMITIVE2D:
{
const primitive2d::InvertPrimitive2D& rInvertPrimitive2D =
static_cast< const primitive2d::InvertPrimitive2D& >(rCandidate);
+ basegfx::B2DRange
aRange(rInvertPrimitive2D.getB2DRange(getViewInformation2D()));
+
+ if(isVisible(getGraphics(), aRange))
+ {
+ aRange.transform(getCurrentTransformation());
+ }
+
break;
}
case PRIMITIVE2D_ID_MASKPRIMITIVE2D:
{
const primitive2d::MaskPrimitive2D& rMaskPrimitive2D =
static_cast< const primitive2d::MaskPrimitive2D& >(rCandidate);
+
+ if(rMaskPrimitive2D.getChildren().hasElements())
+ {
+ const basegfx::B2DPolyPolygon& rMask =
rMaskPrimitive2D.getMask();
+
+ if(rMask.count())
+ {
+ const basegfx::B2DRange
aRange(rMaskPrimitive2D.getB2DRange(getViewInformation2D()));
+
+ if(isVisible(getGraphics(), aRange))
+ {
+ const boost::shared_ptr< Gdiplus::GraphicsPath
> aMaskPath(getBufferedGdiPlusGraphicsPathFromB2DPolyPolygon(rMask));
+
+ if(aMaskPath.get())
+ {
+ // save current clip region
+ const Gdiplus::GraphicsState aState =
getGraphics().Save();
+
+ // add clip to current
+ getGraphics().SetClip(
+ aMaskPath.get(),
+ Gdiplus::CombineModeIntersect);
+
+ // do process children
+ process(rMaskPrimitive2D.getChildren());
+
+ // restore clip region
+ getGraphics().Restore(aState);
+ }
+ }
+ }
+ }
+
break;
}
case PRIMITIVE2D_ID_MODIFIEDCOLORPRIMITIVE2D:
Modified:
openoffice/branches/alg/sysdepgs/main/vcl/inc/win/gdiplusobjectbuffer.hxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/vcl/inc/win/gdiplusobjectbuffer.hxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/vcl/inc/win/gdiplusobjectbuffer.hxx
(original)
+++ openoffice/branches/alg/sysdepgs/main/vcl/inc/win/gdiplusobjectbuffer.hxx
Wed May 8 17:00:00 2013
@@ -44,9 +44,11 @@ namespace basegfx
class WinSalBitmap;
//////////////////////////////////////////////////////////////////////////////
-// Helper class to manage Gdiplus::Bitmap instances created from WinSalBitmap
+// Helper class to manage Gdiplus::Bitmap instances created from WinSalBitmap,
+// and Gdiplus::GraphicsPath instances created from basegfx::B2DPolygon or
+// basegfx::B2DPolyPolygon
-class GdiPlusObjectBuffer : public basegfx::cache::cmanager, public Timer
+class GdiPlusObjectBuffer : public basegfx::cache::manager, public Timer
{
private:
protected:
Modified:
openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx
URL:
http://svn.apache.org/viewvc/openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx?rev=1480354&r1=1480353&r2=1480354&view=diff
==============================================================================
--- openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx
(original)
+++ openoffice/branches/alg/sysdepgs/main/vcl/win/source/gdi/salgdi_gdiplus.cxx
Wed May 8 17:00:00 2013
@@ -59,13 +59,15 @@
#include <impbmp.hxx>
//////////////////////////////////////////////////////////////////////////////
-
+// cached entry for a Gdiplus::Bitmap which may be constructed from a single
+// WinSalBitmap or two (when transparence is used). This class should only
+// be used by GdiPlusObjectBuffer
class GdiPlusBitmapBufferNode : public basegfx::cache::node
{
private:
boost::shared_ptr< Gdiplus::Bitmap > maGdiPlusBitmapPtr;
-protected:
+ // conversion helpers
Gdiplus::Bitmap* createGdiPlusBitmap(const WinSalBitmap& rBitmapSource);
Gdiplus::Bitmap* createGdiPlusBitmap(const WinSalBitmap& rBitmapSource,
const WinSalBitmap& rAlphaSource);
@@ -80,13 +82,15 @@ public:
};
//////////////////////////////////////////////////////////////////////////////
-
+// cached entry for Gdiplus::GraphicsPath which may be constructed from a
+// basegfx::B2DPolyPolygon or basegfx::B2DPolygon. This class should only
+// be used by GdiPlusObjectBuffer
class GdiPlusGraphicsPathBufferNode : public basegfx::cache::node
{
private:
boost::shared_ptr< Gdiplus::GraphicsPath > maGdiPlusGraphicsPathPtr;
-protected:
+ // conversion helpers
Gdiplus::GraphicsPath* createGdiPlusGraphicsPath(const
basegfx::B2DPolygon& rSource);
Gdiplus::GraphicsPath* createGdiPlusGraphicsPath(const
basegfx::B2DPolyPolygon& rSource);
@@ -105,7 +109,7 @@ public:
//////////////////////////////////////////////////////////////////////////////
GdiPlusObjectBuffer::GdiPlusObjectBuffer()
-: basegfx::cache::cmanager(30), // keep for 30 seconds
+: basegfx::cache::manager(30), // keep for 30 lifetime rounds
Timer()
{
SetTimeout(1000); // one second
@@ -198,7 +202,10 @@ void GdiPlusObjectBuffer::onFilled()
void GdiPlusObjectBuffer::Timeout()
{
- trigger();
+ if(!empty())
+ {
+ trigger();
+ }
if(!empty())
{