gg wrote:
> Omari Stephens wrote:
>> Hi, all
>>
>> I'm working on a patch which shifts the rotation grid so that a grid 
>> intersection always falls on the center of rotation.  The simple 
>> use-case for this functionality is when doing a corrective rotation in 
>> a photo with a clear horizontal or vertical object.  Maintaining an 
>> intersection on the center of rotation means that you'd _always_ be 
>> able to stick the center of rotation on one end of the straight 
>> object, align a gridline along the object, and be done.   Currently, 
>> this is not always easily doable without futzing with the number of 
>> gridlines.
>>
>> My current rough-draft patch (against r28237) is up at:
>> http://ocaml.xvm.mit.edu/~xsdg/stuff/gimp/shift_rotate_grid.v2.patch.txt
>>
>> At the moment I have a few questions:
>>
>> 1) Let C be the coords for center of rotation, and TC be the coords 
>> for the transformed center of rotation.  At times, it seems like TC is 
>> up-to-date and C lags (such as when dragging the center of rotation 
>> with the mouse).  But other times, C is up-to-date and TC lags (for 
>> instance, when adjusting one of C's coords with the spinbox in the 
>> dialog).  This makes it incredibly difficult to make the offset always 
>> correct.
>>
>> I think this happens because gimp_transform_tool_grid_recalc() and 
>> gimp_transform_tool_transform_bounding_box() need to be called in 
>> differnet orders depending on where the canonical center of rotation 
>> coords are stored (C or TC).
>>
>> When you update the spinbox, the gimp_transform_tool_motion() callback 
>> calls gimp_rotate_tool_motion() (which sets C from the values in the 
>> spinbox), and then gimp_transform_tool_recalc(), calls 
>> ..._grid_recalc() and then ..._transform_bounding_box().  So, in this 
>> case, TC will be stale at the point when ..._grid_recalc() is called 
>> (since TC is updated from C in ..._transform_bounding_box()).
>>
>> When you move the center of rotation by dragging it with the mouse, 
>> however, it seems that sometimes ..._transform_bounding_box() is 
>> called without an accompanying ..._grid_recalc() call, which means 
>> that C is stale but TC is up-to-date.  In particular, when this 
>> happens, C is temporarily set to the center of the image, which I find 
>> incredibly confusing.  I'm not sure how or why this happens.  Any 
>> suggestions for how should I fix this behavior so that it's correct in 
>> either case?
>>
>> 2) I want to only enable shifting when we're doing rotation (as 
>> opposed to shearing or scaling, for instance).  This is as easy as 
>> clamping x_off and y_off to zero in 
>> gimp_transform_tool_grid_recalc().  From that function, how do I 
>> determine if the transformation is a rotation?
>>
>> 3) The bounding box is drawn in a different function.  I would like to 
>> avoid splitting the shift logic across functions (or duplicating it in 
>> both).  Any suggestions on how to keep the bounding-box aligned with 
>> the grid (including the shift offset), but still allow the bounding 
>> box to work when the grid isn't being calculated?
>>
>> 4) Any other questions, suggestions, or feedback?
>>
>> Thanks,
>> --xsdg
> 
> Hi,
> 
> I looked at this centre shift issue a year or so ago. You may be able to 
> find it the archive.
> 
> I found accumulated errors were leading to the image tracking around a 
> central point.
> 
> IIRC some improvement was made by someone else at that time but since 
> these base transformations will "soon" be migrated to gegl it was deemed 
> not worth improving the existing code base in this area.
> 
> I suggest you dig out that thread before investing too much effort.
Do you know more specifically when it happened or what the thread might have 
been called?  I have (local) archives back to Feb, 2008 and didn't see anything 
pertinent-looking that you had sent.

--xsdg
_______________________________________________
Gimp-developer mailing list
Gimp-developer@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer

Reply via email to