Index: include/core/SkTextBlob.h |
diff --git a/include/core/SkTextBlob.h b/include/core/SkTextBlob.h |
index 1addb6f9142e11b7252ec3a534f50b571bfee44e..01263af02d6701099efca009be0e02d93ea70d2c 100644 |
--- a/include/core/SkTextBlob.h |
+++ b/include/core/SkTextBlob.h |
@@ -10,6 +10,7 @@ |
#include "../private/SkTemplates.h" |
#include "SkPaint.h" |
+#include "SkString.h" |
#include "SkRefCnt.h" |
class SkReadBuffer; |
@@ -49,7 +50,7 @@ public: |
return MakeFromBuffer(buffer).release(); |
} |
- enum GlyphPositioning { |
+ enum GlyphPositioning : uint8_t { |
kDefault_Positioning = 0, // Default glyph advances -- zero scalars per glyph. |
kHorizontal_Positioning = 1, // Horizontal positioning -- one scalar per glyph. |
kFull_Positioning = 2 // Point positioning -- two scalars per glyph. |
@@ -112,11 +113,29 @@ public: |
/** |
* Glyph and position buffers associated with a run. |
* |
- * A run is a sequence of glyphs sharing the same font metrics and positioning mode. |
+ * A run is a sequence of glyphs sharing the same font metrics |
+ * and positioning mode. |
+ * |
+ * If textByteCount is 0, utf8text and clusters will be NULL (no |
+ * character information will be associated with the glyphs). |
+ * |
+ * utf8text will point to a buffer of size textByteCount bytes. |
+ * |
+ * clusters (if not NULL) will point to an array of size count. |
+ * For each glyph, give the byte-offset into the text for the |
+ * first byte in the first character in that glyph's cluster. |
+ * Each value in the array should be an integer less than |
+ * textByteCount. Values in the array should either be |
+ * monotonically increasing (left-to-right text) or monotonically |
+ * decreasing (right-to-left text). This definiton is conviently |
+ * the same as used by Harfbuzz's hb_glyph_info_t::cluster field, |
+ * except that Harfbuzz interleaves glyphs and clusters. |
*/ |
struct RunBuffer { |
SkGlyphID* glyphs; |
SkScalar* pos; |
+ char* utf8text; |
+ uint32_t* clusters; |
}; |
/** |
@@ -126,14 +145,27 @@ public: |
* @param font The font to be used for this run. |
* @param count Number of glyphs. |
* @param x,y Position within the blob. |
+ * @param textByteCount length of the original UTF-8 text that |
+ * corresponds to this sequence of glyphs. If 0, |
+ * text will not be included in the textblob. |
+ * @param lang Language code, currently unimplemented. |
* @param bounds Optional run bounding box. If known in advance (!= NULL), it will |
* be used when computing the blob bounds, to avoid re-measuring. |
* |
* @return A writable glyph buffer, valid until the next allocRun() or |
* build() call. The buffer is guaranteed to hold @count@ glyphs. |
*/ |
+ const RunBuffer& allocRunText(const SkPaint& font, |
+ int count, |
+ SkScalar x, |
+ SkScalar y, |
+ int textByteCount, |
+ SkString lang, |
+ const SkRect* bounds = NULL); |
const RunBuffer& allocRun(const SkPaint& font, int count, SkScalar x, SkScalar y, |
- const SkRect* bounds = NULL); |
+ const SkRect* bounds = NULL) { |
+ return this->allocRunText(font, count, x, y, 0, SkString(), bounds); |
+ } |
/** |
* Allocates a new horizontally-positioned run and returns its writable glyph and position |
@@ -142,14 +174,23 @@ public: |
* @param font The font to be used for this run. |
* @param count Number of glyphs. |
* @param y Vertical offset within the blob. |
+ * @param textByteCount length of the original UTF-8 text that |
+ * corresponds to this sequence of glyphs. If 0, |
+ * text will not be included in the textblob. |
+ * @param lang Language code, currently unimplemented. |
* @param bounds Optional run bounding box. If known in advance (!= NULL), it will |
* be used when computing the blob bounds, to avoid re-measuring. |
* |
* @return Writable glyph and position buffers, valid until the next allocRun() |
* or build() call. The buffers are guaranteed to hold @count@ elements. |
*/ |
+ const RunBuffer& allocRunTextPosH(const SkPaint& font, int count, SkScalar y, |
+ int textByteCount, SkString lang, |
+ const SkRect* bounds = NULL); |
const RunBuffer& allocRunPosH(const SkPaint& font, int count, SkScalar y, |
- const SkRect* bounds = NULL); |
+ const SkRect* bounds = NULL) { |
+ return this->allocRunTextPosH(font, count, y, 0, SkString(), bounds); |
+ } |
/** |
* Allocates a new fully-positioned run and returns its writable glyph and position |
@@ -157,6 +198,10 @@ public: |
* |
* @param font The font to be used for this run. |
* @param count Number of glyphs. |
+ * @param textByteCount length of the original UTF-8 text that |
+ * corresponds to this sequence of glyphs. If 0, |
+ * text will not be included in the textblob. |
+ * @param lang Language code, currently unimplemented. |
* @param bounds Optional run bounding box. If known in advance (!= NULL), it will |
* be used when computing the blob bounds, to avoid re-measuring. |
* |
@@ -164,12 +209,18 @@ public: |
* or build() call. The glyph buffer and position buffer are |
* guaranteed to hold @count@ and 2 * @count@ elements, respectively. |
*/ |
- const RunBuffer& allocRunPos(const SkPaint& font, int count, const SkRect* bounds = NULL); |
+ const RunBuffer& allocRunTextPos(const SkPaint& font, int count, |
+ int textByteCount, SkString lang, |
+ const SkRect* bounds = NULL); |
+ const RunBuffer& allocRunPos(const SkPaint& font, int count, |
+ const SkRect* bounds = NULL) { |
+ return this->allocRunTextPos(font, count, 0, SkString(), bounds); |
+ } |
private: |
void reserve(size_t size); |
void allocInternal(const SkPaint& font, SkTextBlob::GlyphPositioning positioning, |
- int count, SkPoint offset, const SkRect* bounds); |
+ int count, int textBytes, SkPoint offset, const SkRect* bounds); |
bool mergeRun(const SkPaint& font, SkTextBlob::GlyphPositioning positioning, |
int count, SkPoint offset); |
void updateDeferredBounds(); |