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

Side by Side Diff: ui/gfx/render_text_win.cc

Issue 8401032: Correct text y position calculation in RenderTextWin. (Closed) Base URL: svn://svn.chromium.org/chrome/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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/gfx/render_text_win.h" 5 #include "ui/gfx/render_text_win.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/stl_util.h" 8 #include "base/stl_util.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "ui/gfx/canvas.h" 10 #include "ui/gfx/canvas.h"
(...skipping 571 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 582
583 void RenderTextWin::DrawVisualText(Canvas* canvas) { 583 void RenderTextWin::DrawVisualText(Canvas* canvas) {
584 if (text().empty()) 584 if (text().empty())
585 return; 585 return;
586 586
587 SkCanvas* canvas_skia = canvas->GetSkCanvas(); 587 SkCanvas* canvas_skia = canvas->GetSkCanvas();
588 588
589 Point offset(ToViewPoint(Point())); 589 Point offset(ToViewPoint(Point()));
590 // TODO(msw): Establish a vertical baseline for strings of mixed font heights. 590 // TODO(msw): Establish a vertical baseline for strings of mixed font heights.
591 size_t height = default_style().font.GetHeight(); 591 size_t height = default_style().font.GetHeight();
592
593 float base_x = SkIntToScalar(offset.x());
594 float base_y = SkIntToScalar(offset.y());
592 // Center the text vertically in the display area. 595 // Center the text vertically in the display area.
593 offset.Offset(0, (display_rect().height() - height) / 2); 596 base_y += (display_rect().height() - height) / 2;
597 // Offset by the font size to account for Skia expecting y to be the bottom.
598 base_y += default_style().font.GetFontSize();
594 599
595 SkPaint paint; 600 SkPaint paint;
596 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding); 601 paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
597 paint.setStyle(SkPaint::kFill_Style); 602 paint.setStyle(SkPaint::kFill_Style);
598 paint.setAntiAlias(true); 603 paint.setAntiAlias(true);
599 paint.setSubpixelText(true); 604 paint.setSubpixelText(true);
600 paint.setLCDRenderText(true); 605 paint.setLCDRenderText(true);
601 SkPoint point(SkPoint::Make(SkIntToScalar(offset.x()), 606
602 SkIntToScalar(display_rect().height() - offset.y())));
603 scoped_array<SkPoint> pos; 607 scoped_array<SkPoint> pos;
604 for (size_t i = 0; i < runs_.size(); ++i) { 608 for (size_t i = 0; i < runs_.size(); ++i) {
605 // Get the run specified by the visual-to-logical map. 609 // Get the run specified by the visual-to-logical map.
606 internal::TextRun* run = runs_[visual_to_logical_[i]]; 610 internal::TextRun* run = runs_[visual_to_logical_[i]];
607 611
608 // TODO(msw): Font default/fallback and style integration. 612 // TODO(msw): Font default/fallback and style integration.
609 std::string font(UTF16ToASCII(run->font.GetFontName())); 613 std::string font(UTF16ToASCII(run->font.GetFontName()));
610 SkTypeface::Style style = SkTypeface::kNormal; 614 SkTypeface::Style style = SkTypeface::kNormal;
611 SkTypeface* typeface = SkTypeface::CreateFromName(font.c_str(), style); 615 SkTypeface* typeface = SkTypeface::CreateFromName(font.c_str(), style);
612 if (typeface) { 616 if (typeface) {
613 paint.setTypeface(typeface); 617 paint.setTypeface(typeface);
614 // |paint| adds its own ref. Release the ref from CreateFromName. 618 // |paint| adds its own ref. Release the ref from CreateFromName.
615 typeface->unref(); 619 typeface->unref();
616 } 620 }
617 paint.setTextSize(run->font.GetFontSize()); 621 paint.setTextSize(run->font.GetFontSize());
618 paint.setColor(run->foreground); 622 paint.setColor(run->foreground);
619 623
620 // Based on WebCore::skiaDrawText. 624 // Based on WebCore::skiaDrawText.
621 pos.reset(new SkPoint[run->glyph_count]); 625 pos.reset(new SkPoint[run->glyph_count]);
622 for (int glyph = 0; glyph < run->glyph_count; glyph++) { 626 for (int glyph = 0; glyph < run->glyph_count; glyph++) {
623 pos[glyph].set(point.x() + run->offsets[glyph].du, 627 pos[glyph].set(base_x + run->offsets[glyph].du,
624 point.y() + run->offsets[glyph].dv); 628 base_y + run->offsets[glyph].dv);
625 point.offset(SkIntToScalar(run->advance_widths[glyph]), 0); 629 base_x += SkIntToScalar(run->advance_widths[glyph]);
626 } 630 }
627 size_t byte_length = run->glyph_count * sizeof(WORD); 631 size_t byte_length = run->glyph_count * sizeof(WORD);
628 canvas_skia->drawPosText(run->glyphs.get(), byte_length, pos.get(), paint); 632 canvas_skia->drawPosText(run->glyphs.get(), byte_length, pos.get(), paint);
629 633
630 // Draw the strikethrough. 634 // Draw the strikethrough.
631 if (run->strike) { 635 if (run->strike) {
632 Rect bounds(offset, Size(run->width, run->font.GetHeight())); 636 Rect bounds(offset, Size(run->width, run->font.GetHeight()));
633 SkPaint strike; 637 SkPaint strike;
634 strike.setAntiAlias(true); 638 strike.setAntiAlias(true);
635 strike.setStyle(SkPaint::kFill_Style); 639 strike.setStyle(SkPaint::kFill_Style);
(...skipping 16 matching lines...) Expand all
652 Rect r(GetUpdatedCursorBounds()); 656 Rect r(GetUpdatedCursorBounds());
653 canvas->DrawRectInt(kCursorColor, r.x(), r.y(), r.width(), r.height()); 657 canvas->DrawRectInt(kCursorColor, r.x(), r.y(), r.width(), r.height());
654 } 658 }
655 } 659 }
656 660
657 RenderText* RenderText::CreateRenderText() { 661 RenderText* RenderText::CreateRenderText() {
658 return new RenderTextWin; 662 return new RenderTextWin;
659 } 663 }
660 664
661 } // namespace gfx 665 } // namespace gfx
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698