diff --git a/src/colors/parser.cpp b/src/colors/parser.cpp index 6693aa25e0bb7ae8323160aa691bf9ed23e7a4bd..9d7a5716a0fc4e9420c8dddd958b0a2bef54d2cd 100644 --- a/src/colors/parser.cpp +++ b/src/colors/parser.cpp @@ -155,8 +155,8 @@ std::string Parser::parseColor(std::istringstream &ss, std::vector &outp bool HueParser::parse(std::istringstream &ss, std::vector &output) const { bool end = false; - return append_css_value(ss, output, end, ',', 360) && append_css_value(ss, output, end, ',') && - append_css_value(ss, output, end, !_alpha ? '/' : ',') && (append_css_value(ss, output, end) || !_alpha) && + return append_css_value(ss, output, end, ',', 360) && append_css_value(ss, output, end, ',', _scale) && + append_css_value(ss, output, end, !_alpha ? '/' : ',', _scale) && (append_css_value(ss, output, end) || !_alpha) && end; } diff --git a/src/colors/parser.h b/src/colors/parser.h index d4cbc618779e496fa0f4aeeef43c416e91c00eee..2567956c6292d8ddeecf9ddab72f64bb5f54d2be 100644 --- a/src/colors/parser.h +++ b/src/colors/parser.h @@ -60,10 +60,13 @@ protected: class HueParser : public LegacyParser { public: - HueParser(std::string const &prefix, Space::Type type, bool alpha) + HueParser(std::string const &prefix, Space::Type type, bool alpha, double scale = 1.0) : LegacyParser(prefix, type, alpha) + , _scale(scale) {} bool parse(std::istringstream &ss, std::vector &output) const override; +protected: + double _scale = 1.0; }; class HexParser : public Parser diff --git a/src/colors/spaces/hsl.cpp b/src/colors/spaces/hsl.cpp index c8a2dca1cacfa4437161ae8d0309cdaf4848a023..73255723cb547d0bfce6ed9a79021a071c8ab132 100644 --- a/src/colors/spaces/hsl.cpp +++ b/src/colors/spaces/hsl.cpp @@ -109,9 +109,10 @@ void HSL::profileToSpace(std::vector &output) const */ std::string HSL::toString(std::vector const &values, bool opacity) const { + static constexpr double CSS_SL_SCALE = 100.0; auto oo = CssLegacyPrinter(3, "hsl", opacity && values.size() == 4); // First entry is Hue, which is in degrees - return oo << (int)(values[0] * 360) << values[1] << values[2] << values.back(); + return oo << (int)(values[0] * 360) << values[1] * CSS_SL_SCALE << values[2] * CSS_SL_SCALE << values.back(); } }; // namespace Inkscape::Colors::Space diff --git a/src/colors/spaces/hsl.h b/src/colors/spaces/hsl.h index 473826a13a2f6ad865d411c966da9400d35931f9..07bdd3547d2661b093806bcd3572c43d6aa1338d 100644 --- a/src/colors/spaces/hsl.h +++ b/src/colors/spaces/hsl.h @@ -34,7 +34,7 @@ public: { public: Parser(bool alpha) - : HueParser("hsl", Type::HSL, alpha) + : HueParser("hsl", Type::HSL, alpha, 100.0) {} }; }; diff --git a/src/colors/spaces/hsv.cpp b/src/colors/spaces/hsv.cpp index 88da40534325bc590fbd4b573d6a0672b5f7f446..882f695b72367ac32a764b11a69140644669e7b2 100644 --- a/src/colors/spaces/hsv.cpp +++ b/src/colors/spaces/hsv.cpp @@ -113,12 +113,13 @@ bool HSV::fromHwbParser::parse(std::istringstream &ss, std::vector &outp */ std::string HSV::toString(std::vector const &values, bool opacity) const { + static constexpr double CSS_WB_SCALE = 100.0; auto oo = CssLegacyPrinter(3, "hwb", opacity && values.size() == 4); - // First entry is Hue, which is in degrees, white and black are dirived - return oo << (int)(values[0] * 360) // Hue, degrees, 0..360 - << (1.0 - values[1]) * values[2] // White - << 1.0 - values[2] // Black - << values.back(); // Opacity + // First entry is Hue, which is in degrees, white and black are derived + return oo << (int)(values[0] * 360) // Hue, degrees, 0..360 + << ((1.0 - values[1]) * values[2]) * CSS_WB_SCALE // White, 0..100 + << (1.0 - values[2]) * CSS_WB_SCALE // Black, 0..100 + << values.back(); // Opacity } }; // namespace Inkscape::Colors::Space diff --git a/src/colors/spaces/hsv.h b/src/colors/spaces/hsv.h index ff0e2e26e196b2a556c401d5777ac1807a6c3d2d..f4a43411d04db30adb9a892eea56fb05fa3fce13 100644 --- a/src/colors/spaces/hsv.h +++ b/src/colors/spaces/hsv.h @@ -34,7 +34,7 @@ public: { public: fromHwbParser(bool alpha) - : HueParser("hwb", Space::Type::HSV, alpha) + : HueParser("hwb", Space::Type::HSV, alpha, 100.0) {} bool parse(std::istringstream &input, std::vector &output) const override; }; diff --git a/testfiles/cli_tests/testcases/pdfoutput/02-test-fills.svg b/testfiles/cli_tests/testcases/pdfoutput/02-test-fills.svg index 6a65b71558409a70b870d8a00b39c81996d47c6a..a8c0da38bf8c94645bafbc2f7be05e21d02aa30f 100644 --- a/testfiles/cli_tests/testcases/pdfoutput/02-test-fills.svg +++ b/testfiles/cli_tests/testcases/pdfoutput/02-test-fills.svg @@ -156,7 +156,7 @@ offset="0" id="stop7" /> @@ -216,7 +216,7 @@ offset="0" id="stop18" /> @@ -264,7 +264,7 @@ offset="0" id="stop37" /> @@ -542,7 +542,7 @@ id="stop4491" /> @@ -636,7 +636,7 @@ id="stop4509" /> @@ -755,7 +755,7 @@ id="stop4491-1" /> @@ -849,7 +849,7 @@ id="stop4509-6" /> diff --git a/testfiles/src/colors/color-set-test.cpp b/testfiles/src/colors/color-set-test.cpp index 985dab1c6cc61f4753dfb6070ca659ae480e7763..8e5cd593a553bf6c10b5a55ca55d85cc146caeb7 100644 --- a/testfiles/src/colors/color-set-test.cpp +++ b/testfiles/src/colors/color-set-test.cpp @@ -110,7 +110,7 @@ TEST(ColorSetTest, setColorsHsl) ASSERT_TRUE(*colors.getAlphaConstraint()); colors.set("i1", *Color::parse("red")); - ASSERT_EQ(colors.get("i1")->toString(), "hsla(0, 1, 0.5, 1)"); + ASSERT_EQ(colors.get("i1")->toString(), "hsla(0, 100, 50, 1)"); } TEST(ColorSetTest, setAllColors) @@ -251,16 +251,16 @@ TEST(ColorSetTest, getAverage) EXPECT_TRUE(colors.isSame()); colors.clear(); - colors.set("c1", *Color::parse("hsl(180,1,1)")); - colors.set("c2", *Color::parse("hsla(60,0,0, 0.5)")); + colors.set("c1", *Color::parse("hsl(180,100,100)")); + colors.set("c2", *Color::parse("hsla(60,0,0, 50)")); EXPECT_EQ(colors.getBestSpace()->getName(), "HSL"); - EXPECT_EQ(colors.getAverage().toString(), "hsl(120, 0.5, 0.5)"); + EXPECT_EQ(colors.getAverage().toString(), "hsl(120, 50, 50)"); - colors.set("c1", *Color::parse("hsl(180,1,1)")); - colors.set("c2", *Color::parse("hsl(0,0.5,1)")); + colors.set("c1", *Color::parse("hsl(180,100,100)")); + colors.set("c2", *Color::parse("hsl(0,50,100)")); colors.set("c3", *Color::parse("blue")); EXPECT_EQ(colors.getBestSpace()->getName(), "HSL"); - EXPECT_EQ(colors.getAverage().toString(), "hsl(139, 0.833, 0.833)"); + EXPECT_EQ(colors.getAverage().toString(), "hsl(139, 83.333, 83.333)"); } TEST(ColorSetTest, getCmykAverage) diff --git a/testfiles/src/colors/color-test.cpp b/testfiles/src/colors/color-test.cpp index af99b1a70688cfbcc147def819c383597df4c373..efb63d1eb7884d16c5d9d81c74230f293124b72d 100644 --- a/testfiles/src/colors/color-test.cpp +++ b/testfiles/src/colors/color-test.cpp @@ -24,12 +24,12 @@ TEST(ColorsColor, construct_space_obj) auto space = Manager::get().find(Space::Type::HSL); ASSERT_TRUE(space); - ASSERT_EQ(Color(space, {0, 1, 0.5}).toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(Color(space, {0, 1, 0.5}).toString(), "hsl(0, 100, 50)"); } TEST(ColorsColor, construct_space_type) { - ASSERT_EQ(Color(Space::Type::HSL, {0, 1, 0.5}).toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(Color(Space::Type::HSL, {0, 1, 0.5}).toString(), "hsl(0, 100, 50)"); } TEST(ColorsColor, construct_css_string) @@ -198,7 +198,7 @@ TEST(ColorsColor, similarAndClose) TEST(ColorsColor, convert_other) { auto other = *Color::parse("red"); - auto color = Color::parse("hsl(120, 1, 0.251)"); + auto color = Color::parse("hsl(120, 100, 25.1)"); color->convert(other); EXPECT_EQ(color->toString(), "green"); other.addOpacity(); @@ -213,37 +213,37 @@ TEST(ColorsColor, convert_space_obj) auto color = Color(0xff0000ff, false); color.convert(space); - ASSERT_EQ(color.toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(color.toString(), "hsl(0, 100, 50)"); } TEST(ColorsColor, convert_space_type) { auto color = Color(0xff0000ff, false); ASSERT_TRUE(color.convert(Space::Type::HSL)); - ASSERT_EQ(color.toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(color.toString(), "hsl(0, 100, 50)"); ASSERT_FALSE(color.convert(Space::Type::NONE)); - ASSERT_EQ(color.toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(color.toString(), "hsl(0, 100, 50)"); } TEST(ColorsColor, converted_other) { auto other = *Color::parse("red"); - ASSERT_EQ(Color::parse("hsl(120, 1, 0.251)")->converted(other)->toString(), "green"); + ASSERT_EQ(Color::parse("hsl(120, 100, 25.1)")->converted(other)->toString(), "green"); other.addOpacity(); - ASSERT_EQ(Color::parse("hsl(120, 1, 0.251)")->converted(other)->toString(), "#008000ff"); + ASSERT_EQ(Color::parse("hsl(120, 100, 25.1)")->converted(other)->toString(), "#008000ff"); } TEST(ColorsColor, converted_space_obj) { auto space = Manager::get().find(Space::Type::HSL); ASSERT_TRUE(space); - ASSERT_EQ(Color::parse("red")->converted(space)->toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(Color::parse("red")->converted(space)->toString(), "hsl(0, 100, 50)"); } TEST(ColorsColor, converted_space_type) { auto color = Color::parse("red"); - ASSERT_EQ(color->converted(Space::Type::HSL)->toString(), "hsl(0, 1, 0.5)"); + ASSERT_EQ(color->converted(Space::Type::HSL)->toString(), "hsl(0, 100, 50)"); auto none = color->converted(Space::Type::NONE); ASSERT_FALSE(none); @@ -328,12 +328,12 @@ TEST(ColorsColor, invertColor) color.invert(); ASSERT_EQ(color.toString(), "red"); - color = *Color::parse("hsl(90,0.5,0.1)"); + color = *Color::parse("hsl(90,50,10)"); color.invert(); - ASSERT_EQ(color.toString(), "hsl(270, 0.5, 0.9)"); + ASSERT_EQ(color.toString(), "hsl(270, 50, 90)"); color.invert(2); - ASSERT_EQ(color.toString(), "hsl(90, 0.5, 0.1)"); + ASSERT_EQ(color.toString(), "hsl(90, 50, 10)"); color = *Color::parse("rgb(255 255 255 0.2)"); ASSERT_NEAR(color[0], 1, 0.001); diff --git a/testfiles/src/colors/spaces-hsl-test.cpp b/testfiles/src/colors/spaces-hsl-test.cpp index 24581e8935a03aba02010627a898dd46f1992f4e..3ababa98848d05a7b5337c01b3e0db3ae621c6ee 100644 --- a/testfiles/src/colors/spaces-hsl-test.cpp +++ b/testfiles/src/colors/spaces-hsl-test.cpp @@ -16,13 +16,13 @@ using Space::Type::RGB; // clang-format off INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsl, fromString, testing::Values( - _P(in, "hsl(80, 1, 0.5)", { 0.222, 1, 0.5 }, 0xaaff00ff), - _P(in, "hsl(360,0.5,0)", { 1.0, 0.5, 0 }, 0x000000ff), + _P(in, "hsl(80, 100, 50)", { 0.222, 1, 0.5 }, 0xaaff00ff), + _P(in, "hsl(360, 50, 0)", { 1.0, 0.5, 0 }, 0x000000ff), _P(in, "hsl(180deg, 100%, 50%)", { 0.5, 1, 0.5 }, 0x00ffffff), _P(in, "hsl(0.5turn 100% 50%)", { 0.5, 1, 0.5 }, 0x00ffffff), - _P(in, " hsl(20, 1, 0.5)", { 0.055, 1, 0.5 }, 0xff5500ff), + _P(in, " hsl(20, 100, 50)", { 0.055, 1, 0.5 }, 0xff5500ff), _P(in, "hsl(50%, 100%, 50% / 50%)", { 0.5, 1, 0.5, 0.5 }, 0x00ffff80), - _P(in, "hsla(30, 0, 0.5, 0.5)", { 0.083, 0, 0.5, 0.5 }, 0x80808080) + _P(in, "hsla(30, 0, 50, 0.5)", { 0.083, 0, 0.5, 0.5 }, 0x80808080) )); INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsl, badColorString, testing::Values( @@ -30,11 +30,11 @@ INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsl, badColorString, testing::Values( )); INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsl, toString, testing::Values( - _P(out, HSL, { 0.333, 0.2, 0.8 }, "hsl(119, 0.2, 0.8)"), - _P(out, HSL, { 0.333, 0.8, 0.258 }, "hsl(119, 0.8, 0.258)"), - _P(out, HSL, { 1.0, 0.5, 0.004 }, "hsl(360, 0.5, 0.004)"), - _P(out, HSL, { 0, 1, 0.2, 0.8 }, "hsla(0, 1, 0.2, 0.8)", true), - _P(out, HSL, { 0, 1, 0.2, 0.8 }, "hsl(0, 1, 0.2)", false) + _P(out, HSL, { 0.333, 0.2, 0.8 }, "hsl(119, 20, 80)"), + _P(out, HSL, { 0.333, 0.8, 0.258 }, "hsl(119, 80, 25.8)"), + _P(out, HSL, { 1.0, 0.5, 0.004 }, "hsl(360, 50, 0.4)"), + _P(out, HSL, { 0, 1, 0.2, 0.8 }, "hsla(0, 100, 20, 0.8)", true), + _P(out, HSL, { 0, 1, 0.2, 0.8 }, "hsl(0, 100, 20)", false) )); INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsl, convertColorSpace, testing::Values( diff --git a/testfiles/src/colors/spaces-hsv-test.cpp b/testfiles/src/colors/spaces-hsv-test.cpp index 6baf0b4c770a0a06d02fb829082f6216b5149bcf..a2cb0333ce1bf53ba32bb88238e89bd0b03b4eb0 100644 --- a/testfiles/src/colors/spaces-hsv-test.cpp +++ b/testfiles/src/colors/spaces-hsv-test.cpp @@ -17,17 +17,17 @@ using Space::Type::RGB; // clang-format off INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsv, fromString, testing::Values( // Taken from the w3c hwb example chart - _P(in, "hwb(0, 0.2, 0.2)", { 0.0, 0.75, 0.8 }, 0xcc3333ff), - _P(in, "hwb(30, 0.2, 0.2)", { 0.083, 0.75, 0.8 }, 0xcc7f33ff), - _P(in, "hwb(90, 0.2, 0.2)", { 0.25, 0.75, 0.8 }, 0x80cc33ff), - _P(in, "hwb(0, 0.4, 0.4)", { 0.0, 0.333, 0.6 }, 0x996666ff), - _P(in, "hwb(30deg, 0.4, 0.4)", { 0.083, 0.333, 0.6 }, 0x997f66ff), - _P(in, "hwb(0.25turn, 0.4, 0.4)", { 0.25, 0.333, 0.6 }, 0x809966ff), - _P(in, "hwb(0, 0.6, 60%)", { 0.0, 0, 0.5 }, 0x808080ff), - _P(in, "hwb(30, 60%, 0.6)", { 0.083, 0, 0.5 }, 0x808080ff), - _P(in, " hwb(90, 0.6, 0.6) ", { 0.25, 0, 0.5 }, 0x808080ff), - _P(in, "hwb(0, 0.8, 0.8)", { 0.0, 0, 0.5 }, 0x808080ff), - _P(in, "hwb(0, 1.0, 1.0 / 0.5)", { 0.0, 0, 0.5, 0.5 }, 0x80808080) + _P(in, "hwb(0, 20, 20)", { 0.0, 0.75, 0.8 }, 0xcc3333ff), + _P(in, "hwb(30, 20.0, 20.0)", { 0.083, 0.75, 0.8 }, 0xcc7f33ff), + _P(in, "hwb(90, 20, 20)", { 0.25, 0.75, 0.8 }, 0x80cc33ff), + _P(in, "hwb(0, 40, 40)", { 0.0, 0.333, 0.6 }, 0x996666ff), + _P(in, "hwb(30deg, 40, 40)", { 0.083, 0.333, 0.6 }, 0x997f66ff), + _P(in, "hwb(0.25turn, 40, 40)", { 0.25, 0.333, 0.6 }, 0x809966ff), + _P(in, "hwb(0, 60, 60%)", { 0.0, 0, 0.5 }, 0x808080ff), + _P(in, "hwb(30, 60%, 60)", { 0.083, 0, 0.5 }, 0x808080ff), + _P(in, " hwb(90, 60, 60) ", { 0.25, 0, 0.5 }, 0x808080ff), + _P(in, "hwb(0, 80, 80)", { 0.0, 0, 0.5 }, 0x808080ff), + _P(in, "hwb(0, 100, 100 / 0.5)", { 0.0, 0, 0.5, 0.5 }, 0x80808080) )); INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsv, badColorString, testing::Values( @@ -35,11 +35,11 @@ INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsv, badColorString, testing::Values( )); INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsv, toString, testing::Values( - _P(out, HSV, { 0.333, 0.2, 0.8 }, "hwb(119, 0.64, 0.2)"), - _P(out, HSV, { 0.333, 0.8, 0.258 }, "hwb(119, 0.052, 0.742)"), - _P(out, HSV, { 1.0, 0.5, 0.004 }, "hwb(360, 0.002, 0.996)"), - _P(out, HSV, { 0, 1, 0.2, 0.8 }, "hwba(0, 0, 0.8, 0.8)"), - _P(out, HSV, { 0, 1, 0.2, 0.8 }, "hwb(0, 0, 0.8)", false) + _P(out, HSV, { 0.333, 0.2, 0.8 }, "hwb(119, 64, 20)"), + _P(out, HSV, { 0.333, 0.8, 0.258 }, "hwb(119, 5.16, 74.2)"), + _P(out, HSV, { 1.0, 0.5, 0.004 }, "hwb(360, 0.2, 99.6)"), + _P(out, HSV, { 0, 1, 0.2, 0.8 }, "hwba(0, 0, 80, 0.8)"), + _P(out, HSV, { 0, 1, 0.2, 0.8 }, "hwb(0, 0, 80)", false) )); INSTANTIATE_TEST_SUITE_P(ColorsSpacesHsv, convertColorSpace, testing::Values( diff --git a/testfiles/src/colors/utils-test.cpp b/testfiles/src/colors/utils-test.cpp index 185f68b07952ba46da41d57dc56fcc0ced2f2665..1e8d39574b2755de01a7ca95fa88d9919b32fa39 100644 --- a/testfiles/src/colors/utils-test.cpp +++ b/testfiles/src/colors/utils-test.cpp @@ -37,7 +37,7 @@ TEST(ColorUtils, test_color_to_id) EXPECT_EQ(color_to_id(Color::parse("red")), "css-red"); EXPECT_EQ(color_to_id(Color::parse("#0000ff")), "rgb-0000ff"); - auto color = Color::parse("hsl(0.5, 0.5, 1.0)"); + auto color = Color::parse("hsl(0.5, 50, 100)"); EXPECT_EQ(color_to_id(color), "hsl-007fff"); color->setName("Huey // Dewy_! Lewy"); diff --git a/testfiles/src/colors/xml-color-test.cpp b/testfiles/src/colors/xml-color-test.cpp index fe940905767a40f2e874937301655b1ed9fc8ef1..5b3268d0aa44a99612fc833e284c66767c8f1508 100644 --- a/testfiles/src/colors/xml-color-test.cpp +++ b/testfiles/src/colors/xml-color-test.cpp @@ -56,7 +56,7 @@ TEST_F(ColorXmlColor, test_paint_to_xml_string) b="0.07058824" /> )"); - ASSERT_EQ(paint_to_xml_string(*Color::parse("hsl(180,1,1)")), R"( + ASSERT_EQ(paint_to_xml_string(*Color::parse("hsl(180,100,100)")), R"(