@@ -238,6 +238,82 @@ public List<byte[]> DrawMulti(
238
238
return result ;
239
239
}
240
240
241
+ /// <summary>
242
+ /// Draw the label on the provided surface
243
+ /// </summary>
244
+ /// <param name="surface">Skia Surface</param>
245
+ /// <param name="elements">Zpl elements</param>
246
+ /// <param name="labelWidth">Label width in millimeter</param>
247
+ /// <param name="labelHeight">Label height in millimeter</param>
248
+ /// <param name="printDensityDpmm">Dots per millimeter</param>
249
+ /// <returns></returns>
250
+ public void DrawSurface ( SKSurface surface ,
251
+ ZplElementBase [ ] elements ,
252
+ double labelWidth = 101.6 ,
253
+ double labelHeight = 152.4 ,
254
+ int printDensityDpmm = 8 )
255
+ {
256
+ var result = new List < byte [ ] > ( ) ;
257
+ var imageHistory = new List < SKImage > ( ) ;
258
+ var labelImageWidth = Convert . ToInt32 ( labelWidth * printDensityDpmm ) ;
259
+ var labelImageHeight = Convert . ToInt32 ( labelHeight * printDensityDpmm ) ;
260
+
261
+ var skCanvas = surface . Canvas ;
262
+ //This has an issue with AvaloniaUI making the window transparent.
263
+ skCanvas . Clear ( SKColors . Transparent ) ;
264
+
265
+ foreach ( var element in elements )
266
+ {
267
+ var drawer = this . _elementDrawers . SingleOrDefault ( o => o . CanDraw ( element ) ) ;
268
+ if ( drawer == null )
269
+ {
270
+ continue ;
271
+ }
272
+
273
+ try
274
+ {
275
+ if ( drawer . IsReverseDraw ( element ) )
276
+ {
277
+ //basically only ZplGraphicBox/Circle depending on requirements
278
+ using var skBitmapInvert = new SKBitmap ( labelImageWidth , labelImageHeight ) ;
279
+ using var skCanvasInvert = new SKCanvas ( skBitmapInvert ) ;
280
+ skCanvasInvert . Clear ( SKColors . Transparent ) ;
281
+
282
+ drawer . Prepare ( this . _printerStorage , skCanvasInvert ) ;
283
+ drawer . Draw ( element , _drawerOptions ) ;
284
+
285
+ //use color inversion on an reverse draw white element
286
+ if ( drawer . IsWhiteDraw ( element ) )
287
+ {
288
+ this . InvertDrawWhite ( skCanvas , skBitmapInvert ) ;
289
+ }
290
+ else
291
+ {
292
+ this . InvertDraw ( skCanvas , skBitmapInvert ) ;
293
+ }
294
+
295
+ continue ;
296
+ }
297
+
298
+ drawer . Prepare ( this . _printerStorage , skCanvas ) ;
299
+ drawer . Draw ( element , _drawerOptions ) ;
300
+
301
+ continue ;
302
+ }
303
+ catch ( Exception ex )
304
+ {
305
+ if ( element is ZplBarcode barcodeElement )
306
+ throw new Exception ( $ "Error on zpl element \" { barcodeElement . Content } \" : { ex . Message } ", ex ) ;
307
+ else if ( element is ZplDataMatrix dataMatrixElement )
308
+ throw new Exception ( $ "Error on zpl element \" { dataMatrixElement . Content } \" : { ex . Message } ", ex ) ;
309
+ else
310
+ {
311
+ throw ;
312
+ }
313
+ }
314
+ }
315
+ }
316
+
241
317
/**
242
318
* PDF transparency and SKBlendMode are not very good friends, SKBlendMode.Xor behaves as SKBlendMode.SrcOver.
243
319
*
0 commit comments