#!/usr/bin/perl -w use Gtk; use Gtk::Atoms; use Gimp qw(:auto); use strict 'vars'; # Gimp::set_trace(TRACE_ALL); ### # Globals ### my ($direction, $cancelFlag); my ($plugin) = "plug_in_AlphaFade"; # XPM's that I removed the $ and the @'s from (they get intrepreted in # strings, which makes for nasty problems). my @arr = ( ["24 24 66 1", " c None", ". c #A0A0A0", "+ c #A2A2A2", "X c #787878", "# c #7B7B7B", "Z c #A8A8A8", "% c #AAAAAA", "& c #848484", "* c #868686", "= c #B0B0B0", "- c #B2B2B2", "; c #8F8F8F", "> c #929292", ", c #B8B8B8", "' c #BABABA", ") c #9B9B9B", "! c #9E9E9E", "~ c #C0C0C0", "{ c #C2C2C2", "] c #A7A7A7", "^ c #C7C7C7", "/ c #C9C9C9", "( c #B3B3B3", "_ c #B5B5B5", ": c #A4A4A4", "< c #7E7E7E", "[ c #ACACAC", "} c #898989", "| c #B4B4B4", "1 c #959595", "2 c #BCBCBC", "3 c #A1A1A1", "4 c #C3C3C3", "5 c #ADADAD", "6 c #CCCCCC", "7 c #CFCFCF", "8 c #D2D2D2", "9 c #D3D3D3", "0 c #BEBEBE", "a c #C1C1C1", "b c #C4C4C4", "c c #D8D8D8", "d c #D9D9D9", "e c #DBDBDB", "f c #CACACA", "g c #CDCDCD", "h c #D0D0D0", "i c #DFDFDF", "j c #E1E1E1", "k c #E3E3E3", "l c #D6D6D6", "m c #DCDCDC", "n c #E7E7E7", "o c #E9E9E9", "p c #EBEBEB", "q c #E2E2E2", "r c #E4E4E4", "s c #EFEFEF", "t c #F1F1F1", "u c #F3F3F3", "v c #EDEDED", "w c #F0F0F0", "x c #F7F7F7", "y c #F9F9F9", "z c #FBFBFB", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W:#<%[*}-|>1'2!3{4%5/6_W", "W#Z%&*=-;>,')!~{]%^/(_7W", "W<%[*}-|>1'2!3{4%5/6_,8W", "W%&*=-;>,')!~{]%^/(_780W", "W[*}-|>1'2!3{4%5/6_,89aW", "W*=-;>,')!~{]%^/(_780acW", "W}-|>1'2!3{4%5/6_,89abdW", "W-;>,')!~{]%^/(_780acdfW", "W|>1'2!3{4%5/6_,89abdegW", "W>,')!~{]%^/(_780acdfgiW", "W1'2!3{4%5/6_,89abdeghjW", "W')!~{]%^/(_780acdfgijlW", "W2!3{4%5/6_,89abdeghjkdW", "W!~{]%^/(_780acdfgijldnW", "W3{4%5/6_,89abdeghjkdmoW", "W{]%^/(_780acdfgijldnoqW", "W4%5/6_,89abdeghjkdmoprW", "W%^/(_780acdfgijldnoqrsW", "W5/6_,89abdeghjkdmoprntW", "W/(_780acdfgijldnoqrstvW", "W6_,89abdeghjkdmoprntuwW", "W_780acdfgijldnoqrstvwxW", "WWWWWWWWWWWWWWWWWWWWWWWW" ], ["24 24 47 1", " c None", ". c #A0A0A0", "+ c #A4A4A4", "X c #7E7E7E", "# c #848484", "Z c #B0B0B0", "% c #B4B4B4", "& c #959595", "* c #9B9B9B", "= c #C0C0C0", "- c #C3C3C3", "; c #ADADAD", "> c #B3B3B3", ", c #CFCFCF", "' c #D3D3D3", ") c #C4C4C4", "! c #CACACA", "~ c #DFDFDF", "{ c #E3E3E3", "] c #DCDCDC", "^ c #E2E2E2", "/ c #EFEFEF", "( c #F3F3F3", "_ c #F9F9F9", ": c #727272", "< c #787878", "[ c #A8A8A8", "} c #ACACAC", "| c #898989", "1 c #8F8F8F", "2 c #B8B8B8", "3 c #BCBCBC", "4 c #A1A1A1", "5 c #A7A7A7", "6 c #C7C7C7", "7 c #CCCCCC", "8 c #BEBEBE", "9 c #D8D8D8", "0 c #DBDBDB", "a c #D0D0D0", "b c #D6D6D6", "c c #E7E7E7", "d c #EBEBEB", "e c #EDEDED", "f c #F7F7F7", "g c #FBFBFB", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W+X#Z%&*=-;>,')!~{]^/((W", "W<[}|12345672890abcdcefW", "W<[}|12345672890abcdcefW", "W+X#Z%&*=-;>,')!~{]^/((W", "W+X#Z%&*=-;>,')!~{]^/((W", "W<[}|12345672890abcdcefW", "W<[}|12345672890abcdcefW", "W+X#Z%&*=-;>,')!~{]^/((W", "W+X#Z%&*=-;>,')!~{]^/((W", "W<[}|12345672890abcdcefW", "W<[}|12345672890abcdcefW", "W+X#Z%&*=-;>,')!~{]^/((W", "W+X#Z%&*=-;>,')!~{]^/((W", "W<[}|12345672890abcdcefW", "W<[}|12345672890abcdcefW", "W+X#Z%&*=-;>,')!~{]^/((W", "W+X#Z%&*=-;>,')!~{]^/((W", "W<[}|12345672890abcdcefW", "W<[}|12345672890abcdcefW", "W+X#Z%&*=-;>,')!~{]^/((W", "W+X#Z%&*=-;>,')!~{]^/((W", "W<[}|12345672890abcdcefW", "WWWWWWWWWWWWWWWWWWWWWWWW" ], ["24 24 65 1", " c None", ". c #CFCFCF", "+ c #D2D2D2", "X c #BEBEBE", "# c #C1C1C1", "Z c #D8D8D8", "% c #D9D9D9", "& c #CACACA", "* c #CDCDCD", "= c #DFDFDF", "- c #E1E1E1", "; c #D6D6D6", "> c #E7E7E7", ", c #E9E9E9", "' c #E2E2E2", ") c #E4E4E4", "! c #EFEFEF", "~ c #F1F1F1", "{ c #EDEDED", "] c #F0F0F0", "^ c #F7F7F7", "/ c #F9F9F9", "( c #FCFCFC", "_ c #BCBCBC", ": c #D5D5D5", "< c #C7C7C7", "[ c #DDDDDD", "} c #D3D3D3", "| c #E5E5E5", "1 c #DEDEDE", "2 c #EBEBEB", "3 c #F5F5F5", "4 c #F6F6F6", "5 c #B3B3B3", "6 c #B5B5B5", "7 c #AFAFAF", "8 c #C9C9C9", "9 c #C6C6C6", "0 c #A7A7A7", "a c #AAAAAA", "b c #A4A4A4", "c c #C0C0C0", "d c #C2C2C2", "e c #BDBDBD", "f c #9B9B9B", "g c #9E9E9E", "h c #989898", "i c #B8B8B8", "j c #BABABA", "k c #B6B6B6", "l c #8F8F8F", "m c #929292", "n c #8D8D8D", "o c #B0B0B0", "p c #B2B2B2", "q c #AEAEAE", "r c #848484", "s c #868686", "t c #808080", "u c #A8A8A8", "v c #A6A6A6", "w c #787878", "x c #7B7B7B", "y c #757575", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W._X:Z<&[=};|>1'{!2{3^4W", "W6.+X#Z%&*=-;%>,')!~{]^W", "W5*._X:Z<&[=};|>1'{!2{3W", "W856.+X#Z%&*=-;%>,')!~{W", "W<75*._X:Z<&[=};|>1'{!2W", "Wa<856.+X#Z%&*=-;%>,')!W", "W09<75*._X:Z<&[=};|>1'{W", "Wd0a<856.+X#Z%&*=-;%>,'W", "Wcb09<75*._X:Z<&[=};|>1W", "Wgcd0a<856.+X#Z%&*=-;%>W", "Wfecb09<75*._X:Z<&[=};|W", "Wjfgcd0a<856.+X#Z%&*=-;W", "Wihfecb09<75*._X:Z<&[=}W", "Wmijfgcd0a<856.+X#Z%&*=W", "Wlkihfecb09<75*._X:Z<&[W", "Wplmijfgcd0a<856.+X#Z%&W", "Wonlkihfecb09<75*._X:Z c #8F8F8F", ", c #959595", "' c #B8B8B8", ") c #9B9B9B", "! c #BCBCBC", "~ c #C0C0C0", "{ c #A1A1A1", "] c #C3C3C3", "^ c #A7A7A7", "/ c #ADADAD", "( c #C7C7C7", "_ c #B3B3B3", ": c #CCCCCC", "< c #CFCFCF", "[ c #D3D3D3", "} c #BEBEBE", "| c #C4C4C4", "1 c #D8D8D8", "2 c #CACACA", "3 c #DBDBDB", "4 c #DFDFDF", "5 c #D0D0D0", "6 c #E3E3E3", "7 c #D6D6D6", "8 c #DCDCDC", "9 c #E7E7E7", "0 c #E2E2E2", "a c #EBEBEB", "b c #EFEFEF", "c c #F3F3F3", "d c #EDEDED", "e c #F7F7F7", "f c #F9F9F9", "g c #FBFBFB", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "WX##XX##XX##XX##XX##XX#W", "WZ%%ZZ%%ZZ%%ZZ%%ZZ%%ZZ%W", "W&**&&**&&**&&**&&**&&*W", "W=--==--==--==--==--==-W", "W;>>;;>>;;>>;;>>;;>>;;>W", "W,'',,'',,'',,'',,'',,'W", "W)!!))!!))!!))!!))!!))!W", "W~{{~~{{~~{{~~{{~~{{~~{W", "W]^^]]^^]]^^]]^^]]^^]]^W", "W/((//((//((//((//((//(W", "W_::__::__::__::__::__:W", "W<''<<''<<''<<''<<''<<'W", "W[}}[[}}[[}}[[}}[[}}[[}W", "W|11||11||11||11||11||1W", "W2332233223322332233223W", "W4554455445544554455445W", "W6776677667766776677667W", "W8998899889988998899889W", "W0aa00aa00aa00aa00aa00aW", "Wb99bb99bb99bb99bb99bb9W", "WcddccddccddccddccddccdW", "WceecceecceecceecceecceW", "WWWWWWWWWWWWWWWWWWWWWWWW" ], [ "24 24 79 1", " c None", ". c #A0A0A0", "+ c #727272", "X c #A2A2A2", "# c #A4A4A4", "Z c #7B7B7B", "% c #7D7D7D", "& c #A8A8A8", "* c #A7A7A7", "= c #797979", "- c #A3A3A3", "; c #A6A6A6", "> c #808080", ", c #848484", "' c #AEAEAE", ") c #AFAFAF", "! c #898989", "~ c #ACACAC", "{ c #A9A9A9", "] c #ADADAD", "^ c #8B8B8B", "/ c #8F8F8F", "( c #B6B6B6", "_ c #B7B7B7", ": c #959595", "< c #949494", "[ c #B4B4B4", "} c #868686", "| c #A5A5A5", "1 c #ABABAB", "2 c #909090", "3 c #B8B8B8", "4 c #BBBBBB", "5 c #9E9E9E", "6 c #C0C0C0", "7 c #BFBFBF", "8 c #9A9A9A", "9 c #828282", "0 c #B0B0B0", "a c #939393", "b c #C3C3C3", "c c #C7C7C7", "d c #8A8A8A", "e c #BCBCBC", "f c #C1C1C1", "g c #AAAAAA", "h c #CDCDCD", "i c #CFCFCF", "j c #CACACA", "k c #BABABA", "l c #D4D4D4", "m c #D6D6D6", "n c #C4C4C4", "o c #D1D1D1", "p c #D2D2D2", "q c #D8D8D8", "r c #CECECE", "s c #DFDFDF", "t c #DEDEDE", "u c #CCCCCC", "v c #B1B1B1", "w c #757575", "x c #DDDDDD", "y c #DADADA", "z c #E7E7E7", "A c #E6E6E6", "B c #E9E9E9", "C c #EDEDED", "D c #E4E4E4", "E c #E2E2E2", "F c #C5C5C5", "G c #F4F4F4", "H c #F3F3F3", "I c #EEEEEE", "J c #FFFFFF", "K c #F7F7F7", "L c #DCDCDC", "M c #7E7E7E", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W.++..++X#Z%&*Z=X.++..+W", "W+..++-;>,')!!'~>Z-.++.W", "W+..+={]^/(_:<([^}{#++.W", "W.++|1!2345.67583[!9|.+W", "W.+=10a87b{~cc{|74ad1#+W", "W+-{!aefg0hi3_hjg-e(!>-W", "W+;]28fc[klmnblo[~f42};W", "WX>^37g[pqjrstjnpug.3v>W", "W#,/4b0kqxlyzAlhqo0|4[,W", "WZ'(5{hljlBCzDBEj7hF5a'W", "W%)_.~imryCGHICArbic.<)W", "W&!:6c3nszzHJKzLsq3]63!W", "W*!<7c_btADIKGDytm_~7_!W", "WZ'(5{hljlBCzDBEj7hF5a'W", "W=~[8|jonhEALyExnkjb8/~W", "WX>^37g[pqjrstjnpug.3v>W", "W.Z}[4-~uo7bqm7kuc-8[]ZW", "W+-{!aefg0hi3_hjg-e(!>-W", "W+.#9d(4.|Fc]~Fb.8(09=.W", "W.++|1!2345.67583[!9|.+W", "W.++.#>}v[a<3_a/v]>=..+W", "W+..++-;>,')!!'~>Z-.++.W", "WWWWWWWWWWWWWWWWWWWWWWWW" ], ["24 24 46 1", " c None", ". c #FFFFFF", "+ c #FBFBFB", "X c #F9F9F9", "# c #F3F3F3", "Z c #F7F7F7", "% c #EDEDED", "& c #EFEFEF", "* c #E7E7E7", "= c #EBEBEB", "- c #E2E2E2", "; c #DCDCDC", "> c #D6D6D6", ", c #E3E3E3", "' c #DFDFDF", ") c #D0D0D0", "! c #DBDBDB", "~ c #CACACA", "{ c #C4C4C4", "] c #D8D8D8", "^ c #BEBEBE", "/ c #D3D3D3", "( c #CFCFCF", "_ c #B8B8B8", ": c #CCCCCC", "< c #B3B3B3", "[ c #ADADAD", "} c #C7C7C7", "| c #A7A7A7", "1 c #C3C3C3", "2 c #C0C0C0", "3 c #A1A1A1", "4 c #BCBCBC", "5 c #9B9B9B", "6 c #959595", "7 c #8F8F8F", "8 c #B4B4B4", "9 c #B0B0B0", "0 c #898989", "a c #ACACAC", "b c #848484", "c c #7E7E7E", "d c #A8A8A8", "e c #787878", "f c #A4A4A4", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W+XX++XX++XX++XX++XX++XW", "W#ZZ##ZZ##ZZ##ZZ##ZZ##ZW", "W%##%%##%%##%%##%%##%%#W", "W&**&&**&&**&&**&&**&&*W", "W=--==--==--==--==--==-W", "W;**;;**;;**;;**;;**;;*W", "W>,,>>,,>>,,>>,,>>,,>>,W", "W'))''))''))''))''))'')W", "W!~~!!~~!!~~!!~~!!~~!!~W", "W{]]{{]]{{]]{{]]{{]]{{]W", "W^//^^//^^//^^//^^//^^/W", "W(__((__((__((__((__((_W", "W:<<::<<::<<::<<::<<:: c #989898", ", c #B8B8B8", "' c #B6B6B6", ") c #8F8F8F", "! c #8D8D8D", "~ c #B0B0B0", "{ c #AEAEAE", "] c #848484", "^ c #808080", "/ c #A8A8A8", "( c #A6A6A6", "_ c #787878", ": c #757575", "< c #D2D2D2", "[ c #B5B5B5", "} c #C9C9C9", "| c #AAAAAA", "1 c #C2C2C2", "2 c #9E9E9E", "3 c #BABABA", "4 c #929292", "5 c #B2B2B2", "6 c #868686", "7 c #7B7B7B", "8 c #BEBEBE", "9 c #BCBCBC", "0 c #C1C1C1", "a c #D8D8D8", "b c #D5D5D5", "c c #D9D9D9", "d c #CACACA", "e c #DFDFDF", "f c #DDDDDD", "g c #E1E1E1", "h c #D6D6D6", "i c #D3D3D3", "j c #E7E7E7", "k c #E5E5E5", "l c #E9E9E9", "m c #E2E2E2", "n c #DEDEDE", "o c #E4E4E4", "p c #EFEFEF", "q c #EDEDED", "r c #F1F1F1", "s c #EBEBEB", "t c #F0F0F0", "u c #F7F7F7", "v c #F5F5F5", "w c #F9F9F9", "x c #F6F6F6", "y c #FCFCFC", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W.[X}Z|&1=2;3,4)5~6]|/7W", "W9.+X#Z%&*=-;>,')!~{]^/W", "W8<.[X}Z|&1=2;3,4)5~6]|W", "Wb89.+X#Z%&*=-;>,')!~{]W", "Wa08<.[X}Z|&1=2;3,4)5~6W", "WZab89.+X#Z%&*=-;>,')!~W", "Wdca08<.[X}Z|&1=2;3,4)5W", "WfdZab89.+X#Z%&*=-;>,')W", "We+dca08<.[X}Z|&1=2;3,4W", "WiefdZab89.+X#Z%&*=-;>,W", "Whge+dca08<.[X}Z|&1=2;3W", "WkhiefdZab89.+X#Z%&*=-;W", "Wjchge+dca08<.[X}Z|&1=2W", "WnjkhiefdZab89.+X#Z%&*=W", "Wmljchge+dca08<.[X}Z|&1W", "WqmnjkhiefdZab89.+X#Z%&W", "Wpomljchge+dca08<.[X}Z|W", "WspqmnjkhiefdZab89.+X#ZW", "Wqrpomljchge+dca08<.[X}W", "WvqspqmnjkhiefdZab89.+XW", "Wutqrpomljchge+dca08<.[W", "WxuvqspqmnjkhiefdZab89.W", "WWWWWWWWWWWWWWWWWWWWWWWW" ], [ "24 24 46 1", " c None", ". c #FFFFFF", "+ c #FBFBFB", "X c #F3F3F3", "# c #EDEDED", "Z c #EFEFEF", "% c #EBEBEB", "& c #DCDCDC", "* c #D6D6D6", "= c #DFDFDF", "- c #DBDBDB", "; c #C4C4C4", "> c #BEBEBE", ", c #CFCFCF", "' c #CCCCCC", ") c #ADADAD", "! c #A7A7A7", "~ c #C0C0C0", "{ c #BCBCBC", "] c #959595", "^ c #8F8F8F", "/ c #B0B0B0", "( c #ACACAC", "_ c #7E7E7E", ": c #787878", "< c #F9F9F9", "[ c #F7F7F7", "} c #E7E7E7", "| c #E2E2E2", "1 c #E3E3E3", "2 c #D0D0D0", "3 c #CACACA", "4 c #D8D8D8", "5 c #D3D3D3", "6 c #B8B8B8", "7 c #B3B3B3", "8 c #C7C7C7", "9 c #C3C3C3", "0 c #A1A1A1", "a c #9B9B9B", "b c #B4B4B4", "c c #898989", "d c #848484", "e c #A8A8A8", "f c #A4A4A4", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W+X#Z%&*=-;>,')!~{]^/(_W", "W<[X}|}1234567890a6bcdeW", "W<[X}|}1234567890a6bcdeW", "W+X#Z%&*=-;>,')!~{]^/(_W", "W+X#Z%&*=-;>,')!~{]^/(_W", "W<[X}|}1234567890a6bcdeW", "W<[X}|}1234567890a6bcdeW", "W+X#Z%&*=-;>,')!~{]^/(_W", "W+X#Z%&*=-;>,')!~{]^/(_W", "W<[X}|}1234567890a6bcdeW", "W<[X}|}1234567890a6bcdeW", "W+X#Z%&*=-;>,')!~{]^/(_W", "W+X#Z%&*=-;>,')!~{]^/(_W", "W<[X}|}1234567890a6bcdeW", "W<[X}|}1234567890a6bcdeW", "W+X#Z%&*=-;>,')!~{]^/(_W", "W+X#Z%&*=-;>,')!~{]^/(_W", "W<[X}|}1234567890a6bcdeW", "W<[X}|}1234567890a6bcdeW", "W+X#Z%&*=-;>,')!~{]^/(_W", "W+X#Z%&*=-;>,')!~{]^/(_W", "W<[X}|}1234567890a6bcdeW", "WWWWWWWWWWWWWWWWWWWWWWWW" ], [ "24 24 62 1", " c None", ". c #FFFFFF", "+ c #FDFDFD", "X c #F9F9F9", "# c #F6F6F6", "Z c #F7F7F7", "% c #F5F5F5", "& c #EDEDED", "* c #EBEBEB", "= c #EFEFEF", "- c #E2E2E2", "; c #DEDEDE", "> c #E7E7E7", ", c #E5E5E5", "' c #D6D6D6", ") c #D3D3D3", "! c #DFDFDF", "~ c #DDDDDD", "{ c #CACACA", "] c #C7C7C7", "^ c #D8D8D8", "/ c #D5D5D5", "( c #BEBEBE", "_ c #BCBCBC", ": c #FBFBFB", "< c #F3F3F3", "[ c #DCDCDC", "} c #E3E3E3", "| c #D0D0D0", "1 c #DBDBDB", "2 c #C4C4C4", "3 c #B8B8B8", "4 c #CFCFCF", "5 c #CDCDCD", "6 c #CCCCCC", "7 c #B3B3B3", "8 c #AFAFAF", "9 c #ADADAD", "0 c #C6C6C6", "a c #C3C3C3", "b c #A7A7A7", "c c #A4A4A4", "d c #A1A1A1", "e c #C0C0C0", "f c #BDBDBD", "g c #9B9B9B", "h c #989898", "i c #959595", "j c #B6B6B6", "k c #B4B4B4", "l c #8F8F8F", "m c #8D8D8D", "n c #898989", "o c #B0B0B0", "p c #AEAEAE", "q c #ACACAC", "r c #848484", "s c #808080", "t c #7E7E7E", "u c #A8A8A8", "v c #A6A6A6", "W c #000000", "WWWWWWWWWWWWWWWWWWWWWWWW", "W:#<%<*>&*;[,})|~1]2/)_W", "W#Z%&*=&-;>,')!~{]^/(_4W", "W<%<*>&*;[,})|~1]2/)_35W", "W%&*=&-;>,')!~{]^/(_457W", "W<*>&*;[,})|~1]2/)_3568W", "W*=&-;>,')!~{]^/(_4578]W", "W>&*;[,})|~1]2/)_356890W", "W&-;>,')!~{]^/(_4578]0bW", "W*;[,})|~1]2/)_356890acW", "W;>,')!~{]^/(_4578]0bceW", "W[,})|~1]2/)_356890acdfW", "W,')!~{]^/(_4578]0bcefgW", "W})|~1]2/)_356890acdf_hW", "W)!~{]^/(_4578]0bcefgh3W", "W|~1]2/)_356890acdf_hijW", "W~{]^/(_4578]0bcefgh3jlW", "W1]2/)_356890acdf_hijkmW", "W]^/(_4578]0bcefgh3jlmoW", "W2/)_356890acdf_hijkmnpW", "W/(_4578]0bcefgh3jlmoprW", "W)_356890acdf_hijkmnpqsW", "W_4578]0bcefgh3jlmoprsuW", "WWWWWWWWWWWWWWWWWWWWWWWW" ]); ### # Subroutines ### sub do_fade { my ($image, $drawable) = @_; my (@bounds, $mask, $prevBack, $prevFore); if (!$drawable->is_layer) { die "$plugin: Cannot operate on anything other than layers\n"; } $image->undo_push_group_start; @bounds = $image->selection_bounds; if (!$drawable->has_alpha) { $drawable->add_alpha; } if ($drawable->mask) { $mask = $drawable->mask; } else { $mask = $drawable->create_mask(ALPHA_MASK); $image->add_layer_mask($drawable, $mask); } $prevBack = Palette->get_background; $prevFore = Palette->get_foreground; Palette->set_background([0,0,0]); Palette->set_foreground([255,255,255]); # Direction Map # 0 3 6 # 1 4 7 # 2 5 8 # Bounds Map # (1,2) (3,2) # (1,4) (3,4) if ($direction==0) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, $bounds[3], $bounds[4], $bounds[1], $bounds[2]); } elsif ($direction==1) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, $bounds[3], ($bounds[2]+$bounds[4])/2, $bounds[1], ($bounds[2]+$bounds[4])/2); } elsif ($direction==2) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, $bounds[3], $bounds[2], $bounds[1], $bounds[4]); } elsif ($direction==3) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, ($bounds[3]+$bounds[1])/2, $bounds[4], ($bounds[3]+$bounds[1])/2, $bounds[2]); } elsif ($direction==4) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, RADIAL, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, ($bounds[1]+$bounds[3])/2, ($bounds[2]+$bounds[4])/2, ($bounds[3]+$bounds[1])/2, $bounds[4]); } elsif ($direction==5) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, ($bounds[3]+$bounds[1])/2, $bounds[2], ($bounds[3]+$bounds[1])/2, $bounds[4]); } elsif ($direction==6) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, $bounds[1], $bounds[4], $bounds[3], $bounds[2]); } elsif ($direction==7) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, $bounds[1], ($bounds[2]+$bounds[4])/2, $bounds[3], ($bounds[2]+$bounds[4])/2); } elsif ($direction==8) { $mask->blend(FG_BG_RGB, DARKEN_ONLY_MODE, LINEAR, 100.0, 0.0, REPEAT_NONE, 0, 1, 0.1, $bounds[1], $bounds[2], $bounds[3], $bounds[4]); } if ($direction >=0 && $direction <9) { $image->remove_layer_mask($drawable, APPLY); } Palette->set_background($prevBack); Palette->set_foreground($prevFore); $image->undo_push_group_end; } sub btn_pressed { my ($widget, $btnIndex) = @_; $direction = $btnIndex; } sub add_pixmap { my ($window, $but, $num) = @_; my @tar = @{$arr[$num]}; my ($pixmap, $mask) = Gtk::Gdk::Pixmap->colormap_create_from_xpm_d(undef, $but->get_colormap, $but->style->bg('normal'), @{$arr[$num]}); my ($pixmapId) = new Gtk::Pixmap $pixmap, $mask; $pixmapId->show; $but->add($pixmapId); } sub okCbk { $cancelFlag = 0; Gtk->main_quit; } sub create_window { my ($window, $frm, $box1, $hbox, $hsep, $btnTable, $i, $j, $btn); $window = new Gtk::Window('toplevel'); $window->set_name("Alpha Fader"); $window->set_wmclass("Gimp", "AlphaFader"); $window->signal_connect("destroy" => \&Gtk::main_quit); $window->signal_connect("delete_event" => \&Gtk::false); $box1 = new Gtk::VBox(0, 0); $box1->set_spacing(2); $window->add($box1); $frm = new Gtk::Frame "Fade Type"; $frm->set_border_width(6); $frm->show; $box1->pack_start($frm, 1, 1, 0); $btnTable = new Gtk::Table(3,3,1); $btnTable->set_border_width(6); $frm->add($btnTable); $btn = new Gtk::RadioButton; for ($i=0;$i<3;$i++) { for ($j=0;$j<3;$j++) { $btn = Gtk::RadioButton->new_from_widget($btn); $btn->set_mode(0); $btn->signal_connect("clicked", \&btn_pressed, $i*3+$j); $btn->show; $btnTable->attach_defaults($btn, $i, $i+1, $j, $j+1); add_pixmap($window, $btn, $i*3+$j); if (Gimp->get_data($plugin) ne "") { # if run before, get last data if (Gimp->get_data($plugin) == $i*3+$j) { $btn->clicked; } } else { # first run of plug-in, set first button if ($i==0 && $j==0) { $btn->clicked; } } } } $hsep = new Gtk::HSeparator; $box1->pack_start($hsep, 0, 0, 0); $hsep->show; $hbox = new Gtk::HButtonBox; $hbox->set_border_width(2); $hbox->set_spacing(4); $box1->pack_start($hbox, 0, 0, 0); $hbox->show; $btn = new Gtk::Button "OK"; $btn->can_default(1); $btn->signal_connect("clicked" => \&okCbk); $btn->show; $hbox->pack_start($btn, 0, 0, 0); $btn->grab_default; $btn = new Gtk::Button "Cancel"; $btn->can_default(1); $btn->signal_connect("clicked" => \&Gtk::main_quit); $btn->show; $hbox->pack_start($btn, 0, 0, 0); $btnTable->show; $box1->show; $window->show; } Gimp::on_run { my ($interactive, $img, $drw); ($interactive, $img, $drw, $direction) = @_; $cancelFlag = 1; if ($interactive==1) { $cancelFlag = 0; } elsif ($interactive==2) { $direction = Gimp->get_data($plugin); $cancelFlag = 0; } else { init Gtk; create_window; main Gtk; } # Do the gimply stuff on it if (!$cancelFlag) { do_fade($img, $drw); Gimp->displays_flush; Gimp->set_data($plugin, $direction); } }; Gimp::on_query { gimp_install_procedure( $plugin, "Fade the alpha channel of a layer from one side to another", "This was written as a slightly useful exercise to test mostly to learn Gtk's excellent perl interface. It was inspired by a mailing list question that asked how to do exactly what this does, which is fade the alpha from one side to another.", "Seth Burgess", "Seth Burgess", "2000", "/Image/Alpha/Fade", "*", PLUGIN, [ [PDB_INT32, "run_mode", "Interactive, [non-interactive"], [PDB_IMAGE, "image", "Input image (unused)"], [PDB_DRAWABLE, "drawable", "Input drawable"], [PDB_INT32, "direction", "Direction to fade(0-8)"] ], []) }; exit main;