X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FGuiFontMetrics.h;h=3f50dfe5d29902d0516e2b27c3ca2ec32fa4d4e4;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=44ee9c38205a06fc89c837f80a89ce44b6c90047;hpb=00edcc582ff7cfe9cbbc8f7458ea29649bd642d9;p=lyx.git diff --git a/src/frontends/qt4/GuiFontMetrics.h b/src/frontends/qt4/GuiFontMetrics.h index 44ee9c3820..3f50dfe5d2 100644 --- a/src/frontends/qt4/GuiFontMetrics.h +++ b/src/frontends/qt4/GuiFontMetrics.h @@ -1,6 +1,6 @@ // -*- C++ -*- /** - * \file FontMetrics.h + * \file GuiFontMetrics.h * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * @@ -9,75 +9,104 @@ * Full author contact details are available in file CREDITS. */ -#ifndef QT4_FONT_METRICS_H -#define QT4_FONT_METRICS_H +#ifndef GUI_FONT_METRICS_H +#define GUI_FONT_METRICS_H #include "frontends/FontMetrics.h" +#include "support/Cache.h" #include "support/docstring.h" +#include #include +#include +#include -// Starting with version 3.1.0, Qt/X11 does its own caching of -// character width, so it is not necessary to provide ours. -#if defined(Q_WS_MACX) || defined(Q_WS_WIN32) -#define USE_LYX_FONTCACHE -#include -#endif +#include namespace lyx { namespace frontend { -class GuiFontMetrics: public FontMetrics +class GuiFontMetrics : public FontMetrics { public: - GuiFontMetrics(QFont const & font); - GuiFontMetrics(QFont const & font, QFont const & smallcaps_font); virtual ~GuiFontMetrics() {} virtual int maxAscent() const; virtual int maxDescent() const; - virtual int ascent(lyx::char_type c) const; - int descent(lyx::char_type c) const; - virtual int lbearing(lyx::char_type c) const; - virtual int rbearing(lyx::char_type c) const; - virtual int width(lyx::char_type const * s, size_t n) const; - virtual int signedWidth(lyx::docstring const & s) const; - virtual void rectText(lyx::docstring const & str, + virtual Dimension const defaultDimension() const; + virtual int em() const; + virtual int lineWidth() const; + virtual int underlinePos() const; + virtual int strikeoutPos() const; + virtual int width(char_type c) const; + virtual int ascent(char_type c) const; + virtual int descent(char_type c) const; + virtual int lbearing(char_type c) const; + virtual int rbearing(char_type c) const; + virtual int width(docstring const & s) const; + virtual int signedWidth(docstring const & s) const; + virtual int pos2x(docstring const & s, int pos, bool rtl, double ws) const; + virtual int x2pos(docstring const & s, int & x, bool rtl, double ws) const; + virtual bool breakAt(docstring & s, int & x, bool rtl, bool force) const; + virtual Dimension const dimension(char_type c) const; + + virtual void rectText(docstring const & str, int & width, int & ascent, int & descent) const; - virtual void buttonText(lyx::docstring const & str, + virtual void buttonText(docstring const & str, + const int offset, int & width, int & ascent, int & descent) const; -private: - int smallcapsWidth(QString const & s) const; + int countExpanders(docstring const & str) const; + /// + int width(QString const & str) const; - /// Metrics on the font - QFontMetrics metrics_; - QFontMetrics smallcaps_metrics_; + /// Return a pointer to a cached QTextLayout object + std::shared_ptr + getTextLayout(docstring const & s, bool const rtl, + double const wordspacing) const; - bool smallcaps_shape_; +private: -#ifndef USE_LYX_FONTCACHE - /// Return pixel width for the given unicode char - int width(unsigned short val) const { return metrics_.width(QChar(val)); } + std::pair breakAt_helper(docstring const & s, int const x, + bool const rtl, bool const force) const; -#else - /// Return pixel width for the given unicode char - int width(unsigned short val) const; + /// The font + QFont font_; + + /// Metrics on the font + QFontMetrics metrics_; - typedef std::map WidthCache; /// Cache of char widths - mutable WidthCache widthcache; -#endif // USE_LYX_FONTCACHE + mutable QHash width_cache_; + /// Cache of string widths + mutable Cache strwidth_cache_; + /// Cache for breakAt + mutable Cache> breakat_cache_; + /// Cache for QTextLayout + mutable Cache> qtextlayout_cache_; + + struct AscendDescend { + int ascent; + int descent; + }; + /// Cache of char ascends and descends + mutable QHash metrics_cache_; + /// fill in \c metrics_cache_ at specified value. + AscendDescend const fillMetricsCache(char_type) const; + + /// Cache of char right bearings + mutable QHash rbearing_cache_; + }; } // namespace frontend } // namespace lyx -#endif // QT4_FONT_METRICS_H +#endif // GUI_FONT_METRICS_H