split out fontmetrics into its own struct

Future CLs will migrate all callers to use SkFontMetrics,
so we can remove the SkPaint typedef.

Next migrate the world to use SkFont::getMetrics() instead

Bug: skia:2664
Change-Id: I2aa45cd88762c3d3589c12f5074974af7fb85410
Reviewed-on: https://skia-review.googlesource.com/c/168641
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Mike Reed <reed@google.com>
This commit is contained in:
Mike Reed 2018-11-06 12:44:54 -05:00 committed by Skia Commit-Bot
parent 3674336c33
commit cb6f53efbc
6 changed files with 116 additions and 99 deletions

View File

@ -229,7 +229,7 @@ public:
boundsPaint.setStyle(SkPaint::kStroke_Style);
canvas->drawRect(fontBounds, boundsPaint);
SkPaint::FontMetrics fm;
SkFontMetrics fm;
glyphPaint.getFontMetrics(&fm);
SkPaint metricsPaint(boundsPaint);
metricsPaint.setStyle(SkPaint::kFill_Style);

View File

@ -0,0 +1,107 @@
/*
* 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 "SkScalar.h"
struct SK_API SkFontMetrics {
/** \enum SkPaint::FontMetrics::FontMetricsFlags
FontMetricsFlags are set in fFlags when underline and strikeout metrics are valid;
the underline or strikeout metric 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
};
uint32_t fFlags; //!< is set to FontMetricsFlags when metrics are valid
SkScalar fTop; //!< extent above baseline
SkScalar fAscent; //!< distance to reserve above baseline
SkScalar fDescent; //!< distance to reserve below baseline
SkScalar fBottom; //!< extent below baseline
SkScalar fLeading; //!< distance to add between lines
SkScalar fAvgCharWidth; //!< average character width
SkScalar fMaxCharWidth; //!< maximum character width
SkScalar fXMin; //!< minimum x
SkScalar fXMax; //!< maximum x
SkScalar fXHeight; //!< height of lower-case 'x'
SkScalar fCapHeight; //!< height of an upper-case letter
SkScalar fUnderlineThickness; //!< underline thickness
SkScalar fUnderlinePosition; //!< underline position relative to baseline
SkScalar fStrikeoutThickness; //!< strikeout thickness
SkScalar fStrikeoutPosition; //!< strikeout position relative to baseline
/** Returns true if SkPaint::FontMetrics 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 SkPaint::FontMetrics 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 SkPaint::FontMetrics 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 SkPaint::FontMetrics 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;
}
};
#endif

View File

@ -22,6 +22,7 @@
#include "SkBlendMode.h"
#include "SkColor.h"
#include "SkFilterQuality.h"
#include "SkFontMetrics.h"
#include "SkFontTypes.h"
#include "SkMatrix.h"
#include "SkRefCnt.h"
@ -950,98 +951,7 @@ public:
fStrikeoutThickness and fStrikeoutPosition have a bit set in fFlags if their values
are valid, since their value may be zero.
*/
struct FontMetrics {
/** \enum SkPaint::FontMetrics::FontMetricsFlags
FontMetricsFlags are set in fFlags when underline and strikeout metrics are valid;
the underline or strikeout metric 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
};
uint32_t fFlags; //!< is set to FontMetricsFlags when metrics are valid
SkScalar fTop; //!< extent above baseline
SkScalar fAscent; //!< distance to reserve above baseline
SkScalar fDescent; //!< distance to reserve below baseline
SkScalar fBottom; //!< extent below baseline
SkScalar fLeading; //!< distance to add between lines
SkScalar fAvgCharWidth; //!< average character width
SkScalar fMaxCharWidth; //!< maximum character width
SkScalar fXMin; //!< minimum x
SkScalar fXMax; //!< maximum x
SkScalar fXHeight; //!< height of lower-case 'x'
SkScalar fCapHeight; //!< height of an upper-case letter
SkScalar fUnderlineThickness; //!< underline thickness
SkScalar fUnderlinePosition; //!< underline position relative to baseline
SkScalar fStrikeoutThickness; //!< strikeout thickness
SkScalar fStrikeoutPosition; //!< strikeout position relative to baseline
/** Returns true if SkPaint::FontMetrics 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 SkPaint::FontMetrics 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 SkPaint::FontMetrics 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 SkPaint::FontMetrics 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;
}
};
typedef SkFontMetrics FontMetrics;
/** Returns SkPaint::FontMetrics associated with SkTypeface.
The return value is the recommended spacing between lines: the sum of metrics
@ -1054,7 +964,7 @@ public:
@param metrics storage for SkPaint::FontMetrics from SkTypeface; may be nullptr
@return recommended spacing between lines
*/
SkScalar getFontMetrics(FontMetrics* metrics) const;
SkScalar getFontMetrics(SkFontMetrics* metrics) const;
/** Returns the recommended spacing between lines: the sum of metrics
descent, ascent, and leading.

View File

@ -24,7 +24,7 @@ size_t compute_path_size(const SkPath& path) {
SkGlyphCache::SkGlyphCache(
const SkDescriptor& desc,
std::unique_ptr<SkScalerContext> scaler,
const SkPaint::FontMetrics& fontMetrics)
const SkFontMetrics& fontMetrics)
: fDesc{desc}
, fScalerContext{std::move(scaler)}
, fFontMetrics{fontMetrics}

View File

@ -34,7 +34,7 @@ class SkGlyphCache : public SkGlyphCacheInterface {
public:
SkGlyphCache(const SkDescriptor& desc,
std::unique_ptr<SkScalerContext> scaler,
const SkPaint::FontMetrics&);
const SkFontMetrics&);
~SkGlyphCache() override;
const SkDescriptor& getDescriptor() const;
@ -123,7 +123,7 @@ public:
/** Return the vertical metrics for this strike.
*/
const SkPaint::FontMetrics& getFontMetrics() const {
const SkFontMetrics& getFontMetrics() const {
return fFontMetrics;
}
@ -221,7 +221,7 @@ private:
const SkAutoDescriptor fDesc;
const std::unique_ptr<SkScalerContext> fScalerContext;
SkPaint::FontMetrics fFontMetrics;
SkFontMetrics fFontMetrics;
// Map from a combined GlyphID and sub-pixel position to a SkGlyph.
SkTHashTable<SkGlyph, SkPackedGlyphID, SkGlyph::HashTraits> fGlyphMap;

View File

@ -472,7 +472,7 @@ size_t SkPaint::breakText(const void* textD, size_t length, SkScalar maxWidth,
///////////////////////////////////////////////////////////////////////////////
SkScalar SkPaint::getFontMetrics(FontMetrics* metrics) const {
SkScalar SkPaint::getFontMetrics(SkFontMetrics* metrics) const {
SkCanonicalizePaint canon(*this);
const SkPaint& paint = canon.getPaint();
SkScalar scale = canon.getScale();