vcl/qa/cppunit/physicalfontcollection.cxx | 14 ++++++++++++++ vcl/source/font/PhysicalFontCollection.cxx | 24 +++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-)
New commits: commit ddd675c5a79b26d23da8d4affeeb888ac3664635 Author: Hossein <hoss...@libreoffice.org> AuthorDate: Wed Dec 15 02:15:52 2021 +0100 Commit: Hossein <hoss...@libreoffice.org> CommitDate: Wed Dec 15 03:17:56 2021 +0100 tdf#144961 vcl: fix CJK matching in FindFontFamilyByAttributes Whilst testing CJK matching, I uncovered an issue. The matching algorithm detects that the font is a CJK font if there are any CJK characters in the font name. However, if you searched for a CJK font against a font that was not a CJK font (i.e. the family name had no CJK characters) then it would still match against this font family. We now check if the font being matched against was a CJK font family or not, if not then I reduced the testMatch value by CJK_MATCH_VALUE. The fix can be tested with: make CPPUNIT_TEST_NAME=testShouldNotFindCJKFamily -sr \ CppunitTest_vcl_font Without the fix in place, the test fails with: Test name: VclPhysicalFontCollectionTest::testShouldNotFindCJKFamily assertion failed - Expression: !aFontCollection.FindFontFamilyByAttributes( ImplFontAttrs::CJK, WEIGHT_NORMAL, WIDTH_NORMAL, ITALIC_NONE, "") - family found Change-Id: I18b246f151b2174dc4ae0f5507630a4e8e4bb442 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123309 Tested-by: Jenkins Reviewed-by: Hossein <hoss...@libreoffice.org> diff --git a/vcl/qa/cppunit/physicalfontcollection.cxx b/vcl/qa/cppunit/physicalfontcollection.cxx index a147fb1dea4f..7df20ce76b66 100644 --- a/vcl/qa/cppunit/physicalfontcollection.cxx +++ b/vcl/qa/cppunit/physicalfontcollection.cxx @@ -35,6 +35,7 @@ public: void testShouldFindFontFamilyByTokenNames(); void testShouldFindNoFamilyWithWorthlessAttributes(); void testShouldFindCJKFamily(); + void testShouldNotFindCJKFamily(); void testShouldFindStarsymbolFamily(); void testShouldFindOpensymbolFamilyWithMultipleSymbolFamilies(); void testShouldFindSymboltypeFamily(); @@ -65,6 +66,7 @@ public: CPPUNIT_TEST(testShouldFindFontFamilyByTokenNames); CPPUNIT_TEST(testShouldFindNoFamilyWithWorthlessAttributes); CPPUNIT_TEST(testShouldFindCJKFamily); + CPPUNIT_TEST(testShouldNotFindCJKFamily); CPPUNIT_TEST(testShouldFindStarsymbolFamily); CPPUNIT_TEST(testShouldFindOpensymbolFamilyWithMultipleSymbolFamilies); CPPUNIT_TEST(testShouldFindSymboltypeFamily); @@ -186,6 +188,18 @@ void VclPhysicalFontCollectionTest::testShouldFindCJKFamily() pCJKFamily->GetSearchName()); } +void VclPhysicalFontCollectionTest::testShouldNotFindCJKFamily() +{ + vcl::font::PhysicalFontCollection aFontCollection; + vcl::font::PhysicalFontFamily* pFontFamily + = aFontCollection.FindOrCreateFontFamily(GetEnglishSearchFontName(u"No CJK characters")); + AddNormalFontFace(pFontFamily, "No CJK characters"); + + CPPUNIT_ASSERT_MESSAGE("family found", + !aFontCollection.FindFontFamilyByAttributes( + ImplFontAttrs::CJK, WEIGHT_NORMAL, WIDTH_NORMAL, ITALIC_NONE, "")); +} + void VclPhysicalFontCollectionTest::testShouldFindStarsymbolFamily() { vcl::font::PhysicalFontCollection aFontCollection; diff --git a/vcl/source/font/PhysicalFontCollection.cxx b/vcl/source/font/PhysicalFontCollection.cxx index 0cb503a7df54..211e4e65bd57 100644 --- a/vcl/source/font/PhysicalFontCollection.cxx +++ b/vcl/source/font/PhysicalFontCollection.cxx @@ -445,13 +445,23 @@ PhysicalFontFamily* PhysicalFontCollection::FindFontFamilyByAttributes(ImplFontA // test CJK script attributes if ( nSearchType & ImplFontAttrs::CJK ) { - // Matching language - if( ImplFontAttrs::None == ((nSearchType ^ nMatchType) & ImplFontAttrs::CJK_AllLang) ) - nTestMatch += 10000000*3; - if( nMatchType & ImplFontAttrs::CJK ) - nTestMatch += 10000000*2; - if( nMatchType & ImplFontAttrs::Full ) - nTestMatch += 10000000; + // if the matching font doesn't support any CJK languages, then + // it is not appropriate + if ( !(nMatchType & ImplFontAttrs::CJK_AllLang) ) + { + nTestMatch -= 10000000; + } + else + { + // Matching language + if ( (nSearchType & ImplFontAttrs::CJK_AllLang) + && (nMatchType & ImplFontAttrs::CJK_AllLang) ) + nTestMatch += 10000000*3; + if ( nMatchType & ImplFontAttrs::CJK ) + nTestMatch += 10000000*2; + if ( nMatchType & ImplFontAttrs::Full ) + nTestMatch += 10000000; + } } else if ( nMatchType & ImplFontAttrs::CJK ) {