1+ using DocumentFormat . OpenXml ;
2+ using DocumentFormat . OpenXml . Drawing ;
3+ using DocumentFormat . OpenXml . Flatten ;
4+ using DocumentFormat . OpenXml . Flatten . ElementConverters . CommonElement ;
5+ using DocumentFormat . OpenXml . Flatten . ElementConverters . Primitive ;
6+ using DocumentFormat . OpenXml . Flatten . ElementConverters . ShapeGeometryConverters ;
7+ using DocumentFormat . OpenXml . Flatten . Framework . Context ;
8+ using DocumentFormat . OpenXml . Packaging ;
9+
10+ using dotnetCampus . OpenXmlUnitConverter ;
11+
12+ using MauiPptxViewerCore . Utils ;
13+
14+ using Microsoft . Maui . Graphics ;
15+
16+ using Shape = DocumentFormat . OpenXml . Presentation . Shape ;
17+
18+ namespace MauiPptxViewerCore ;
19+
20+ public class PptxSlide
21+ {
22+ internal PptxSlide ( uint slideId , SlidePart slidePart , DocumentModel documentModel )
23+ {
24+ SlideId = slideId ;
25+ SlidePart = slidePart ;
26+ DocumentModel = documentModel ;
27+ }
28+
29+ public UInt32 SlideId { get ; }
30+ public SlidePart SlidePart { get ; }
31+ private DocumentModel DocumentModel { get ; }
32+
33+ public void Render ( ICanvas canvas )
34+ {
35+ var slide = SlidePart . Slide ;
36+
37+ var slideContext = new SlideContext ( slide , DocumentModel . PresentationDocument ) ;
38+
39+ foreach ( var openXmlElement in slide . CommonSlideData ! . ShapeTree ! . ChildElements )
40+ {
41+ canvas . SaveState ( ) ;
42+
43+ var openXmlElementFlatten = new OpenXmlElementFlatten ( ) ;
44+ var newElement = openXmlElementFlatten . GetFlattenElement ( openXmlElement , slideContext , shouldCloneOriginElement : false ) ;
45+
46+ //var rootElement ??= slideContext.RootElement;
47+
48+ //var currentPart = slideContext.GetCurrentPart();
49+ //var colorMap = slideContext.GetColorMap();
50+ //var colorScheme = slideContext.GetColorScheme();
51+
52+ if ( newElement is Shape shape )
53+ {
54+ RenderShape ( canvas , newElement , slideContext , shape ) ;
55+ }
56+ else
57+ {
58+ // 其他类型的元素
59+ }
60+
61+ canvas . RestoreState ( ) ;
62+ }
63+ }
64+
65+ private void RenderShape ( ICanvas canvas , OpenXmlElement newElement , SlideContext slideContext , Shape shape )
66+ {
67+ var transformData = newElement . GetOrCreateTransformData ( slideContext ) ;
68+
69+ // 这里渲染采用像素单位,需要进行转换
70+ // 设置坐标
71+ canvas . Translate ( ( float ) transformData . OffsetX . ToPixel ( ) . Value , ( float ) transformData . OffsetY . ToPixel ( ) . Value ) ;
72+
73+ var shapeProperties = shape . ShapeProperties ;
74+ if ( shapeProperties == null )
75+ {
76+ return ;
77+ }
78+
79+ var solidFill = shapeProperties . GetFirstChild < SolidFill > ( ) ;
80+ if ( solidFill != null )
81+ {
82+ var aRgbColor = ColorHelper . BuildColor ( solidFill , slideContext ) ;
83+ if ( aRgbColor != null )
84+ {
85+ canvas . FillColor = ARgbToColor ( aRgbColor ) ;
86+ }
87+ }
88+
89+ // 获取线条
90+ var outline = shapeProperties . GetFirstChild < Outline > ( ) ;
91+ if ( outline != null )
92+ {
93+ if ( outline . Width is not null )
94+ {
95+ var emu = new Emu ( outline . Width ) ;
96+ canvas . StrokeSize = ( float ) emu . ToPixel ( ) . Value ;
97+ }
98+
99+ var lineFill = outline . GetFirstChild < SolidFill > ( ) ;
100+ if ( lineFill != null )
101+ {
102+ var aRgbColor = ColorHelper . BuildColor ( lineFill , slideContext ) ;
103+ if ( aRgbColor != null )
104+ {
105+ canvas . StrokeColor = ARgbToColor ( aRgbColor ) ;
106+ }
107+ }
108+ }
109+
110+ var svgPath = shape . ToSvgPath ( ) ;
111+ var multiShapePaths = svgPath ? . MultiShapePaths ;
112+
113+ if ( multiShapePaths != null )
114+ {
115+ foreach ( var multiShapePath in multiShapePaths )
116+ {
117+ PathF path = PathConverter . ToPath ( multiShapePath . Path ) ;
118+
119+ if ( multiShapePath . IsFilled )
120+ {
121+ canvas . FillPath ( path , WindingMode . NonZero ) ;
122+ }
123+
124+ if ( multiShapePath . IsStroke )
125+ {
126+ canvas . DrawPath ( path ) ;
127+ }
128+ }
129+ }
130+ }
131+
132+ private static Color ARgbToColor ( ARgbColor aRgbColor )
133+ {
134+ var color = new Color ( aRgbColor . R , aRgbColor . G , aRgbColor . B , aRgbColor . A ) ;
135+ return color ;
136+ }
137+ }
0 commit comments