1
0
Fork 0
libreoffice/vcl/source/font/FontSelectPattern.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

156 lines
4.4 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* 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 <o3tl/safeint.hxx>
#include <tools/gen.hxx>
#include <utility>
#include <vcl/font.hxx>
#include <font/FontSelectPattern.hxx>
#include <font/PhysicalFontFace.hxx>
namespace vcl::font
{
// These mustn't conflict with font name lists which use ; and ,
const char FontSelectPattern::FEAT_PREFIX = ':';
const char FontSelectPattern::FEAT_SEPARATOR = '&';
FontSelectPattern::FontSelectPattern( const vcl::Font& rFont,
OUString aSearchName, const Size& rSize, float fExactHeight, bool bNonAntialias)
: maSearchName(std::move( aSearchName ))
, mnWidth( rSize.Width() )
, mnHeight( rSize.Height() )
, mfExactHeight( fExactHeight)
, mnOrientation( rFont.GetOrientation() )
, meLanguage( rFont.GetLanguage() )
, mbVertical( rFont.IsVertical() )
, mbNonAntialiased(bNonAntialias)
, mbEmbolden( false )
{
maTargetName = GetFamilyName();
rFont.GetFontAttributes( *this );
// normalize orientation between 0 and 3600
if( mnOrientation < 0_deg10 || mnOrientation >= 3600_deg10 )
{
if( mnOrientation >= 0_deg10 )
mnOrientation %= 3600_deg10;
else
mnOrientation = 3600_deg10 - (-mnOrientation % 3600_deg10);
}
// normalize width and height
if( mnHeight < 0 )
mnHeight = o3tl::saturating_toggle_sign(mnHeight);
if( mnWidth < 0 )
mnWidth = o3tl::saturating_toggle_sign(mnWidth);
}
// NOTE: this ctor is still used on Windows. Do not remove.
#ifdef _WIN32
FontSelectPattern::FontSelectPattern( const PhysicalFontFace& rFontData,
const Size& rSize, float fExactHeight, int nOrientation, bool bVertical )
: FontAttributes( rFontData )
, mnWidth( rSize.Width() )
, mnHeight( rSize.Height() )
, mfExactHeight( fExactHeight )
, mnOrientation( nOrientation )
, meLanguage( 0 )
, mbVertical( bVertical )
, mbNonAntialiased( false )
, mbEmbolden( false )
{
maTargetName = maSearchName = GetFamilyName();
// NOTE: no normalization for width/height/orientation
}
#endif
size_t FontSelectPattern::hashCode() const
{
// TODO: does it pay off to improve this hash function?
size_t nHash;
// check for features and generate a unique hash if necessary
if (maTargetName.indexOf(FontSelectPattern::FEAT_PREFIX)
!= -1)
{
nHash = maTargetName.hashCode();
}
else
{
nHash = maSearchName.hashCode();
}
nHash += 11U * mnHeight;
nHash += 19 * GetWeight();
nHash += 29 * GetItalic();
nHash += 37 * mnOrientation.get();
nHash += 41 * static_cast<sal_uInt16>(meLanguage);
if( mbVertical )
nHash += 53;
return nHash;
}
bool FontSelectPattern::operator==(const FontSelectPattern& rOther) const
{
if (!CompareDeviceIndependentFontAttributes(rOther))
return false;
if (maTargetName != rOther.maTargetName)
return false;
if (maSearchName != rOther.maSearchName)
return false;
if (mnWidth != rOther.mnWidth)
return false;
if (mnHeight != rOther.mnHeight)
return false;
if (mfExactHeight != rOther.mfExactHeight)
return false;
if (mnOrientation != rOther.mnOrientation)
return false;
if (meLanguage != rOther.meLanguage)
return false;
if (mbVertical != rOther.mbVertical)
return false;
if (mbNonAntialiased != rOther.mbNonAntialiased)
return false;
if (mbEmbolden != rOther.mbEmbolden)
return false;
if (maItalicMatrix != rOther.maItalicMatrix)
return false;
return true;
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */