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

177 lines
5.7 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#include <sal/config.h>
#include <sal/log.hxx>
#include <vcl/svapp.hxx>
#include <vcl/sysdata.hxx>
#ifdef MACOSX
#include <osx/salinst.h>
#include <osx/saldata.hxx>
#include <osx/salframe.h>
#else
#include <ios/iosinst.hxx>
#include "headless/svpframe.hxx"
#include "headless/svpinst.hxx"
#include "headless/svpvd.hxx"
#endif
#include <quartz/salgdi.h>
#include <quartz/salvd.h>
#include <quartz/utils.h>
std::unique_ptr<SalVirtualDevice> AquaSalInstance::CreateVirtualDevice( SalGraphics& rGraphics,
tools::Long &nDX, tools::Long &nDY,
DeviceFormat eFormat,
const SystemGraphicsData *pData )
{
// #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;
}
#else
return std::unique_ptr<SalVirtualDevice>(new AquaSalVirtualDevice( static_cast< AquaSalGraphics* >(&rGraphics),
nDX, nDY, eFormat, pData ));
#endif
}
AquaSalVirtualDevice::AquaSalVirtualDevice(
AquaSalGraphics* pGraphic, tools::Long &nDX, tools::Long &nDY,
DeviceFormat eFormat, const SystemGraphicsData *pData )
: 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) <<
" pData=" << pData << " context=" << (pData ? pData->rCGContext : nullptr) );
if( pGraphic && pData && pData->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)
{
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"));
}
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
}
}
AquaSalVirtualDevice::~AquaSalVirtualDevice()
{
SAL_INFO( "vcl.virdev", "AquaSalVirtualDevice::~AquaSalVirtualDevice() this=" << this );
if( mpGraphics )
{
mpGraphics->SetVirDevGraphics( this, nullptr, nullptr );
delete mpGraphics;
mpGraphics = nullptr;
}
Destroy();
}
SalGraphics* AquaSalVirtualDevice::AcquireGraphics()
{
if( mbGraphicsUsed || !mpGraphics )
{
return nullptr;
}
mbGraphicsUsed = true;
return mpGraphics;
}
void AquaSalVirtualDevice::ReleaseGraphics( SalGraphics* )
{
mbGraphicsUsed = false;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */