diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-02 00:24:18 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-02 00:24:18 +0000 |
commit | 7007668faea3bf52350d21d86a030cd6209ac5a9 (patch) | |
tree | b34d09b6bb97a97a18b61d5849cf6ff91c3efa04 /app | |
parent | c90c0e3e83d8167cd067a2414a1677f4d6e1c7ff (diff) | |
download | chromium_src-7007668faea3bf52350d21d86a030cd6209ac5a9.zip chromium_src-7007668faea3bf52350d21d86a030cd6209ac5a9.tar.gz chromium_src-7007668faea3bf52350d21d86a030cd6209ac5a9.tar.bz2 |
Workaround Skia and Pango measuring font heights differently by asking Pango
for the height that we'll report in the gfx::Font. This seems wrong, but at
least things will look reasonable until we find a better solution.
This changes the existing height computation code to use ceiling. Even though
this is no longer used, it is good to have the correct code for the height
computation here so that if we find a better solution, it will be run properly.
This also gives more room for the clock in the status area view because the
height is now more and we want it to be aligned properly.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/183044
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25131 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'app')
-rw-r--r-- | app/gfx/font_skia.cc | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/app/gfx/font_skia.cc b/app/gfx/font_skia.cc index 4308bf6..988683c 100644 --- a/app/gfx/font_skia.cc +++ b/app/gfx/font_skia.cc @@ -41,9 +41,13 @@ void Font::calculateMetrics() { PaintSetup(&paint); paint.getFontMetrics(&metrics); - ascent_ = SkScalarRound(-metrics.fAscent); - height_ = SkScalarRound(-metrics.fAscent + metrics.fDescent + - metrics.fLeading); + // We need to know the number of whole pixels for these measurements. The + // height is the number of whole pixels above the baseline, plus the number + // of whole pixels below it. + ascent_ = SkScalarCeil(-metrics.fAscent); + height_ = ascent_ + + SkScalarCeil(metrics.fDescent) + + SkScalarCeil(metrics.fLeading); if (metrics.fAvgCharWidth) { avg_width_ = SkScalarRound(metrics.fAvgCharWidth); @@ -54,6 +58,23 @@ void Font::calculateMetrics() { avg_width_ = static_cast<int>(ceilf(SkScalarToFloat(width))); } + + // HACK ALERT! Skia and Pango don't agree about how to vertically size text. + // Since we use Pango in gfx::Canvas, we need to use its version of the + // height or various layouts will look weird. + // + // From debugging, it looks like Skia's notion of ascenders and descenders + // are correct from the pixel rendering, but includes no leading or other + // space around the text. Pango includes extra space (at least for the fonts + // tested). To hack around this, we now ask Pango to get the height of a + // string: we use "l" for the highest ascender, and "g" to get a descender. + // + // TODO(brettw/jhawkins): figure out how to get the real height that Pango + // will use in a reasonable way. This is a horrible hack! + int width, height; + Canvas cvs(1, 1, true); + cvs.SizeStringInt(L"lg", *this, &width, &height, 0); + height_ = height; } void Font::CopyFont(const Font& other) { |