[Libreoffice-commits] .: 4 commits - svtools/source vcl/inc vcl/source

Caolán McNamara caolan at kemper.freedesktop.org
Thu Jul 12 05:32:20 PDT 2012


 svtools/source/misc/sampletext.cxx |   16 +++++---
 vcl/inc/vcl/outdev.hxx             |    2 -
 vcl/source/gdi/outdev3.cxx         |   73 +++++++++++++++++++++++--------------
 3 files changed, 57 insertions(+), 34 deletions(-)

New commits:
commit f92dfe253aeaf3e6e4c7ada84f1429e548316529
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jul 12 13:30:48 2012 +0100

    extend sample text
    
    Change-Id: I5700a051e64171f1d2d1ec19c63fbf9778e4bc30

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index 37af8b5..6b8cc61 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -614,6 +614,14 @@ rtl::OUString makeRepresentativeTextForLanguage(LanguageType eLang)
         case LANGUAGE_YI & LANGUAGE_MASK_PRIMARY:
             sRet = makeRepresentativeTextForScript(USCRIPT_YI);
             break;
+        case LANGUAGE_GAELIC_IRELAND & LANGUAGE_MASK_PRIMARY:
+        {
+            const sal_Unicode aGa[] = {
+                'T', 0x00E9, 'a', 'c', 's', ' ', 'S', 'a', 'm', 'p', 'l', 'a', 'c', 'h'
+            };
+            sRet = rtl::OUString(aGa, SAL_N_ELEMENTS(aGa));
+            break;
+        }
         default:
             break;
     }
commit 99fabb54f38f5f36deda2e5b31616817b72f5696
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jul 12 12:59:00 2012 +0100

    Modern Tagalog is not written in traditional Tagalog script (Baybayin)
    
    Change-Id: I0be64324cb92fb7411e3b341d3c1e949e8edbe09

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index 94ec4d7..37af8b5 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -608,9 +608,6 @@ rtl::OUString makeRepresentativeTextForLanguage(LanguageType eLang)
         case LANGUAGE_MONGOLIAN & LANGUAGE_MASK_PRIMARY:
             sRet = makeRepresentativeTextForScript(USCRIPT_MONGOLIAN);
             break;
-        case LANGUAGE_USER_TAGALOG & LANGUAGE_MASK_PRIMARY:
-            sRet = makeRepresentativeTextForScript(USCRIPT_TAGALOG);
-            break;
         case LANGUAGE_JAPANESE & LANGUAGE_MASK_PRIMARY:
             sRet = makeRepresentativeTextForScript(USCRIPT_JAPANESE);
             break;
commit a3c43e21114289ee4d5c5331ff62daefc789fc19
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jul 12 12:58:10 2012 +0100

    only suggest text samples we can render
    
    Change-Id: Iebeb98ed2959bd4424f3f271f01a5809a03fdd70

diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx
index cf07a2a..94ec4d7 100644
--- a/svtools/source/misc/sampletext.cxx
+++ b/svtools/source/misc/sampletext.cxx
@@ -476,7 +476,6 @@ rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript)
     if (sSampleText.isEmpty())
         sSampleText = makeShortRepresentativeTextForScript(eScript);
     return sSampleText;
-
 }
 
 rtl::OUString makeShortMinimalTextForScript(UScriptCode eScript)
@@ -1497,9 +1496,9 @@ rtl::OUString makeRepresentativeTextForFont(sal_Int16 nScriptType, const Font &r
 {
     rtl::OUString sRet(makeRepresentativeTextForLanguage(rFont.GetLanguage()));
 
-    if (sRet.isEmpty())
+    VirtualDevice aDevice;
+    if (sRet.isEmpty() || (STRING_LEN != aDevice.HasGlyphs(rFont, sRet)))
     {
-        VirtualDevice aDevice;
         aDevice.SetFont(rFont);
         vcl::FontCapabilities aFontCapabilities;
         if (aDevice.GetFontCapabilities(aFontCapabilities))
commit b3ec98dea6e59dcc0c94aeece0e4f8e35430a86a
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Jul 12 12:10:49 2012 +0100

    Related: fdo#45355 stale gdi font handles apparently still used
    
    When we do glyph fallback we check to see if the glyph is too large to fit the
    space available, and if it is we try and rescale it smaller.
    
    This worked wonderfully under Linux, but under Windows it seems that the
    SalLayout impl keeps an old unscaled gdi font handle which would give visually
    broken glyphs for me when the base font was smaller than the replacement font.
    
    So, now instead rather than just changing the font for the fallback level, we
    throw away the SalLayout using the old font, set the font for the fallback
    level, and recreate a new SalLayout using the new font.
    
    Hopefully this is the true reason behind the crashes of fdo#45355 although
    that remains unreproducible for me.
    
    Change-Id: I415b6e7a77777d4aa5e62079c52c6c18473c0ebd

diff --git a/vcl/inc/vcl/outdev.hxx b/vcl/inc/vcl/outdev.hxx
index e5e21c5..aa2b8ce 100644
--- a/vcl/inc/vcl/outdev.hxx
+++ b/vcl/inc/vcl/outdev.hxx
@@ -559,7 +559,7 @@ public:
     // Helper for line geometry paint with support for graphic expansion (pattern and fat_to_area)
     void impPaintLineGeometryWithEvtlExpand(const LineInfo& rInfo, basegfx::B2DPolyPolygon aLinePolyPolygon);
 
-    SAL_DLLPRIVATE void forceFallbackFontToFit(SalLayout &rFallback, ImplFontEntry &rFallbackFont,
+    SAL_DLLPRIVATE SalLayout* getFallbackFontThatFits(ImplFontEntry &rFallbackFont,
         FontSelectPattern &rFontSelData, int nFallbackLevel,
         ImplLayoutArgs& rLayoutArgs, const ImplFontMetricData& rOrigMetric) const;
 protected:
diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx
index fc166ae..e1bebd8 100644
--- a/vcl/source/gdi/outdev3.cxx
+++ b/vcl/source/gdi/outdev3.cxx
@@ -6210,15 +6210,30 @@ SalLayout* OutputDevice::ImplLayout( const String& rOrigStr,
     return pSalLayout;
 }
 
-void OutputDevice::forceFallbackFontToFit(SalLayout &rFallback, ImplFontEntry &rFallbackFont,
+SalLayout* OutputDevice::getFallbackFontThatFits(ImplFontEntry &rFallbackFont,
     FontSelectPattern &rFontSelData, int nFallbackLevel,
     ImplLayoutArgs& rLayoutArgs, const ImplFontMetricData& rOrigMetric) const
 {
+    rFallbackFont.mnSetFontFlags = mpGraphics->SetFont( &rFontSelData, nFallbackLevel );
+
+    rLayoutArgs.ResetPos();
+    SalLayout* pFallback = mpGraphics->GetTextLayout( rLayoutArgs, nFallbackLevel );
+
+    if (!pFallback)
+        return NULL;
+
+    if (!pFallback->LayoutText(rLayoutArgs))
+    {
+        // there is no need for a font that couldn't resolve anything
+        pFallback->Release();
+        return NULL;
+    }
+
     Rectangle aBoundRect;
     bool bHaveBounding = false;
     Rectangle aRectangle;
 
-    rFallback.AdjustLayout( rLayoutArgs );
+    pFallback->AdjustLayout( rLayoutArgs );
 
     //All we care about here is getting the vertical bounds of this text and
     //make sure it will fit inside the available space
@@ -6226,7 +6241,7 @@ void OutputDevice::forceFallbackFontToFit(SalLayout &rFallback, ImplFontEntry &r
     for( int nStart = 0;;)
     {
         sal_GlyphId nLGlyph;
-        if( !rFallback.GetNextGlyphs( 1, &nLGlyph, aPos, nStart ) )
+        if( !pFallback->GetNextGlyphs( 1, &nLGlyph, aPos, nStart ) )
             break;
 
         sal_GlyphId nFontTag = nFallbackLevel << GF_FONTSHIFT;
@@ -6255,11 +6270,28 @@ void OutputDevice::forceFallbackFontToFit(SalLayout &rFallback, ImplFontEntry &r
         if (fScale < 1)
         {
             long nOrigHeight = rFontSelData.mnHeight;
-            rFontSelData.mnHeight = static_cast<int>(static_cast<float>(rFontSelData.mnHeight) * fScale);
+            long nNewHeight = static_cast<int>(static_cast<float>(rFontSelData.mnHeight) * fScale);
+
+            if (nNewHeight == nOrigHeight)
+                --nNewHeight;
+
+            pFallback->Release();
+
+            rFontSelData.mnHeight = nNewHeight;
             rFallbackFont.mnSetFontFlags = mpGraphics->SetFont( &rFontSelData, nFallbackLevel );
             rFontSelData.mnHeight = nOrigHeight;
+
+            rLayoutArgs.ResetPos();
+            pFallback = mpGraphics->GetTextLayout( rLayoutArgs, nFallbackLevel );
+            if (pFallback && !pFallback->LayoutText(rLayoutArgs))
+            {
+                pFallback->Release();
+                pFallback = NULL;
+            }
+            SAL_WARN_IF(pFallback, "vcl.gdi", "we couldn't layout text with a smaller point size that worked with a bigger one");
         }
     }
+    return pFallback;
 }
 
 // -----------------------------------------------------------------------
@@ -6320,30 +6352,17 @@ SalLayout* OutputDevice::ImplGlyphFallbackLayout( SalLayout* pSalLayout, ImplLay
             }
         }
 
-        pFallbackFont->mnSetFontFlags = mpGraphics->SetFont( &aFontSelData, nFallbackLevel );
-
         // create and add glyph fallback layout to multilayout
-        rLayoutArgs.ResetPos();
-        SalLayout* pFallback = mpGraphics->GetTextLayout( rLayoutArgs, nFallbackLevel );
-        if( pFallback )
-        {
-            if( pFallback->LayoutText( rLayoutArgs ) )
-            {
-                forceFallbackFontToFit(*pFallback, *pFallbackFont, aFontSelData,
-                    nFallbackLevel, rLayoutArgs, aOrigMetric);
-
-                if( !pMultiSalLayout )
-                    pMultiSalLayout = new MultiSalLayout( *pSalLayout );
-                pMultiSalLayout->AddFallback( *pFallback,
-                    rLayoutArgs.maRuns, aFontSelData.mpFontData );
-                if (nFallbackLevel == MAX_FALLBACK-1)
-                    pMultiSalLayout->SetInComplete();
-            }
-            else
-            {
-                // there is no need for a font that couldn't resolve anything
-                pFallback->Release();
-            }
+        SalLayout* pFallback = getFallbackFontThatFits(*pFallbackFont, aFontSelData,
+            nFallbackLevel, rLayoutArgs, aOrigMetric);
+        if (pFallback)
+        {
+            if( !pMultiSalLayout )
+                pMultiSalLayout = new MultiSalLayout( *pSalLayout );
+            pMultiSalLayout->AddFallback( *pFallback,
+                rLayoutArgs.maRuns, aFontSelData.mpFontData );
+            if (nFallbackLevel == MAX_FALLBACK-1)
+                pMultiSalLayout->SetInComplete();
         }
 
         mpFontCache->Release( pFallbackFont );


More information about the Libreoffice-commits mailing list