From 35f2610f4d6410e2737b27f444a00ab540df0907 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Fri, 30 Dec 2022 09:29:10 +0100 Subject: [PATCH 1/2] coverage.c: Use width/height arguments The tests in coverage.c have #defines for WIDTH and HEIGHT, but also have function arguments for these numbers. This commit changes the tests to use the function arguments instead of the defines. One complication is the rhombus test that already had a factor 2 between these two numbers. A new variable is added to get back the previous value. Signed-off-by: Uli Schlachter --- test/coverage.c | 119 ++++++++++++++++++++++++------------------------ 1 file changed, 60 insertions(+), 59 deletions(-) diff --git a/test/coverage.c b/test/coverage.c index 86216df31..f6626f3d0 100644 --- a/test/coverage.c +++ b/test/coverage.c @@ -50,9 +50,9 @@ hars_petruska_f54_1_random (void) } static double -random_offset (int range, int precise) +random_offset (int range, int precise, int width) { - double x = hars_petruska_f54_1_random() / (double) UINT32_MAX * range / WIDTH; + double x = hars_petruska_f54_1_random() / (double) UINT32_MAX * range / width; if (precise) x = floor (x * PRECISION) / PRECISION; return x; @@ -69,9 +69,9 @@ rectangles (cairo_t *cr, int width, int height) cairo_paint (cr); #if GENERATE_REFERENCE - for (x = 0; x < WIDTH; x++) { - cairo_set_source_rgba (cr, 1, 1, 1, x * x * 1.0 / (WIDTH * WIDTH)); - cairo_rectangle (cr, x, 0, 1, HEIGHT); + for (x = 0; x < width; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 1.0 / (width * width)); + cairo_rectangle (cr, x, 0, 1, height); cairo_fill (cr); } #else @@ -84,11 +84,11 @@ rectangles (cairo_t *cr, int width, int height) case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; } - for (x = 0; x < WIDTH; x++) { - for (y = 0; y < HEIGHT; y++) { - double dx = random_offset (WIDTH - x, TRUE); - double dy = random_offset (WIDTH - x, TRUE); - cairo_rectangle (cr, x + dx, y + dy, x / (double) WIDTH, x / (double) WIDTH); + for (x = 0; x < width; x++) { + for (y = 0; y < height; y++) { + double dx = random_offset (width - x, TRUE, width); + double dy = random_offset (width - x, TRUE, width); + cairo_rectangle (cr, x + dx, y + dy, x / (double) width, x / (double) width); } } cairo_fill (cr); @@ -102,15 +102,16 @@ static cairo_test_status_t rhombus (cairo_t *cr, int width, int height) { int x, y; + int internal_size = width / 2; cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_paint (cr); #if GENERATE_REFERENCE - for (y = 0; y < WIDTH; y++) { - for (x = 0; x < WIDTH; x++) { + for (y = 0; y < internal_size; y++) { + for (x = 0; x < internal_size; x++) { cairo_set_source_rgba (cr, 1, 1, 1, - x * y / (2. * WIDTH * WIDTH)); + x * y / (2. * internal_size * internal_size)); cairo_rectangle (cr, 2*x, 2*y, 2, 2); cairo_fill (cr); } @@ -119,10 +120,10 @@ rhombus (cairo_t *cr, int width, int height) cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgb (cr, 1, 1, 1); - for (y = 0; y < WIDTH; y++) { - double yf = y / (double) WIDTH; - for (x = 0; x < WIDTH; x++) { - double xf = x / (double) WIDTH; + for (y = 0; y < internal_size; y++) { + double yf = y / (double) internal_size; + for (x = 0; x < internal_size; x++) { + double xf = x / (double) internal_size; cairo_move_to (cr, 2*x + 1 - xf, @@ -157,9 +158,9 @@ intersecting_quads (cairo_t *cr, int width, int height) cairo_paint (cr); #if GENERATE_REFERENCE - for (x = 0; x < WIDTH; x++) { - cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH)); - cairo_rectangle (cr, x, 0, 1, HEIGHT); + for (x = 0; x < width; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (width * width)); + cairo_rectangle (cr, x, 0, 1, height); cairo_fill (cr); } #else @@ -172,11 +173,11 @@ intersecting_quads (cairo_t *cr, int width, int height) case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; } - for (x = 0; x < WIDTH; x++) { - double step = x / (double) WIDTH; - for (y = 0; y < HEIGHT; y++) { - double dx = random_offset (WIDTH - x, TRUE); - double dy = random_offset (WIDTH - x, TRUE); + for (x = 0; x < width; x++) { + double step = x / (double) width; + for (y = 0; y < height; y++) { + double dx = random_offset (width - x, TRUE, width); + double dy = random_offset (width - x, TRUE, width); cairo_move_to (cr, x + dx, y + dy); cairo_rel_line_to (cr, step, step); cairo_rel_line_to (cr, 0, -step); @@ -202,9 +203,9 @@ intersecting_triangles (cairo_t *cr, int width, int height) cairo_paint (cr); #if GENERATE_REFERENCE - for (x = 0; x < WIDTH; x++) { - cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.75 / (WIDTH * WIDTH)); - cairo_rectangle (cr, x, 0, 1, HEIGHT); + for (x = 0; x < width; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.75 / (width * width)); + cairo_rectangle (cr, x, 0, 1, height); cairo_fill (cr); } #else @@ -217,11 +218,11 @@ intersecting_triangles (cairo_t *cr, int width, int height) case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; } - for (x = 0; x < WIDTH; x++) { - double step = x / (double) WIDTH; - for (y = 0; y < HEIGHT; y++) { - double dx = random_offset (WIDTH - x, TRUE); - double dy = random_offset (WIDTH - x, TRUE); + for (x = 0; x < width; x++) { + double step = x / (double) width; + for (y = 0; y < height; y++) { + double dx = random_offset (width - x, TRUE, width); + double dy = random_offset (width - x, TRUE, width); /* left */ cairo_move_to (cr, x + dx, y + dy); @@ -254,9 +255,9 @@ triangles (cairo_t *cr, int width, int height) cairo_paint (cr); #if GENERATE_REFERENCE - for (x = 0; x < WIDTH; x++) { - cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (WIDTH * WIDTH)); - cairo_rectangle (cr, x, 0, 1, HEIGHT); + for (x = 0; x < width; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * x * 0.5 / (width * width)); + cairo_rectangle (cr, x, 0, 1, height); cairo_fill (cr); } #else @@ -269,13 +270,13 @@ triangles (cairo_t *cr, int width, int height) case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; } - for (x = 0; x < WIDTH; x++) { - for (y = 0; y < HEIGHT; y++) { - double dx = random_offset (WIDTH - x, TRUE); - double dy = random_offset (WIDTH - x, TRUE); + for (x = 0; x < width; x++) { + for (y = 0; y < height; y++) { + double dx = random_offset (width - x, TRUE, width); + double dy = random_offset (width - x, TRUE, width); cairo_move_to (cr, x + dx, y + dy); - cairo_rel_line_to (cr, x / (double) WIDTH, 0); - cairo_rel_line_to (cr, 0, x / (double) WIDTH); + cairo_rel_line_to (cr, x / (double) width, 0); + cairo_rel_line_to (cr, 0, x / (double) width); cairo_close_path (cr); } } @@ -344,9 +345,9 @@ column_triangles (cairo_t *cr, int width, int height) cairo_paint (cr); #if GENERATE_REFERENCE - for (x = 0; x < WIDTH; x++) { - cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH); - cairo_rectangle (cr, x, 0, 1, HEIGHT); + for (x = 0; x < width; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / width); + cairo_rectangle (cr, x, 0, 1, height); cairo_fill (cr); } #else @@ -359,11 +360,11 @@ column_triangles (cairo_t *cr, int width, int height) case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; } - for (x = 0; x < WIDTH; x++) { - double step = x / (double) (2 * WIDTH); - for (y = 0; y < HEIGHT; y++) { + for (x = 0; x < width; x++) { + double step = x / (double) (2 * width); + for (y = 0; y < height; y++) { for (i = 0; i < PRECISION; i++) { - double dy = random_offset (WIDTH - x, FALSE); + double dy = random_offset (width - x, FALSE, width); /* * We want to test some sharing of edges to further @@ -375,7 +376,7 @@ column_triangles (cairo_t *cr, int width, int height) * s --- . --- * t | |\ | * e | | \ | - * p --- .... | 2 * step = x / WIDTH + * p --- .... | 2 * step = x / width * \ | | * \| | * . --- @@ -383,8 +384,8 @@ column_triangles (cairo_t *cr, int width, int height) * 1 / PRECISION * * Each column contains two triangles of width one quantum and - * total height of (x / WIDTH), thus the total area covered by all - * columns in each pixel is .5 * (x / WIDTH). + * total height of (x / width), thus the total area covered by all + * columns in each pixel is .5 * (x / width). */ cairo_move_to (cr, x + i / (double) PRECISION, y + dy); @@ -413,9 +414,9 @@ row_triangles (cairo_t *cr, int width, int height) cairo_paint (cr); #if GENERATE_REFERENCE - for (x = 0; x < WIDTH; x++) { - cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / WIDTH); - cairo_rectangle (cr, x, 0, 1, HEIGHT); + for (x = 0; x < width; x++) { + cairo_set_source_rgba (cr, 1, 1, 1, x * 0.5 / width); + cairo_rectangle (cr, x, 0, 1, height); cairo_fill (cr); } #else @@ -428,11 +429,11 @@ row_triangles (cairo_t *cr, int width, int height) case 2: cairo_set_source_rgb (cr, 0.0, 0.0, 1.0); break; } - for (x = 0; x < WIDTH; x++) { - double step = x / (double) (2 * WIDTH); - for (y = 0; y < HEIGHT; y++) { + for (x = 0; x < width; x++) { + double step = x / (double) (2 * width); + for (y = 0; y < height; y++) { for (i = 0; i < PRECISION; i++) { - double dx = random_offset (WIDTH - x, FALSE); + double dx = random_offset (width - x, FALSE, width); /* See column_triangles() for a transposed description * of this geometry. From 8d74c4d0198326f2d216e3c8c0b18e121cdb1436 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Fri, 30 Dec 2022 16:36:22 +0100 Subject: [PATCH 2/2] Speed up coverage-column-triangles test This commit changes the height of the coverage-column-triangles test by using a smaller height for the test. Previously the image was 40 pixels in height and the test took 517 seconds for me. Now, the image has a height of 4 pixels and the test takes 55 seconds. This is possible since column_triangles() does the same thing for each y coordinate. Thus, previously this test just did the same thing 40 times. Times are measured with the backends I happened to have enabled locally: script, xcb, xlib, image, recording. Thanks a lot to Christian Rohlfs for coming up with this idea in https://gitlab.freedesktop.org/cairo/cairo/-/issues/498#note_1700197 Possibly-fixes: https://gitlab.freedesktop.org/cairo/cairo/-/issues/498 Signed-off-by: Uli Schlachter --- test/coverage.c | 3 ++- .../coverage-column-triangles.ref.png | Bin 208 -> 886 bytes .../coverage-column-triangles.xfail.png | Bin 7632 -> 560 bytes .../coverage-column-triangles.xlib.xfail.png | Bin 12745 -> 1364 bytes 4 files changed, 2 insertions(+), 1 deletion(-) diff --git a/test/coverage.c b/test/coverage.c index f6626f3d0..0749fa22a 100644 --- a/test/coverage.c +++ b/test/coverage.c @@ -491,7 +491,8 @@ CAIRO_TEST (coverage_column_triangles, "Check the fidelity of the rasterisation.", NULL, /* keywords */ "target=raster", /* requirements */ - WIDTH, HEIGHT, + /* Smaller height since this test does not vary by y-coordinate */ + WIDTH, 4, NULL, column_triangles) CAIRO_TEST (coverage_triangles, "Check the fidelity of the rasterisation.", diff --git a/test/reference/coverage-column-triangles.ref.png b/test/reference/coverage-column-triangles.ref.png index aa61031b7265a6c03194a271fc82a097d7f883a2..24ccc9f2a476e38d951e5d54e4bd50561b020c6b 100644 GIT binary patch delta 860 zcmV-i1Ec)V0rm!v7YYOj0ssI2?)G+*ks%a+11m{HK~zYIot8_Mk-j@ zE^F7+EF`_Q;1o~~QX##m5I9O6%R~0nOd4A0gI4#IB^mNiBJU^ABF+XL3_TG?%FJg=-f1N+$c`9_S@;pz1DDf#z z($`sJE~w&k7D7FbNi@mN&(E&O^E~{2_fhYc$q*TtLUMD0oWx64sC>2*< zBTVYnYh7|AWHU~G`Dd!Ui#&L;t{xG(UAN-za*7NCZ$_GIRo zroI=_^`RT}l#BbLy?0KzC|W2HqZgH(pb?uF+wk5XJ1&yS&Em~KI1{u`A?A30;K0^w zGA#T~+MAJKqA|G_=ez(+(bMH{Ic(?CG>r@Jp6%xjgQntIY6u+Dq0j8gLaYBAiW3b9 zNezJiGd=}i?oTlUZB$v_JsQpl$tolv9Ml~3LXltNEqs>;Cz`$z-tyG(?R&swJ$FSu zhvswfXUkfeQyFcKBNG7*$zEQ6SI1*R1GCS+qRH!yR`rJgTV(4UCUioXjxqu?Q(GHb zUYYoW)YDfLbHlaz4Kh=vZz=H=(job3gMTs$PJ>q)EHYN(=JXnw5%>9UC(QBle6E!{N4BzK&}aAGc}qVe!KsFJKiJ2l!F}3 zyHdU@GGG7KPsit80(RxqYtGmY;h2o&&OupbUef#Z&o`F+2%}Cr)|7$!^%XsD=Ss{+ zD9zP)e=;SKy{O6X*IW1J(7JddZG&m}VC#|o4~7uWO{dhXSCy6t$^BcCAHv3 msX1#Q*#z___n+1LcjF(rGAWuigkFjO0000cByV>YhW{YAVDIwDK#^8Y z7srr_Id3mJGBOzOv}}0&r+c2jBzC?Xxwqf>ncgtxFlNYPQ#i}8M6$tzc|sb)B_4-a ej2=`Lw7d71@vO~+LzO@WF?hQAxvX|@wz6z+s7>cC&=4ZJ`B$Wa}j76Pgl5mR?sI{+koT4Bm zKtdHRpnAYJsU1@&Lhk)7M#ccuHjpN3u8}u##D5>3%}$qtr0sW65tB;evm*2ve9ZuV zUwpaO4HU+hDsquuak%PE(1*2xDz{OM5Bg$d#VW)d8Ejc$oPWWezP5O4Z{vIkPMzERZ+Tb~K@55-eM2aSjh$~Pr zCSkr0X1}+4gyEp!J1y5g$E4O~(&IIM0&}+tctX(7W8%y+;c(xRAcu;$4dY5nbqn|$BwLm V>2t#*ExP~!002ovPDHLkV1k)^2)zIR literal 7632 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 diff --git a/test/reference/coverage-column-triangles.xlib.xfail.png b/test/reference/coverage-column-triangles.xlib.xfail.png index f433b7a849ec966e72e35866e0ef19998fa52b44..18e4af2dae6e271f32ba071106cd61b8860f32d8 100644 GIT binary patch delta 1342 zcmV-E1;P5sW7G`0D7@u7KS_5SzT z`9emZ2J*~4t)Y$vB7qB#002-V$r4$fv34K#WHKZ%?bG;th=}*bdZdF(9o%-pj#3k5j1Wc^R!ch)*QE8+Hn0c6i(Z@W?9Toy2j>wyPM&2&0DF`ku#$FRQDW2o5h?&kO;lC_iIADd$Qp#_ z#yl7G>1qE4b3OloZz5>`9_`zj%gY5=0BKBrAClfR61{O(avD z;DSfJl7bX-%x%~J$A<*E59`iI1iFiV8MdGh(12v1XaP|`0b)D}fNS>ZXS$%1^+;0I z=pX9y>HP1>UqM81$tGn-YQ?P_YW@{QGyr00OA6 zgd4FWka-+b(;27G)28!NxEpmT6azlgm`p09UsJw-fi2n+BflV++$F(an{&t#1~ExA zEEUksRuM~qtrwNECPV|3`zGsG7ihR!zIKPUI%-+EBKUA2L95$p#C|1z=9=aSVU$(S z_CYi%B#^6jbu0)J0QF&05_VA;B3tHgE-*|l1(C*bqGgd7T`?o<%b%=odtnC zJVMZ65{VK_JVec}^I6a)5P%>75rq*Rp^H$FLUbzwgcQ)fTZM9dABzulK{N>I z>ryhYw2{j){J}JWw~@+t#DyEfS!6dK*t);fROBkoH}FYP?7Kh_ep?Pxg`5fc11{oa zH9R7;mt|X=&q;57M{A$1z+HTf+pylO{4qin5((&wG|IjSMz*Sd(0=ekg_~kmv_#++ zkeVel5w+w(ydJ+xAd(h4Q@4*+aIsx>{$^|y5fy1SYiTTC;k%o^eor)Ie$C?eUj?fKVVg3sVvqTBOs!#dbz4CcO5~23Wj;C!xqyK@gdn(Ord2*gC6y(LHZ$md`#t#!H$fy78?AsviI&8_Mku$*ZEvlB_Rs3z|d9ebGnc0 zwUHvUdMw zT~>rhT+**8H2kLFAxkE}=`62MggutuLrE3?3)`BQ8X*cB?*IS*07*qoM6N<$f+rAI A-T(jq literal 12745 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