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