svtools/source/misc/sampletext.cxx | 5 +- unusedcode.easy | 24 +++++++++++++ vcl/generic/fontmanager/fontconfig.cxx | 18 ++++++++- vcl/generic/fontmanager/fontsubst.cxx | 6 ++- vcl/generic/glyphs/glyphcache.cxx | 7 +++ vcl/inc/outfont.hxx | 19 ++++++++++ vcl/inc/vcl/fontmanager.hxx | 3 + vcl/source/gdi/outdev3.cxx | 60 ++++++++++++++++++++++----------- 8 files changed, 116 insertions(+), 26 deletions(-)
New commits: commit c17aeee2d97fdc5ff941aae66dd01d6a58386f89 Author: Caolán McNamara <caol...@redhat.com> Date: Thu Oct 27 12:48:42 2011 +0100 probably better Japanese longer text preview diff --git a/svtools/source/misc/sampletext.cxx b/svtools/source/misc/sampletext.cxx index 33a49c6..7c2be7b 100644 --- a/svtools/source/misc/sampletext.cxx +++ b/svtools/source/misc/sampletext.cxx @@ -449,10 +449,9 @@ rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript) } case USCRIPT_JAPANESE: { - //Iroha + //'Beautiful Japanese' const sal_Unicode aJa[] = { - 0x8272, 0x306F, 0x5302, 0x3078, 0x3069, 0x0020, 0x6563, - 0x308A, 0x306C, 0x308B, 0x3092 + 0x7F8E, 0x3057, 0x3044, 0x65E5, 0x672C, 0x8A9E }; sSampleText = rtl::OUString(aJa, SAL_N_ELEMENTS(aJa)); break; commit 5eac2ffaa08d4a9bb251491bfdbca15281c3a21b Author: Caolán McNamara <caol...@redhat.com> Date: Thu Oct 27 12:48:26 2011 +0100 update unused list diff --git a/unusedcode.easy b/unusedcode.easy index db7aeea..b153d42 100644 --- a/unusedcode.easy +++ b/unusedcode.easy @@ -199,6 +199,9 @@ Graphic::StartAnimation(OutputDevice*, Point const&, long, OutputDevice*) Graphic::WriteEmbedded(SvStream&) GraphicReader::IsPreviewModeEnabled() const GroupTable::SkipCurrentGroup() +GtkSalFrame::popIgnoreDamage() +GtkSalFrame::pushIgnoreDamage() +GtkSalFrame::signalDraw(_GtkWidget*, _cairo*, void*) HTMLControls::Insert(HTMLControl const*&, unsigned short&) HTMLControls::Insert(HTMLControl const**, unsigned short) HTMLControls::Insert(HTMLControls const*, unsigned short, unsigned short) @@ -367,6 +370,7 @@ SVGExport::pushClip(basegfx::B2DPolyPolygon const&) SalColormap::SalColormap(BitmapPalette const&) SalColormap::SetPalette(BitmapPalette const&) SalDisplay::IsLocal() +SalGraphics::AddDevFontSubstitute(OutputDevice*, String const&, String const&, unsigned short) SalGraphics::DrawBitmap(SalTwoRect const*, SalBitmap const&, unsigned int, OutputDevice const*) SalGraphics::drawAlphaBitmap(SalTwoRect const&, SalBitmap const&, SalBitmap const&) SalGraphics::drawPolyLine(basegfx::B2DPolygon const&, double, basegfx::B2DVector const&, basegfx::B2DLineJoin) @@ -1454,6 +1458,8 @@ _ZSortFlys::Remove(_ZSortFly const&, unsigned short) _ZSortFlys_SAR::Replace(_ZSortFly const&, unsigned short) _ZSortFlys_SAR::Replace(_ZSortFly const*, unsigned short, unsigned short) _ZSortFlys_SAR::_ForEach(unsigned short, unsigned short, unsigned char (*)(_ZSortFly const&, void*), void*) +basebmp::BitmapDevice::getPaletteEntryCount() const +basebmp::BitmapDevice::getPixelData(basegfx::B2IPoint const&) basebmp::debugDump(boost::shared_ptr<basebmp::BitmapDevice> const&, std::basic_ostream<char, std::char_traits<char> >&) basegfx::B1DRange::B1DRange(basegfx::B1IRange const&) basegfx::B2DCubicBezier::B2DCubicBezier(basegfx::B2DPoint const&, basegfx::B2DPoint const&) @@ -2380,11 +2386,15 @@ layoutimpl::getParent(com::sun::star::uno::Reference<com::sun::star::uno::XInter layoutimpl::prophlp::getProperty(com::sun::star::uno::Reference<com::sun::star::uno::XInterface> const&, rtl::OUString const&) libcmis::SessionFactory::getRepositories(std::__debug::map<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<int>, std::allocator<std::pair<int const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > >) libvisio::VSDXCharacterList::getElement(unsigned int) +libvisio::VSDXContentCollector::charStyleFromStyleSheet(unsigned int) +libvisio::VSDXContentCollector::paraStyleFromStyleSheet(unsigned int) +libvisio::VSDXContentCollector::textBlockStyleFromStyleSheet(unsigned int) libvisio::VSDXOutputElementList::addEllipse(WPXPropertyList const&) libvisio::VSDXOutputElementList::addEndLayer() libvisio::VSDXOutputElementList::addStartLayer(WPXPropertyList const&) libvisio::VSDXOutputElementList::clear() libvisio::VSDXPage::VSDXPage(double, double, unsigned int, unsigned int, libvisio::VSDXOutputElementList const&) +libvisio::VSDXParagraphList::getElement(unsigned int) libvisio::VisioDocument::generateSVG(WPXInputStream*, WPXString&) libwpg::WPGraphics::generateSVG(unsigned char const*, unsigned long, WPXString&, libwpg::WPGFileFormat) libwpg::WPGraphics::parse(unsigned char const*, unsigned long, libwpg::WPGPaintInterface*, libwpg::WPGFileFormat) @@ -2604,14 +2614,28 @@ sd::ViewShellBase::RegisterFactory(unsigned short) sd::framework::ConfigurationClassifier::GetC1andC2() const sd::framework::ConfigurationClassifier::TraceResourceIdVector(char const*, std::__debug::vector<com::sun::star::uno::Reference<com::sun::star::drawing::framework::XResourceId>, std::allocator<com::sun::star::uno::Reference<com::sun::star::drawing::framework::XResourceId> > > const&) const sd::framework::ConfigurationTracer::TraceConfiguration(com::sun::star::uno::Reference<com::sun::star::drawing::framework::XConfiguration> const&, char const*) +sd::slidesorter::cache::GenericPageCache::ReleasePreviewBitmap(SdrPage const*) +sd::slidesorter::controller::SelectionFunction::EventDescriptor::EventDescriptor(KeyEvent const&, sd::slidesorter::SlideSorter&) +sd::slidesorter::controller::SlotManager::LinkStubUserEventCallback(void*, void*) +sd::slidesorter::model::VisualState::SetVisualStateBlend(double) sd::slidesorter::view::(anonymous namespace)::Blend(unsigned char, unsigned char, double) sd::slidesorter::view::(anonymous namespace)::CalculateColorChannel(double, double, double, double, double) sd::slidesorter::view::(anonymous namespace)::PageObjectRun::GetInnerBoundingBox(sd::slidesorter::view::Layouter const&, int) const sd::slidesorter::view::(anonymous namespace)::RectangleBackgroundTheme::RectangleBackgroundTheme(boost::shared_ptr<sd::slidesorter::view::Theme> const&, std::__debug::vector<boost::shared_ptr<sd::slidesorter::view::Button>, std::allocator<boost::shared_ptr<sd::slidesorter::view::Button> > > const&) sd::slidesorter::view::FontProvider::GetFont(OutputDevice const&) +sd::slidesorter::view::Layouter::_SetZoom(Fraction) +sdext::presenter::(anonymous namespace)::MoveInFromBottomAnimator::MoveInFromBottomAnimator(com::sun::star::uno::Reference<com::sun::star::drawing::framework::XResourceId> const&, rtl::Reference<sdext::presenter::PresenterController> const&, bool, std::__debug::vector<boost::function<void ()>, std::allocator<boost::function<void ()> > > const&, std::__debug::vector<boost::function<void ()>, std::allocator<boost::function<void ()> > > const&) +sdext::presenter::(anonymous namespace)::TransparentOverlayAnimator::TransparentOverlayAnimator(com::sun::star::uno::Reference<com::sun::star::drawing::framework::XResourceId> const&, rtl::Reference<sdext::presenter::PresenterController> const&, bool, std::__debug::vector<boost::function<void ()>, std::allocator<boost::function<void ()> > > const&, std::__debug::vector<boost::function<void ()>, std::allocator<boost::function<void ()> > > const&) +sdext::presenter::(anonymous namespace)::UnfoldInCenterAnimator::UnfoldInCenterAnimator(com::sun::star::uno::Reference<com::sun::star::drawing::framework::XResourceId> const&, rtl::Reference<sdext::presenter::PresenterController> const&, bool, std::__debug::vector<boost::function<void ()>, std::allocator<boost::function<void ()> > > const&, std::__debug::vector<boost::function<void ()>, std::allocator<boost::function<void ()> > > const&) sdext::presenter::PresenterFrameworkObserver::False() +sdext::presenter::PresenterFrameworkObserver::HasResource(com::sun::star::uno::Reference<com::sun::star::drawing::framework::XConfigurationController> const&, com::sun::star::uno::Reference<com::sun::star::drawing::framework::XResourceId> const&) sdext::presenter::PresenterHorizontalScrollBar::PresenterHorizontalScrollBar(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, com::sun::star::uno::Reference<com::sun::star::awt::XWindow> const&, boost::shared_ptr<sdext::presenter::PresenterPaintManager> const&, boost::function<void (double)> const&) +sdext::presenter::PresenterSprite::SetPriority(double) +sdext::presenter::PresenterTextView::PresenterTextView(com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, com::sun::star::uno::Reference<com::sun::star::rendering::XCanvas> const&) +sdext::presenter::PresenterTextView::SetText(rtl::OUString const&) sdext::presenter::PresenterTheme::FontDescriptor::FontDescriptor() +sdext::presenter::PresenterToolBar::GetCurrentSlideIndex() +sdext::presenter::PresenterToolBar::GetSlideCount() sdr::Comment::Comment(unsigned int, Date, rtl::OUString const&, rtl::OUString const&, basegfx::B2DPoint const&) sdr::Comment::SetCreationDate(Date) sdr::Comment::SetPosition(basegfx::B2DPoint const&) commit 58b48f188bbfd9a3382460d6de63848eb3db416d Author: Caolán McNamara <caol...@redhat.com> Date: Thu Oct 27 12:24:11 2011 +0100 Resolves: fdo#32665 handle that FreeSerif lacks some glyphs in bold/italic FreeSerif lacks glyphs in bold/italic variants that it has in the normal one. A lot of our glyph fallback infrastructure, especially the caches don't expect that a normal variant of a font with extra emboldening or extra font skew can be a fallback for a bold/italic variant of itself which exists, but doesn't have the missing glyphs that the normal one does. We really need to improve our glyph/font caching, but we can get 90% of the way there by excluding such cases from the caches. diff --git a/vcl/generic/fontmanager/fontconfig.cxx b/vcl/generic/fontmanager/fontconfig.cxx index be91349..a4f5f7f 100644 --- a/vcl/generic/fontmanager/fontconfig.cxx +++ b/vcl/generic/fontmanager/fontconfig.cxx @@ -68,6 +68,9 @@ using namespace psp; #ifndef FC_EMBOLDEN #define FC_EMBOLDEN "embolden" #endif +#ifndef FC_MATRIX + #define FC_MATRIX "matrix" +#endif #ifndef FC_FONTFORMAT #define FC_FONTFORMAT "fontformat" #endif @@ -747,7 +750,7 @@ static void addtopattern(FcPattern *pPattern, rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName, rtl::OUString& rMissingCodes, const rtl::OString &rLangAttrib, FontItalic &rItalic, FontWeight &rWeight, - FontWidth &rWidth, FontPitch &rPitch) const + FontWidth &rWidth, FontPitch &rPitch, bool &rEmbolden, ItalicMatrix &rMatrix) const { rtl::OUString aName; FontCfgWrapper& rWrapper = FontCfgWrapper::get(); @@ -834,6 +837,17 @@ rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName, rPitch = convertSpacing(val); if (FcResultMatch == FcPatternGetInteger(pSet->fonts[0], FC_WIDTH, 0, &val)) rWidth = convertWidth(val); + FcBool bEmbolden; + if (FcResultMatch == FcPatternGetBool(pSet->fonts[0], FC_EMBOLDEN, 0, &bEmbolden)) + rEmbolden = bEmbolden; + FcMatrix *pMatrix = 0; + if (FcResultMatch == FcPatternGetMatrix(pSet->fonts[0], FC_MATRIX, 0, &pMatrix)) + { + rMatrix.xx = pMatrix->xx; + rMatrix.xy = pMatrix->xy; + rMatrix.yx = pMatrix->yx; + rMatrix.yy = pMatrix->yy; + } } // update rMissingCodes by removing resolved unicodes @@ -844,7 +858,7 @@ rtl::OUString PrintFontManager::Substitute(const rtl::OUString& rFontName, FcCharSet* unicodes; if (!FcPatternGetCharSet(pSet->fonts[0], FC_CHARSET, 0, &unicodes)) { - for( sal_Int32 nStrIndex = 0; nStrIndex < rMissingCodes.getLength(); ) + for( sal_Int32 nStrIndex = 0; nStrIndex < rMissingCodes.getLength(); ) { // also handle unicode surrogates const sal_uInt32 nCode = rMissingCodes.iterateCodePoints( &nStrIndex ); diff --git a/vcl/generic/fontmanager/fontsubst.cxx b/vcl/generic/fontmanager/fontsubst.cxx index 3bf2d07..2d187b1 100644 --- a/vcl/generic/fontmanager/fontsubst.cxx +++ b/vcl/generic/fontmanager/fontsubst.cxx @@ -127,10 +127,14 @@ static ImplFontSelectData GetFcSubstitute(const ImplFontSelectData &rFontSelData FontWeight eWeight = rFontSelData.GetWeight(); FontWidth eWidth = rFontSelData.GetWidthType(); FontPitch ePitch = rFontSelData.GetPitch(); + bool bEmbolden = rFontSelData.mbEmbolden; + ItalicMatrix aMatrix = rFontSelData.maItalicMatrix; const psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); - aRet.maSearchName = rMgr.Substitute( rFontSelData.maTargetName, rMissingCodes, aLangAttrib, eItalic, eWeight, eWidth, ePitch); + aRet.maSearchName = rMgr.Substitute( rFontSelData.maTargetName, rMissingCodes, aLangAttrib, eItalic, eWeight, eWidth, ePitch, bEmbolden, aMatrix ); + aRet.maItalicMatrix = aMatrix; + aRet.mbEmbolden = bEmbolden; aRet.meItalic = eItalic; aRet.meWeight = eWeight; aRet.meWidthType = eWidth; diff --git a/vcl/generic/glyphs/glyphcache.cxx b/vcl/generic/glyphs/glyphcache.cxx index 5322b65..fa712bb 100644 --- a/vcl/generic/glyphs/glyphcache.cxx +++ b/vcl/generic/glyphs/glyphcache.cxx @@ -163,6 +163,13 @@ bool GlyphCache::IFSD_Equal::operator()( const ImplFontSelectData& rA, const Imp != STRING_NOTFOUND) && rA.maTargetName != rB.maTargetName) return false; #endif + + if (rA.mbEmbolden != rB.mbEmbolden) + return false; + + if (rA.maItalicMatrix != rB.maItalicMatrix) + return false; + return true; } diff --git a/vcl/inc/outfont.hxx b/vcl/inc/outfont.hxx index faf2b00..857d944 100644 --- a/vcl/inc/outfont.hxx +++ b/vcl/inc/outfont.hxx @@ -156,6 +156,22 @@ friend class ImplDevFontListData; // - ImplFontSelectData - // ---------------------- +struct ItalicMatrix +{ + double xx, xy, yx, yy; + ItalicMatrix() : xx(1), xy(0), yx(0), yy(1) {} +}; + +inline bool operator ==(const ItalicMatrix& a, const ItalicMatrix& b) +{ + return a.xx == b.xx && a.xy == b.xy && a.yx == b.yx && a.yy == b.yy; +} + +inline bool operator !=(const ItalicMatrix& a, const ItalicMatrix& b) +{ + return a.xx != b.xx || a.xy != b.xy || a.yx != b.yx || a.yy != b.yy; +} + class ImplFontSelectData : public ImplFontAttributes { public: @@ -175,6 +191,9 @@ public: // TODO: change to private bool mbVertical; // vertical mode of requested font bool mbNonAntialiased; // true if antialiasing is disabled + bool mbEmbolden; // Force emboldening + ItalicMatrix maItalicMatrix; // Force matrix for slant + const ImplFontData* mpFontData; // a matching ImplFontData object ImplFontEntry* mpFontEntry; // pointer to the resulting FontCache entry }; diff --git a/vcl/inc/vcl/fontmanager.hxx b/vcl/inc/vcl/fontmanager.hxx index 0af5e14..4a110ad 100644 --- a/vcl/inc/vcl/fontmanager.hxx +++ b/vcl/inc/vcl/fontmanager.hxx @@ -37,6 +37,7 @@ #include "vcl/dllapi.h" #include "vcl/helper.hxx" #include "vcl/vclenum.hxx" +#include "outfont.hxx" #include "com/sun/star/lang/Locale.hpp" #include <vector> @@ -649,7 +650,7 @@ public: rtl::OUString Substitute( const rtl::OUString& rFontName, rtl::OUString& rMissingCodes, const rtl::OString& rLangAttrib, FontItalic& rItalic, FontWeight& rWeight, - FontWidth& rWidth, FontPitch& rPitch) const; + FontWidth& rWidth, FontPitch& rPitch, bool &rEmboldening, ItalicMatrix &rMatrix) const; bool hasFontconfig() const { return m_bFontconfigSuccess; } int FreeTypeCharIndex( void *pFace, sal_uInt32 aChar ); diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx index b0f59cd..3cc438c 100755 --- a/vcl/source/gdi/outdev3.cxx +++ b/vcl/source/gdi/outdev3.cxx @@ -865,9 +865,11 @@ bool ImplFontData::IsBetterMatch( const ImplFontSelectData& rFSD, FontMatchStatu if( rFSD.meWeight != WEIGHT_DONTKNOW ) { - // if not bold prefer light fonts to bold fonts - int nReqWeight = (int)rFSD.meWeight; - if ( rFSD.meWeight > WEIGHT_MEDIUM ) + // if not bold or requiring emboldening prefer light fonts to bold fonts + FontWeight ePatternWeight = rFSD.mbEmbolden ? WEIGHT_NORMAL : rFSD.meWeight; + + int nReqWeight = (int)ePatternWeight; + if ( ePatternWeight > WEIGHT_MEDIUM ) nReqWeight += 100; int nGivenWeight = (int)meWeight; @@ -897,14 +899,17 @@ bool ImplFontData::IsBetterMatch( const ImplFontSelectData& rFSD, FontMatchStatu nMatch += 150; } - if ( rFSD.meItalic == ITALIC_NONE ) + // if requiring custom matrix to fake italic, prefer upright font + FontItalic ePatternItalic = rFSD.maItalicMatrix != ItalicMatrix() ? ITALIC_NONE : rFSD.meItalic; + + if ( ePatternItalic == ITALIC_NONE ) { if( meItalic == ITALIC_NONE ) nMatch += 900; } else { - if( rFSD.meItalic == meItalic ) + if( ePatternItalic == meItalic ) nMatch += 900; else if( meItalic != ITALIC_NONE ) nMatch += 600; @@ -1457,22 +1462,31 @@ ImplDevFontListData* ImplDevFontList::GetGlyphFallbackFont( ImplFontSelectData& else rFontSelData.maSearchName = String(); - // cache the result even if there was no match - for(;;) - { - if( !rFontSelData.mpFontEntry->GetFallbackForUnicode( cChar, rFontSelData.GetWeight(), &rFontSelData.maSearchName ) ) - rFontSelData.mpFontEntry->AddFallbackForUnicode( cChar, rFontSelData.GetWeight(), rFontSelData.maSearchName ); - if( nStrIndex >= aOldMissingCodes.getLength() ) - break; - cChar = aOldMissingCodes.iterateCodePoints( &nStrIndex ); - } - if( rFontSelData.maSearchName.Len() != 0 ) + //See fdo#32665 for an example. FreeSerif that has glyphs in normal + //font, but not in the italic or bold version + bool bSubSetOfFontRequiresPropertyFaking = rFontSelData.mbEmbolden || rFontSelData.maItalicMatrix != ItalicMatrix(); + + // cache the result even if there was no match, unless its from part of a font for which the properties need + // to be faked. We need to rework this cache to take into account that fontconfig can return different fonts + // for different input sizes, weights, etc. Basically the cache is way to naive + if (!bSubSetOfFontRequiresPropertyFaking) { - // remove cache entries that were still not resolved - for( nStrIndex = 0; nStrIndex < rMissingCodes.getLength(); ) + for(;;) { - cChar = rMissingCodes.iterateCodePoints( &nStrIndex ); - rFontSelData.mpFontEntry->IgnoreFallbackForUnicode( cChar, rFontSelData.GetWeight(), rFontSelData.maSearchName ); + if( !rFontSelData.mpFontEntry->GetFallbackForUnicode( cChar, rFontSelData.GetWeight(), &rFontSelData.maSearchName ) ) + rFontSelData.mpFontEntry->AddFallbackForUnicode( cChar, rFontSelData.GetWeight(), rFontSelData.maSearchName ); + if( nStrIndex >= aOldMissingCodes.getLength() ) + break; + cChar = aOldMissingCodes.iterateCodePoints( &nStrIndex ); + } + if( rFontSelData.maSearchName.Len() != 0 ) + { + // remove cache entries that were still not resolved + for( nStrIndex = 0; nStrIndex < rMissingCodes.getLength(); ) + { + cChar = rMissingCodes.iterateCodePoints( &nStrIndex ); + rFontSelData.mpFontEntry->IgnoreFallbackForUnicode( cChar, rFontSelData.GetWeight(), rFontSelData.maSearchName ); + } } } } @@ -2180,6 +2194,7 @@ ImplFontSelectData::ImplFontSelectData( const Font& rFont, meLanguage( rFont.GetLanguage() ), mbVertical( rFont.IsVertical() ), mbNonAntialiased( false ), + mbEmbolden( false ), mpFontData( NULL ), mpFontEntry( NULL ) { @@ -2215,6 +2230,7 @@ ImplFontSelectData::ImplFontSelectData( const ImplFontData& rFontData, meLanguage( 0 ), mbVertical( bVertical ), mbNonAntialiased( false ), + mbEmbolden( false ), mpFontData( &rFontData ), mpFontEntry( NULL ) { @@ -2297,6 +2313,12 @@ bool ImplFontCache::IFSD_Equal::operator()(const ImplFontSelectData& rA, const I return false; #endif + if (rA.mbEmbolden != rB.mbEmbolden) + return false; + + if (rA.maItalicMatrix != rB.maItalicMatrix) + return false; + return true; }
_______________________________________________ Libreoffice-commits mailing list Libreoffice-commits@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits