Add C API for getting font metrics from an sk_paint_t.
authorPeter Golde <peter@golde.org>
Tue, 15 Mar 2016 17:27:40 +0000 (10:27 -0700)
committerPeter Golde <peter@golde.org>
Tue, 15 Mar 2016 17:27:40 +0000 (10:27 -0700)
include/c/sk_paint.h
include/c/sk_types.h
src/c/sk_paint.cpp
src/c/sk_types_priv.h

index e5e1cc46cdce3c694268f4ec487ba01ba410df72..2f189aef4438b50017b4cd3ef1f0e58c5fa7bcfe 100644 (file)
@@ -206,7 +206,10 @@ SK_API float sk_paint_measure_text(const sk_paint_t* cpaint, const void* text, s
  *  Return the width of the UTF16 encoded text
  */
 SK_API float sk_paint_measure_utf16_text(sk_paint_t* cpaint, const void* text, size_t length, sk_rect_t* cbounds);
-
+/**
+ *  Get the font metrics for the current typeface and type size. 
+ */
+SK_API void sk_paint_get_fontmetrics(sk_paint_t* cpaint, sk_fontmetrics_t* cfontmetrics);
 
 SK_C_PLUS_PLUS_END_GUARD
 
index 6c6b7546e47156c85fb0c9a5ce6cb012416b0a84..76897c426bc0cd7190cbfccc24d12fa2eb216c60 100644 (file)
@@ -128,6 +128,27 @@ typedef struct {
     float   mat[9];
 } sk_matrix_t;
 
+typedef struct {
+    uint32_t fFlags;            // Bit field to identify which values are unknown
+    float    fTop;              // The greatest distance above the baseline for any glyph (will be <= 0)
+    float    fAscent;           // The recommended distance above the baseline (will be <= 0)
+    float    fDescent;          // The recommended distance below the baseline (will be >= 0)
+    float    fBottom;           // The greatest distance below the baseline for any glyph (will be >= 0)
+    float    fLeading;          // The recommended distance to add between lines of text (will be >= 0)
+    float    fAvgCharWidth;     // the average character width (>= 0)
+    float    fMaxCharWidth;     // the max character width (>= 0)
+    float    fXMin;             // The minimum bounding box x value for all glyphs
+    float    fXMax;             // The maximum bounding box x value for all glyphs
+    float    fXHeight;          // The height of an 'x' in px, or 0 if no 'x' in face
+    float    fCapHeight;        // The cap height (> 0), or 0 if cannot be determined.
+    float    fUnderlineThickness; // underline thickness, or 0 if cannot be determined
+    float    fUnderlinePosition; // underline position, or 0 if cannot be determined
+} sk_fontmetrics_t;
+
+// Flags for fFlags member of sk_fontmetrics_t
+#define FONTMETRICS_FLAGS_UNDERLINE_THICKNESS_IS_VALID (1U << 0)
+#define FONTMETRICS_FLAGS_UNDERLINE_POSITION_IS_VALID (1U << 1)
+
 /**
     A sk_canvas_t encapsulates all of the state about drawing into a
     destination This includes a reference to the destination itself,
index ed49808068e6d4615aa65744dd47e2c4c771b323..fd47672129cb0ed5755053083fb3c829f14ad378 100644 (file)
@@ -250,3 +250,9 @@ float sk_paint_measure_utf16_text(sk_paint_t* cpaint, const void* text, size_t l
     return ret;
 }
 
+void sk_paint_get_fontmetrics(sk_paint_t* cpaint, sk_fontmetrics_t* cfontmetrics)
+{
+    SkPaint *paint = AsPaint(cpaint);
+    paint->getFontMetrics(AsFontMetrics(cfontmetrics));
+}
+
index 86da45736b0669006d7f4bf642d0912f7be4761c..02684d51ced8feb003b95b20be82aa9e3d790461 100644 (file)
@@ -256,6 +256,14 @@ static inline const SkImageFilter::CropRect* AsImageFilterCropRect(const sk_imag
     return reinterpret_cast<const SkImageFilter::CropRect*>(p);
 }
 
+static inline SkPaint::FontMetrics* AsFontMetrics(sk_fontmetrics_t* p) {
+    return reinterpret_cast<SkPaint::FontMetrics*>(p);
+}
+
+static inline sk_fontmetrics_t* ToFontMetrics(SkPaint::FontMetrics* p) {
+    return reinterpret_cast<sk_fontmetrics_t*>(p);
+}
+
 const struct {
     sk_xfermode_mode_t  fC;
     SkXfermode::Mode    fSK;