| // Copyright 2014 The Cobalt Authors. All Rights Reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef COBALT_RENDER_TREE_FONT_H_ |
| #define COBALT_RENDER_TREE_FONT_H_ |
| |
| #include <vector> |
| |
| #include "base/memory/ref_counted.h" |
| #include "cobalt/math/rect_f.h" |
| #include "cobalt/render_tree/glyph.h" |
| #include "cobalt/render_tree/typeface.h" |
| |
| namespace cobalt { |
| namespace render_tree { |
| |
| // Contains metrics common to all glyphs in the font. |
| class FontMetrics { |
| public: |
| FontMetrics(float ascent, float descent, float leading, float x_height) |
| : ascent_(ascent), |
| descent_(descent), |
| leading_(leading), |
| x_height_(x_height) {} |
| float ascent() const { return ascent_; } |
| float descent() const { return descent_; } |
| float leading() const { return leading_; } |
| float x_height() const { return x_height_; } |
| float em_box_height() const { return ascent_ + descent_ + leading_; } |
| float baseline_offset_from_top() const { return ascent_ + leading_ / 2; } |
| |
| private: |
| // The recommended distance above the baseline. |
| float ascent_; |
| // The recommended distance below the baseline. |
| float descent_; |
| // The recommended distance to add between lines of text. |
| float leading_; |
| // The x-height, aka the height of the 'x' glyph, used for centering. |
| // See also https://en.wikipedia.org/wiki/X-height |
| float x_height_; |
| }; |
| |
| // Used as a parameter to GetLocalTypeface() and GetCharacterFallbackTypeface() |
| // to describe the font style the caller is seeking. |
| struct FontStyle { |
| enum Weight { |
| kThinWeight = 100, |
| kExtraLightWeight = 200, |
| kLightWeight = 300, |
| kNormalWeight = 400, |
| kMediumWeight = 500, |
| kSemiBoldWeight = 600, |
| kBoldWeight = 700, |
| kExtraBoldWeight = 800, |
| kBlackWeight = 900 |
| }; |
| |
| enum Slant { |
| kUprightSlant, |
| kItalicSlant, |
| }; |
| |
| FontStyle() : weight(kNormalWeight), slant(kUprightSlant) {} |
| FontStyle(Weight font_weight, Slant font_slant) |
| : weight(font_weight), slant(font_slant) {} |
| |
| Weight weight; |
| Slant slant; |
| }; |
| |
| // The Font class is an abstract base class representing a typeface with a |
| // specific size. It provides the font metrics common to all glyphs in the |
| // font, and supports retrieval of both the glyph that it uses for each UTF-32 |
| // character and the bounds and width information for any of its contained |
| // glyphs. Since Font objects may be created in the front-end, but must be |
| // accessed by the rasterizer during GlyphBuffer creation, it is expected that |
| // they will be downcast again to a rasterizer-specific type through |
| // base::polymorphic_downcast(). |
| // NOTE: Font objects are not immutable and offer no thread safety guarantees. |
| // While Font is intended to assist in the creation of GlyphBuffer objects, only |
| // GlyphBuffer objects, which are immutable and thread-safe, should be accessed |
| // on multiple threads. |
| class Font : public base::RefCounted<Font> { |
| public: |
| // Returns the font's typeface id, which is guaranteed to be unique among the |
| // typefaces registered with the font's resource provider. |
| virtual TypefaceId GetTypefaceId() const = 0; |
| |
| // Returns the metrics common to all glyphs in the font. Used to calculate |
| // the recommended line height and spacing between the lines. |
| virtual FontMetrics GetFontMetrics() const = 0; |
| |
| // Returns an index to the glyph that the font provides for a given UTF-32 |
| // unicode character. If the character is unsupported, then it returns |
| // kInvalidGlyphIndex. |
| virtual GlyphIndex GetGlyphForCharacter(int32 utf32_character) = 0; |
| |
| // Returns the bounding box for a given glyph. While left is always zero, |
| // note that since the glyph is output with the origin vertically on the |
| // baseline, the top of the bounding box will likely be non-zero and is used |
| // to indicate the offset of the glyph bounding box from the origin. The |
| // return value is given in units of pixels. |
| virtual const math::RectF& GetGlyphBounds(GlyphIndex glyph) = 0; |
| |
| // Returns the width of a given glyph. The return value is given in units of |
| // pixels. |
| virtual float GetGlyphWidth(GlyphIndex glyph) = 0; |
| |
| protected: |
| virtual ~Font() {} |
| |
| // Allow the reference counting system access to our destructor. |
| friend class base::RefCounted<Font>; |
| }; |
| |
| typedef std::vector<scoped_refptr<Font> > FontVector; |
| |
| } // namespace render_tree |
| } // namespace cobalt |
| |
| #endif // COBALT_RENDER_TREE_FONT_H_ |