in source/SkiaSharp.HarfBuzz/SkiaSharp.HarfBuzz/SKShaper.cs [44:101]
public Result Shape(Buffer buffer, SKPaint paint) =>
Shape(buffer, 0, 0, paint.GetFont());
[Obsolete("Use Shape(Buffer buffer, float xOffset, float yOffset, SKFont font) instead.")]
public Result Shape(Buffer buffer, float xOffset, float yOffset, SKPaint paint) =>
Shape(buffer, xOffset, yOffset, paint.GetFont());
public Result Shape(Buffer buffer, SKFont font) =>
Shape(buffer, 0, 0, font);
public Result Shape(Buffer buffer, float xOffset, float yOffset, SKFont font)
{
if (buffer == null)
{
throw new ArgumentNullException(nameof(buffer));
}
if (font == null)
{
throw new ArgumentNullException(nameof(font));
}
// do the shaping
hbFont.Shape(buffer);
// get the shaping results
var len = buffer.Length;
var info = buffer.GlyphInfos;
var pos = buffer.GlyphPositions;
// get the sizes
float textSizeY = font.Size / FONT_SIZE_SCALE;
float textSizeX = textSizeY * font.ScaleX;
var points = new SKPoint[len];
var clusters = new uint[len];
var codepoints = new uint[len];
var xOffsetStart = xOffset;
for (var i = 0; i < len; i++)
{
codepoints[i] = info[i].Codepoint;
clusters[i] = info[i].Cluster;
points[i] = new SKPoint(
xOffset + pos[i].XOffset * textSizeX,
yOffset - pos[i].YOffset * textSizeY);
// move the cursor
xOffset += pos[i].XAdvance * textSizeX;
yOffset += pos[i].YAdvance * textSizeY;
}
var width = xOffset - xOffsetStart;
return new Result(codepoints, clusters, points, width);
}