1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 08:24:58 +00:00

LibGfx+icc: Add ICCProfile support for parametricCurveType and print it

With this, we can parse all types required in v4
"Three-component matrix-based Input profiles".
This commit is contained in:
Nico Weber 2023-01-23 13:55:57 -05:00 committed by Linus Groh
parent 67f718aa3f
commit fa00d94e82
3 changed files with 172 additions and 2 deletions

View file

@ -112,6 +112,33 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
record.iso_3166_1_country_code >> 8, record.iso_3166_1_country_code & 0xff,
record.text);
}
} else if (tag_data->type() == Gfx::ICC::ParametricCurveTagData::Type) {
auto& parametric_curve = static_cast<Gfx::ICC::ParametricCurveTagData&>(*tag_data);
switch (parametric_curve.function_type()) {
case Gfx::ICC::ParametricCurveTagData::FunctionType::Type0:
outln(" Y = X**{}", parametric_curve.g());
break;
case Gfx::ICC::ParametricCurveTagData::FunctionType::Type1:
outln(" Y = ({}*X + {})**{} if X >= -{}/{}",
parametric_curve.a(), parametric_curve.b(), parametric_curve.g(), parametric_curve.b(), parametric_curve.a());
outln(" Y = 0 else");
break;
case Gfx::ICC::ParametricCurveTagData::FunctionType::Type2:
outln(" Y = ({}*X + {})**{} + {} if X >= -{}/{}",
parametric_curve.a(), parametric_curve.b(), parametric_curve.g(), parametric_curve.c(), parametric_curve.b(), parametric_curve.a());
outln(" Y = {} else", parametric_curve.c());
break;
case Gfx::ICC::ParametricCurveTagData::FunctionType::Type3:
outln(" Y = ({}*X + {})**{} if X >= {}",
parametric_curve.a(), parametric_curve.b(), parametric_curve.g(), parametric_curve.d());
outln(" Y = {}*X else", parametric_curve.c());
break;
case Gfx::ICC::ParametricCurveTagData::FunctionType::Type4:
outln(" Y = ({}*X + {})**{} + {} if X >= {}",
parametric_curve.a(), parametric_curve.b(), parametric_curve.g(), parametric_curve.e(), parametric_curve.d());
outln(" Y = {}*X + {} else", parametric_curve.c(), parametric_curve.f());
break;
}
} else if (tag_data->type() == Gfx::ICC::S15Fixed16ArrayTagData::Type) {
// This tag can contain arbitrarily many fixed-point numbers, but in practice it's
// exclusively used for the 'chad' tag, where it always contains 9 values that