split CreateVirtualDevice into two methods
because I need to make it more complicated in an upcoming patch, and this is already complicated. Change-Id: I920adc8729e53672a370c9778aa2b8a6b907ad50 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181046 Tested-by: Jenkins Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
This commit is contained in:
committed by
Noel Grandin
parent
9179d008ab
commit
a46c265051
@@ -197,10 +197,22 @@ void SvpSalInstance::DestroyObject( SalObject* pObject )
|
||||
|
||||
#ifndef IOS
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> SvpSalInstance::CreateVirtualDevice(SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat /*eFormat*/)
|
||||
{
|
||||
SvpSalGraphics *pSvpSalGraphics = dynamic_cast<SvpSalGraphics*>(&rGraphics);
|
||||
assert(pSvpSalGraphics);
|
||||
std::unique_ptr<SalVirtualDevice> xNew(new SvpSalVirtualDevice(pSvpSalGraphics->getSurface(), /*pPreExistingTarget*/nullptr));
|
||||
if (!xNew->SetSize(nDX, nDY))
|
||||
xNew.reset();
|
||||
return xNew;
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> SvpSalInstance::CreateVirtualDevice(SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/,
|
||||
const SystemGraphicsData* pGd)
|
||||
const SystemGraphicsData& rGd)
|
||||
{
|
||||
SvpSalGraphics *pSvpSalGraphics = dynamic_cast<SvpSalGraphics*>(&rGraphics);
|
||||
assert(pSvpSalGraphics);
|
||||
@@ -208,10 +220,10 @@ std::unique_ptr<SalVirtualDevice> SvpSalInstance::CreateVirtualDevice(SalGraphic
|
||||
// tdf#127529 normally pPreExistingTarget is null and we are a true virtualdevice drawing to a backing buffer.
|
||||
// Occasionally, for canvas/slideshow, pPreExistingTarget is pre-provided as a hack to use the vcl drawing
|
||||
// apis to render onto a preexisting cairo surface. The necessity for that precedes the use of cairo in vcl proper
|
||||
cairo_surface_t* pPreExistingTarget = pGd ? static_cast<cairo_surface_t*>(pGd->pSurface) : nullptr;
|
||||
cairo_surface_t* pPreExistingTarget = static_cast<cairo_surface_t*>(rGd.pSurface);
|
||||
#else
|
||||
//ANDROID case
|
||||
(void)pGd;
|
||||
(void)rGd;
|
||||
cairo_surface_t* pPreExistingTarget = nullptr;
|
||||
#endif
|
||||
std::unique_ptr<SalVirtualDevice> xNew(new SvpSalVirtualDevice(pSvpSalGraphics->getSurface(), pPreExistingTarget));
|
||||
|
||||
@@ -136,12 +136,19 @@ public:
|
||||
|
||||
// VirtualDevice
|
||||
// nDX and nDY in Pixel
|
||||
// nBitCount: 0 == Default(=as window) / 1 == Mono
|
||||
SAL_DLLPRIVATE virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat ) override;
|
||||
|
||||
// VirtualDevice
|
||||
// nDX and nDY in Pixel
|
||||
// pData allows for using a system dependent graphics or device context
|
||||
SAL_DLLPRIVATE virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr ) override;
|
||||
DeviceFormat eFormat,
|
||||
const SystemGraphicsData& rData ) override;
|
||||
|
||||
// Printer
|
||||
// pSetupData->mpDriverData can be 0
|
||||
|
||||
@@ -106,11 +106,15 @@ public:
|
||||
virtual SalObject* CreateObject( SalFrame* pParent, SystemWindowData* pWindowData,
|
||||
bool bShow ) override;
|
||||
virtual void DestroyObject( SalObject* pObject ) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat ) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat,
|
||||
const SystemGraphicsData *pData = nullptr ) override;
|
||||
const SystemGraphicsData& rData ) override;
|
||||
virtual SalInfoPrinter* CreateInfoPrinter( SalPrinterQueueInfo* pQueueInfo,
|
||||
ImplJobSetup* pSetupData ) override;
|
||||
virtual void DestroyInfoPrinter( SalInfoPrinter* pPrinter ) override;
|
||||
|
||||
@@ -124,9 +124,13 @@ public:
|
||||
bool bShow) override;
|
||||
virtual void DestroyObject(SalObject* pObject) override;
|
||||
|
||||
virtual std::unique_ptr<SalVirtualDevice> CreateVirtualDevice(SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat) override;
|
||||
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice(SalGraphics& rGraphics, tools::Long& nDX, tools::Long& nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData* pData = nullptr) override;
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData) override;
|
||||
|
||||
virtual SalInfoPrinter* CreateInfoPrinter(SalPrinterQueueInfo* pQueueInfo,
|
||||
ImplJobSetup* pSetupData) override;
|
||||
|
||||
@@ -52,7 +52,8 @@ private:
|
||||
void Destroy();
|
||||
|
||||
public:
|
||||
AquaSalVirtualDevice( AquaSalGraphics* pGraphic, tools::Long &nDX, tools::Long &nDY, DeviceFormat eFormat, const SystemGraphicsData *pData );
|
||||
AquaSalVirtualDevice( AquaSalGraphics* pGraphic, tools::Long nDX, tools::Long nDY, DeviceFormat eFormat );
|
||||
AquaSalVirtualDevice( AquaSalGraphics* pGraphic, tools::Long &nDX, tools::Long &nDY, DeviceFormat eFormat, const SystemGraphicsData& rData );
|
||||
virtual ~AquaSalVirtualDevice() override;
|
||||
|
||||
virtual SalGraphics* AcquireGraphics() override;
|
||||
|
||||
+10
-2
@@ -106,14 +106,22 @@ public:
|
||||
|
||||
// VirtualDevice
|
||||
// nDX and nDY in pixels
|
||||
// nBitCount: 0 == default(=as window) / 1 == mono
|
||||
// pData allows for using a system dependent graphics or device context,
|
||||
// if a system context is passed in nDX and nDY are updated to reflect
|
||||
// its size; otherwise these remain unchanged.
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat ) = 0;
|
||||
|
||||
// VirtualDevice
|
||||
// nDX and nDY in pixels
|
||||
// pData allows for using a system dependent graphics or device context,
|
||||
// nDX and nDY are updated to reflect its size; otherwise these remain unchanged.
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &rDX, tools::Long &rDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr ) = 0;
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData ) = 0;
|
||||
|
||||
// Printer
|
||||
// pSetupData->mpDriverData can be 0
|
||||
|
||||
@@ -24,7 +24,9 @@ class X11SkiaSalVirtualDevice final : public SalVirtualDevice
|
||||
|
||||
public:
|
||||
X11SkiaSalVirtualDevice(const SalGraphics& rGraphics, tools::Long nDX, tools::Long nDY,
|
||||
const SystemGraphicsData* pData,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
X11SkiaSalVirtualDevice(const SalGraphics& rGraphics, tools::Long nDX, tools::Long nDY,
|
||||
const SystemGraphicsData& rData,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
virtual ~X11SkiaSalVirtualDevice() override;
|
||||
|
||||
|
||||
@@ -263,11 +263,15 @@ public:
|
||||
virtual std::unique_ptr<SalMenuItem> CreateMenuItem( const SalItemParams& ) override;
|
||||
virtual SalTimer* CreateSalTimer() override;
|
||||
virtual void AddToRecentDocumentList(const OUString& rFileUrl, const OUString& rMimeType, const OUString& rDocumentService) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics&,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat ) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics&,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat,
|
||||
const SystemGraphicsData* = nullptr ) override;
|
||||
const SystemGraphicsData& ) override;
|
||||
virtual std::shared_ptr<SalBitmap> CreateSalBitmap() override;
|
||||
|
||||
virtual bool DoYield(bool bWait, bool bHandleAllCurrentEvents) override;
|
||||
|
||||
@@ -50,13 +50,19 @@ public:
|
||||
virtual void DestroyObject( SalObject* pObject ) override;
|
||||
|
||||
/// Gtk vclplug needs to pass GtkSalGraphics to X11SalVirtualDevice, so create it, and pass as pNewGraphics.
|
||||
static std::unique_ptr<SalVirtualDevice> CreateX11VirtualDevice(const SalGraphics& rGraphics, tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat, std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
static std::unique_ptr<SalVirtualDevice> CreateX11VirtualDevice(const SalGraphics& rGraphics, tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData* pData, std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData, std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat ) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr ) override;
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData ) override;
|
||||
virtual void PostPrintersChanged() override;
|
||||
virtual std::unique_ptr<GenPspGraphics> CreatePrintGraphics() override;
|
||||
|
||||
|
||||
+3
-1
@@ -50,8 +50,10 @@ class X11SalVirtualDevice final : public SalVirtualDevice
|
||||
bool m_bOwnsSurface; // nearly always true, except for edge case of tdf#127529
|
||||
|
||||
public:
|
||||
X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat, std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData *pData, std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData, std::unique_ptr<X11SalGraphics> pNewGraphics);
|
||||
|
||||
virtual ~X11SalVirtualDevice() override;
|
||||
|
||||
|
||||
@@ -49,10 +49,14 @@ public:
|
||||
virtual void DestroyFrame( SalFrame* pFrame ) override;
|
||||
virtual SalObject* CreateObject( SalFrame* pParent, SystemWindowData* pWindowData, bool bShow ) override;
|
||||
virtual void DestroyObject( SalObject* pObject ) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat ) override;
|
||||
virtual std::unique_ptr<SalVirtualDevice>
|
||||
CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData *pData = nullptr ) override;
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData ) override;
|
||||
virtual SalInfoPrinter* CreateInfoPrinter( SalPrinterQueueInfo* pQueueInfo,
|
||||
ImplJobSetup* pSetupData ) override;
|
||||
virtual void DestroyInfoPrinter( SalInfoPrinter* pPrinter ) override;
|
||||
|
||||
+26
-5
@@ -388,17 +388,38 @@ void QtInstance::DestroyObject(SalObject* pObject)
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice>
|
||||
QtInstance::CreateVirtualDevice(SalGraphics& rGraphics, tools::Long& nDX, tools::Long& nDY,
|
||||
DeviceFormat /*eFormat*/, const SystemGraphicsData* pGd)
|
||||
std::unique_ptr<SalVirtualDevice> QtInstance::CreateVirtualDevice(SalGraphics& rGraphics,
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat /*eFormat*/)
|
||||
{
|
||||
if (m_bUseCairo)
|
||||
{
|
||||
SvpSalGraphics* pSvpSalGraphics = dynamic_cast<QtSvpGraphics*>(&rGraphics);
|
||||
assert(pSvpSalGraphics);
|
||||
// tdf#127529 see SvpSalInstance::CreateVirtualDevice for the rare case of a non-null pPreExistingTarget
|
||||
cairo_surface_t* pPreExistingTarget
|
||||
= pGd ? static_cast<cairo_surface_t*>(pGd->pSurface) : nullptr;
|
||||
std::unique_ptr<SalVirtualDevice> pVD(
|
||||
new QtSvpVirtualDevice(pSvpSalGraphics->getSurface(), /*pPreExistingTarget*/ nullptr));
|
||||
pVD->SetSize(nDX, nDY);
|
||||
return pVD;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::unique_ptr<SalVirtualDevice> pVD(new QtVirtualDevice(/*scale*/ 1));
|
||||
pVD->SetSize(nDX, nDY);
|
||||
return pVD;
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice>
|
||||
QtInstance::CreateVirtualDevice(SalGraphics& rGraphics, tools::Long& nDX, tools::Long& nDY,
|
||||
DeviceFormat /*eFormat*/, const SystemGraphicsData& rGd)
|
||||
{
|
||||
if (m_bUseCairo)
|
||||
{
|
||||
SvpSalGraphics* pSvpSalGraphics = dynamic_cast<QtSvpGraphics*>(&rGraphics);
|
||||
assert(pSvpSalGraphics);
|
||||
// tdf#127529 see SvpSalInstance::CreateVirtualDevice for the rare case of a non-null pPreExistingTarget
|
||||
cairo_surface_t* pPreExistingTarget = static_cast<cairo_surface_t*>(rGd.pSurface);
|
||||
std::unique_ptr<SalVirtualDevice> pVD(
|
||||
new QtSvpVirtualDevice(pSvpSalGraphics->getSurface(), pPreExistingTarget));
|
||||
pVD->SetSize(nDX, nDY);
|
||||
|
||||
+99
-81
@@ -38,34 +38,87 @@
|
||||
#include <quartz/utils.h>
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> AquaSalInstance::CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat,
|
||||
const SystemGraphicsData *pData )
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat )
|
||||
{
|
||||
// #i92075# can be called first in a thread
|
||||
SalData::ensureThreadAutoreleasePool();
|
||||
|
||||
#ifdef IOS
|
||||
if( pData )
|
||||
{
|
||||
return std::unique_ptr<SalVirtualDevice>(new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >(&rGraphics),
|
||||
nDX, nDY, eFormat, pData ));
|
||||
}
|
||||
else
|
||||
{
|
||||
std::unique_ptr<SalVirtualDevice> pNew(new AquaSalVirtualDevice( NULL, nDX, nDY, eFormat, NULL ));
|
||||
pNew->SetSize( nDX, nDY );
|
||||
return pNew;
|
||||
}
|
||||
std::unique_ptr<SalVirtualDevice> pNew(new AquaSalVirtualDevice( NULL, nDX, nDY, eFormat, NULL ));
|
||||
pNew->SetSize( nDX, nDY );
|
||||
return pNew;
|
||||
#else
|
||||
return std::unique_ptr<SalVirtualDevice>(new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >(&rGraphics),
|
||||
nDX, nDY, eFormat, pData ));
|
||||
nDX, nDY, eFormat ));
|
||||
#endif
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> AquaSalInstance::CreateVirtualDevice( SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat,
|
||||
const SystemGraphicsData& rData )
|
||||
{
|
||||
// #i92075# can be called first in a thread
|
||||
SalData::ensureThreadAutoreleasePool();
|
||||
|
||||
#ifdef IOS
|
||||
return std::unique_ptr<SalVirtualDevice>(new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >(&rGraphics),
|
||||
nDX, nDY, eFormat, rData ));
|
||||
#else
|
||||
return std::unique_ptr<SalVirtualDevice>(new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >(&rGraphics),
|
||||
nDX, nDY, eFormat, rData ));
|
||||
#endif
|
||||
}
|
||||
|
||||
AquaSalVirtualDevice::AquaSalVirtualDevice(
|
||||
AquaSalGraphics* pGraphic, tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat eFormat )
|
||||
: mbGraphicsUsed( false )
|
||||
, mnBitmapDepth( 0 )
|
||||
, mnWidth(0)
|
||||
, mnHeight(0)
|
||||
{
|
||||
SAL_INFO( "vcl.virdev", "AquaSalVirtualDevice::AquaSalVirtualDevice() this=" << this
|
||||
<< " size=(" << nDX << "x" << nDY << ") bitcount=" << static_cast<int>(eFormat) );
|
||||
|
||||
// create empty new virtual device
|
||||
|
||||
mbForeignContext = false; // the mxContext is created within VCL
|
||||
mpGraphics = new AquaSalGraphics(); // never fails
|
||||
switch (eFormat)
|
||||
{
|
||||
#ifdef IOS
|
||||
case DeviceFormat::GRAYSCALE:
|
||||
mnBitmapDepth = 8;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
mnBitmapDepth = 0;
|
||||
break;
|
||||
}
|
||||
#ifdef MACOSX
|
||||
// inherit resolution from reference device
|
||||
if( pGraphic )
|
||||
{
|
||||
AquaSalFrame* pFrame = pGraphic->getGraphicsFrame();
|
||||
if( pFrame && AquaSalFrame::isAlive( pFrame ) )
|
||||
{
|
||||
mpGraphics->setGraphicsFrame( pFrame );
|
||||
mpGraphics->copyResolution( *pGraphic );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if( nDX && nDY )
|
||||
{
|
||||
SetSize( nDX, nDY );
|
||||
}
|
||||
// NOTE: if SetSize does not succeed, we just ignore the nDX and nDY
|
||||
}
|
||||
|
||||
AquaSalVirtualDevice::AquaSalVirtualDevice(
|
||||
AquaSalGraphics* pGraphic, tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat eFormat, const SystemGraphicsData *pData )
|
||||
DeviceFormat eFormat, const SystemGraphicsData& rData )
|
||||
: mbGraphicsUsed( false )
|
||||
, mnBitmapDepth( 0 )
|
||||
, mnWidth(0)
|
||||
@@ -73,77 +126,42 @@ AquaSalVirtualDevice::AquaSalVirtualDevice(
|
||||
{
|
||||
SAL_INFO( "vcl.virdev", "AquaSalVirtualDevice::AquaSalVirtualDevice() this=" << this
|
||||
<< " size=(" << nDX << "x" << nDY << ") bitcount=" << static_cast<int>(eFormat) <<
|
||||
" pData=" << pData << " context=" << (pData ? pData->rCGContext : nullptr) );
|
||||
" rData=" << &rData << " context=" << rData.rCGContext );
|
||||
|
||||
if( pGraphic && pData && pData->rCGContext )
|
||||
assert(pGraphic);
|
||||
assert(rData.rCGContext);
|
||||
|
||||
// Create virtual device based on existing SystemGraphicsData
|
||||
// We ignore nDx and nDY, as the desired size comes from the SystemGraphicsData.
|
||||
// the mxContext is from pData (what "mxContext"? there is no such field anywhere in vcl;)
|
||||
mbForeignContext = true;
|
||||
mpGraphics = new AquaSalGraphics( /*pGraphic*/ );
|
||||
if (nDX == 0)
|
||||
{
|
||||
// Create virtual device based on existing SystemGraphicsData
|
||||
// We ignore nDx and nDY, as the desired size comes from the SystemGraphicsData.
|
||||
// the mxContext is from pData (what "mxContext"? there is no such field anywhere in vcl;)
|
||||
mbForeignContext = true;
|
||||
mpGraphics = new AquaSalGraphics( /*pGraphic*/ );
|
||||
if (nDX == 0)
|
||||
{
|
||||
nDX = 1;
|
||||
}
|
||||
if (nDY == 0)
|
||||
{
|
||||
nDY = 1;
|
||||
}
|
||||
maLayer.set(CGLayerCreateWithContext(pData->rCGContext, CGSizeMake(nDX, nDY), nullptr));
|
||||
// Interrogate the context as to its real size
|
||||
if (maLayer.isSet())
|
||||
{
|
||||
const CGSize aSize = CGLayerGetSize(maLayer.get());
|
||||
nDX = static_cast<tools::Long>(aSize.width);
|
||||
nDY = static_cast<tools::Long>(aSize.height);
|
||||
}
|
||||
else
|
||||
{
|
||||
nDX = 0;
|
||||
nDY = 0;
|
||||
}
|
||||
|
||||
mpGraphics->SetVirDevGraphics(this, maLayer, pData->rCGContext);
|
||||
|
||||
SAL_INFO("vcl.virdev", "AquaSalVirtualDevice::AquaSalVirtualDevice() this=" << this <<
|
||||
" (" << nDX << "x" << nDY << ") mbForeignContext=" << (mbForeignContext ? "YES" : "NO"));
|
||||
|
||||
nDX = 1;
|
||||
}
|
||||
if (nDY == 0)
|
||||
{
|
||||
nDY = 1;
|
||||
}
|
||||
maLayer.set(CGLayerCreateWithContext(rData.rCGContext, CGSizeMake(nDX, nDY), nullptr));
|
||||
// Interrogate the context as to its real size
|
||||
if (maLayer.isSet())
|
||||
{
|
||||
const CGSize aSize = CGLayerGetSize(maLayer.get());
|
||||
nDX = static_cast<tools::Long>(aSize.width);
|
||||
nDY = static_cast<tools::Long>(aSize.height);
|
||||
}
|
||||
else
|
||||
{
|
||||
// create empty new virtual device
|
||||
mbForeignContext = false; // the mxContext is created within VCL
|
||||
mpGraphics = new AquaSalGraphics(); // never fails
|
||||
switch (eFormat)
|
||||
{
|
||||
#ifdef IOS
|
||||
case DeviceFormat::GRAYSCALE:
|
||||
mnBitmapDepth = 8;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
mnBitmapDepth = 0;
|
||||
break;
|
||||
}
|
||||
#ifdef MACOSX
|
||||
// inherit resolution from reference device
|
||||
if( pGraphic )
|
||||
{
|
||||
AquaSalFrame* pFrame = pGraphic->getGraphicsFrame();
|
||||
if( pFrame && AquaSalFrame::isAlive( pFrame ) )
|
||||
{
|
||||
mpGraphics->setGraphicsFrame( pFrame );
|
||||
mpGraphics->copyResolution( *pGraphic );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if( nDX && nDY )
|
||||
{
|
||||
SetSize( nDX, nDY );
|
||||
}
|
||||
// NOTE: if SetSize does not succeed, we just ignore the nDX and nDY
|
||||
nDX = 0;
|
||||
nDY = 0;
|
||||
}
|
||||
|
||||
mpGraphics->SetVirDevGraphics(this, maLayer, rData.rCGContext);
|
||||
|
||||
SAL_INFO("vcl.virdev", "AquaSalVirtualDevice::AquaSalVirtualDevice() this=" << this <<
|
||||
" (" << nDX << "x" << nDY << ") mbForeignContext=" << (mbForeignContext ? "YES" : "NO"));
|
||||
}
|
||||
|
||||
AquaSalVirtualDevice::~AquaSalVirtualDevice()
|
||||
|
||||
+17
-3
@@ -30,7 +30,7 @@ void X11SalGraphics::Init(X11SkiaSalVirtualDevice* pDevice)
|
||||
}
|
||||
|
||||
X11SkiaSalVirtualDevice::X11SkiaSalVirtualDevice(const SalGraphics& rGraphics, tools::Long nDX,
|
||||
tools::Long nDY, const SystemGraphicsData* pData,
|
||||
tools::Long nDY,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics)
|
||||
: mpGraphics(std::move(pNewGraphics))
|
||||
, mbGraphics(false)
|
||||
@@ -38,9 +38,23 @@ X11SkiaSalVirtualDevice::X11SkiaSalVirtualDevice(const SalGraphics& rGraphics, t
|
||||
{
|
||||
assert(mpGraphics);
|
||||
|
||||
mpDisplay = vcl_sal::getSalDisplay(GetGenericUnixSalData());
|
||||
mnXScreen = static_cast<const X11SalGraphics&>(rGraphics).GetScreenNumber();
|
||||
mnWidth = nDX;
|
||||
mnHeight = nDY;
|
||||
mpGraphics->Init(this);
|
||||
}
|
||||
|
||||
X11SkiaSalVirtualDevice::X11SkiaSalVirtualDevice(const SalGraphics& rGraphics, tools::Long nDX,
|
||||
tools::Long nDY,
|
||||
const SystemGraphicsData& /*rData*/,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics)
|
||||
: mpGraphics(std::move(pNewGraphics))
|
||||
, mbGraphics(false)
|
||||
, mnXScreen(0)
|
||||
{
|
||||
// TODO Check where a VirtualDevice is created from SystemGraphicsData
|
||||
assert(pData == nullptr);
|
||||
(void)pData;
|
||||
assert(false);
|
||||
|
||||
mpDisplay = vcl_sal::getSalDisplay(GetGenericUnixSalData());
|
||||
mnXScreen = static_cast<const X11SalGraphics&>(rGraphics).GetScreenNumber();
|
||||
|
||||
@@ -154,7 +154,12 @@ void VirtualDevice::ImplInitVirDev( const OutputDevice* pOutDev,
|
||||
(void)pOutDev->AcquireGraphics();
|
||||
pGraphics = pOutDev->mpGraphics;
|
||||
if ( pGraphics )
|
||||
mpVirDev = pSVData->mpDefInst->CreateVirtualDevice(*pGraphics, nDX, nDY, meFormatAndAlpha, pData);
|
||||
{
|
||||
if (pData)
|
||||
mpVirDev = pSVData->mpDefInst->CreateVirtualDevice(*pGraphics, nDX, nDY, meFormatAndAlpha, *pData);
|
||||
else
|
||||
mpVirDev = pSVData->mpDefInst->CreateVirtualDevice(*pGraphics, nDX, nDY, meFormatAndAlpha);
|
||||
}
|
||||
else
|
||||
mpVirDev = nullptr;
|
||||
if ( !mpVirDev )
|
||||
|
||||
@@ -35,22 +35,41 @@
|
||||
#include <cairo-xlib.h>
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> X11SalInstance::CreateX11VirtualDevice(const SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY, DeviceFormat eFormat, const SystemGraphicsData *pData,
|
||||
tools::Long nDX, tools::Long nDY, DeviceFormat eFormat,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics)
|
||||
{
|
||||
assert(pNewGraphics);
|
||||
#if HAVE_FEATURE_SKIA
|
||||
if (SkiaHelper::isVCLSkiaEnabled())
|
||||
return std::unique_ptr<SalVirtualDevice>(new X11SkiaSalVirtualDevice(rGraphics, nDX, nDY, pData, std::move(pNewGraphics)));
|
||||
return std::unique_ptr<SalVirtualDevice>(new X11SkiaSalVirtualDevice(rGraphics, nDX, nDY, std::move(pNewGraphics)));
|
||||
else
|
||||
#endif
|
||||
return std::unique_ptr<SalVirtualDevice>(new X11SalVirtualDevice(rGraphics, nDX, nDY, eFormat, pData, std::move(pNewGraphics)));
|
||||
return std::unique_ptr<SalVirtualDevice>(new X11SalVirtualDevice(rGraphics, nDX, nDY, eFormat, std::move(pNewGraphics)));
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> X11SalInstance::CreateX11VirtualDevice(const SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY, DeviceFormat eFormat, const SystemGraphicsData& rData,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics)
|
||||
{
|
||||
assert(pNewGraphics);
|
||||
#if HAVE_FEATURE_SKIA
|
||||
if (SkiaHelper::isVCLSkiaEnabled())
|
||||
return std::unique_ptr<SalVirtualDevice>(new X11SkiaSalVirtualDevice(rGraphics, nDX, nDY, rData, std::move(pNewGraphics)));
|
||||
else
|
||||
#endif
|
||||
return std::unique_ptr<SalVirtualDevice>(new X11SalVirtualDevice(rGraphics, nDX, nDY, eFormat, rData, std::move(pNewGraphics)));
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> X11SalInstance::CreateVirtualDevice(SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY, DeviceFormat eFormat, const SystemGraphicsData *pData)
|
||||
tools::Long nDX, tools::Long nDY, DeviceFormat eFormat)
|
||||
{
|
||||
return CreateX11VirtualDevice(rGraphics, nDX, nDY, eFormat, pData, std::make_unique<X11SalGraphics>());
|
||||
return CreateX11VirtualDevice(rGraphics, nDX, nDY, eFormat, std::make_unique<X11SalGraphics>());
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> X11SalInstance::CreateVirtualDevice(SalGraphics& rGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY, DeviceFormat eFormat, const SystemGraphicsData& rData)
|
||||
{
|
||||
return CreateX11VirtualDevice(rGraphics, nDX, nDY, eFormat, rData, std::make_unique<X11SalGraphics>());
|
||||
}
|
||||
|
||||
void X11SalGraphics::Init(X11SalVirtualDevice *pDevice, SalColormap* pColormap, bool bDeleteColormap)
|
||||
@@ -82,8 +101,8 @@ void X11SalGraphics::Init(X11SalVirtualDevice *pDevice, SalColormap* pColormap,
|
||||
mxImpl->UpdateX11GeometryProvider();
|
||||
}
|
||||
|
||||
X11SalVirtualDevice::X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/, const SystemGraphicsData *pData,
|
||||
X11SalVirtualDevice::X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat /*eFormat*/,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics) :
|
||||
pGraphics_(std::move(pNewGraphics)),
|
||||
m_nXScreen(0),
|
||||
@@ -96,40 +115,14 @@ X11SalVirtualDevice::X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Lo
|
||||
pDisplay_ = vcl_sal::getSalDisplay(GetGenericUnixSalData());
|
||||
nDepth_ = nBitCount;
|
||||
|
||||
if( pData && pData->hDrawable != None )
|
||||
{
|
||||
::Window aRoot;
|
||||
int x, y;
|
||||
unsigned int w = 0, h = 0, bw, d;
|
||||
Display* pDisp = pDisplay_->GetDisplay();
|
||||
XGetGeometry( pDisp, pData->hDrawable,
|
||||
&aRoot, &x, &y, &w, &h, &bw, &d );
|
||||
int nScreen = 0;
|
||||
while( nScreen < ScreenCount( pDisp ) )
|
||||
{
|
||||
if( RootWindow( pDisp, nScreen ) == aRoot )
|
||||
break;
|
||||
nScreen++;
|
||||
}
|
||||
nDX_ = static_cast<tools::Long>(w);
|
||||
nDY_ = static_cast<tools::Long>(h);
|
||||
nDX = nDX_;
|
||||
nDY = nDY_;
|
||||
m_nXScreen = SalX11Screen( nScreen );
|
||||
hDrawable_ = pData->hDrawable;
|
||||
bExternPixmap_ = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
nDX_ = nDX;
|
||||
nDY_ = nDY;
|
||||
m_nXScreen = static_cast<const X11SalGraphics&>(rGraphics).GetScreenNumber();
|
||||
hDrawable_ = limitXCreatePixmap( GetXDisplay(),
|
||||
pDisplay_->GetDrawable( m_nXScreen ),
|
||||
nDX_, nDY_,
|
||||
GetDepth() );
|
||||
bExternPixmap_ = false;
|
||||
}
|
||||
nDX_ = nDX;
|
||||
nDY_ = nDY;
|
||||
m_nXScreen = static_cast<const X11SalGraphics&>(rGraphics).GetScreenNumber();
|
||||
hDrawable_ = limitXCreatePixmap( GetXDisplay(),
|
||||
pDisplay_->GetDrawable( m_nXScreen ),
|
||||
nDX_, nDY_,
|
||||
GetDepth() );
|
||||
bExternPixmap_ = false;
|
||||
|
||||
if( nBitCount != pDisplay_->GetVisual( m_nXScreen ).GetDepth() )
|
||||
{
|
||||
@@ -140,7 +133,61 @@ X11SalVirtualDevice::X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Lo
|
||||
pGraphics_->SetLayout( SalLayoutFlags::NONE ); // by default no! mirroring for VirtualDevices, can be enabled with EnableRTL()
|
||||
|
||||
// tdf#127529 see SvpSalInstance::CreateVirtualDevice for the rare case of a non-null pPreExistingTarget
|
||||
cairo_surface_t* pPreExistingTarget = pData ? static_cast<cairo_surface_t*>(pData->pSurface) : nullptr;
|
||||
m_bOwnsSurface = true;
|
||||
m_pSurface = cairo_xlib_surface_create(GetXDisplay(), hDrawable_,
|
||||
pDisplay_->GetColormap(m_nXScreen).GetVisual().visual,
|
||||
nDX_, nDY_);
|
||||
|
||||
pGraphics_->Init(this, pColormap, bDeleteColormap);
|
||||
}
|
||||
|
||||
X11SalVirtualDevice::X11SalVirtualDevice(const SalGraphics& rGraphics, tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/, const SystemGraphicsData& rData,
|
||||
std::unique_ptr<X11SalGraphics> pNewGraphics) :
|
||||
pGraphics_(std::move(pNewGraphics)),
|
||||
m_nXScreen(0),
|
||||
bGraphics_(false)
|
||||
{
|
||||
SalColormap* pColormap = nullptr;
|
||||
bool bDeleteColormap = false;
|
||||
|
||||
sal_uInt16 nBitCount = rGraphics.GetBitCount();
|
||||
pDisplay_ = vcl_sal::getSalDisplay(GetGenericUnixSalData());
|
||||
nDepth_ = nBitCount;
|
||||
|
||||
assert(rData.hDrawable != None);
|
||||
|
||||
::Window aRoot;
|
||||
int x, y;
|
||||
unsigned int w = 0, h = 0, bw, d;
|
||||
Display* pDisp = pDisplay_->GetDisplay();
|
||||
XGetGeometry( pDisp, rData.hDrawable,
|
||||
&aRoot, &x, &y, &w, &h, &bw, &d );
|
||||
int nScreen = 0;
|
||||
while( nScreen < ScreenCount( pDisp ) )
|
||||
{
|
||||
if( RootWindow( pDisp, nScreen ) == aRoot )
|
||||
break;
|
||||
nScreen++;
|
||||
}
|
||||
nDX_ = static_cast<tools::Long>(w);
|
||||
nDY_ = static_cast<tools::Long>(h);
|
||||
nDX = nDX_;
|
||||
nDY = nDY_;
|
||||
m_nXScreen = SalX11Screen( nScreen );
|
||||
hDrawable_ = rData.hDrawable;
|
||||
bExternPixmap_ = true;
|
||||
|
||||
if( nBitCount != pDisplay_->GetVisual( m_nXScreen ).GetDepth() )
|
||||
{
|
||||
pColormap = new SalColormap( nBitCount );
|
||||
bDeleteColormap = true;
|
||||
}
|
||||
|
||||
pGraphics_->SetLayout( SalLayoutFlags::NONE ); // by default no! mirroring for VirtualDevices, can be enabled with EnableRTL()
|
||||
|
||||
// tdf#127529 see SvpSalInstance::CreateVirtualDevice for the rare case of a non-null pPreExistingTarget
|
||||
cairo_surface_t* pPreExistingTarget = static_cast<cairo_surface_t*>(rData.pSurface);
|
||||
if (pPreExistingTarget)
|
||||
{
|
||||
m_bOwnsSurface = false;
|
||||
|
||||
@@ -369,15 +369,29 @@ void GtkYieldMutex::ThreadsLeave()
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> GtkInstance::CreateVirtualDevice( SalGraphics &rG,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/,
|
||||
const SystemGraphicsData* pGd )
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat /*eFormat*/ )
|
||||
{
|
||||
EnsureInit();
|
||||
SvpSalGraphics *pSvpSalGraphics = dynamic_cast<SvpSalGraphics*>(&rG);
|
||||
assert(pSvpSalGraphics);
|
||||
// tdf#127529 see SvpSalInstance::CreateVirtualDevice for the rare case of a non-null pPreExistingTarget
|
||||
cairo_surface_t* pPreExistingTarget = pGd ? static_cast<cairo_surface_t*>(pGd->pSurface) : nullptr;
|
||||
std::unique_ptr<SalVirtualDevice> xNew(new SvpSalVirtualDevice(pSvpSalGraphics->getSurface(), /*pPreExistingTarget*/nullptr));
|
||||
if (!xNew->SetSize(nDX, nDY))
|
||||
xNew.reset();
|
||||
return xNew;
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> GtkInstance::CreateVirtualDevice( SalGraphics &rG,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/,
|
||||
const SystemGraphicsData& rGd )
|
||||
{
|
||||
EnsureInit();
|
||||
SvpSalGraphics *pSvpSalGraphics = dynamic_cast<SvpSalGraphics*>(&rG);
|
||||
assert(pSvpSalGraphics);
|
||||
// tdf#127529 see SvpSalInstance::CreateVirtualDevice for the rare case of a non-null pPreExistingTarget
|
||||
cairo_surface_t* pPreExistingTarget = static_cast<cairo_surface_t*>(rGd.pSurface);
|
||||
std::unique_ptr<SalVirtualDevice> xNew(new SvpSalVirtualDevice(pSvpSalGraphics->getSurface(), pPreExistingTarget));
|
||||
if (!xNew->SetSize(nDX, nDY))
|
||||
xNew.reset();
|
||||
|
||||
+55
-32
@@ -72,52 +72,75 @@ HBITMAP WinSalVirtualDevice::ImplCreateVirDevBitmap(HDC hDC, tools::Long nDX, to
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> WinSalInstance::CreateVirtualDevice( SalGraphics& rSGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/,
|
||||
const SystemGraphicsData* pData )
|
||||
tools::Long nDX, tools::Long nDY,
|
||||
DeviceFormat /*eFormat*/ )
|
||||
{
|
||||
WinSalGraphics& rGraphics = static_cast<WinSalGraphics&>(rSGraphics);
|
||||
HDC hDC = nullptr;
|
||||
|
||||
if( pData )
|
||||
HDC hDC = CreateCompatibleDC( rGraphics.getHDC() );
|
||||
SAL_WARN_IF( !hDC, "vcl", "CreateCompatibleDC failed: " << WindowsErrorString( GetLastError() ) );
|
||||
|
||||
if (!hDC)
|
||||
return nullptr;
|
||||
|
||||
const sal_uInt16 nBitCount = 0;
|
||||
// #124826# continue even if hBmp could not be created
|
||||
// if we would return a failure in this case, the process
|
||||
// would terminate which is not required
|
||||
HBITMAP hBmp = WinSalVirtualDevice::ImplCreateVirDevBitmap(rGraphics.getHDC(),
|
||||
nDX, nDY, nBitCount,
|
||||
&o3tl::temporary<void*>(nullptr));
|
||||
|
||||
const SalData* pSalData = GetSalData();
|
||||
|
||||
WinSalVirtualDevice* pVDev = new WinSalVirtualDevice(hDC, hBmp, nBitCount,
|
||||
/*bForeignDC*/false, nDX, nDY);
|
||||
|
||||
WinSalGraphics* pVirGraphics = new WinSalGraphics(WinSalGraphics::VIRTUAL_DEVICE,
|
||||
rGraphics.isScreen(), nullptr, pVDev);
|
||||
|
||||
// by default no! mirroring for VirtualDevices, can be enabled with EnableRTL()
|
||||
pVirGraphics->SetLayout( SalLayoutFlags::NONE );
|
||||
pVirGraphics->setHDC(hDC);
|
||||
|
||||
if ( pSalData->mhDitherPal && pVirGraphics->isScreen() )
|
||||
{
|
||||
hDC = (pData->hDC) ? pData->hDC : GetDC(pData->hWnd);
|
||||
if (hDC)
|
||||
{
|
||||
nDX = GetDeviceCaps( hDC, HORZRES );
|
||||
nDY = GetDeviceCaps( hDC, VERTRES );
|
||||
}
|
||||
else
|
||||
{
|
||||
nDX = 0;
|
||||
nDY = 0;
|
||||
}
|
||||
pVirGraphics->setPalette(pSalData->mhDitherPal);
|
||||
RealizePalette( hDC );
|
||||
}
|
||||
|
||||
pVDev->setGraphics(pVirGraphics);
|
||||
|
||||
return std::unique_ptr<SalVirtualDevice>(pVDev);
|
||||
}
|
||||
|
||||
std::unique_ptr<SalVirtualDevice> WinSalInstance::CreateVirtualDevice( SalGraphics& rSGraphics,
|
||||
tools::Long &nDX, tools::Long &nDY,
|
||||
DeviceFormat /*eFormat*/,
|
||||
const SystemGraphicsData& rData )
|
||||
{
|
||||
WinSalGraphics& rGraphics = static_cast<WinSalGraphics&>(rSGraphics);
|
||||
|
||||
HDC hDC = rData.hDC ? rData.hDC : GetDC(rData.hWnd);
|
||||
if (hDC)
|
||||
{
|
||||
nDX = GetDeviceCaps( hDC, HORZRES );
|
||||
nDY = GetDeviceCaps( hDC, VERTRES );
|
||||
}
|
||||
else
|
||||
{
|
||||
hDC = CreateCompatibleDC( rGraphics.getHDC() );
|
||||
SAL_WARN_IF( !hDC, "vcl", "CreateCompatibleDC failed: " << WindowsErrorString( GetLastError() ) );
|
||||
nDX = 0;
|
||||
nDY = 0;
|
||||
}
|
||||
|
||||
if (!hDC)
|
||||
return nullptr;
|
||||
|
||||
sal_uInt16 nBitCount = 0;
|
||||
HBITMAP hBmp = nullptr;
|
||||
if (!pData)
|
||||
{
|
||||
// #124826# continue even if hBmp could not be created
|
||||
// if we would return a failure in this case, the process
|
||||
// would terminate which is not required
|
||||
hBmp = WinSalVirtualDevice::ImplCreateVirDevBitmap(rGraphics.getHDC(),
|
||||
nDX, nDY, nBitCount,
|
||||
&o3tl::temporary<void*>(nullptr));
|
||||
}
|
||||
|
||||
const bool bForeignDC = pData != nullptr && pData->hDC != nullptr;
|
||||
const sal_uInt16 nBitCount = 0;
|
||||
const bool bForeignDC = rData.hDC != nullptr;
|
||||
const SalData* pSalData = GetSalData();
|
||||
|
||||
WinSalVirtualDevice* pVDev = new WinSalVirtualDevice(hDC, hBmp, nBitCount,
|
||||
WinSalVirtualDevice* pVDev = new WinSalVirtualDevice(hDC, /*hBmp*/nullptr, nBitCount,
|
||||
bForeignDC, nDX, nDY);
|
||||
|
||||
WinSalGraphics* pVirGraphics = new WinSalGraphics(WinSalGraphics::VIRTUAL_DEVICE,
|
||||
|
||||
Reference in New Issue
Block a user