using System;
namespace ColorMine.ColorSpaces.Conversions
{
internal static class LabConverter
{
internal static void ToColorSpace(IRgb color, ILab item)
{
var xyz = new Xyz();
xyz.Initialize(color);
var white = XyzConverter.WhiteReference;
var x = PivotXyz(xyz.X / white.X);
var y = PivotXyz(xyz.Y / white.Y);
var z = PivotXyz(xyz.Z / white.Z);
item.L = Math.Max(0, 116 * y - 16);
item.A = 500 * (x - y);
item.B = 200 * (y - z);
}
internal static IRgb ToColor(ILab item)
{
var y = (item.L + 16.0) / 116.0;
var x = item.A / 500.0 + y;
var z = y - item.B / 200.0;
var white = XyzConverter.WhiteReference;
var x3 = x * x * x;
var z3 = z * z * z;
var xyz = new Xyz
{
X = white.X * (x3 > XyzConverter.Epsilon ? x3 : (x - 16.0 / 116.0) / 7.787),
Y = white.Y * (item.L > (XyzConverter.Kappa * XyzConverter.Epsilon) ? Math.Pow(((item.L + 16.0) / 116.0), 3) : item.L / XyzConverter.Kappa),
Z = white.Z * (z3 > XyzConverter.Epsilon ? z3 : (z - 16.0 / 116.0) / 7.787)
};
return xyz.ToRgb();
}
private static double PivotXyz(double n)
{
return n > XyzConverter.Epsilon ? CubicRoot(n) : (XyzConverter.Kappa * n + 16) / 116;
}
private static double CubicRoot(double n)
{
return Math.Pow(n, 1.0 / 3.0);
}
}
}
ActualWidth}" MaxHeight="{TemplateBinding MaxDropDownHeight}" Margin="2,0,0,0">
<ScrollViewer x:Name="DropDownScrollViewer">
<Grid RenderOptions.ClearTypeHint="Enabled">
<Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
<Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/>
</Canvas>
<ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained"/>
</Grid>
</ScrollViewer>
</Border>
</Popup>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="{DynamicResource Menu.Disable.Foreground}"/>
<Setter Property="Background" TargetName="Background" Value="{DynamicResource ToolBarDisabledFill}"/>
<Setter Property="Grid.ColumnSpan" TargetName="Background" Value="2"/>
<Setter Property="BorderBrush" TargetName="Border" Value="{DynamicResource ToolBarDisabledBorder}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsKeyboardFocusWithin" Value="true"/>
<Condition Property="IsDropDownOpen" Value="false"/>
<Condition Property="IsEditable" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Background" TargetName="SelectedContentBorder" Value="{DynamicResource ListBorder}"/>
<Setter Property="Foreground" Value="{DynamicResource ControlForegroundKey}"/>
</MultiTrigger>
<Trigger Property="IsEditable" Value="true">
<Setter Property="Background" TargetName="DropDownButton" Value="{x:Null}"/>
<Setter Property="Visibility" TargetName="ContentSite" Value="Collapsed"/>
<Setter Property="Visibility" TargetName="PART_EditableTextBox" Value="Visible"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="BorderBrush" TargetName="DropDownButton" Value="{DynamicResource ToolBarButtonHoverBorder}"/>
<Setter Property="Background" TargetName="DropDownButton" Value="{DynamicResource DropDownButtonHover}"/>
<Setter Property="BorderBrush" TargetName="Border" Value="{DynamicResource ToolBarButtonHoverBorder}"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="BorderBrush" TargetName="DropDownButton" Value="{DynamicResource ToolBarButtonHoverBorder}"/>
<Setter Property="Background" TargetName="DropDownButton" Value="{DynamicResource DropDownButtonHover}"/>
<Setter Property="BorderBrush" TargetName="Border" Value="{DynamicResource ToolBarButtonHoverBorder}"/>
</Trigger>
<Trigger Property="HasItems" Value="false">
<Setter Property="MinHeight" TargetName="DropDownBorder" Value="95"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsGrouping" Value="true"/>
<Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
</MultiTrigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsKeyboardFocusWithin" Value="true"/>
<Condition Property="IsDropDownOpen" Value="false"/>
<Condition Property="IsEditable" Value="false"/>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="{DynamicResource ControlForegroundKey}"/>
</MultiTrigger>
<Trigger Property="IsEditable" Value="true">
<Setter Property="Padding" Value="2"/>
<Setter Property="IsTabStop" Value="false"/>
</Trigger>
<Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false">
<Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
<Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Resources>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True" />
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ComboBoxItem}">
<Border x:Name="ItemBorder" Background="{DynamicResource ComboboxItemBackground}" BorderBrush="Transparent" BorderThickness="1">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="ItemBorder" Value="{DynamicResource ComboboxItemMouseOverBackground}"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="true">
<Setter Property="Background" TargetName="ItemBorder" Value="{DynamicResource ComboboxItemMouseOverBackground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Style.Resources>
</Style>
</ResourceDictionary>