public Result Shape()

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);
		}