15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_GFX_PANGO_UTIL_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_GFX_PANGO_UTIL_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cairo/cairo.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <pango/pango.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_export.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _PangoContext PangoContext; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Font; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PlatformFontPango; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates and returns a PangoContext. The caller owns the context. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PangoContext* GetPangoContext(); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the resolution (DPI) used by pango. A negative values means the 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// resolution hasn't been set. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)double GetPangoResolution(); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utility class to ensure that PangoFontDescription is freed. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedPangoFontDescription { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit ScopedPangoFontDescription(PangoFontDescription* description) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : description_(description) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(description); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~ScopedPangoFontDescription() { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pango_font_description_free(description_); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PangoFontDescription* get() { return description_; } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PangoFontDescription* description_; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ScopedPangoFontDescription); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Uses Pango to draw text onto |cr|. This is the public method for d 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UI_EXPORT DrawTextOntoCairoSurface(cairo_t* cr, 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& text, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font& font, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& clip, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor text_color, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------------------------------------------------------- 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All other methods in this file are only to be used within the ui/ directory. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// They are shared with internal skia interfaces. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ---------------------------------------------------------------------------- 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Setup pango |layout|; set the |text|, the font description based on |font|, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the |width| in PANGO_SCALE for RTL locale, the base |text_direction|, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// alignment, ellipsis, word wrapping, resolution, etc. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPangoLayout(PangoLayout* layout, 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& text, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Font& font, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection text_direction, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Setup pango layout |layout| the same way as SetupPangoLayout(), except this 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sets the font description based on |font_description|. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetupPangoLayoutWithFontDescription( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PangoLayout* layout, 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::string16& text, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& font_description, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection text_direction, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Draws the |layout| (pango tuple of font, actual text, etc) onto |cr| using 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |text_color| as the cairo pattern. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DrawPangoLayout(cairo_t* cr, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PangoLayout* layout, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Font& font, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& text_rect, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkColor text_color, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::TextDirection text_direction, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Draw an underline under the text using |cr|, which must already be 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// initialized with the correct source. |extra_edge_width| is added to the 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// outer edge of the line. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void DrawPangoTextUnderline(cairo_t* cr, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::PlatformFontPango* platform_font, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double extra_edge_width, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Rect& text_rect); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the size in pixels for the specified |pango_font|. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)size_t GetPangoFontSizeInPixels(PangoFontDescription* pango_font); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Retrieves the Pango metrics for a Pango font description. Caches the metrics 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and never frees them. The metrics objects are relatively small and very 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expensive to look up. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PangoFontMetrics* GetPangoFontMetrics(PangoFontDescription* desc); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gfx 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_GFX_PANGO_UTIL_H_ 117