public static void ToSKPaint(this SP.Paint paint, SkiaCodeGenObjectCounter counter, StringBuilder sb, string indent) { var counterPaint = counter.Paint; sb.AppendLine($"{indent}var {counter.PaintVarName}{counterPaint} = new SKPaint();"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.Style = {paint.Style.ToSKPaintStyle()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.IsAntialias = {paint.IsAntialias.ToString(_ci).ToLower()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.StrokeWidth = {paint.StrokeWidth.ToString(_ci)}f;"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.StrokeCap = {paint.StrokeCap.ToSKStrokeCap()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.StrokeJoin = {paint.StrokeJoin.ToSKStrokeJoin()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.StrokeMiter = {paint.StrokeMiter.ToString(_ci)}f;"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.TextSize = {paint.TextSize.ToString(_ci)}f;"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.TextAlign = {paint.TextAlign.ToSKTextAlign()};"); if (paint.Typeface != null) { // TODO: Typeface = paint.Typeface?.ToSKTypeface(); sb.AppendLine($"{indent} // TODO: {counter.PaintVarName}{counterPaint}.Typeface"); } sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.LcdRenderText = {paint.LcdRenderText.ToString(_ci).ToLower()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.SubpixelText = {paint.SubpixelText.ToString(_ci).ToLower()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.TextEncoding = {paint.TextEncoding.ToSKTextEncoding()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.Color = {(paint.Color == null ? "SKColor.Empty" : ToSKColor(paint.Color.Value))};"); if (paint.Shader != null) { var counterShader = ++counter.Shader; paint.Shader.ToSKShader(counter, sb, indent); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.Shader = {counter.ShaderVarName}{counterShader};"); } if (paint.ColorFilter != null) { // TODO: ColorFilter = paint.ColorFilter?.ToSKColorFilter(); sb.AppendLine($"{indent} // TODO: {counter.PaintVarName}{counterPaint}.ColorFilter"); } if (paint.ImageFilter != null) { // TODO: ImageFilter = paint.ImageFilter?.ToSKImageFilter(); sb.AppendLine($"{indent} // TODO: {counter.PaintVarName}{counterPaint}.ImageFilter"); } if (paint.PathEffect != null) { // TODO: PathEffect = paint.PathEffect?.ToSKPathEffect(); sb.AppendLine($"{indent} // TODO: {counter.PaintVarName}{counterPaint}.PathEffect"); } sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.BlendMode = {paint.BlendMode.ToSKBlendMode()};"); sb.AppendLine($"{indent}{counter.PaintVarName}{counterPaint}.FilterQuality = {paint.FilterQuality.ToSKFilterQuality()};"); }
public static string Generate(SP.Picture picture, string namespaceName, string className) { var counter = new SkiaCodeGenObjectCounter(); var sb = new StringBuilder(); sb.AppendLine($"using SkiaSharp;"); sb.AppendLine($""); sb.AppendLine($"namespace {namespaceName}"); sb.AppendLine($"{{"); sb.AppendLine($" public class {className}"); sb.AppendLine($" {{"); sb.AppendLine($" public static SKPicture Picture {{ get; }}"); sb.AppendLine($""); sb.AppendLine($" static {className}()"); sb.AppendLine($" {{"); sb.AppendLine($" Picture = Record();"); sb.AppendLine($" }}"); sb.AppendLine($""); sb.AppendLine($" private static SKPicture Record()"); sb.AppendLine($" {{"); var indent = " "; var counterPicture = ++counter.Picture; picture.ToSKPicture(counter, sb, indent); sb.AppendLine($"{indent}return {counter.PictureVarName}{counterPicture};"); sb.AppendLine($" }}"); sb.AppendLine($""); sb.AppendLine($" public static void Draw(SKCanvas {counter.CanvasVarName})"); sb.AppendLine($" {{"); sb.AppendLine($" {counter.CanvasVarName}.DrawPicture(Picture);"); sb.AppendLine($" }}"); sb.AppendLine($" }}"); sb.AppendLine($"}}"); var code = sb.ToString(); return(code); }
public static void ToSKPicture(this SP.Picture?picture, SkiaCodeGenObjectCounter counter, StringBuilder sb, string indent) { var counterPicture = counter.Picture; if (picture == null) { sb.AppendLine($"{indent}var {counter.PictureVarName}{counterPicture} = default(SKPicture);"); return; } var counterPictureRecorder = ++counter.PictureRecorder; var counterCanvas = ++counter.Canvas; sb.AppendLine($"{indent}using var {counter.PictureRecorderVarName}{counterPictureRecorder} = new SKPictureRecorder();"); sb.AppendLine($"{indent}using var {counter.CanvasVarName}{counterCanvas} = {counter.PictureRecorderVarName}{counterPictureRecorder}.BeginRecording({picture.CullRect.ToSKRect()});"); if (picture.Commands == null) { sb.AppendLine($"{indent}var {counter.PictureVarName}{counterPicture} = {counter.PictureRecorderVarName}{counterPictureRecorder}.EndRecording();"); return; } foreach (var canvasCommand in picture.Commands) { switch (canvasCommand) { case SP.ClipPathCanvasCommand clipPathCanvasCommand: { // TODO: sb.AppendLine($"{indent}// TODO: ClipPath"); //var path = clipPathCanvasCommand.ClipPath.ToSKPath(); //var operation = clipPathCanvasCommand.Operation.ToSKClipOperation(); //var antialias = clipPathCanvasCommand.Antialias; //skCanvas.ClipPath(path, operation, antialias); } break; case SP.ClipRectCanvasCommand clipRectCanvasCommand: { var rect = clipRectCanvasCommand.Rect.ToSKRect(); var operation = clipRectCanvasCommand.Operation.ToSKClipOperation(); var antialias = clipRectCanvasCommand.Antialias.ToString(_ci).ToLower(); sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.ClipRect({rect}, {operation}, {antialias});"); } break; case SP.SaveCanvasCommand _: { sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.Save();"); } break; case SP.RestoreCanvasCommand _: { sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.Restore();"); } break; case SP.SetMatrixCanvasCommand setMatrixCanvasCommand: { sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.SetMatrix({setMatrixCanvasCommand.Matrix.ToSKMatrix()});"); } break; case SP.SaveLayerCanvasCommand saveLayerCanvasCommand: { if (saveLayerCanvasCommand.Paint != null) { var counterPaint = ++counter.Paint; saveLayerCanvasCommand.Paint.ToSKPaint(counter, sb, indent); sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.SaveLayer({counter.PaintVarName}{counterPaint});"); } else { sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.SaveLayer();"); } } break; case SP.DrawImageCanvasCommand drawImageCanvasCommand: { if (drawImageCanvasCommand.Image != null) { // TODO: sb.AppendLine($"{indent}// TODO: DrawImage"); //var image = drawImageCanvasCommand.Image.ToSKImage(); //var source = drawImageCanvasCommand.Source.ToSKRect(); //var dest = drawImageCanvasCommand.Dest.ToSKRect(); //var paint = drawImageCanvasCommand.Paint?.ToSKPaint(); //skCanvas.DrawImage(image, source, dest, paint); } } break; case SP.DrawPathCanvasCommand drawPathCanvasCommand: { if (drawPathCanvasCommand.Path != null && drawPathCanvasCommand.Paint != null) { var counterPath = ++counter.Path; drawPathCanvasCommand.Path.ToSKPath(counter, sb, indent); var counterPaint = ++counter.Paint; drawPathCanvasCommand.Paint.ToSKPaint(counter, sb, indent); sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.DrawPath({counter.PathVarName}{counterPath}, {counter.PaintVarName}{counterPaint});"); } } break; case SP.DrawTextBlobCanvasCommand drawPositionedTextCanvasCommand: { if (drawPositionedTextCanvasCommand.TextBlob != null && drawPositionedTextCanvasCommand.TextBlob.Points != null && drawPositionedTextCanvasCommand.Paint != null) { // TODO: sb.AppendLine($"{indent}// TODO: DrawTextBlob"); //var text = drawPositionedTextCanvasCommand.TextBlob.Text; //var points = drawPositionedTextCanvasCommand.TextBlob.Points.ToSKPoints(); //var paint = drawPositionedTextCanvasCommand.Paint.ToSKPaint(); //var font = paint.ToFont(); //var textBlob = SKTextBlob.CreatePositioned(text, font, points); //skCanvas.DrawText(textBlob, 0, 0, paint); } } break; case SP.DrawTextCanvasCommand drawTextCanvasCommand: { if (drawTextCanvasCommand.Paint != null) { var text = drawTextCanvasCommand.Text; var x = drawTextCanvasCommand.X; var y = drawTextCanvasCommand.Y; var counterPaint = ++counter.Paint; drawTextCanvasCommand.Paint.ToSKPaint(counter, sb, indent); sb.AppendLine($"{indent}{counter.CanvasVarName}{counterCanvas}.DrawText(\"{text}\", {x.ToString(_ci)}, {y.ToString(_ci)}, {counter.PaintVarName}{counterPaint});"); } } break; case SP.DrawTextOnPathCanvasCommand drawTextOnPathCanvasCommand: { if (drawTextOnPathCanvasCommand.Path != null && drawTextOnPathCanvasCommand.Paint != null) { // TODO: sb.AppendLine($"{indent}// TODO: DrawTextOnPath"); //var text = drawTextOnPathCanvasCommand.Text; //var path = drawTextOnPathCanvasCommand.Path.ToSKPath(); //var hOffset = drawTextOnPathCanvasCommand.HOffset; //var vOffset = drawTextOnPathCanvasCommand.VOffset; //var paint = drawTextOnPathCanvasCommand.Paint.ToSKPaint(); //skCanvas.DrawTextOnPath(text, path, hOffset, vOffset, paint); } } break; default: break; } } sb.AppendLine($"{indent}var {counter.PictureVarName}{counterPicture} = {counter.PictureRecorderVarName}{counterPictureRecorder}.EndRecording();"); }
public static void ToSKPath(this SP.Path path, SkiaCodeGenObjectCounter counter, StringBuilder sb, string indent) { sb.AppendLine($"{indent}var {counter.PathVarName}{counter.Path} = new SKPath() {{ FillType = {path.FillType.ToSKPathFillType()} }};"); if (path.Commands == null) { return; } foreach (var pathCommand in path.Commands) { switch (pathCommand) { case SP.MoveToPathCommand moveToPathCommand: { var x = moveToPathCommand.X; var y = moveToPathCommand.Y; sb.AppendLine($"{indent}skPath{counter.Path}.MoveTo({x.ToString(_ci)}f, {y.ToString(_ci)}f);"); } break; case SP.LineToPathCommand lineToPathCommand: { var x = lineToPathCommand.X; var y = lineToPathCommand.Y; sb.AppendLine($"{indent}skPath{counter.Path}.LineTo({x.ToString(_ci)}f, {y.ToString(_ci)}f);"); } break; case SP.ArcToPathCommand arcToPathCommand: { var rx = arcToPathCommand.Rx; var ry = arcToPathCommand.Ry; var xAxisRotate = arcToPathCommand.XAxisRotate; var largeArc = arcToPathCommand.LargeArc.ToSKPathArcSize(); var sweep = arcToPathCommand.Sweep.ToSKPathDirection(); var x = arcToPathCommand.X; var y = arcToPathCommand.Y; sb.AppendLine($"{indent}skPath{counter.Path}.ArcTo({rx.ToString(_ci)}f, {ry.ToString(_ci)}f, {xAxisRotate.ToString(_ci)}f, {largeArc}, {sweep}, {x.ToString(_ci)}f, {y.ToString(_ci)}f);"); } break; case SP.QuadToPathCommand quadToPathCommand: { var x0 = quadToPathCommand.X0; var y0 = quadToPathCommand.Y0; var x1 = quadToPathCommand.X1; var y1 = quadToPathCommand.Y1; sb.AppendLine($"{indent}skPath{counter.Path}.QuadTo({x0.ToString(_ci)}f, {y0.ToString(_ci)}f, {x1.ToString(_ci)}f, {y1.ToString(_ci)}f);"); } break; case SP.CubicToPathCommand cubicToPathCommand: { var x0 = cubicToPathCommand.X0; var y0 = cubicToPathCommand.Y0; var x1 = cubicToPathCommand.X1; var y1 = cubicToPathCommand.Y1; var x2 = cubicToPathCommand.X2; var y2 = cubicToPathCommand.Y2; sb.AppendLine($"{indent}skPath{counter.Path}.CubicTo({x0.ToString(_ci)}f, {y0.ToString(_ci)}f, {x1.ToString(_ci)}f, {y1.ToString(_ci)}f, {x2.ToString(_ci)}f, {y2.ToString(_ci)}f);"); } break; case SP.ClosePathCommand _: { sb.AppendLine($"{indent}skPath{counter.Path}.Close();"); } break; case SP.AddRectPathCommand addRectPathCommand: { var rect = addRectPathCommand.Rect.ToSKRect(); sb.AppendLine($"{indent}skPath{counter.Path}.AddRect({rect});"); } break; case SP.AddRoundRectPathCommand addRoundRectPathCommand: { var rect = addRoundRectPathCommand.Rect.ToSKRect(); var rx = addRoundRectPathCommand.Rx; var ry = addRoundRectPathCommand.Ry; sb.AppendLine($"{indent}skPath{counter.Path}.AddRoundRect({rect}, {rx.ToString(_ci)}f, {ry.ToString(_ci)}f);"); } break; case SP.AddOvalPathCommand addOvalPathCommand: { var rect = addOvalPathCommand.Rect.ToSKRect(); sb.AppendLine($"{indent}skPath{counter.Path}.AddOval({rect});"); } break; case SP.AddCirclePathCommand addCirclePathCommand: { var x = addCirclePathCommand.X; var y = addCirclePathCommand.Y; var radius = addCirclePathCommand.Radius; sb.AppendLine($"{indent}skPath{counter.Path}.AddCircle({x.ToString(_ci)}f, {y.ToString(_ci)}f, {radius.ToString(_ci)}f);"); } break; case SP.AddPolyPathCommand addPolyPathCommand: { if (addPolyPathCommand.Points != null) { var points = addPolyPathCommand.Points.ToSKPoints(); var close = addPolyPathCommand.Close.ToString(_ci).ToLower(); sb.AppendLine($"{indent}skPath{counter.Path}.AddPoly(points, {close});"); } } break; default: break; } } }
public static void ToSKShader(this SP.Shader?shader, SkiaCodeGenObjectCounter counter, StringBuilder sb, string indent) { var counterShader = counter.Shader; switch (shader) { case SP.ColorShader colorShader: { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreateColor("); sb.AppendLine($"{indent} {colorShader.Color.ToSKColor()});"); return; } case SP.LinearGradientShader linearGradientShader: { if (linearGradientShader.Colors == null || linearGradientShader.ColorPos == null) { sb.AppendLine($"{indent}var {counter.ShaderVarName}{counterShader} = default(SKShader);"); return; } if (linearGradientShader.LocalMatrix != null) { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreateLinearGradient("); sb.AppendLine($"{indent} {linearGradientShader.Start.ToSKPoint()},"); sb.AppendLine($"{indent} {linearGradientShader.End.ToSKPoint()},"); sb.AppendLine($"{indent} {linearGradientShader.Colors.ToSKColors()},"); sb.AppendLine($"{indent} {linearGradientShader.ColorPos.ToSKColorPos()},"); sb.AppendLine($"{indent} {linearGradientShader.Mode.ToSKShaderTileMode()},"); sb.AppendLine($"{indent} {linearGradientShader.LocalMatrix.Value.ToSKMatrix()});"); return; } else { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreateLinearGradient("); sb.AppendLine($"{indent} {linearGradientShader.Start.ToSKPoint()},"); sb.AppendLine($"{indent} {linearGradientShader.End.ToSKPoint()},"); sb.AppendLine($"{indent} {linearGradientShader.Colors.ToSKColors()},"); sb.AppendLine($"{indent} {linearGradientShader.ColorPos.ToSKColorPos()},"); sb.AppendLine($"{indent} {linearGradientShader.Mode.ToSKShaderTileMode()});"); return; } } case SP.TwoPointConicalGradientShader twoPointConicalGradientShader: { if (twoPointConicalGradientShader.Colors == null || twoPointConicalGradientShader.ColorPos == null) { sb.AppendLine($"{indent}var {counter.ShaderVarName}{counterShader} = default(SKShader);"); return; } if (twoPointConicalGradientShader.LocalMatrix != null) { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreateTwoPointConicalGradient("); sb.AppendLine($"{indent} {twoPointConicalGradientShader.Start.ToSKPoint()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.StartRadius.ToString(_ci)}f,"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.End.ToSKPoint()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.EndRadius.ToString(_ci)}f,"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.Colors.ToSKColors()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.ColorPos.ToSKColorPos()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.Mode.ToSKShaderTileMode()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.LocalMatrix.Value.ToSKMatrix()});"); return; } else { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreateTwoPointConicalGradient("); sb.AppendLine($"{indent} {twoPointConicalGradientShader.Start.ToSKPoint()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.StartRadius.ToString(_ci)}f,"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.End.ToSKPoint()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.EndRadius.ToString(_ci)}f,"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.Colors.ToSKColors()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.ColorPos.ToSKColorPos()},"); sb.AppendLine($"{indent} {twoPointConicalGradientShader.Mode.ToSKShaderTileMode()});"); return; } } case SP.PictureShader pictureShader: { if (pictureShader.Src == null) { sb.AppendLine($"{indent}var {counter.ShaderVarName}{counterShader} = default(SKShader);"); return; } var counterPicture = ++counter.Picture; pictureShader.Src?.ToSKPicture(counter, sb, indent); sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreatePicture("); sb.AppendLine($"{indent} {counter.PictureVarName}{counterPicture},"); sb.AppendLine($"{indent} SKShaderTileMode.Repeat,"); sb.AppendLine($"{indent} SKShaderTileMode.Repeat,"); sb.AppendLine($"{indent} {pictureShader.LocalMatrix.ToSKMatrix()},"); sb.AppendLine($"{indent} {pictureShader.Tile.ToSKRect()});"); return; } case SP.PerlinNoiseFractalNoiseShader perlinNoiseFractalNoiseShader: { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreatePerlinNoiseFractalNoise("); sb.AppendLine($"{indent} {perlinNoiseFractalNoiseShader.BaseFrequencyX.ToString(_ci)}f,"); sb.AppendLine($"{indent} {perlinNoiseFractalNoiseShader.BaseFrequencyY.ToString(_ci)}f,"); sb.AppendLine($"{indent} {perlinNoiseFractalNoiseShader.NumOctaves.ToString(_ci)},"); sb.AppendLine($"{indent} {perlinNoiseFractalNoiseShader.Seed.ToString(_ci)}f,"); sb.AppendLine($"{indent} {perlinNoiseFractalNoiseShader.TileSize.ToSKPointI()});"); return; } case SP.PerlinNoiseTurbulenceShader perlinNoiseTurbulenceShader: { sb.Append($"{indent}var {counter.ShaderVarName}{counterShader} = "); sb.AppendLine($"SKShader.CreatePerlinNoiseTurbulence("); sb.AppendLine($"{indent} {perlinNoiseTurbulenceShader.BaseFrequencyX.ToString(_ci)}f,"); sb.AppendLine($"{indent} {perlinNoiseTurbulenceShader.BaseFrequencyY.ToString(_ci)}f,"); sb.AppendLine($"{indent} {perlinNoiseTurbulenceShader.NumOctaves.ToString(_ci)},"); sb.AppendLine($"{indent} {perlinNoiseTurbulenceShader.Seed.ToString(_ci)}f,"); sb.AppendLine($"{indent} {perlinNoiseTurbulenceShader.TileSize.ToSKPointI()});"); return; } default: { sb.AppendLine($"{indent}var {counter.ShaderVarName}{counterShader} = default(SKShader);"); return; } } }