@@ -292,24 +292,32 @@ public Double ToPixel(IRenderDimensions renderDimensions, Boolean isWidth = true
292
292
case Unit . Px : // 1 px = 1/96 in
293
293
return _value ;
294
294
case Unit . Percent :
295
+ CheckForValidRenderDimensions ( renderDimensions , isWidth ) ;
295
296
return _value * 0.01 * ( isWidth ? renderDimensions . RenderWidth : renderDimensions . RenderHeight ) ;
296
297
case Unit . Em :
298
+ CheckForValidRenderDimensionsForFont ( renderDimensions ) ;
297
299
return _value * renderDimensions . FontSize ;
298
300
case Unit . Rem :
299
301
// here we dont actually know the root font size but currently the only IRenderDimensions used is
300
302
// the IRenderDevice meaning its all the root font size
303
+ CheckForValidRenderDimensionsForFont ( renderDimensions ) ;
301
304
return _value * renderDimensions . FontSize ;
302
305
case Unit . Vh :
306
+ CheckForValidRenderDimensions ( renderDimensions , false ) ;
303
307
return _value * 0.01 * renderDimensions . RenderHeight ;
304
308
case Unit . Vw :
309
+ CheckForValidRenderDimensions ( renderDimensions , true ) ;
305
310
return _value * 0.01 * renderDimensions . RenderWidth ;
306
311
case Unit . Vmax :
312
+ CheckForValidRenderDimensions ( renderDimensions , true ) ;
313
+ CheckForValidRenderDimensions ( renderDimensions , false ) ;
307
314
return _value * 0.01 * Math . Max ( renderDimensions . RenderHeight , renderDimensions . RenderWidth ) ;
308
315
case Unit . Vmin :
316
+ CheckForValidRenderDimensions ( renderDimensions , true ) ;
317
+ CheckForValidRenderDimensions ( renderDimensions , false ) ;
309
318
return _value * 0.01 * Math . Min ( renderDimensions . RenderHeight , renderDimensions . RenderWidth ) ;
310
- //todo implement other units and handle if dimensions is null
311
319
default :
312
- throw new InvalidOperationException ( "A relative unit cannot be converted." ) ;
320
+ throw new InvalidOperationException ( "Unsupported Unit cant be converted." ) ;
313
321
}
314
322
}
315
323
@@ -340,24 +348,48 @@ public Double To(Unit unit, IRenderDimensions renderDimensions, Boolean isWidth
340
348
case Unit . Px : // 1 px = 1/96 in
341
349
return value ;
342
350
case Unit . Percent :
351
+ CheckForValidRenderDimensions ( renderDimensions , isWidth ) ;
343
352
return value / ( isWidth ? renderDimensions . RenderWidth : renderDimensions . RenderHeight ) * 100 ;
344
353
case Unit . Em :
354
+ CheckForValidRenderDimensionsForFont ( renderDimensions ) ;
345
355
return value / renderDimensions . FontSize ;
346
356
case Unit . Rem :
347
357
// here we dont actually know the root font size but currently the only IRenderDimensions used is
348
358
// the IRenderDevice meaning its all the root font size
359
+ CheckForValidRenderDimensionsForFont ( renderDimensions ) ;
349
360
return value / renderDimensions . FontSize ;
350
361
case Unit . Vh :
362
+ CheckForValidRenderDimensions ( renderDimensions , false ) ;
351
363
return value / ( 0.01 * renderDimensions . RenderHeight ) ;
352
364
case Unit . Vw :
365
+ CheckForValidRenderDimensions ( renderDimensions , true ) ;
353
366
return value / ( 0.01 * renderDimensions . RenderWidth ) ;
354
367
case Unit . Vmax :
368
+ CheckForValidRenderDimensions ( renderDimensions , true ) ;
369
+ CheckForValidRenderDimensions ( renderDimensions , false ) ;
355
370
return value / ( 0.01 * Math . Max ( renderDimensions . RenderHeight , renderDimensions . RenderWidth ) ) ;
356
371
case Unit . Vmin :
372
+ CheckForValidRenderDimensions ( renderDimensions , true ) ;
373
+ CheckForValidRenderDimensions ( renderDimensions , false ) ;
357
374
return value / ( 0.01 * Math . Min ( renderDimensions . RenderHeight , renderDimensions . RenderWidth ) ) ;
358
- //todo implement other units and handle if dimensions is null
359
375
default :
360
- throw new InvalidOperationException ( "An absolute unit cannot be converted to a relative one." ) ;
376
+ throw new InvalidOperationException ( "Unsupported Unit cant be converted." ) ;
377
+ }
378
+ }
379
+
380
+ private void CheckForValidRenderDimensions ( IRenderDimensions renderDimensions , bool isWidth )
381
+ {
382
+ if ( renderDimensions == null || ( isWidth ? renderDimensions . RenderWidth : renderDimensions . RenderHeight ) > 0 )
383
+ {
384
+ throw new ArgumentException ( "A non null render device with a font size is required to calculate em or rem units." ) ;
385
+ }
386
+ }
387
+
388
+ private void CheckForValidRenderDimensionsForFont ( IRenderDimensions renderDimensions )
389
+ {
390
+ if ( renderDimensions == null || renderDimensions . FontSize > 0 )
391
+ {
392
+ throw new ArgumentException ( "A non null render device with a font size is required to calculate em or rem units." ) ;
361
393
}
362
394
}
363
395
0 commit comments