On 24/09/2010 17:05, Joao S. O. Bueno wrote:
> On Fri, Sep 24, 2010 at 11:19 AM, Ofnuts<ofn...@laposte.net>  wrote:
>>   Hi,
>> My code needs to do a one-pixel-wide selection, at distance "x" from the
>> current selection.  This looks a lot like a border selection except that
>> the border selection creates at best a two-pixel wide ribbon and I only
>> want one (but if I'm wrong, please tell me how to :-)
>> So far my code goes like this:
>> # Selects pixels that are between x and x+1 pixels from
>> # the original selection. Bumping the selection by one
>> # each time doesn't work, a small circle degenerates into
>> # a square with rounded corners instead of a big circle.
>>      def select_ribbon(self,image,selection,dist):
>>          pdb.gimp_selection_load(selection)
>>          pdb.gimp_selection_grow(image,dist+1)
>>          outer=pdb.gimp_selection_save(image)
>>          pdb.gimp_selection_load(selection)
>>          pdb.gimp_selection_grow(image,dist)
>>          inner=pdb.gimp_selection_save(image)
>>          pdb.gimp_channel_combine_masks(outer,inner,CHANNEL_OP_SUBTRACT,0,0)
>>          pdb.gimp_selection_load(outer)
>>          image.remove_channel(outer)
>>          image.remove_channel(inner)
>> That works, but can be slow (especially since it's at the core of a
>> loop). Is there any better way? Or useless code to jettison?
>> Next improvement is to create a 3-pixels selection and feather it one
>> pixel. Anything to be wary of?
> Hmm..this _will_ be slow. :-)
> You can speed it up by making a copy of your drawable to another
> image, disable the undo system on this new image  and perform your
> cations above, before copying the results back to the original image -
> but it is about it.
> Maybe you can perform the whole loop in the copy with undo disabled -
> but I don't know your intent.

The whole plugin paints successive concentric uniform 1-pixel ribbons 
around the original selection (pixel values a obtained from another 
layer). On my laptop (T2400, 1.83GHz) it takes roughly 10 seconds to 
draw 20 concentric ribbons around a 500-pixels circular selection.

The whole thing runs within a undo_group_start()/image.undo_group_end() 
so I don't expect any more undos?

Gimp-developer mailing list

Reply via email to