vcl/inc/sft.hxx | 2 vcl/source/fontsubset/sft.cxx | 139 ++++++++++++++++++++++++++++ vcl/unx/generic/fontmanager/fontmanager.cxx | 138 --------------------------- 3 files changed, 141 insertions(+), 138 deletions(-)
New commits: commit 283b6a474d241797ae15eda8ec06f651469d3c82 Author: Caolán McNamara <[email protected]> AuthorDate: Tue Aug 12 13:24:10 2025 +0100 Commit: Miklos Vajna <[email protected]> CommitDate: Fri Sep 19 13:58:20 2025 +0200 move convertSfntName from fontmanager to sft Change-Id: I67327fdef59538fcafe92f0c6d42f94d9aca06bc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/191160 Reviewed-by: Miklos Vajna <[email protected]> Tested-by: Jenkins CollaboraOffice <[email protected]> diff --git a/vcl/inc/sft.hxx b/vcl/inc/sft.hxx index 78ebf744531f..4a6324ab8ecb 100644 --- a/vcl/inc/sft.hxx +++ b/vcl/inc/sft.hxx @@ -149,6 +149,8 @@ namespace vcl std::vector<sal_uInt8> sptr; /**< string data (not zero-terminated!) */ }; + OUString convertSfntName(const NameRecord& rNameRecord); + /** Return value of GetTTGlobalFontInfo() */ typedef struct TTGlobalFontInfo_ { diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx index 67bc04cc1097..3ad71be6dab5 100644 --- a/vcl/source/fontsubset/sft.cxx +++ b/vcl/source/fontsubset/sft.cxx @@ -42,11 +42,13 @@ #include <tools/fix16.hxx> #endif #include "ttcr.hxx" +#include <i18nlangtag/applelangid.hxx> #include <rtl/crc.h> #include <rtl/ustring.hxx> #include <rtl/ustrbuf.hxx> #include <sal/log.hxx> #include <o3tl/safeint.hxx> +#include <o3tl/string_view.hxx> #include <osl/endian.h> #include <osl/thread.h> #include <unotools/tempfile.hxx> @@ -1810,6 +1812,143 @@ bool getTTCoverage( return bRet; } +/* + * static helpers + */ +static sal_uInt16 getUInt16BE( const sal_uInt8*& pBuffer ) +{ + sal_uInt16 nRet = static_cast<sal_uInt16>(pBuffer[1]) | + (static_cast<sal_uInt16>(pBuffer[0]) << 8); + pBuffer+=2; + return nRet; +} + +OUString convertSfntName( const NameRecord& rNameRecord ) +{ + OUString aValue; + if( + ( rNameRecord.platformID == 3 && ( rNameRecord.encodingID == 0 || rNameRecord.encodingID == 1 ) ) // MS, Unicode + || + ( rNameRecord.platformID == 0 ) // Apple, Unicode + ) + { + OUStringBuffer aName( rNameRecord.sptr.size()/2 ); + const sal_uInt8* pNameBuffer = rNameRecord.sptr.data(); + for(size_t n = 0; n < rNameRecord.sptr.size()/2; n++ ) + aName.append( static_cast<sal_Unicode>(getUInt16BE( pNameBuffer )) ); + aValue = aName.makeStringAndClear(); + } + else if( rNameRecord.platformID == 3 ) + { + if( rNameRecord.encodingID >= 2 && rNameRecord.encodingID <= 6 ) + { + /* + * and now for a special kind of madness: + * some fonts encode their byte value string as BE uint16 + * (leading to stray zero bytes in the string) + * while others code two bytes as a uint16 and swap to BE + */ + OStringBuffer aName; + const sal_uInt8* pNameBuffer = rNameRecord.sptr.data(); + for(size_t n = 0; n < rNameRecord.sptr.size()/2; n++ ) + { + sal_Unicode aCode = static_cast<sal_Unicode>(getUInt16BE( pNameBuffer )); + char aChar = aCode >> 8; + if( aChar ) + aName.append( aChar ); + aChar = aCode & 0x00ff; + if( aChar ) + aName.append( aChar ); + } + switch( rNameRecord.encodingID ) + { + case 2: + aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_932 ); + break; + case 3: + aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_936 ); + break; + case 4: + aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_950 ); + break; + case 5: + aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_949 ); + break; + case 6: + aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_1361 ); + break; + } + } + } + else if( rNameRecord.platformID == 1 ) + { + std::string_view aName(reinterpret_cast<const char*>(rNameRecord.sptr.data()), rNameRecord.sptr.size()); + rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; + switch (rNameRecord.encodingID) + { + case 0: + eEncoding = RTL_TEXTENCODING_APPLE_ROMAN; + break; + case 1: + eEncoding = RTL_TEXTENCODING_APPLE_JAPANESE; + break; + case 2: + eEncoding = RTL_TEXTENCODING_APPLE_CHINTRAD; + break; + case 3: + eEncoding = RTL_TEXTENCODING_APPLE_KOREAN; + break; + case 4: + eEncoding = RTL_TEXTENCODING_APPLE_ARABIC; + break; + case 5: + eEncoding = RTL_TEXTENCODING_APPLE_HEBREW; + break; + case 6: + eEncoding = RTL_TEXTENCODING_APPLE_GREEK; + break; + case 7: + eEncoding = RTL_TEXTENCODING_APPLE_CYRILLIC; + break; + case 9: + eEncoding = RTL_TEXTENCODING_APPLE_DEVANAGARI; + break; + case 10: + eEncoding = RTL_TEXTENCODING_APPLE_GURMUKHI; + break; + case 11: + eEncoding = RTL_TEXTENCODING_APPLE_GUJARATI; + break; + case 21: + eEncoding = RTL_TEXTENCODING_APPLE_THAI; + break; + case 25: + eEncoding = RTL_TEXTENCODING_APPLE_CHINSIMP; + break; + case 29: + eEncoding = RTL_TEXTENCODING_APPLE_CENTEURO; + break; + case 32: //Uninterpreted + eEncoding = RTL_TEXTENCODING_UTF8; + break; + default: + if (o3tl::starts_with(aName, "Khmer OS") || // encoding '20' (Khmer) isn't implemented + o3tl::starts_with(aName, "YoavKtav")) // tdf#152278 + { + eEncoding = RTL_TEXTENCODING_UTF8; + } + SAL_WARN_IF(eEncoding == RTL_TEXTENCODING_DONTKNOW, "vcl.fonts", "mac encoding " << + rNameRecord.encodingID << " in font '" << aName << "'" << + (rNameRecord.encodingID > 32 ? " is invalid" : " has unimplemented conversion")); + break; + } + if (eEncoding != RTL_TEXTENCODING_DONTKNOW) + aValue = OStringToOUString(aName, eEncoding); + } + + return aValue; +} + } // namespace vcl int TestFontSubset(const void* data, sal_uInt32 size) diff --git a/vcl/unx/generic/fontmanager/fontmanager.cxx b/vcl/unx/generic/fontmanager/fontmanager.cxx index d755f317362a..fd2b1dbad382 100644 --- a/vcl/unx/generic/fontmanager/fontmanager.cxx +++ b/vcl/unx/generic/fontmanager/fontmanager.cxx @@ -62,18 +62,6 @@ using namespace psp; using namespace com::sun::star::uno; using namespace com::sun::star::lang; -/* - * static helpers - */ - -static sal_uInt16 getUInt16BE( const sal_uInt8*& pBuffer ) -{ - sal_uInt16 nRet = static_cast<sal_uInt16>(pBuffer[1]) | - (static_cast<sal_uInt16>(pBuffer[0]) << 8); - pBuffer+=2; - return nRet; -} - /* * PrintFont implementations */ @@ -311,132 +299,6 @@ std::vector<fontID> PrintFontManager::findFontFileIDs( int nDirID, const OString namespace { -OUString convertSfntName( const NameRecord& rNameRecord ) -{ - OUString aValue; - if( - ( rNameRecord.platformID == 3 && ( rNameRecord.encodingID == 0 || rNameRecord.encodingID == 1 ) ) // MS, Unicode - || - ( rNameRecord.platformID == 0 ) // Apple, Unicode - ) - { - OUStringBuffer aName( rNameRecord.sptr.size()/2 ); - const sal_uInt8* pNameBuffer = rNameRecord.sptr.data(); - for(size_t n = 0; n < rNameRecord.sptr.size()/2; n++ ) - aName.append( static_cast<sal_Unicode>(getUInt16BE( pNameBuffer )) ); - aValue = aName.makeStringAndClear(); - } - else if( rNameRecord.platformID == 3 ) - { - if( rNameRecord.encodingID >= 2 && rNameRecord.encodingID <= 6 ) - { - /* - * and now for a special kind of madness: - * some fonts encode their byte value string as BE uint16 - * (leading to stray zero bytes in the string) - * while others code two bytes as a uint16 and swap to BE - */ - OStringBuffer aName; - const sal_uInt8* pNameBuffer = rNameRecord.sptr.data(); - for(size_t n = 0; n < rNameRecord.sptr.size()/2; n++ ) - { - sal_Unicode aCode = static_cast<sal_Unicode>(getUInt16BE( pNameBuffer )); - char aChar = aCode >> 8; - if( aChar ) - aName.append( aChar ); - aChar = aCode & 0x00ff; - if( aChar ) - aName.append( aChar ); - } - switch( rNameRecord.encodingID ) - { - case 2: - aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_932 ); - break; - case 3: - aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_936 ); - break; - case 4: - aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_950 ); - break; - case 5: - aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_949 ); - break; - case 6: - aValue = OStringToOUString( aName, RTL_TEXTENCODING_MS_1361 ); - break; - } - } - } - else if( rNameRecord.platformID == 1 ) - { - std::string_view aName(reinterpret_cast<const char*>(rNameRecord.sptr.data()), rNameRecord.sptr.size()); - rtl_TextEncoding eEncoding = RTL_TEXTENCODING_DONTKNOW; - switch (rNameRecord.encodingID) - { - case 0: - eEncoding = RTL_TEXTENCODING_APPLE_ROMAN; - break; - case 1: - eEncoding = RTL_TEXTENCODING_APPLE_JAPANESE; - break; - case 2: - eEncoding = RTL_TEXTENCODING_APPLE_CHINTRAD; - break; - case 3: - eEncoding = RTL_TEXTENCODING_APPLE_KOREAN; - break; - case 4: - eEncoding = RTL_TEXTENCODING_APPLE_ARABIC; - break; - case 5: - eEncoding = RTL_TEXTENCODING_APPLE_HEBREW; - break; - case 6: - eEncoding = RTL_TEXTENCODING_APPLE_GREEK; - break; - case 7: - eEncoding = RTL_TEXTENCODING_APPLE_CYRILLIC; - break; - case 9: - eEncoding = RTL_TEXTENCODING_APPLE_DEVANAGARI; - break; - case 10: - eEncoding = RTL_TEXTENCODING_APPLE_GURMUKHI; - break; - case 11: - eEncoding = RTL_TEXTENCODING_APPLE_GUJARATI; - break; - case 21: - eEncoding = RTL_TEXTENCODING_APPLE_THAI; - break; - case 25: - eEncoding = RTL_TEXTENCODING_APPLE_CHINSIMP; - break; - case 29: - eEncoding = RTL_TEXTENCODING_APPLE_CENTEURO; - break; - case 32: //Uninterpreted - eEncoding = RTL_TEXTENCODING_UTF8; - break; - default: - if (o3tl::starts_with(aName, "Khmer OS") || // encoding '20' (Khmer) isn't implemented - o3tl::starts_with(aName, "YoavKtav")) // tdf#152278 - { - eEncoding = RTL_TEXTENCODING_UTF8; - } - SAL_WARN_IF(eEncoding == RTL_TEXTENCODING_DONTKNOW, "vcl.fonts", "mac encoding " << - rNameRecord.encodingID << " in font '" << aName << "'" << - (rNameRecord.encodingID > 32 ? " is invalid" : " has unimplemented conversion")); - break; - } - if (eEncoding != RTL_TEXTENCODING_DONTKNOW) - aValue = OStringToOUString(aName, eEncoding); - } - - return aValue; -} - OUString analyzeSfntFamilyName(void const * pTTFont) { OUString aFamily;
