Re: [Gimp-user] Script-Fu Exceptions and errors

2009-11-25 Thread Thomas DuBuisson
> I don't like how you nest the various let*-statements. That makes the
> code hard to track.
>
> It would be better if you have some dummy variable declarations in your
> outer let*-statement and then use set! to redefine the values.
>
> Also note that the use of "25" for the mode is not nice, you really
> should use the symbolic constants.

These issues are because my code is randomly generated using a
Script-fu syntax tree I wrote.  I'll add indentation to the
AST/Script-fu compiler and that should make things easier to read.
Not sure how to handle the side-effects of flattening, I'll think on
it more.

> You should be concerned moderately, since your code apparently is doing
> some bogus stuff and does not properly keep track of the layers in the
> image. However, the critical warning should not happen, we really should
> catch these errors in the PDB wrappers already.

It's a little more concerning to me that I found 1 infinite loop that
nearly crashed my system (took a while to register, but I finally
killed gimp-console) and several memory bugs where a gimp plugin
requests gigabytes of memory (and then fails).  Also, values aren't
garbage collected after fails scripts thus my constant testing lead to
a gimp-console taking nearly all of my 4GB of RAM; this forced me to
stop using GIMP for the project.  After I finish with this project I'd
be happy to re-generate some of the buggy scripts and post to the
developers list if you'd like - somewhat like BNF fuzzing script-fu
:-)

Thanks Simon,
Thomas
___
Gimp-user mailing list
Gimp-user@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user


Re: [Gimp-user] Script-Fu Exceptions and errors

2009-11-25 Thread Simon Budig
Thomas DuBuisson (thomas.dubuis...@gmail.com) wrote:
> - CODE --

(let* ((image (car (gimp-file-load RUN-NONINTERACTIVE
 "image.png" "image.png")))
   (layer0 (car (gimp-image-get-active-layer image)))
  )
  (let* ((layer1 (car (gimp-image-flatten image
  (gimp-layer-set-mode layer1 25)
  )
  (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
...
> - END CODE --


As you already found out, flattening the image makes its layers invalid,
this is because it generates a new one, which it returns as result.

As you can see in my re-indented version of your code, you use let* to
bind the newly created layer to the "layer1" variable, yet you forget
it too early, since you need to use it for the
gimp-layer-new-from-drawable.

I don't like how you nest the various let*-statements. That makes the
code hard to track.

It would be better if you have some dummy variable declarations in your
outer let*-statement and then use set! to redefine the values. Something
like this:

(let* ((image (car (gimp-file-load RUN-NONINTERACTIVE
 "image.png" "image.png")))
   (layer0 (car (gimp-image-get-active-layer image)))
   (layer1 0)
  )
  (set! layer0 (car (gimp-image-flatten image)))
  (gimp-layer-set-mode layer0 25)
  (set! layer1 (car (gimp-layer-new-from-drawable layer0 image)))
...

Also note that the use of "25" for the mode is not nice, you really
should use the symbolic constants.

> 3) C Assertation failures
> Perhaps most concerning are the assertation failures.  Presumably,
> these are not supposed to happen.  How concerned should I be?
> 
[...]
> (gimp-console:2987): Gimp-Core-CRITICAL **: gimp_image_remove_layer:
> assertion `gimp_container_have (image->layers, GIMP_OBJECT (layer))'
> failed

You should be concerned moderately, since your code apparently is doing
some bogus stuff and does not properly keep track of the layers in the
image. However, the critical warning should not happen, we really should
catch these errors in the PDB wrappers already.

Hope this helps,
Simon
-- 
  si...@budig.de  http://simon.budig.de/
___
Gimp-user mailing list
Gimp-user@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user


Re: [Gimp-user] Script-Fu Exceptions and errors

2009-11-24 Thread Thomas DuBuisson
Update 2:
1) Exceptions
The macro (not sure of the underlying primitives) "catch" will catch
errors.  The web page didn't even call them exceptions, which explains
why I/google didn't find it quickly.

Ex: when converting an image that might already be RGB to RGB:
(catch (gimp-image-convert-rgb image))

2) The layer issue
As stated before, an earlier command was obliterating my layer and I
forgot to take the head of the get-active-{layer,drawable} in my later
operations.

3) Assertation failures and segfaults

The assertation failures are probably somehow connected with my layer
merging - not that it is good to be able to hit this so easily.  I
also found a segfault, do to out of range arguments, since my previous
post and see that this doesn't crash the program - so its running in a
different thread or processs I guess.  Not sure if I can catch this
with "catch", if I can't then I'll have to fix these corner cases.
Perhaps I'll make some patches for the function documentation if
people are interested.

Thomas

On Tue, Nov 24, 2009 at 11:34 AM, Thomas DuBuisson
 wrote:
> Update:
>
> 1) The question regarding exceptions remains - there are too many
> corner cases, mostly undocumented, so it would be nice to ignore them
> silently.
>
> 2) I see my fix was almost right but I forgot to take the head of the list:
> "(car (gimp-image-get-active-drawable image))" is what I want, not the
> no-longer-existing layer0 or the whole list returned by
> gimp-image-get-active-{layer,drawable}.
>
> 3) I still get things like the message below, so same question.
> (gimp-console:2987): Gimp-Core-CRITICAL **: gimp_image_remove_layer:
> assertion `gimp_container_have (image->layers, GIMP_OBJECT (layer))'
> failed
>
>
>
> On Tue, Nov 24, 2009 at 10:05 AM, Thomas DuBuisson
>  wrote:
>> Hello list,
>>
>> I am planning on evolving image transformations using an AST of the
>> script-fu langauge and generating random (but syntatically correct)
>> scripts.  I would like to avoid programming in hundreds of corner
>> cases into the system and thus have the following questions:
>>
>> 1) Script-fu throws exceptions
>>
>> If/when I do something basic like call "gimp-image-raise-layer" on a
>> layer that can not be raised, an exception is thrown.  I would very
>> much like to catch/ignore exceptions such as this but it seems
>> script-fu is too primitive.  Am I missing something?
>>
>> 2) gimp-layer-new-from-drawable nearly always fails
>>
>> - CODE --
>> (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE "image.png" 
>> "image.png")))
>>        (layer0 (car (gimp-image-get-active-layer image
>>        (let* ((layer1 (car (gimp-image-flatten image
>>        (gimp-layer-set-mode layer1 25)
>> )       (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
>> ...
>> - END CODE --
>>
>> In the above you see I define layer0 as the active layer (which I
>> thought was a drawable) but this doesn't work for
>> gimp-layer-new-from-drawable.  Replacing layer0 with 'image' also
>> doesn't work and most frustratingly, using "
>> (gimp-image-get-active-drawable image)" also doesn't work - which I
>> really thought it should based on the documentation.  What does this
>> function expect?
>>
>> (I understand gimp-image-flatten somehow screws everything up by
>> eliminating the layer, but am still not clear how to once-again get a
>> valid layer from my image)
>>
>>
>> 3) C Assertation failures
>> Perhaps most concerning are the assertation failures.  Presumably,
>> these are not supposed to happen.  How concerned should I be?
>>
>>  START CONSOLE DUMP -
>>> (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE "image.png" 
>>> "image.png")))
>>        (layer0 (car (gimp-image-get-active-layer image
>>        (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
>>        (gimp-layer-add-alpha layer1)
>>        (gimp-image-merge-down image layer1 2))
>>        (set! layer0 (gimp-image-get-active-layer image))
>>        (let* ((layer1 (car (gimp-image-flatten image
>>        (gimp-layer-set-opacity layer1 21.811554)
>>        (gimp-image-merge-down image layer1 0))
>>        (set! layer0 (gimp-image-get-active-layer image))
>>        (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
>>        (gimp-layer-flatten layer1)
>>        (gimp-image-merge-down image layer1 0))
>>        (set! layer0 (gimp-image-get-active-layer image))
>> (let* ((currDraw (car (gimp-image-get-active-layer image
>> (gimp-file-save RUN-NONINTERACTIVE image currDraw "newImage.png"
>> "newImage.png" ))
>> )
>>
>> (gimp-console:2987): Gimp-Core-CRITICAL **: gimp_image_remove_layer:
>> assertion `gimp_container_have (image->layers, GIMP_OBJECT (layer))'
>> failed
>>
>>  END CONSOLE DUMP -
>>
>>
>> Cheers,
>> Thomas
>>
>
___
Gi

Re: [Gimp-user] Script-Fu Exceptions and errors

2009-11-24 Thread Thomas DuBuisson
Update:

1) The question regarding exceptions remains - there are too many
corner cases, mostly undocumented, so it would be nice to ignore them
silently.

2) I see my fix was almost right but I forgot to take the head of the list:
"(car (gimp-image-get-active-drawable image))" is what I want, not the
no-longer-existing layer0 or the whole list returned by
gimp-image-get-active-{layer,drawable}.

3) I still get things like the message below, so same question.
(gimp-console:2987): Gimp-Core-CRITICAL **: gimp_image_remove_layer:
assertion `gimp_container_have (image->layers, GIMP_OBJECT (layer))'
failed



On Tue, Nov 24, 2009 at 10:05 AM, Thomas DuBuisson
 wrote:
> Hello list,
>
> I am planning on evolving image transformations using an AST of the
> script-fu langauge and generating random (but syntatically correct)
> scripts.  I would like to avoid programming in hundreds of corner
> cases into the system and thus have the following questions:
>
> 1) Script-fu throws exceptions
>
> If/when I do something basic like call "gimp-image-raise-layer" on a
> layer that can not be raised, an exception is thrown.  I would very
> much like to catch/ignore exceptions such as this but it seems
> script-fu is too primitive.  Am I missing something?
>
> 2) gimp-layer-new-from-drawable nearly always fails
>
> - CODE --
> (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE "image.png" 
> "image.png")))
>        (layer0 (car (gimp-image-get-active-layer image
>        (let* ((layer1 (car (gimp-image-flatten image
>        (gimp-layer-set-mode layer1 25)
> )       (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
> ...
> - END CODE --
>
> In the above you see I define layer0 as the active layer (which I
> thought was a drawable) but this doesn't work for
> gimp-layer-new-from-drawable.  Replacing layer0 with 'image' also
> doesn't work and most frustratingly, using "
> (gimp-image-get-active-drawable image)" also doesn't work - which I
> really thought it should based on the documentation.  What does this
> function expect?
>
> (I understand gimp-image-flatten somehow screws everything up by
> eliminating the layer, but am still not clear how to once-again get a
> valid layer from my image)
>
>
> 3) C Assertation failures
> Perhaps most concerning are the assertation failures.  Presumably,
> these are not supposed to happen.  How concerned should I be?
>
>  START CONSOLE DUMP -
>> (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE "image.png" 
>> "image.png")))
>        (layer0 (car (gimp-image-get-active-layer image
>        (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
>        (gimp-layer-add-alpha layer1)
>        (gimp-image-merge-down image layer1 2))
>        (set! layer0 (gimp-image-get-active-layer image))
>        (let* ((layer1 (car (gimp-image-flatten image
>        (gimp-layer-set-opacity layer1 21.811554)
>        (gimp-image-merge-down image layer1 0))
>        (set! layer0 (gimp-image-get-active-layer image))
>        (let* ((layer1 (car (gimp-layer-new-from-drawable layer0 image
>        (gimp-layer-flatten layer1)
>        (gimp-image-merge-down image layer1 0))
>        (set! layer0 (gimp-image-get-active-layer image))
> (let* ((currDraw (car (gimp-image-get-active-layer image
> (gimp-file-save RUN-NONINTERACTIVE image currDraw "newImage.png"
> "newImage.png" ))
> )
>
> (gimp-console:2987): Gimp-Core-CRITICAL **: gimp_image_remove_layer:
> assertion `gimp_container_have (image->layers, GIMP_OBJECT (layer))'
> failed
>
>  END CONSOLE DUMP -
>
>
> Cheers,
> Thomas
>
___
Gimp-user mailing list
Gimp-user@lists.XCF.Berkeley.EDU
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user