blob: 717a87f056f38cb516469d31f4fc616851ac3d4f [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkFontMetrics_DEFINED
#define SkFontMetrics_DEFINED
#include "include/core/SkScalar.h"
/** \class SkFontMetrics
The metrics of an SkFont.
The metric values are consistent with the Skia y-down coordinate system.
*/
struct SK_API SkFontMetrics {
bool operator==(const SkFontMetrics& that) {
return
this->fFlags == that.fFlags &&
this->fTop == that.fTop &&
this->fAscent == that.fAscent &&
this->fDescent == that.fDescent &&
this->fBottom == that.fBottom &&
this->fLeading == that.fLeading &&
this->fAvgCharWidth == that.fAvgCharWidth &&
this->fMaxCharWidth == that.fMaxCharWidth &&
this->fXMin == that.fXMin &&
this->fXMax == that.fXMax &&
this->fXHeight == that.fXHeight &&
this->fCapHeight == that.fCapHeight &&
this->fUnderlineThickness == that.fUnderlineThickness &&
this->fUnderlinePosition == that.fUnderlinePosition &&
this->fStrikeoutThickness == that.fStrikeoutThickness &&
this->fStrikeoutPosition == that.fStrikeoutPosition;
}
/** \enum FontMetricsFlags
FontMetricsFlags indicate when certain metrics are valid;
the underline or strikeout metrics may be valid and zero.
Fonts with embedded bitmaps may not have valid underline or strikeout metrics.
*/
enum FontMetricsFlags {
kUnderlineThicknessIsValid_Flag = 1 << 0, //!< set if fUnderlineThickness is valid
kUnderlinePositionIsValid_Flag = 1 << 1, //!< set if fUnderlinePosition is valid
kStrikeoutThicknessIsValid_Flag = 1 << 2, //!< set if fStrikeoutThickness is valid
kStrikeoutPositionIsValid_Flag = 1 << 3, //!< set if fStrikeoutPosition is valid
kBoundsInvalid_Flag = 1 << 4, //!< set if fTop, fBottom, fXMin, fXMax invalid
};
uint32_t fFlags; //!< FontMetricsFlags indicating which metrics are valid
SkScalar fTop; //!< greatest extent above origin of any glyph bounding box, typically negative; deprecated with variable fonts
SkScalar fAscent; //!< distance to reserve above baseline, typically negative
SkScalar fDescent; //!< distance to reserve below baseline, typically positive
SkScalar fBottom; //!< greatest extent below origin of any glyph bounding box, typically positive; deprecated with variable fonts
SkScalar fLeading; //!< distance to add between lines, typically positive or zero
SkScalar fAvgCharWidth; //!< average character width, zero if unknown
SkScalar fMaxCharWidth; //!< maximum character width, zero if unknown
SkScalar fXMin; //!< greatest extent to left of origin of any glyph bounding box, typically negative; deprecated with variable fonts
SkScalar fXMax; //!< greatest extent to right of origin of any glyph bounding box, typically positive; deprecated with variable fonts
SkScalar fXHeight; //!< height of lower-case 'x', zero if unknown, typically negative
SkScalar fCapHeight; //!< height of an upper-case letter, zero if unknown, typically negative
SkScalar fUnderlineThickness; //!< underline thickness
SkScalar fUnderlinePosition; //!< distance from baseline to top of stroke, typically positive
SkScalar fStrikeoutThickness; //!< strikeout thickness
SkScalar fStrikeoutPosition; //!< distance from baseline to bottom of stroke, typically negative
/** Returns true if SkFontMetrics has a valid underline thickness, and sets
thickness to that value. If the underline thickness is not valid,
return false, and ignore thickness.
@param thickness storage for underline width
@return true if font specifies underline width
*/
bool hasUnderlineThickness(SkScalar* thickness) const {
if (SkToBool(fFlags & kUnderlineThicknessIsValid_Flag)) {
*thickness = fUnderlineThickness;
return true;
}
return false;
}
/** Returns true if SkFontMetrics has a valid underline position, and sets
position to that value. If the underline position is not valid,
return false, and ignore position.
@param position storage for underline position
@return true if font specifies underline position
*/
bool hasUnderlinePosition(SkScalar* position) const {
if (SkToBool(fFlags & kUnderlinePositionIsValid_Flag)) {
*position = fUnderlinePosition;
return true;
}
return false;
}
/** Returns true if SkFontMetrics has a valid strikeout thickness, and sets
thickness to that value. If the underline thickness is not valid,
return false, and ignore thickness.
@param thickness storage for strikeout width
@return true if font specifies strikeout width
*/
bool hasStrikeoutThickness(SkScalar* thickness) const {
if (SkToBool(fFlags & kStrikeoutThicknessIsValid_Flag)) {
*thickness = fStrikeoutThickness;
return true;
}
return false;
}
/** Returns true if SkFontMetrics has a valid strikeout position, and sets
position to that value. If the underline position is not valid,
return false, and ignore position.
@param position storage for strikeout position
@return true if font specifies strikeout position
*/
bool hasStrikeoutPosition(SkScalar* position) const {
if (SkToBool(fFlags & kStrikeoutPositionIsValid_Flag)) {
*position = fStrikeoutPosition;
return true;
}
return false;
}
/** Returns true if SkFontMetrics has a valid fTop, fBottom, fXMin, and fXMax.
If the bounds are not valid, return false.
@return true if font specifies maximum glyph bounds
*/
bool hasBounds() const {
return !SkToBool(fFlags & kBoundsInvalid_Flag);
}
};
#endif