office-gobmx/vcl/quartz/salgdicommon.cxx
Gabor Kelemen e1a351ca19 Remove now unneeded osl/diagnose.h
followup to commit 57c228803e

Change-Id: Iebfb23bb65e2bf898bf27f367cc9641f47a14cf3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167998
Reviewed-by: Gabor Kelemen <gabor.kelemen.extern@allotropia.de>
Tested-by: Jenkins
2024-07-20 10:20:31 +02:00

235 lines
7.5 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 <cassert>
#include <cstring>
#include <numeric>
#include <basegfx/polygon/b2dpolygon.hxx>
#include <basegfx/polygon/b2dpolygontools.hxx>
#include <basegfx/polygon/b2dpolypolygontools.hxx>
#include <osl/endian.h>
#include <osl/diagnose.h>
#include <osl/file.hxx>
#include <sal/types.h>
#include <tools/long.hxx>
#include <vcl/sysdata.hxx>
#include <quartz/salbmp.h>
#ifdef MACOSX
#include <quartz/salgdi.h>
#endif
#include <quartz/utils.h>
#ifdef IOS
#include <svdata.hxx>
#endif
using namespace vcl;
#ifndef IOS
void AquaSalGraphics::copyResolution( AquaSalGraphics& rGraphics )
{
if (!rGraphics.mnRealDPIY && rGraphics.maShared.mbWindow && rGraphics.maShared.mpFrame)
{
rGraphics.initResolution(rGraphics.maShared.mpFrame->getNSWindow());
}
mnRealDPIX = rGraphics.mnRealDPIX;
mnRealDPIY = rGraphics.mnRealDPIY;
}
#endif
SystemGraphicsData AquaSalGraphics::GetGraphicsData() const
{
SystemGraphicsData aRes;
aRes.nSize = sizeof(aRes);
aRes.rCGContext = maShared.maContextHolder.get();
return aRes;
}
#ifndef IOS
void AquaSalGraphics::initResolution(NSWindow* nsWindow)
{
if (!nsWindow)
{
if (Application::IsBitmapRendering())
mnRealDPIX = mnRealDPIY = 96;
return;
}
// #i100617# read DPI only once; there is some kind of weird caching going on
// if the main screen changes
// FIXME: this is really unfortunate and needs to be investigated
SalData* pSalData = GetSalData();
if( pSalData->mnDPIX == 0 || pSalData->mnDPIY == 0 )
{
NSScreen* pScreen = nil;
/* #i91301#
many woes went into the try to have different resolutions
on different screens. The result of these trials is that OOo is not ready
for that yet, vcl and applications would need to be adapted.
Unfortunately this is not possible in the 3.0 timeframe.
So let's stay with one resolution for all Windows and VirtualDevices
which is the resolution of the main screen
This of course also means that measurements are exact only on the main screen.
For activating different resolutions again just comment out the two lines below.
if( pWin )
pScreen = [pWin screen];
*/
if( pScreen == nil )
{
NSArray* pScreens = [NSScreen screens];
if( pScreens && [pScreens count] > 0)
{
pScreen = [pScreens objectAtIndex: 0];
}
}
mnRealDPIX = mnRealDPIY = 96;
if( pScreen )
{
NSDictionary* pDev = [pScreen deviceDescription];
if( pDev )
{
NSNumber* pVal = [pDev objectForKey: @"NSScreenNumber"];
if( pVal )
{
// FIXME: casting a long to CGDirectDisplayID is evil, but
// Apple suggest to do it this way
const CGDirectDisplayID nDisplayID = static_cast<CGDirectDisplayID>([pVal longValue]);
const CGSize aSize = CGDisplayScreenSize( nDisplayID ); // => result is in millimeters
mnRealDPIX = static_cast<sal_Int32>((CGDisplayPixelsWide( nDisplayID ) * 25.4) / aSize.width);
mnRealDPIY = static_cast<sal_Int32>((CGDisplayPixelsHigh( nDisplayID ) * 25.4) / aSize.height);
}
else
{
OSL_FAIL( "no resolution found in device description" );
}
}
else
{
OSL_FAIL( "no device description" );
}
}
else
{
OSL_FAIL( "no screen found" );
}
// #i107076# maintaining size-WYSIWYG-ness causes many problems for
// low-DPI, high-DPI or for mis-reporting devices
// => it is better to limit the calculation result then
static const int nMinDPI = 72;
if( (mnRealDPIX < nMinDPI) || (mnRealDPIY < nMinDPI) )
{
mnRealDPIX = mnRealDPIY = nMinDPI;
}
// Note that on a Retina display, the "mnRealDPIX" as
// calculated above is not the true resolution of the display,
// but the "logical" one, or whatever the correct terminology
// is. (For instance on a 5K 27in iMac, it's 108.) So at
// least currently, it won't be over 200. I don't know whether
// this test is a "sanity check", or whether there is some
// real reason to limit this to 200.
static const int nMaxDPI = 200;
if( (mnRealDPIX > nMaxDPI) || (mnRealDPIY > nMaxDPI) )
{
mnRealDPIX = mnRealDPIY = nMaxDPI;
}
// for OSX any anisotropy reported for the display resolution is best ignored (e.g. TripleHead2Go)
mnRealDPIX = mnRealDPIY = (mnRealDPIX + mnRealDPIY + 1) / 2;
pSalData->mnDPIX = mnRealDPIX;
pSalData->mnDPIY = mnRealDPIY;
}
else
{
mnRealDPIX = pSalData->mnDPIX;
mnRealDPIY = pSalData->mnDPIY;
}
}
#endif
void AquaSharedAttributes::setState()
{
maContextHolder.restoreState();
maContextHolder.saveState();
// setup clipping
if (mxClipPath)
{
CGContextBeginPath(maContextHolder.get()); // discard any existing path
CGContextAddPath(maContextHolder.get(), mxClipPath); // set the current path to the clipping path
CGContextClip(maContextHolder.get()); // use it for clipping
}
// set RGB colorspace and line and fill colors
CGContextSetFillColor(maContextHolder.get(), maFillColor.AsArray() );
CGContextSetStrokeColor(maContextHolder.get(), maLineColor.AsArray() );
CGContextSetShouldAntialias(maContextHolder.get(), false );
if (mnXorMode == 2)
{
CGContextSetBlendMode(maContextHolder.get(), kCGBlendModeDifference );
}
}
#ifndef IOS
void AquaSalGraphics::updateResolution()
{
SAL_WARN_IF(!maShared.mbWindow, "vcl", "updateResolution on inappropriate graphics");
initResolution((maShared.mbWindow && maShared.mpFrame) ? maShared.mpFrame->getNSWindow() : nil);
}
#endif
XorEmulation::XorEmulation()
: m_xTargetLayer( nullptr )
, m_xTargetContext( nullptr )
, m_xMaskContext( nullptr )
, m_xTempContext( nullptr )
, m_pMaskBuffer( nullptr )
, m_pTempBuffer( nullptr )
, m_nBufferLongs( 0 )
, m_bIsEnabled( false )
{
SAL_INFO( "vcl.quartz", "XorEmulation::XorEmulation() this=" << this );
}
XorEmulation::~XorEmulation()
{
SAL_INFO( "vcl.quartz", "XorEmulation::~XorEmulation() this=" << this );
Disable();
SetTarget( 0, 0, 0, nullptr, nullptr );
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */