Le 13/03/2015 12:10, Jean-Marc Lasgouttes a écrit :
In this patch, I change our new LyX logo inset to look like the real
thing. Georg, is there a reason why your chose not to follow this route
(or only lack of time/motivation).
Also, I am not sure that the Color_special color is the best choice (try
to load the Intro manual, for example). Would it be a problem to use
normal color once it is clear that the logo is something special, not
plain text?
With this new patch all logos are logoified and the color is the normal
plain one.
Comments?
JMarc
>From c0ff3f2d9f310b3a4dfe1b3544ed741ecd0b20bb Mon Sep 17 00:00:00 2001
From: Jean-Marc Lasgouttes <lasgout...@lyx.org>
Date: Fri, 13 Mar 2015 12:05:15 +0100
Subject: [PATCH] Improve display of the logos.
This look now more like the real logos. Moreover, we use not the normal font color because Color_special is a bit too flashy.
---
src/insets/InsetSpecialChar.cpp | 120 +++++++++++++++++++++++++++++++--------
1 file changed, 97 insertions(+), 23 deletions(-)
diff --git a/src/insets/InsetSpecialChar.cpp b/src/insets/InsetSpecialChar.cpp
index 77792b9..e4fd180 100644
--- a/src/insets/InsetSpecialChar.cpp
+++ b/src/insets/InsetSpecialChar.cpp
@@ -43,12 +43,54 @@ InsetSpecialChar::Kind InsetSpecialChar::kind() const
}
+namespace {
+
+int logoWidth(FontInfo const & font, InsetSpecialChar::Kind kind) {
+ frontend::FontMetrics const & fm = theFontMetrics(font);
+ double const em = fm.width('M');
+ int width = 0;
+ switch (kind) {
+ case InsetSpecialChar::PHRASE_LYX:
+ width = fm.width(from_ascii("L")) - 0.16667 * em
+ + fm.width(from_ascii("Y")) - 0.125 * em
+ + fm.width(from_ascii("X"));
+ break;
+
+ case InsetSpecialChar::PHRASE_TEX:
+ width = fm.width(from_ascii("T")) - 0.16667 * em
+ + fm.width(from_ascii("E")) - 0.125 * em
+ + fm.width(from_ascii("X"));
+ break;
+
+ case InsetSpecialChar::PHRASE_LATEX2E:
+ width = logoWidth(font, InsetSpecialChar::PHRASE_LATEX)
+ + fm.width(from_ascii("2") + char_type(0x03b5));
+ break;
+ case InsetSpecialChar::PHRASE_LATEX: {
+ FontInfo smaller = font;
+ smaller.decSize().decSize();
+ width = fm.width(from_ascii("L")) - 0.36 * em
+ + theFontMetrics(smaller).width(from_ascii("A")) - 0.15 * em
+ + logoWidth(font, InsetSpecialChar::PHRASE_TEX);
+ break;
+ }
+ default:
+ LYXERR0("No information for computing width of logo " << kind);
+ }
+
+ return width;
+}
+
+}
+
+
void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
{
frontend::FontMetrics const & fm =
theFontMetrics(mi.base.font);
dim.asc = fm.maxAscent();
dim.des = fm.maxDescent();
+ dim.wid = 0;
docstring s;
switch (kind_) {
@@ -65,7 +107,9 @@ void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
s = from_ascii(" x ");
break;
case HYPHENATION:
- s = from_ascii("-");
+ dim.wid = fm.width(from_ascii("-"));
+ if (dim.wid > 5)
+ dim.wid -= 2; // to make it look shorter
break;
case SLASH:
s = from_ascii("/");
@@ -74,26 +118,66 @@ void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const
s = from_ascii("-");
break;
case PHRASE_LYX:
- s = from_ascii("LyX");
- break;
case PHRASE_TEX:
- s = from_ascii("TeX");
- break;
case PHRASE_LATEX2E:
- s = from_ascii("LaTeX2") + char_type(0x03b5);
- break;
case PHRASE_LATEX:
- s = from_ascii("LaTeX");
+ dim.wid = logoWidth(mi.base.font, kind_);
break;
}
- dim.wid = fm.width(s);
- if (kind_ == HYPHENATION && dim.wid > 5)
- dim.wid -= 2; // to make it look shorter
-
+ if (dim.wid == 0)
+ dim.wid = fm.width(s);
+
setDimCache(mi, dim);
}
+namespace {
+
+void drawLogo(PainterInfo & pi, InsetSpecialChar::Kind kind, int & x, int & y) {
+ FontInfo const & font = pi.base.font;
+ // FIXME: this definition of em is bogus, but there is a need
+ // for a big refactoring of the code around this issue anyway.
+ double const em = theFontMetrics(font).width('M');
+ switch (kind) {
+ case InsetSpecialChar::PHRASE_LYX:
+ x += pi.pain.text(x, y, from_ascii("L"), font);
+ x -= 0.16667 * em;
+ x += pi.pain.text(x, y + 0.25 * em, from_ascii("Y"), font);
+ x -= 0.125 * em;
+ x += pi.pain.text(x, y, from_ascii("X"), font);
+ break;
+
+ case InsetSpecialChar::PHRASE_TEX:
+ x += pi.pain.text(x, y, from_ascii("T"), font);
+ x -= 0.16667 * em;
+ x += pi.pain.text(x, y + 0.25 * em, from_ascii("E"), font);
+ x -= 0.125 * em;
+ x += pi.pain.text(x, y, from_ascii("X"), font);
+ break;
+
+ case InsetSpecialChar::PHRASE_LATEX2E:
+ drawLogo(pi, InsetSpecialChar::PHRASE_LATEX, x, y);
+ x += pi.pain.text(x, y, from_ascii("2"), font);
+ x += pi.pain.text(x, y + 0.25 * em, char_type(0x03b5), font);
+ break;
+
+ case InsetSpecialChar::PHRASE_LATEX: {
+ x += pi.pain.text(x, y, from_ascii("L"), font);
+ x -= 0.36 * em;
+ FontInfo smaller = font;
+ smaller.decSize().decSize();
+ x += pi.pain.text(x, y - 0.2 * em, from_ascii("A"), smaller);
+ x -= 0.15 * em;
+ drawLogo(pi, InsetSpecialChar::PHRASE_TEX, x, y);
+ break;
+ }
+ default:
+ LYXERR0("No information for drawing logo " << kind);
+ }
+}
+
+}
+
void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const
{
FontInfo font = pi.base.font;
@@ -157,20 +241,10 @@ void InsetSpecialChar::draw(PainterInfo & pi, int x, int y) const
break;
}
case PHRASE_LYX:
- font.setColor(Color_special);
- pi.pain.text(x, y, from_ascii("LyX"), font);
- break;
case PHRASE_TEX:
- font.setColor(Color_special);
- pi.pain.text(x, y, from_ascii("TeX"), font);
- break;
case PHRASE_LATEX2E:
- font.setColor(Color_special);
- pi.pain.text(x, y, from_ascii("LaTeX2") + char_type(0x03b5), font);
- break;
case PHRASE_LATEX:
- font.setColor(Color_special);
- pi.pain.text(x, y, from_ascii("LaTeX"), font);
+ drawLogo(pi, kind_, x, y);
break;
}
}
--
1.7.9.5