View | Details | Raw Unified | Return to issue 87970
Collapse All | Expand All

(-)openoffice.org.orig/psprint/inc/psprint/fontmanager.hxx (-2 / +2 lines)
Lines 789-796 Link Here
789
    FontConfigHints getFontConfigHints(const FastPrintFontInfo& rInfo, int nSize);
789
    FontConfigHints getFontConfigHints(const FastPrintFontInfo& rInfo, int nSize);
790
790
791
    rtl::OUString Substitute( const rtl::OUString& rFontName, rtl::OUString& rMissingCodes, 
791
    rtl::OUString Substitute( const rtl::OUString& rFontName, rtl::OUString& rMissingCodes, 
792
        const rtl::OString& rLangAttrib, italic::type eItalic, weight::type eWeight, 
792
        const rtl::OString& rLangAttrib, italic::type& rItalic, weight::type& rWeight, 
793
        width::type eWidth, pitch::type ePitch) const;
793
        width::type& rWidth, pitch::type& rPitch) const;
794
    bool hasFontconfig() const { return m_bFontconfigSuccess; }
794
    bool hasFontconfig() const { return m_bFontconfigSuccess; }
795
795
796
    int FreeTypeCharIndex( void *pFace, sal_uInt32 aChar );
796
    int FreeTypeCharIndex( void *pFace, sal_uInt32 aChar );
(-)openoffice.org.orig/psprint/source/fontmanager/fontconfig.cxx (-42 / +84 lines)
Lines 581-586 Link Here
581
    return true;
581
    return true;
582
}
582
}
583
583
584
namespace
585
{
586
    weight::type convertWeight(int weight)
587
    {
588
        // set weight
589
        if( weight <= FC_WEIGHT_THIN )
590
            return weight::Thin;
591
        else if( weight <= FC_WEIGHT_ULTRALIGHT )
592
            return weight::UltraLight;
593
        else if( weight <= FC_WEIGHT_LIGHT )
594
            return weight::Light;
595
        else if( weight <= FC_WEIGHT_BOOK )
596
            return weight::SemiLight;
597
        else if( weight <= FC_WEIGHT_NORMAL )
598
            return weight::Normal;
599
        else if( weight <= FC_WEIGHT_MEDIUM )
600
            return weight::Medium;
601
        else if( weight <= FC_WEIGHT_SEMIBOLD )
602
            return weight::SemiBold;
603
        else if( weight <= FC_WEIGHT_BOLD )
604
            return weight::Bold;
605
        else if( weight <= FC_WEIGHT_ULTRABOLD )
606
            return weight::UltraBold;
607
        return weight::Black;
608
    }
609
610
    italic::type convertSlant(int slant)
611
    {
612
        // set italic
613
        if( slant == FC_SLANT_ITALIC )
614
            return italic::Italic;
615
        else if( slant == FC_SLANT_OBLIQUE )
616
            return italic::Oblique;
617
        return italic::Upright;
618
    }
619
620
    pitch::type convertSpacing(int spacing)
621
    {
622
        // set pitch
623
        if( spacing == FC_MONO || spacing == FC_CHARCELL )
624
            return pitch::Fixed;
625
        return pitch::Variable;
626
    }
627
628
    width::type convertWidth(int width)
629
    {
630
        if (width == FC_WIDTH_ULTRACONDENSED)
631
            return width::UltraCondensed;
632
        else if (width == FC_WIDTH_EXTRACONDENSED)
633
            return width::ExtraCondensed;
634
        else if (width == FC_WIDTH_CONDENSED)
635
            return width::Condensed;
636
        else if (width == FC_WIDTH_SEMICONDENSED)
637
            return width::SemiCondensed;
638
        else if (width == FC_WIDTH_SEMIEXPANDED)
639
            return width::SemiExpanded;
640
        else if (width == FC_WIDTH_EXPANDED)
641
            return width::Expanded;
642
        else if (width == FC_WIDTH_EXTRAEXPANDED)
643
            return width::ExtraExpanded;
644
        else if (width == FC_WIDTH_ULTRAEXPANDED)
645
            return width::UltraExpanded;
646
        return width::Normal;
647
    }
648
}
649
584
int PrintFontManager::countFontconfigFonts()
650
int PrintFontManager::countFontconfigFonts()
585
{
651
{
586
    int nFonts = 0;
652
    int nFonts = 0;
Lines 709-755 Link Here
709
                    pUpdate->m_nFamilyName = nFamilyName;
775
                    pUpdate->m_nFamilyName = nFamilyName;
710
                }
776
                }
711
                if( eWeightRes == FcResultMatch )
777
                if( eWeightRes == FcResultMatch )
712
                {
778
					pUpdate->m_eWeight = convertWeight(weight);
713
                    // set weight
714
                    if( weight <= FC_WEIGHT_THIN )
715
                        pUpdate->m_eWeight = weight::Thin;
716
                    else if( weight <= FC_WEIGHT_ULTRALIGHT )
717
                        pUpdate->m_eWeight = weight::UltraLight;
718
                    else if( weight <= FC_WEIGHT_LIGHT )
719
                        pUpdate->m_eWeight = weight::Light;
720
                    else if( weight <= FC_WEIGHT_BOOK )
721
                        pUpdate->m_eWeight = weight::SemiLight;
722
                    else if( weight <= FC_WEIGHT_NORMAL )
723
                        pUpdate->m_eWeight = weight::Normal;
724
                    else if( weight <= FC_WEIGHT_MEDIUM )
725
                        pUpdate->m_eWeight = weight::Medium;
726
                    else if( weight <= FC_WEIGHT_SEMIBOLD )
727
                        pUpdate->m_eWeight = weight::SemiBold;
728
                    else if( weight <= FC_WEIGHT_BOLD )
729
                        pUpdate->m_eWeight = weight::Bold;
730
                    else if( weight <= FC_WEIGHT_ULTRABOLD )
731
                        pUpdate->m_eWeight = weight::UltraBold;
732
                    else
733
                        pUpdate->m_eWeight = weight::Black;
734
                }
735
                if( eSpacRes == FcResultMatch )
779
                if( eSpacRes == FcResultMatch )
736
                {
780
                    pUpdate->m_ePitch = convertSpacing(spacing);
737
                    // set pitch
738
                    if( spacing == FC_PROPORTIONAL )
739
                        pUpdate->m_ePitch = pitch::Variable;
740
                    else if( spacing == FC_MONO || spacing == FC_CHARCELL )
741
                        pUpdate->m_ePitch = pitch::Fixed;
742
                }
743
                if( eSlantRes == FcResultMatch )
781
                if( eSlantRes == FcResultMatch )
744
                {
782
					pUpdate->m_eItalic = convertSlant(slant);
745
                    // set italic
746
                    if( slant == FC_SLANT_ROMAN )
747
                        pUpdate->m_eItalic = italic::Upright;
748
                    else if( slant == FC_SLANT_ITALIC )
749
                        pUpdate->m_eItalic = italic::Italic;
750
                    else if( slant == FC_SLANT_OBLIQUE )
751
                        pUpdate->m_eItalic = italic::Oblique;
752
                }
753
                if( eStyleRes == FcResultMatch )
783
                if( eStyleRes == FcResultMatch )
754
                {
784
                {
755
                    pUpdate->m_aStyleName = OStringToOUString( OString( (sal_Char*)style ), RTL_TEXTENCODING_UTF8 );
785
                    pUpdate->m_aStyleName = OStringToOUString( OString( (sal_Char*)style ), RTL_TEXTENCODING_UTF8 );
Lines 888-895 Link Here
888
918
889
rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName,
919
rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName,
890
    rtl::OUString& rMissingCodes, const rtl::OString &rLangAttrib,
920
    rtl::OUString& rMissingCodes, const rtl::OString &rLangAttrib,
891
    italic::type eItalic, weight::type eWeight,
921
    italic::type &rItalic, weight::type &rWeight,
892
    width::type eWidth, pitch::type ePitch) const
922
    width::type &rWidth, pitch::type &rPitch) const
893
{
923
{
894
    rtl::OUString aName;
924
    rtl::OUString aName;
895
    FontCfgWrapper& rWrapper = FontCfgWrapper::get();
925
    FontCfgWrapper& rWrapper = FontCfgWrapper::get();
Lines 932-938 Link Here
932
       rWrapper.FcCharSetDestroy( unicodes );
962
       rWrapper.FcCharSetDestroy( unicodes );
933
    }
963
    }
934
964
935
    addtopattern(rWrapper, pPattern, eItalic, eWeight, eWidth, ePitch);
965
    addtopattern(rWrapper, pPattern, rItalic, rWeight, rWidth, rPitch);
936
966
937
    // query fontconfig for a substitute
967
    // query fontconfig for a substitute
938
    rWrapper.FcConfigSubstitute( rWrapper.getDefConfig(), pPattern, FcMatchPattern );
968
    rWrapper.FcConfigSubstitute( rWrapper.getDefConfig(), pPattern, FcMatchPattern );
Lines 969-974 Link Here
969
                if (aI != rWrapper.m_aFontNameToLocalized.end())
999
                if (aI != rWrapper.m_aFontNameToLocalized.end())
970
                    sFamily = aI->second;
1000
                    sFamily = aI->second;
971
                aName = rtl::OStringToOUString( sFamily, RTL_TEXTENCODING_UTF8 );
1001
                aName = rtl::OStringToOUString( sFamily, RTL_TEXTENCODING_UTF8 );
1002
1003
1004
                fprintf(stderr, "incoming weight was %d\n", rWeight);
1005
                int val = 0;
1006
                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_WEIGHT, 0, &val))
1007
                    rWeight = convertWeight(val);
1008
                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_SLANT, 0, &val))
1009
                    rItalic = convertSlant(val);
1010
                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_SPACING, 0, &val))
1011
                    rPitch = convertSpacing(val);
1012
                if ( FcResultMatch == rWrapper.FcPatternGetInteger( pSet->fonts[0], FC_WIDTH, 0, &val))
1013
                    rWidth = convertWidth(val);
972
            }
1014
            }
973
1015
974
			// update rMissingCodes by removing resolved unicodes
1016
			// update rMissingCodes by removing resolved unicodes
(-)openoffice.org.orig/vcl/unx/source/gdi/salgdi3.cxx (-14 / +79 lines)
Lines 2069-2076 Link Here
2069
2069
2070
// -----------------------------------------------------------------------
2070
// -----------------------------------------------------------------------
2071
2071
2072
static rtl::OUString GetFcSubstitute(const ImplFontSelectData &rFontSelData, OUString& rMissingCodes )
2072
static ImplFontSelectData GetFcSubstitute(const ImplFontSelectData &rFontSelData, OUString& rMissingCodes )
2073
{
2073
{
2074
    ImplFontSelectData aRet(rFontSelData);
2075
2074
    const rtl::OString aLangAttrib; //TODO: = MsLangId::convertLanguageToIsoByteString( rFontSelData.meLanguage );
2076
    const rtl::OString aLangAttrib; //TODO: = MsLangId::convertLanguageToIsoByteString( rFontSelData.meLanguage );
2075
2077
2076
    psp::italic::type eItalic = psp::italic::Unknown;
2078
    psp::italic::type eItalic = psp::italic::Unknown;
Lines 2138-2144 Link Here
2138
    }
2140
    }
2139
2141
2140
    const psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
2142
    const psp::PrintFontManager& rMgr = psp::PrintFontManager::get();
2141
    return rMgr.Substitute( rFontSelData.maTargetName, rMissingCodes, aLangAttrib, eItalic, eWeight, eWidth, ePitch);
2143
    aRet.maSearchName = rMgr.Substitute( rFontSelData.maTargetName, rMissingCodes, aLangAttrib, eItalic, eWeight, eWidth, ePitch);
2144
2145
    switch (eItalic)
2146
    {
2147
        case psp::italic::Upright: aRet.meItalic = ITALIC_NONE; break;
2148
        case psp::italic::Italic: aRet.meItalic = ITALIC_NORMAL; break;
2149
        case psp::italic::Oblique: aRet.meItalic = ITALIC_OBLIQUE; break;
2150
        default:
2151
            break;
2152
    }
2153
2154
    switch (eWeight)
2155
    {
2156
        case psp::weight::Thin: aRet.meWeight = WEIGHT_THIN; break;
2157
        case psp::weight::UltraLight: aRet.meWeight = WEIGHT_ULTRALIGHT; break;
2158
        case psp::weight::Light: aRet.meWeight = WEIGHT_LIGHT; break;
2159
        case psp::weight::SemiLight: aRet.meWeight = WEIGHT_SEMILIGHT; break;
2160
        case psp::weight::Normal: aRet.meWeight = WEIGHT_NORMAL; break;
2161
        case psp::weight::Medium: aRet.meWeight = WEIGHT_MEDIUM; break;
2162
        case psp::weight::SemiBold: aRet.meWeight = WEIGHT_SEMIBOLD; break;
2163
        case psp::weight::Bold: aRet.meWeight = WEIGHT_BOLD; break;
2164
        case psp::weight::UltraBold: aRet.meWeight = WEIGHT_ULTRABOLD; break;
2165
        case psp::weight::Black: aRet.meWeight = WEIGHT_BLACK; break;
2166
        default:
2167
                break;
2168
    }
2169
2170
    switch (eWidth)
2171
    {
2172
        case psp::width::UltraCondensed: aRet.meWidthType = WIDTH_ULTRA_CONDENSED; break;
2173
        case psp::width::ExtraCondensed: aRet.meWidthType = WIDTH_EXTRA_CONDENSED; break;
2174
        case psp::width::Condensed: aRet.meWidthType = WIDTH_CONDENSED; break;
2175
        case psp::width::SemiCondensed: aRet.meWidthType = WIDTH_SEMI_CONDENSED; break;
2176
        case psp::width::Normal: aRet.meWidthType = WIDTH_NORMAL; break;
2177
        case psp::width::SemiExpanded: aRet.meWidthType = WIDTH_SEMI_EXPANDED; break;
2178
        case psp::width::Expanded: aRet.meWidthType = WIDTH_EXPANDED; break;
2179
        case psp::width::ExtraExpanded: aRet.meWidthType = WIDTH_EXTRA_EXPANDED; break;
2180
        case psp::width::UltraExpanded: aRet.meWidthType = WIDTH_ULTRA_EXPANDED; break;
2181
        default:
2182
            break;
2183
    }
2184
2185
    switch (ePitch)
2186
    {
2187
        case psp::pitch::Fixed: aRet.mePitch = PITCH_FIXED; break;
2188
        case psp::pitch::Variable: aRet.mePitch = PITCH_VARIABLE; break;
2189
        default:
2190
            break;
2191
    }
2192
2193
    return aRet;
2194
}
2195
2196
namespace
2197
{
2198
    bool uselessmatch(const ImplFontSelectData &rOrig, const ImplFontSelectData &rNew)
2199
    {
2200
        return
2201
          (
2202
            rOrig.maTargetName == rNew.maSearchName &&
2203
            rOrig.meWeight == rNew.meWeight &&
2204
            rOrig.meItalic == rNew.meItalic &&
2205
            rOrig.mePitch == rNew.mePitch &&
2206
            rOrig.meWidthType == rNew.meWidthType
2207
          );
2208
    }
2142
}
2209
}
2143
2210
2144
//--------------------------------------------------------------------------
2211
//--------------------------------------------------------------------------
Lines 2154-2173 Link Here
2154
        return false;
2221
        return false;
2155
2222
2156
    rtl::OUString aDummy;
2223
    rtl::OUString aDummy;
2157
    const rtl::OUString aOUName = GetFcSubstitute( rFontSelData, aDummy );
2224
    const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, aDummy );
2158
    if( !aOUName.getLength() )
2225
    if (!aOut.maSearchName.Len())
2159
        return false;
2226
        return false;
2160
    const String aName( aOUName );
2227
    if( uselessmatch(rFontSelData, aOut ) )
2161
    if( aName == rFontSelData.maTargetName )
2162
        return false;
2228
        return false;
2163
2229
2164
#ifdef DEBUG
2230
#ifdef DEBUG
2165
    ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
2231
    ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
2166
    ByteString aSubstName( aName, RTL_TEXTENCODING_UTF8 );
2232
    ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 );
2167
    printf( "FcPreMatchSubstititution \"%s\" -> \"%s\"\n",
2233
    printf( "FcPreMatchSubstititution \"%s\" -> \"%s\"\n",
2168
        aOrigName.GetBuffer(), aSubstName.GetBuffer() );
2234
        aOrigName.GetBuffer(), aSubstName.GetBuffer() );
2169
#endif
2235
#endif
2170
    rFontSelData.maSearchName = aName;
2236
    rFontSelData = aOut;
2171
    return true;
2237
    return true;
2172
}
2238
}
2173
2239
Lines 2184-2204 Link Here
2184
    ||  0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "opensymbol", 10) )
2250
    ||  0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "opensymbol", 10) )
2185
        return false;
2251
        return false;
2186
2252
2187
    const rtl::OUString aOUName = GetFcSubstitute( rFontSelData, rMissingCodes );
2253
    const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, rMissingCodes );
2188
    // TODO: cache the unicode+font specific result
2254
    // TODO: cache the unicode+font specific result
2189
    if( !aOUName.getLength() )
2255
    if (!aOut.maSearchName.Len())
2190
        return false;
2256
        return false;
2191
    const String aName( aOUName );
2257
    if (uselessmatch(rFontSelData, aOut))
2192
    if( aName == rFontSelData.maTargetName )
2193
        return false;
2258
        return false;
2194
2259
2195
#ifdef DEBUG
2260
#ifdef DEBUG
2196
    ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
2261
    ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
2197
    ByteString aSubstName( aName, RTL_TEXTENCODING_UTF8 );
2262
    ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 );
2198
    printf( "FcGlyphFallbackSubstititution \"%s\" -> \"%s\"\n",
2263
    printf( "FcGlyphFallbackSubstititution \"%s\" -> \"%s\"\n",
2199
        aOrigName.GetBuffer(), aSubstName.GetBuffer() );
2264
        aOrigName.GetBuffer(), aSubstName.GetBuffer() );
2200
#endif
2265
#endif
2201
    rFontSelData.maSearchName = aName;
2266
    rFontSelData = aOut;
2202
    return true;
2267
    return true;
2203
}
2268
}
2204
2269

Return to issue 87970