// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UI_GFX_TEXT_UTILS_H_ #define UI_GFX_TEXT_UTILS_H_ #include <stddef.h> #include <string> #include "ui/gfx/gfx_export.h" #include "ui/gfx/text_constants.h" namespace gfx { class FontList; class Insets; class Size; // Strips the accelerator char ('&') from a menu string. Useful for platforms // which use underlining to indicate accelerators. // // Single accelerator chars ('&') will be stripped from the string. Double // accelerator chars ('&&') will be converted to a single '&'. The out params // |accelerated_char_pos| and |accelerated_char_span| will be set to the index // and span of the last accelerated character, respectively, or -1 and 0 if // there was none. GFX_EXPORT std::u16string LocateAndRemoveAcceleratorChar( const std::u16string& s, int* accelerated_char_pos, int* accelerated_char_span); // Strips all accelerator notation from a menu string. Useful for platforms // which use underlining to indicate accelerators, as well as situations where // accelerators are not indicated. // // Single accelerator chars ('&') will be stripped from the string. Double // accelerator chars ('&&') will be converted to a single '&'. CJK language // accelerators, specified as "(&x)", will be entirely removed too. GFX_EXPORT std::u16string RemoveAccelerator(const std::u16string& s); // Returns the number of horizontal pixels needed to display the specified // |text| with |font_list|. |typesetter| indicates where the text will be // displayed. GFX_EXPORT int GetStringWidth(const std::u16string& text, const FontList& font_list); // Returns the size required to render |text| in |font_list|. This includes all // leading space, descender area, etc. even if the text to render does not // contain characters with ascenders or descenders. GFX_EXPORT Size GetStringSize(const std::u16string& text, const FontList& font_list); // This is same as GetStringWidth except that fractional width is returned. GFX_EXPORT float GetStringWidthF(const std::u16string& text, const FontList& font_list); // Returns a valid cut boundary at or before |index|. The surrogate pair and // combining characters should not be separated. GFX_EXPORT size_t FindValidBoundaryBefore(const std::u16string& text, size_t index, bool trim_whitespace = false); // Returns a valid cut boundary at or after |index|. The surrogate pair and // combining characters should not be separated. GFX_EXPORT size_t FindValidBoundaryAfter(const std::u16string& text, size_t index, bool trim_whitespace = false); // If the UI layout is right-to-left, flip the alignment direction. GFX_EXPORT HorizontalAlignment MaybeFlipForRTL(HorizontalAlignment alignment); // Returns insets that can be used to draw a highlight or border that appears to // be distance |desired_visual_padding| from the body of a string of text // rendered using |font_list|. The insets are adjusted based on the box used to // render capital letters (or the bodies of most letters in non-capital fonts // like Hebrew and Devanagari), in order to give the best visual appearance. // // That is, any portion of |desired_visual_padding| overlapping the font's // leading space or descender area are truncated, to a minimum of zero. // // In this example, the text is rendered in a highlight that stretches above and // below the height of the H as well as to the left and right of the text // (|desired_visual_padding| = {2, 2, 2, 2}). Note that the descender of the 'y' // overlaps with the padding, as it is outside the capital letter box. // // The resulting padding is {1, 2, 1, 2}. // // . . . . . . . . . . | actual top // . . | | leading space // . | | _ . | font | capital // . |--| /_\ \ / . | height | height // . | | \_ \/ . | | // . / . | | descender // . . . . . . . . . . | actual bottom // ___ ___ // actual actual // left right // GFX_EXPORT Insets AdjustVisualBorderForFont(const FontList& font_list, const Insets& desired_visual_padding); // Returns the y adjustment necessary to align the center of the "cap size" box // - the space between a capital letter's top and bottom - between two fonts. // For non-capital scripts (e.g. Hebrew, Devanagari) the box containing the body // of most letters is used. // // A positive return value means the font |to_center| needs to be moved down // relative to the font |original_font|, while a negative value means it needs // to be moved up. // // Illustration: // // original_font to_center // ---------- ] - return value (+1) // leading ---------- // ---------- leading // ---------- // // cap-height cap-height // // ---------- // ---------- descent // descent ---------- // ---------- // // Visual result: Non-Latin example (Devanagari ऐ "ai"): // \ // |\ | ------ \ // | \ | |\ | | | ---- // | \ | | \| \ / \| // | \| \ / // / // GFX_EXPORT int GetFontCapHeightCenterOffset(const gfx::FontList& original_font, const gfx::FontList& to_center); } // namespace gfx #endif // UI_GFX_TEXT_UTILS_H_