From 5e4821d9fc896b56ebc5dcc3521f8d215a41bf3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 22 Nov 2024 10:07:53 +0100 Subject: [PATCH] tests/cursors: Test viewport based cropping Part-of: --- src/tests/cursor-tests.c | 78 ++++++++++++++++++ ...ackends_native_cursor_cropping_0_0.ref.png | Bin 0 -> 8952 bytes ...ackends_native_cursor_cropping_1_0.ref.png | Bin 0 -> 8952 bytes ...ackends_native_cursor_cropping_2_0.ref.png | Bin 0 -> 9301 bytes ...ackends_native_cursor_cropping_3_0.ref.png | Bin 0 -> 9299 bytes ...ackends_native_cursor_cropping_4_0.ref.png | Bin 0 -> 6640 bytes ...ackends_native_cursor_cropping_5_0.ref.png | Bin 0 -> 7317 bytes .../cursor-tests-client.c | 21 +++++ 8 files changed, 99 insertions(+) create mode 100644 src/tests/ref-tests/backends_native_cursor_cropping_0_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_cropping_1_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_cropping_2_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_cropping_3_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_cropping_4_0.ref.png create mode 100644 src/tests/ref-tests/backends_native_cursor_cropping_5_0.ref.png diff --git a/src/tests/cursor-tests.c b/src/tests/cursor-tests.c index a90525adc..7a8be1ced 100644 --- a/src/tests/cursor-tests.c +++ b/src/tests/cursor-tests.c @@ -35,6 +35,7 @@ #define CURSOR_SCALE_METHOD_BUFFER_SCALE "buffer-scale" #define CURSOR_SCALE_METHOD_VIEWPORT "viewport" +#define CURSOR_SCALE_METHOD_VIEWPORT_CROPPED "viewport-cropped" struct _MetaCrossOverlay { @@ -471,11 +472,88 @@ meta_test_native_cursor_scaling (void) clutter_actor_destroy (overlay_actor); } +static void +meta_test_native_cursor_cropping (void) +{ + MetaBackend *backend = meta_context_get_backend (test_context); + MetaDisplay *display = meta_context_get_display (test_context); + ClutterSeat *seat = meta_backend_get_default_seat (backend); + g_autoptr (ClutterVirtualInputDevice) virtual_pointer = NULL; + ClutterActor *overlay_actor; + ClutterStageView *view; + struct { + int width; + int height; + float scale; + MetaLogicalMonitorLayoutMode layout_mode; + } test_cases[] = { + { + .width = 1920, .height = 1080, .scale = 1.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + }, + { + .width = 1920, .height = 1080, .scale = 1.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL, + }, + { + .width = 1920, .height = 1080, .scale = 2.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + }, + { + .width = 1920, .height = 1080, .scale = 2.0, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL, + }, + { + .width = 1440, .height = 900, .scale = 1.5, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + }, + { + .width = 1440, .height = 900, .scale = 2.25, + .layout_mode = META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL, + }, + }; + int i; + + meta_display_set_cursor (display, META_CURSOR_DEFAULT); + virtual_pointer = clutter_seat_create_virtual_device (seat, + CLUTTER_POINTER_DEVICE); + overlay_actor = create_overlay_actor (); + + for (i = 0; i < G_N_ELEMENTS (test_cases); i++) + { + g_autofree char *ref_test_name = NULL; + + g_debug ("Testing monitor resolution %dx%d with scale %f and " + "%s layout mode", + test_cases[i].width, test_cases[i].height, test_cases[i].scale, + layout_mode_to_string (test_cases[i].layout_mode)); + + wait_for_no_windows (); + + ref_test_name = g_strdup_printf ("%s/%d", g_test_get_path (), i); + + view = setup_test_case (test_cases[i].width, test_cases[i].height, + test_cases[i].scale, + test_cases[i].layout_mode, + virtual_pointer); + + test_client_cursor (view, + CURSOR_SCALE_METHOD_VIEWPORT_CROPPED, + META_CURSOR_MOVE_OR_RESIZE_WINDOW, + ref_test_name, 0, + meta_ref_test_determine_ref_test_flag ()); + } + + clutter_actor_destroy (overlay_actor); +} + static void init_tests (void) { g_test_add_func ("/backends/native/cursor/scaling", meta_test_native_cursor_scaling); + g_test_add_func ("/backends/native/cursor/cropping", + meta_test_native_cursor_cropping); } static void diff --git a/src/tests/ref-tests/backends_native_cursor_cropping_0_0.ref.png b/src/tests/ref-tests/backends_native_cursor_cropping_0_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..9a9d9373916db09dfacbacf863b4098cafda30ad GIT binary patch literal 8952 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 T?hK^V;t)q%iVo=rPAU2a#FasA literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_cropping_3_0.ref.png b/src/tests/ref-tests/backends_native_cursor_cropping_3_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..255134d839320438a33b70e9e126d78c77028574 GIT binary patch literal 9299 zcmeHNZA?>V6n@J$SVR~TtZu@Fx&(y|8Yoi6M_@o|z|Cb0C*N2gs|*LUlv1dSK@85g zkVr-;m{jBk+ZZ&^Wm4#dLj_yt>IUUQzETmWLT$m8k9O}{{_N*|F57$i-yLe8i#Cpd@Qh_-z{l-0{}iC zF*f?6vS#hf-NJKIB)(EZ9S$g}iQ(5>k?_aHd`Rznlb?UUo>F4C9p_?Ca~RVDLlmLf z^Mc2==k-U&=9#?;a{~3+2dU}Bsj8XZ+hcDv&*+y4;zZrIul69@@w$rICU5{s1|U^;C6v< zfLkR1cuW9*Met(2nYWidXS;jYL6Jro12^Y6jCh| z8BPTTT2xa6FgNN4)dX3~%*+hEG2o4|f)K%}^ijIuNR4Ov}BYY@70a z28G1iG8A0i&@J8{C>jBv=(aPII@YCXCTro|)rYx3#KAhZqy6F4Iaxd&ub;u?Zj*bR z0f-kO$s^MPWkgReoSGK<0v$|_ouWJR3EMBsoM|AsS^TqbgCpwMDY zQ~XVyk%h8YEXH;pN6+Y*>l`po4rIPK8@eBcb{&OQwYI7Xt6{*0PaN6va{eigQ(Rp9 zrtrQso38=|N$moGU{P1*T?^k$M@pw6yoZLuLh8501=c7|WG<+(wrB}@9HQOnD(AxzvaqDwZX@3KF4ZyIe5(~B0-_o{~P=~b^pl9H0L)Y*9RCX3B>yU;5Z2SP;?A(;F4+4GN=vb^u8mh)Tpc?CRL)kBwV8+4d=_qVM0Yz)j$95#Iasig2p zpGhBD$Ydhatm+{kha+r&Y%LaMpC8elBrM-p`2%JmPplS(vkRwx(gm}5DXrt<N0q@i3R`W*zTZj0q`tG+y!6`WBo(}H}C&R^Nu@nEMeS{ SVh2?h021SpVt9 literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_cropping_4_0.ref.png b/src/tests/ref-tests/backends_native_cursor_cropping_4_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..ea1b05060aff219a8574781bf427a8ffe547a8ac GIT binary patch literal 6640 zcmeHK?N5_e6h8$K=L8a+0**l3WZg2dlEG}_7~K$~gsm9CHIs={Vi{=>OQB`9q|9w4 z#!*a6tf2-Pi1>j7lrE)fOM$_FDAGv-T_TpkGpysSbS?IUw$E<258MB+``qL?xi{zB z{O&z(zkBTz>qOk{gS!DBuHa<;X@D3tK=gOJqR`53G|Kl#?7UETA|J@eP!Ha_36OlZ zApet+hCA!?4|wM;rVYD$vFu|!b|RHM!hCDR z{_7Z1-FfP4=8dt#6N`V!_ck#u}^{;e735EUEE&uC04@ zUrLrrrQ-2;R4TP590PXezKHJab9u>fjzl6sXBhW>fZhcY0&Sg0q*W(Vn(n4w1`uZT zB$bwyYC4okCH?b0B|^kA3NF6}c2d}Qm5?o+*@05ypRfEKU1tv^knU zFj$r!H5!eMLTO4r9Kj)yN{#*f@9!B6ZF~EQgr8cnKeM)afR#o{upR%>E*2HfZGh==lAQ#i0{u~;}sHW?Y3 zotG6X86hpLmRr=@+skE_aJ|KHj;`#W ze6g!FS1)u-FFlWeTMr+0#sb_LD`JK`bEP$nWXS6@ZEvi-*)?$KnLfA66>%r&dik`5 zDS639&hq&ho)kwzVV*tW`Q=B-2%y+B>E>hlg3)V}kkwD08N?mAjRE_}w*)~X(#nE{ ztSBgaw0}Q3&Jj9Y7TU6=$%3xY1g24^^Q~#jWrJ7hE6jmFz-F^iJEXOBb)KbPuD7(b z{2enYf#}cyu&33Ak`>1jq97xSU4p#Xl=DqA5|b!O@C4rhjsu(vxE|n|i2DL=hnNyz fTJ*oChQ=Yd=-zp};W literal 0 HcmV?d00001 diff --git a/src/tests/ref-tests/backends_native_cursor_cropping_5_0.ref.png b/src/tests/ref-tests/backends_native_cursor_cropping_5_0.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..bdc9034f21d07711f1cf73d7f9498ff8ca589925 GIT binary patch literal 7317 zcmeHMi&Ilq8b5%dTM)K7-Oz*tTejL=$_SMz8Zpx?7L_5irAjf4Nuf#+!$XAdN`kcv zWiy&G)X~bTLx)nzmVij;^2nociRelOSTI=v34~Xc07)PZ3?%!7KV$cv%$z&-%)RG) zkKgb2eRop%0X1&VOZb-%LVM1fj{OLso!=wm^VM!|SWzAFDu;`2YJ6NQa(jN?_cvD~ z6nyqf?7JTq)-F%>^6M^1%BE8?pB<|{Gw>!pw6XlYYKPyuvez%D3g4Fvja=wB*Qols zyzA>v4DS73s!qjL?!WNn?yA_TuTD2c=Dyube{1(juy|{EIB3P(^VjKwDJ{N!EJm|N z@+A-m`w&Wg#*Dak?_T>HLTx`!cU=T?kd*O8j^|qBy$j}V4q`W03@{vET)^}I(?qN; zVC4{N39z>4|FJc!=@yAZ4<1}=>I^(#k}@NLLMY}(`;zgrl#~=2t@pU!4&(|yAhdd; zvY+SX<^&X1A(!it-tY+v3&WjNd=YiOzFz#z5!Y1?XKQm~ZE0yq&!Z-I2IqyLS>kp% z-wTY1I(&Fd$@M|ZrQb)RvV>yymR-wrF5@m1ewLa#^SCNhahpi+_jK=kKHq6uu4!n{ zs#L!&hAs@%IbSRZmGv>?dQE4#vW`8qp%+lZ)^S>#fW&caEC`2_y^v)`0Af~O#Pb)4i2J1UJJ2NvgtE;Pj7+!pk1}}WJJ)-bi zU>~W+3vJTDc3pOa_)6O4%a>U!Rz#40g`A)D;j4sO?~~ap!2uON41ZBnR5T%C-6g`_ z?!6GgXT3RLPgvcP1qO9|gDmpsQTB5>n|}PqT!eU4QZICM>dBKQRiSa>P0Q1#^)V$j zW4S)5nM%(vR)larq0{@XWI|qF@pUo1(bXaNTB@z>GY=4OINTv}&g|o=yoI4#g6?cB z_i1?drv=7!!>B?K!l2W;!oARu1RX+03}=OB)ln0BJ+*Utl)csc6GSd5$X~>ou$kn6 zt6GWsfzPVgxzdrQ7*If3OKj@&LuA`nGJ~@|9G5;++u_;n8SP_m2;7^fPCU7x$y3s8 z9xDr9%P~&&+I6yG9xnHd=w>7u=Z+Vgh@BdJz5kuBK*R4H!gVW#Bhq?feB z64?8_iU7~LUYcv4WNUfut>>xzNP0dL5W%}?Fc_96x)T!;e%S_sAYRe5T1BLY(zX+J z=gu8?pw--yf^>}2ItWlk6rTR8{c}iaMn(qA91f?Tz&3I@l0*oo0Q}_T z*B(^%i~JRE>j3dYp=rJ*n{@OxExSJ-C?lUX{kD^Mx8MGGR#ui)%(*E8djCx*6i~=P z{`E!k-{BagW;`blF~hcL*#ih*6dRg==0GF0S{=X36&yVO^B8oJ1R)Ui^Fjt zlVXl@jPW*Vzw|rLxpmRGsn6T!;7{BHnr6$?n;NWO;;;O1cACeM{+IMd6!U1g9A^9tlz1jWN@l{Zce)|*+pgLk=YdQ9R zXA0@-4T2Mv$H4!S$Bq?QW(VaJfs{>?JefC!q~m||@HPs6OS~~(W3^fV^L?%tOTg0A zzO^A>18+?&W13WHf_`wb#J&>4-E=tYpKiV3gJ|Q6Bm7fd$VHFZc5TW94(C=<3LVw;rMJg3M4N+KE7LX?J1?J05Mx%_UPMj_KL=_kVx5j z`0(L%`JSUjU_!T+OD=Vo9950Umi5s@30MhBPQz%k#4*Dk8yjnCYFcXR&4Ng}br!F( z@Jpr!dk6q;*g^lZ2;zM1oxX8D57Qj2pcn}4PXv^qZRx{quz+|FaHZWR>viewporter, @@ -82,6 +84,7 @@ on_pointer_enter (WaylandSurface *surface, effective_theme_size = (int) (theme_size * ceilf (scale)); break; case CURSOR_SCALE_METHOD_VIEWPORT: + case CURSOR_SCALE_METHOD_VIEWPORT_CROPPED: effective_theme_size = (int) (theme_size * ceilf (scale)); break; } @@ -110,6 +113,12 @@ on_pointer_enter (WaylandSurface *surface, hotspot_x = (int) roundf (image->hotspot_x / image_scale); hotspot_y = (int) roundf (image->hotspot_y / image_scale); break; + case CURSOR_SCALE_METHOD_VIEWPORT_CROPPED: + hotspot_x = (int) roundf ((image->hotspot_x - + (image->width / 4)) / image_scale); + hotspot_y = (int) roundf ((image->hotspot_y - + (image->height / 4)) / image_scale); + break; } wl_pointer_set_cursor (pointer, serial, @@ -130,6 +139,16 @@ on_pointer_enter (WaylandSurface *surface, (int) roundf (image->width / image_scale), (int) roundf (image->height / image_scale)); break; + case CURSOR_SCALE_METHOD_VIEWPORT_CROPPED: + wp_viewport_set_source (cursor_viewport, + wl_fixed_from_int (image->width / 4), + wl_fixed_from_int (image->height / 4), + wl_fixed_from_int (image->width / 2), + wl_fixed_from_int (image->height / 2)); + wp_viewport_set_destination (cursor_viewport, + (int) roundf (image->width / 2 / image_scale), + (int) roundf (image->height / 2 / image_scale)); + break; } wl_surface_commit (cursor_surface); @@ -150,6 +169,8 @@ main (int argc, scale_method = CURSOR_SCALE_METHOD_BUFFER_SCALE; else if (g_strcmp0 (argv[1], "viewport") == 0) scale_method = CURSOR_SCALE_METHOD_VIEWPORT; + else if (g_strcmp0 (argv[1], "viewport-cropped") == 0) + scale_method = CURSOR_SCALE_METHOD_VIEWPORT_CROPPED; else g_error ("Missing scale method");