Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Unified Diff: ui/gfx/render_text_win.cc

Issue 8725002: Draw text via Skia in RenderTextLinux. (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« ui/gfx/render_text_linux.cc ('K') | « ui/gfx/render_text_linux.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/render_text_win.cc
===================================================================
--- ui/gfx/render_text_win.cc (revision 112492)
+++ ui/gfx/render_text_win.cc (working copy)
@@ -11,7 +11,6 @@
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "base/win/scoped_hdc.h"
-#include "third_party/skia/include/core/SkTypeface.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/canvas_skia.h"
#include "ui/gfx/platform_font.h"
@@ -27,42 +26,6 @@
// TODO(msw): Review memory use/failure? Max string length? Alternate approach?
const int kMaxGlyphs = 100000;
-// Draw underline and strike through text decorations.
-// Based on |SkCanvas::DrawTextDecorations()| and constants from:
-// third_party/skia/src/core/SkTextFormatParams.h
-void DrawTextRunDecorations(SkCanvas* canvas_skia,
- const SkPaint& paint,
- const gfx::internal::TextRun& run,
- SkScalar x,
- SkScalar y) {
- // Fraction of the text size to lower a strike through below the baseline.
- const SkScalar kStrikeThroughOffset = (-SK_Scalar1 * 6 / 21);
- // Fraction of the text size to lower an underline below the baseline.
- const SkScalar kUnderlineOffset = (SK_Scalar1 / 9);
- // Fraction of the text size to use for a strike through or under-line.
- const SkScalar kLineThickness = (SK_Scalar1 / 18);
-
- SkScalar text_size = paint.getTextSize();
- SkScalar height = SkScalarMul(text_size, kLineThickness);
- SkRect r;
-
- r.fLeft = x;
- r.fRight = x + run.width;
-
- if (run.underline) {
- SkScalar offset = SkScalarMulAdd(text_size, kUnderlineOffset, y);
- r.fTop = offset;
- r.fBottom = offset + height;
- canvas_skia->drawRect(r, paint);
- }
- if (run.strike) {
- SkScalar offset = SkScalarMulAdd(text_size, kStrikeThroughOffset, y);
- r.fTop = offset;
- r.fBottom = offset + height;
- canvas_skia->drawRect(r, paint);
- }
-}
-
// Callback to |EnumEnhMetaFile()| to intercept font creation.
int CALLBACK MetaFileEnumProc(HDC hdc,
HANDLETABLE* table,
@@ -404,7 +367,7 @@
}
void RenderTextWin::DrawVisualText(Canvas* canvas) {
- SkCanvas* canvas_skia = canvas->GetSkCanvas();
+ DCHECK(!needs_layout_);
Point offset(ToViewPoint(Point()));
// TODO(msw): Establish a vertical baseline for strings of mixed font heights.
@@ -417,45 +380,31 @@
// Offset by the font size to account for Skia expecting y to be the bottom.
y += default_style().font.GetFontSize();
- SkPaint paint;
- paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
- paint.setStyle(SkPaint::kFill_Style);
- paint.setAntiAlias(true);
- paint.setSubpixelText(true);
- paint.setLCDRenderText(true);
+ internal::SkiaTextRenderer renderer(canvas);
+ renderer.Init();
std::vector<SkPoint> pos;
for (size_t i = 0; i < runs_.size(); ++i) {
// Get the run specified by the visual-to-logical map.
internal::TextRun* run = runs_[visual_to_logical_[i]];
- // TODO(msw): Font default/fallback and style integration.
- SkTypeface::Style style = SkTypeface::kNormal;
- SkTypeface* typeface =
- SkTypeface::CreateFromName(run->font.GetFontName().c_str(), style);
- if (typeface) {
- paint.setTypeface(typeface);
- // |paint| adds its own ref. Release the ref from CreateFromName.
- typeface->unref();
- }
- paint.setTextSize(run->font.GetFontSize());
- paint.setColor(run->foreground);
-
- SkScalar run_x = x;
-
// Based on WebCore::skiaDrawText.
pos.resize(run->glyph_count);
+ SkScalar glyph_x = x;
for (int glyph = 0; glyph < run->glyph_count; glyph++) {
- pos[glyph].set(x + run->offsets[glyph].du,
+ pos[glyph].set(glyph_x + run->offsets[glyph].du,
y + run->offsets[glyph].dv);
- x += SkIntToScalar(run->advance_widths[glyph]);
+ glyph_x += SkIntToScalar(run->advance_widths[glyph]);
}
- size_t byte_length = run->glyph_count * sizeof(WORD);
- canvas_skia->drawPosText(run->glyphs.get(), byte_length, &pos[0], paint);
+ renderer.SetFont(run->font);
+ renderer.SetForegroundColor(run->foreground);
+ renderer.DrawPosText(&pos[0], run->glyphs.get(), run->glyph_count);
if (run->strike || run->underline)
- DrawTextRunDecorations(canvas_skia, paint, *run, run_x, y);
+ renderer.DrawDecorations(x, y, run->width, run->underline, run->strike);
+
+ x = glyph_x;
}
}
« ui/gfx/render_text_linux.cc ('K') | « ui/gfx/render_text_linux.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698