| 860 | } |
| 861 | |
| 862 | void ColorPicker::SetColorChannel(txmp::ColorRepresentation representation, txmp::ColorChannel channel, double newValue) |
| 863 | { |
| 864 | Windows::UI::Color oldRgbColor = Color(); |
| 865 | Windows::UI::Color newRgbColor{}; |
| 866 | |
| 867 | if (representation == txmp::ColorRepresentation::Hsva) |
| 868 | { |
| 869 | txmp::HsvColor oldHsvColor{}; |
| 870 | |
| 871 | // Warning: Always maintain/use HSV information in the saved HSV color |
| 872 | // This avoids loss of precision and drift caused by continuously converting to/from RGB |
| 873 | if (!m_SavedHsvColor) |
| 874 | { |
| 875 | oldHsvColor = Util::Color(oldRgbColor).ToHSV(); |
| 876 | } |
| 877 | else |
| 878 | { |
| 879 | oldHsvColor = *m_SavedHsvColor; |
| 880 | } |
| 881 | |
| 882 | switch (channel) |
| 883 | { |
| 884 | case txmp::ColorChannel::Channel1: |
| 885 | oldHsvColor.H = isnan(newValue) ? 0.0 : std::clamp(newValue, 0.0, 360.0); |
| 886 | break; |
| 887 | |
| 888 | case txmp::ColorChannel::Channel2: |
| 889 | oldHsvColor.S = isnan(newValue) ? 0.0 : std::clamp(newValue / 100.0, 0.0, 1.0); |
| 890 | break; |
| 891 | |
| 892 | case txmp::ColorChannel::Channel3: |
| 893 | oldHsvColor.V = isnan(newValue) ? 0.0 : std::clamp(newValue / 100.0, 0.0, 1.0); |
| 894 | break; |
| 895 | |
| 896 | case txmp::ColorChannel::Alpha: |
| 897 | // Unlike color channels, default to no transparency |
| 898 | oldHsvColor.A = isnan(newValue) ? 1.0 : std::clamp(newValue / 100.0, 0.0, 1.0); |
| 899 | break; |
| 900 | } |
| 901 | |
| 902 | newRgbColor = Util::Color::FromHSV(oldHsvColor); |
| 903 | |
| 904 | // Must update HSV color |
| 905 | m_SavedHsvColor = oldHsvColor; |
| 906 | m_SavedHsvColorRgbEquivalent = newRgbColor; |
| 907 | } |
| 908 | else |
| 909 | { |
| 910 | switch (channel) |
| 911 | { |
| 912 | case txmp::ColorChannel::Channel1: |
| 913 | oldRgbColor.R = isnan(newValue) ? 0 : static_cast<uint8_t>(std::clamp(newValue, 0.0, 255.0)); |
| 914 | break; |
| 915 | |
| 916 | case txmp::ColorChannel::Channel2: |
| 917 | oldRgbColor.G = isnan(newValue) ? 0 : static_cast<uint8_t>(std::clamp(newValue, 0.0, 255.0)); |
| 918 | break; |
| 919 | |