GNOME Bugzilla – Bug 754766
"actor: Clean up transform_stage_point()" broke HiDPI mutter
Last modified: 2015-09-11 02:38:56 UTC
Regression testing shows that the commit "actor: Clean up transform_stage_point()" broke HiDPI in mutter. The problem being that clutter_actor_transform_stage_point() always returns the coordinates (0, 0) no matter the input when the actor scale is 0.5 (for example when a wl_surface with scale 2 is on a scale 1 output). Reverting the mentioned patch fixes the issue.
Created attachment 311043 [details] [review] actor: Fix transforming stage point when scale is less than 1 The commit 6cd24faaa54de3246ca45d1c7426d8b7a74f71db (actor: Clean up transform_stage_point()) changed the validation of the transformation matrix to ignore the fraction part of the determinant. This caused clutter_actor_transform_stage_point() to fail and return FALSE for actors which scale was less than 1. Previously the validation was ('det' being a float): det = (RQ[0][0] * ST[0][0]) + (RQ[0][1] * ST[0][1]) + (RQ[0][2] * ST[0][2]); if (!det) return FALSE; Semantically, the if statement expression '!det' is equivalent to 'det == 0', i.e. 'det == 0.0f'. Post cleanup patches, 'det' was turned into a double, and the if statement was changed to: if (CLUTTER_NEARBYINT (det) == 0) return FALSE; which, different from before, rounds the determinant to the nearest integer value, meaning anything determinant in the range (-0.5, 0.5) would be considered invalid. This patch reverts this part to the old behavior, while, because of the inexact nature of floating point arithmetics, allowing a bit more liberal meaning of "equals to 0" than '== 0.0'.
Review of attachment 311043 [details] [review]: Sounds good, thanks for hunting this down.
Pushed with a fixed commit message typo (s/anything determinant/determinant/). Attachment 311043 [details] pushed as 5d83260 - actor: Fix transforming stage point when scale is less than 1