Hello there

I have converted a script-fu script to perl-fu, but are having some
problems. While I get nearly the same pictures, the original have
transparency around the button while my perlified version doesn't.

I thought it could have something to do with the save routine

In the original script I press save and save it.
In the modified version I do #./uni -o test.gif

... and on a related note, I can't seem
to get Gimp->file_png_save($img,-1,....) to work
or           file_gif_save(....)

for that matter.

Please help
Yours Thomas
; The GIMP -- an image manipulation program
; Copyright (C) 1995 Spencer Kimball and Peter Mattis
; 
; Round Button --- create a round beveled Web button.
; Copyright (C) 1998 Federico Mena Quintero & Arturo Espinosa Aldama
; [EMAIL PROTECTED] [EMAIL PROTECTED]
; ************************************************************************
; Changed on Feb 4, 1999 by Piet van Oostrum <[EMAIL PROTECTED]>
; For use with GIMP 1.1.
; All calls to gimp-text-* have been converted to use the *-fontname form.
; The corresponding parameters have been replaced by an SF-FONT parameter.
; ************************************************************************
; 
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
; 
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
; GNU General Public License for more details.
; 
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

(define (text-width extents)
  (car extents))

(define (text-height extents)
  (cadr extents))

(define (text-ascent extents)
  (caddr extents))

(define (text-descent extents)
  (cadr (cddr extents)))

(define (round-select img x y width height ratio)
  (let* ((diameter (* ratio height)))
    (gimp-ellipse-select img x y diameter height ADD FALSE 0 0)
    (gimp-ellipse-select img (+ x (- width diameter)) y
                         diameter height ADD FALSE 0 0)
    (gimp-rect-select img (+ x (/ diameter 2)) y
                      (- width diameter) height ADD FALSE 0)))
  
(define (script-fu-round-button text
                            size
                            font
                            ul-color
                            lr-color
                            text-color
                            ul-color-high
                            lr-color-high
                            hlight-color
                            xpadding
                            ypadding
                            bevel
                            ratio
                            notpressed
                            notpressed-active
                            pressed)

  (cond ((eqv? notpressed TRUE)
         (do-pupibutton text size font ul-color lr-color
                        text-color xpadding ypadding bevel ratio 0)))
  (cond ((eqv? notpressed-active TRUE)
         (do-pupibutton text size font ul-color-high lr-color-high
                        hlight-color xpadding ypadding bevel ratio 0)))
  (cond ((eqv? pressed TRUE)
         (do-pupibutton text size font ul-color-high lr-color-high
                        hlight-color xpadding ypadding bevel ratio 1))))
  
(define (do-pupibutton text
                            size
                            font
                            ul-color
                            lr-color
                            text-color
                            xpadding
                            ypadding
                            bevel
                            ratio
                            pressed)

  (let* ((old-fg-color (car (gimp-palette-get-foreground)))
         (old-bg-color (car (gimp-palette-get-background)))
         
         (text-extents (gimp-text-get-extents-fontname text
                                              size
                                              PIXELS
                                              font))
         (ascent (text-ascent text-extents))
         (descent (text-descent text-extents))
         
         (height (+ (* 2 (+ ypadding bevel))
                        (+ ascent descent)))

         (radius (/ (* ratio height) 4))

         (width (+ (* 2 (+ radius xpadding)) bevel
                       (- (text-width text-extents)
                          (text-width (gimp-text-get-extents-fontname " "
                                                             size
                                                             PIXELS
                                                             font)))))
                                                             
         (img (car (gimp-image-new width height RGB)))

         (bumpmap (car (gimp-layer-new img width height
                                       RGBA_IMAGE "Bumpmap" 100 NORMAL)))
         (gradient (car (gimp-layer-new img width height
                                        RGBA_IMAGE "Button" 100 NORMAL))))
    (gimp-image-undo-disable img)

    ; Create bumpmap layer
    
    (gimp-image-add-layer img bumpmap -1)
    (gimp-selection-none img)
    (gimp-palette-set-background '(0 0 0))
    (gimp-edit-fill bumpmap BG-IMAGE-FILL)

    (round-select img (/ bevel 2) (/ bevel 2)
                  (- width bevel) (- height bevel) ratio)
    (gimp-palette-set-background '(255 255 255))
    (gimp-edit-fill bumpmap BG-IMAGE-FILL)

    (gimp-selection-none img)
    (plug-in-gauss-rle 1 img bumpmap bevel 1 1)

    ; Create gradient layer

    (gimp-image-add-layer img gradient -1)
    (gimp-edit-clear gradient)
    (round-select img 0 0 width height ratio)
    (gimp-palette-set-foreground ul-color)
    (gimp-palette-set-background lr-color)

    (gimp-blend gradient
                FG-BG-RGB
                NORMAL
                LINEAR
                100
                0
                REPEAT-NONE
                FALSE
                0
                0
                0
                0
                0
                (- height 1))

    (gimp-selection-none img)

    (plug-in-bump-map 1 img gradient bumpmap
                      135 45 bevel 0 0 0 0 TRUE pressed 0)

;     Create text layer

    (cond ((eqv? pressed 1) (set! bevel (+ bevel 1))))

    (gimp-palette-set-foreground text-color)
    (let ((textl (car (gimp-text-fontname
                       img -1 0 0 text 0 TRUE size PIXELS
                       font))))
      (gimp-layer-set-offsets textl
                              (+ xpadding radius bevel)
                              (+ ypadding descent bevel)))

;   Delete some fucked-up pixels.

    (gimp-selection-none img)
    (round-select img 1 1 (- width 1) (- height 1) ratio)
    (gimp-selection-invert img)
    (gimp-edit-clear gradient)

;     Done

    (gimp-image-remove-layer img bumpmap)
    (gimp-image-merge-visible-layers img EXPAND-AS-NECESSARY)

    (gimp-selection-none img)
    (gimp-palette-set-foreground old-fg-color)
    (gimp-palette-set-background old-bg-color)
    (gimp-image-undo-enable img)
    (gimp-display-new img)))

; Register!

(script-fu-register "script-fu-round-button"
                    _"<Toolbox>/Xtns/Script-Fu/Buttons/Round Button..."
                    "Round button"
                    "Arturo Espinosa (stolen from quartic's beveled button)"
                    "Arturo Espinosa & Federico Mena Quintero"
                    "June 1998"
                    ""
                    SF-STRING     _"Text" "The GIMP"
                    SF-ADJUSTMENT _"Font Size (pixels)" '(16 2 100 1 1 0 1)
                    SF-FONT       _"Font" "-*-helvetica-*-r-*-*-24-*-*-*-p-*-*-*"
                    SF-COLOR      _"Upper Color" '(192 192 0)
                    SF-COLOR      _"Lower Color" '(128 108 0)
                    SF-COLOR      _"Text Color" '(0 0 0)
                    SF-COLOR      _"Upper Color (Active)" '(255 255 0)
                    SF-COLOR      _"Lower Color (Active)" '(128 108 0)
                    SF-COLOR      _"Text Color (Active)" '(0 0 192)
                    SF-ADJUSTMENT _"Padding X" '(4 0 100 1 10 0 1)
                    SF-ADJUSTMENT _"Padding Y" '(4 0 100 1 10 0 1)
                    SF-ADJUSTMENT _"Bevel Width" '(2 0 100 1 10 0 1)
                    SF-ADJUSTMENT _"Round Ratio" '(1 0.05 20 0.05 1 2 1)
                    SF-TOGGLE     _"Not Pressed" TRUE
                    SF-TOGGLE     _"Not Pressed (Active)" TRUE
                    SF-TOGGLE     _"Pressed" TRUE)


#!/usr/bin/perl -w

use Gimp;
use Gimp::Fu;

sub text_ascent {
    return $_[2];
}

sub text_descent {
    return $_[3];
}

sub text_width {
    return $_[0];
}

sub text_height {
    return $_[1];
}

sub round_select {
    my ($img,
        $x,
        $y,
        $width,
        $height,
        $ratio)=@_;
    my $diameter =$ratio*$height;                              
    Gimp->gimp_ellipse_select($img,$x,$y,$diameter,$height,ADD,0,0,0);
    
Gimp->gimp_ellipse_select($img,($x+($width-$diameter)),$y,$diameter,$height,ADD,0,0,0);

    
Gimp->gimp_rect_select($img,($x+($diameter/2)),$y,($width-$diameter),$height,ADD,0,0)
}
        
sub do_pupibutton {
    my ($text,
        $size,
        $font,
        $ul_color,
        $lr_color,
        $text_color,
        $xpadding,
        $ypadding,
        $bevel,
        $ratio,
        $pressed) = @_;

    my $old_fg_color=Palette->get_foreground();
    my $old_bg_color=Palette->get_background();

    my @text_extents=Gimp->gimp_text_get_extents_fontname($text,$size,0,$font);
    my $ascent=&text_ascent(@text_extents);
    my $descent=&text_descent(@text_extents);

    
    my $height=($ascent+$descent)+2*($ypadding+$bevel);
    my $radius=($ratio*$height)/4;

    my @width_item1=Gimp->gimp_text_get_extents_fontname(" ",$size,0,$font);
    my $width_item2=&text_width (@width_item1);
    my $width_item3=&text_width (@text_extents);
    
    my $width = 2*($radius + $xpadding) + $bevel + ($width_item3 - $width_item2);

    my $img = new Image($width, $height, RGB);


    my $bumpmap = new Layer ($img, $width, $height, RGBA_IMAGE, "Bumpmap", 100, 
NORMAL_MODE);

    my $gradient = new Layer ($img, $width, $height, RGBA_IMAGE, "Button", 100, 
NORMAL_MODE);

   $img->undo_push_group_start;

    # Create bumpmap layer

    Gimp->gimp_image_add_layer($img, $bumpmap, -1);
    Gimp->gimp_selection_none($img);
    Gimp->gimp_palette_set_background([0,0,0]);
    Gimp->gimp_edit_fill($bumpmap,BG_IMAGE_FILL);

    &round_select($img, ($bevel/2), ($bevel/2), ($width-$bevel), 
($height-$bevel),$ratio);
    Gimp->gimp_palette_set_background([255,255,255]);
    Gimp->gimp_edit_fill($bumpmap,BG_IMAGE_FILL);
    Gimp->gimp_selection_none($img);
    Gimp->plug_in_gauss_rle($img,$bumpmap,$bevel,1,1);


    # Create gradient layer

    Gimp->gimp_image_add_layer($img,$gradient,-1);
    Gimp->gimp_edit_clear($gradient);
    &round_select($img, 0, 0, $width, $height, $ratio);
    Gimp->gimp_palette_set_foreground($ul_color);
    Gimp->gimp_palette_set_background($lr_color);

    Gimp->gimp_blend(
                     $gradient,
                     FG_BG_RGB,
                     NORMAL_MODE,
                     LINEAR,
                     100,
                     0,
                     REPEAT_NONE,
                     0, #FALSE
                     0,
                     0,
                     0,
                     0,
                     0,
                     ($height-1),
                     );

    Gimp->gimp_selection_none($img);

    Gimp->plug_in_bump_map($img,$gradient,$bumpmap,135, 45, $bevel, 0, 0, 0, 0, 1, 
$pressed, 0);


#Create text layer

    if($pressed) {
        $bevel++;
    }

    Gimp->gimp_palette_set_foreground($text_color);

    my $textl=Gimp->gimp_text_fontname($img,-1,0,0,$text,0,1,$size,PIXELS,$font);
    
Gimp->gimp_layer_set_offsets($textl,($xpadding+$radius+$bevel),($ypadding+$descent+$bevel));


#   Delete some fucked-up pixels.

    Gimp->gimp_selection_none($img);
    &round_select($img,1,1,($width-1),($height-1),$ratio);
    Gimp->gimp_selection_invert($img);
#    Gimp->gimp_edit_fill($gradient,0);
    Gimp->gimp_layer_add_alpha($gradient);
    Gimp->gimp_edit_clear($gradient);
#    Gimp->gimp_edit_clear($bumpmap);

    #Done

    Gimp->gimp_image_remove_layer($img,$bumpmap);
    Gimp->gimp_image_merge_visible_layers($img,EXPAND_AS_NECESSARY);

    Gimp->gimp_selection_none($img);
    Gimp->gimp_palette_set_foreground($old_fg_color);
    Gimp->gimp_palette_set_background($old_bg_color);
    

    # close the undo push group
    $img->undo_push_group_end;
#    $img->gimp_file_save(-1,,"/home/zensonic/test.gif","/home/zensonic/test.gif");
#    
Gimp->file_png_save($img,-1,"/home/zensonic/test.png","/home/zensonic/test.png",0,6,1,1,1,1,1);

    return $img;


}

sub button {
    my ($text,
        $size,
        $font,
        $ul_color,
        $lr_color,
        $text_color,
        $ul_color_high,
        $lr_color_high,
        $hlight_color,
        $xpadding,
        $ypadding,
        $bevel,
        $ratio,
        $notpressed,
        $notpressed_active,
        $pressed) = @_;


    my $img1;
    my $img2;
    my $img3;
    if($notpressed) {
        $img1=&do_pupibutton($text, $size, $font, $ul_color, $lr_color,
                             $text_color, $xpadding, $ypadding, $bevel, $ratio, 0);
    }
    if($notpressed_active) {
        $img2=&do_pupibutton($text, $size, $font, $ul_color_high, $lr_color_high,
                             $hlight_color, $xpadding, $ypadding, $bevel, $ratio, 0);
    }
    if($pressed) {
        $img3=&do_pupibutton($text, $size, $font, $ul_color_high, $lr_color_high,
                             $hlight_color, $xpadding, $ypadding, $bevel, $ratio, 1);
    }

    return($img1,$img2,$img3);
}


#; Register!
#
#(script-fu-register "script-fu-round-button"
#                   "Arturo Espinosa (stolen from quartic's beveled button)"
#                   "Arturo Espinosa & Federico Mena Quintero"
#                   "June 1998"
#                   ""
#
#
register "uni",
    "Create a uniform image",  # a small description
    "A tutorial script",       # a help text
    "Dov Grobgeld",            # Your name
    "Dov Grobgeld (c)",        # Your copyright
    "1999-05-14",              # Date
    "<Toolbox>/Xtns/Perl-Fu/Tutorial/Img Uni",   # menu path
    "*",                       # Image types
    [
#    [PF_INT,       "size", "Img size", 100],
#    [PF_COLOR,     "color", "Img color", [255,127,0]],
     [PF_STRING     ,"text"        ,"Text"                 ,"The GIMP"],
     [PF_SPINNER    ,"fontsize"    ,"Font Size (pixels)"   ,16,[2,100]],
     [PF_FONT       ,"font"        ,"Font"                 
,"-*-helvetica-*-r-*-*-24-*-*-*-p-*-*-*"],
     [PF_COLOR      ,"uc"          ,"Upper Color"          ,[192, 192, 0]],
     [PF_COLOR      ,"lc"          ,"Lower Color"          ,[128, 108, 0]],
     [PF_COLOR      ,"tc"          ,"Text Color"           ,[0, 0, 0]],
     [PF_COLOR      ,"uac"         ,"Upper Color (Active)" ,[255, 255, 0]],
     [PF_COLOR      ,"lac"         ,"Lower Color (Active)" ,[128, 108, 0]],
     [PF_COLOR      ,"tac"         ,"Text Color (Active)"  ,[0, 0, 192]],
     [PF_SPINNER    ,"padx"        ,"Padding X"            ,4,[0, 100]],
     [PF_SPINNER    ,"pady"        ,"Padding Y"            ,4,[0, 100]],
     [PF_SPINNER    ,"bevel"       ,"Bevel Width"          ,2,[0, 100]],
     [PF_SPINNER    ,"round"       ,"Round Ratio"          ,1,[0.05, 20]],
     [PF_TOGGLE     ,"notpressed"  ,"Not Pressed"          ,TRUE],
     [PF_TOGGLE     ,"notpresseda" ,"Not Pressed (Active)" ,TRUE],
     [PF_TOGGLE     ,"pressed"     ,"Pressed"              ,TRUE]
    ],
    \&button;

exit main();

Reply via email to