public static MediaDefinition Lookup(EMediaFeatureName Name) { if (CssDefinitions.MediaDefinitions.TryGetValue(Name, out MediaDefinition def)) { return(def); } return(null); }
// private bool IsNegated = false; #endregion #region Constructors /// <summary> /// Creates a new 'boolean' type media feature /// </summary> /// <param name="name"></param> public MediaFeature(EMediaFeatureName Name) { Context = EMediaFeatureContext.Boolean; MediaDefinition def = MediaDefinition.Lookup(Name); if (def != null) { IsValid = true; /* if an allowed type is keywords and 'none' is an option then we match it against that keyword */ if (0 != (def.AllowedTypes & ECssValueTypes.KEYWORD) && def.KeywordWhitelist.Contains("none")) { Values = new CssValue[] { CssValue.From(Name), CssValue.None }; } else if (0 != (def.AllowedTypes & ECssValueTypes.INTEGER)) { Values = new CssValue[] { CssValue.From(Name), CssValue.From(0) }; } else if (0 != (def.AllowedTypes & ECssValueTypes.DIMENSION)) { Values = new CssValue[] { CssValue.From(Name), CssValue.From(0, ECssUnit.PX) }; } else if (0 != (def.AllowedTypes & ECssValueTypes.RESOLUTION)) { Values = new CssValue[] { CssValue.From(Name), CssValue.From(0, ECssUnit.DPPX) }; } } else { /* This isnt a supported feature, therefore it should always evaluate to false */ IsValid = false; } /* For sanity just catch the case where we dont have values to compare here */ if (Values.Length <= 0) { IsValid = false; } }
static object Resolve_Media_Name_Value(Document document, EMediaFeatureName Name) { Screen screen = document.defaultView.screen; switch (Name) { case EMediaFeatureName.AspectRatio: case EMediaFeatureName.Min_AspectRatio: case EMediaFeatureName.Max_AspectRatio: { return(screen.width / (double)screen.height); } case EMediaFeatureName.Width: case EMediaFeatureName.Min_Width: case EMediaFeatureName.Max_Width: { return(screen.width); } case EMediaFeatureName.Height: case EMediaFeatureName.Min_Height: case EMediaFeatureName.Max_Height: { return(screen.height); } case EMediaFeatureName.Color: case EMediaFeatureName.Min_Color: case EMediaFeatureName.Max_Color: { return(screen.colorDepth); } case EMediaFeatureName.Monochrome: case EMediaFeatureName.Min_Monochrome: case EMediaFeatureName.Max_Monochrome: { return(screen.monochromeDepth); } case EMediaFeatureName.ColorIndex: case EMediaFeatureName.Min_ColorIndex: case EMediaFeatureName.Max_ColorIndex: { return(screen.colorIndex); } case EMediaFeatureName.Grid: { return(screen.isGrid); } case EMediaFeatureName.Update: { return(screen.refreshRate); } default: { throw new NotImplementedException($"Media feature \"{Enum.GetName(typeof(EMediaFeatureName), Name)}\" is not implemented"); } } }
bool Compare_Keyword(Document document, EMediaFeatureName Name, string keyword) { switch (Name) { case EMediaFeatureName.Orientation: { if (Lookup.TryEnum(keyword, out EMediaOrientation outOrientation)) { double width = (double)Resolve_Media_Name_Value(document, EMediaFeatureName.Width); double height = (double)Resolve_Media_Name_Value(document, EMediaFeatureName.Height); return((outOrientation == EMediaOrientation.Landscape) ? width >= height: height >= width); } } break; case EMediaFeatureName.Update: { if (Lookup.TryEnum(keyword, out EMediaUpdate outUpdateRate)) { double refreshRate = (double)Resolve_Media_Name_Value(document, Name); switch (outUpdateRate) { case EMediaUpdate.None: { return(0 == refreshRate); } case EMediaUpdate.Slow: { return(refreshRate < 20); } case EMediaUpdate.Fast: { return(refreshRate > 20); } } } } break; case EMediaFeatureName.Color: case EMediaFeatureName.Min_Color: case EMediaFeatureName.Max_Color: { return((ulong)Resolve_Media_Name_Value(document, Name) > 0); } case EMediaFeatureName.Monochrome: case EMediaFeatureName.Min_Monochrome: case EMediaFeatureName.Max_Monochrome: { return((ulong)Resolve_Media_Name_Value(document, Name) > 0); } case EMediaFeatureName.ColorIndex: case EMediaFeatureName.Min_ColorIndex: case EMediaFeatureName.Max_ColorIndex: { return((ulong)Resolve_Media_Name_Value(document, Name) > 0); } case EMediaFeatureName.Grid: { return((ulong)Resolve_Media_Name_Value(document, Name) > 0); } case EMediaFeatureName.Width: case EMediaFeatureName.Min_Width: case EMediaFeatureName.Max_Width: { return((long)Resolve_Media_Name_Value(document, Name) > 0); } case EMediaFeatureName.Height: case EMediaFeatureName.Min_Height: case EMediaFeatureName.Max_Height: { return((long)Resolve_Media_Name_Value(document, Name) > 0); } case EMediaFeatureName.AspectRatio: case EMediaFeatureName.Min_AspectRatio: case EMediaFeatureName.Max_AspectRatio: { return((double)Resolve_Media_Name_Value(document, Name) > 0); } } return(false); }