Simulate complete components or palettes, not isolated swatches. Compare which roles converge, then verify that text, icons, shape, position, and contrast still communicate the intended state.
Treat simulation as one review layer
PHPColor applies deterministic matrices for named color-vision profiles. The transformed sRGB colors help expose risky hue relationships, but they do not reproduce every person's perception, display, or viewing condition.
Use the result to ask:
- do two semantic roles become visually close;
- does text still meet its contrast requirement;
- does meaning survive without hue;
- do labels and shapes provide a redundant cue?
Simulate a complete palette
use PhpColor\Color\Color;
use PhpColor\Color\Vision\ColorVisionSimulator;
use PhpColor\Color\Vision\VisionProfile;
$colors = array_map(Color::parse(...), [
'#dc2626', '#d97706', '#16a34a', '#2563eb',
]);
$simulated = ColorVisionSimulator::create(VisionProfile::Deuteranopia)
->simulateAll($colors);
foreach ($simulated as $color) {
echo $color->toHex().PHP_EOL;
}
use PhpColor\Color\Color;
use PhpColor\Color\Vision\ColorVisionSimulator;
use PhpColor\Color\Vision\VisionProfile;
$colors = array_map(Color::parse(...), [
'#dc2626', '#d97706', '#16a34a', '#2563eb',
]);
$simulated = ColorVisionSimulator::create(VisionProfile::Deuteranopia)
->simulateAll($colors);
foreach ($simulated as $color) {
echo $color->toHex().PHP_EOL;
}
The output is:
#98a526
#b4bc28
#4b4065
#3c38c2
#98a526
#b4bc28
#4b4065
#3c38c2
The first two colors move closer in appearance, which is more useful to review as a relationship than as four independent transformed values.
Choose profiles deliberately
Construct a simulator with a default profile when several checks share it:
use PhpColor\Color\Color;
use PhpColor\Color\Vision\ColorVisionSimulator;
use PhpColor\Color\Vision\VisionProfile;
$simulator = ColorVisionSimulator::create(
VisionProfile::Deuteranopia,
);
$simulated = $simulator->simulate(
Color::parse('#ef4444'),
);
echo $simulated->toHex();
use PhpColor\Color\Color;
use PhpColor\Color\Vision\ColorVisionSimulator;
use PhpColor\Color\Vision\VisionProfile;
$simulator = ColorVisionSimulator::create(
VisionProfile::Deuteranopia,
);
$simulated = $simulator->simulate(
Color::parse('#ef4444'),
);
echo $simulated->toHex();
new ColorVisionSimulator() defaults to VisionProfile::Deuteranomaly. Pass a profile to simulate() when one call should override the configured default; the override does not modify the simulator.
The supported profiles are:
VisionProfile::ProtanopiaVisionProfile::DeuteranopiaVisionProfile::TritanopiaVisionProfile::ProtanomalyVisionProfile::DeuteranomalyVisionProfile::TritanomalyVisionProfile::Monochromacy
ColorVisionSimulator::profiles() returns all enum cases. VisionProfile::commonlyTested() returns deuteranomaly, deuteranopia, protanomaly, and protanopia.
simulateAll() preserves input keys and returns the same number of colors. Simulation outputs are sRGB colors and preserve source alpha.
Continue with Simulate a palette for deuteranopia, Check color distinguishability, or Compare color vision profiles.