/// <inheritdoc/> protected override void WriteCanvasGeometryPathFactory(CodeBuilder builder, CanvasGeometry.Path obj, string typeName, string fieldName) { builder.WriteLine($"{typeName} result;"); // D2D Setup builder.WriteLine("ComPtr<ID2D1PathGeometry> path;"); builder.WriteLine($"{FailFastWrapper("_d2dFactory->CreatePathGeometry(&path)")};"); builder.WriteLine("ComPtr<ID2D1GeometrySink> sink;"); builder.WriteLine($"{FailFastWrapper("path->Open(&sink)")};"); if (obj.FilledRegionDetermination != CanvasFilledRegionDetermination.Alternate) { builder.WriteLine($"sink->SetFillMode({FilledRegionDetermination(obj.FilledRegionDetermination)});"); } foreach (var command in obj.Commands) { switch (command.Type) { case CanvasPathBuilder.CommandType.BeginFigure: // Assume D2D1_FIGURE_BEGIN_FILLED builder.WriteLine($"sink->BeginFigure({Vector2(((CanvasPathBuilder.Command.BeginFigure)command).StartPoint)}, D2D1_FIGURE_BEGIN_FILLED);"); break; case CanvasPathBuilder.CommandType.EndFigure: builder.WriteLine($"sink->EndFigure({CanvasFigureLoop(((CanvasPathBuilder.Command.EndFigure)command).FigureLoop)});"); break; case CanvasPathBuilder.CommandType.AddLine: builder.WriteLine($"sink->AddLine({Vector2(((CanvasPathBuilder.Command.AddLine)command).EndPoint)});"); break; case CanvasPathBuilder.CommandType.AddCubicBezier: var cb = (CanvasPathBuilder.Command.AddCubicBezier)command; builder.WriteLine($"sink->AddBezier({{ {Vector2(cb.ControlPoint1)}, {Vector2(cb.ControlPoint2)}, {Vector2(cb.EndPoint)} }});"); break; default: throw new InvalidOperationException(); } } builder.WriteLine($"{FailFastWrapper("sink->Close()")};"); builder.WriteLine("GeoSource* rawResult = new GeoSource(path.Get());"); builder.WriteLine($"result = {FieldAssignment(fieldName)}rawResult;"); builder.WriteLine("rawResult->Release();"); }
/// <inheritdoc/> protected override void WriteCanvasGeometryPathFactory(CodeBuilder builder, CanvasGeometry.Path obj, string typeName, string fieldName) { builder.WriteLine($"{typeName} result;"); builder.WriteLine($"using (var builder = new CanvasPathBuilder(null))"); builder.OpenScope(); if (obj.FilledRegionDetermination != CanvasFilledRegionDetermination.Alternate) { builder.WriteLine($"builder.SetFilledRegionDetermination({_stringifier.FilledRegionDetermination(obj.FilledRegionDetermination)});"); } foreach (var command in obj.Commands) { switch (command.Type) { case CanvasPathBuilder.CommandType.BeginFigure: builder.WriteLine($"builder.BeginFigure({Vector2(((CanvasPathBuilder.Command.BeginFigure)command).StartPoint)});"); break; case CanvasPathBuilder.CommandType.EndFigure: builder.WriteLine($"builder.EndFigure({_stringifier.CanvasFigureLoop(((CanvasPathBuilder.Command.EndFigure)command).FigureLoop)});"); break; case CanvasPathBuilder.CommandType.AddLine: builder.WriteLine($"builder.AddLine({Vector2(((CanvasPathBuilder.Command.AddLine)command).EndPoint)});"); break; case CanvasPathBuilder.CommandType.AddCubicBezier: var cb = (CanvasPathBuilder.Command.AddCubicBezier)command; builder.WriteLine($"builder.AddCubicBezier({Vector2(cb.ControlPoint1)}, {Vector2(cb.ControlPoint2)}, {Vector2(cb.EndPoint)});"); break; default: throw new InvalidOperationException(); } } builder.WriteLine($"result = {FieldAssignment(fieldName)}CanvasGeometry.CreatePath(builder);"); builder.CloseScope(); }