From 7ae85401575adf5afa59fba61c24473f1d34169a Mon Sep 17 00:00:00 2001 From: Pere Pujal i Carabantes Date: Sat, 11 Jul 2009 06:29:00 +0000 Subject: [PATCH] Three new magic tools: mosaic shaped square, hexagon and irregular --- magic/icons/mosaic_shaped_hex.png | Bin 0 -> 1946 bytes magic/icons/mosaic_shaped_hex_pattern.png | Bin 0 -> 1688 bytes magic/icons/mosaic_shaped_irregular.png | Bin 0 -> 2577 bytes .../icons/mosaic_shaped_irregular_pattern.png | Bin 0 -> 6204 bytes magic/icons/mosaic_shaped_square.png | Bin 0 -> 2029 bytes magic/icons/mosaic_shaped_square_pattern.png | Bin 0 -> 300 bytes magic/sounds/mosaic_shaped_hex.ogg | Bin 0 -> 9031 bytes magic/sounds/mosaic_shaped_irregular.ogg | Bin 0 -> 13604 bytes magic/sounds/mosaic_shaped_square.ogg | Bin 0 -> 4220 bytes magic/src/mosaic_shaped.c | 579 ++++++++++++++++++ 10 files changed, 579 insertions(+) create mode 100644 magic/icons/mosaic_shaped_hex.png create mode 100644 magic/icons/mosaic_shaped_hex_pattern.png create mode 100644 magic/icons/mosaic_shaped_irregular.png create mode 100644 magic/icons/mosaic_shaped_irregular_pattern.png create mode 100644 magic/icons/mosaic_shaped_square.png create mode 100644 magic/icons/mosaic_shaped_square_pattern.png create mode 100644 magic/sounds/mosaic_shaped_hex.ogg create mode 100644 magic/sounds/mosaic_shaped_irregular.ogg create mode 100644 magic/sounds/mosaic_shaped_square.ogg create mode 100644 magic/src/mosaic_shaped.c diff --git a/magic/icons/mosaic_shaped_hex.png b/magic/icons/mosaic_shaped_hex.png new file mode 100644 index 0000000000000000000000000000000000000000..617d4e46dff29deb9089cadb7bc12327a44d0d6e GIT binary patch literal 1946 zcmV;L2W9w)P)Px+R7pfZR9M5!m|INK*%rpXUIA^TDYQ-@3IPleR3Hin0?}v<9V^2ONhfrNwvnwy)0mzNh9jQ<_CTCMo<3ha8m4d*VP98Q7p11A(t!g9Xxp)nmzPJ! zj~}Pb&Q6zyTUuJk+uNIJYHG;U3xtP6ONLgfrQqOTDk&);0AT)82hClgWN}1!u8XBOV?e3Gd#$LuhCyak*SO#>~tNI2;Zb z4927zMmvYY$zZWqjt*8;Rn>?@BBZCMLm&`<#bRN7eH|Y^euP%5#nY!x(bv~UnVFeR z19)+9F=1q61fij!$jQlpSS$vc&4$%##plnTVKf>sIy#E*@bDS{wayqzOH231$Hx&9 z6N7vA?)_;{DwX8#?@!Im%``ML6uISje<>>~Baui%N~O|i{8%iOCWS&lyLRm&rBX>2 zi=}Dn>r_`)lRzM#^73*T92`8el`%9l^iy?pHHpPy$0U+SBvf2nOlGtB7iSLWbUF$P z3!~`hXu5m%u7i_mwVM3={3ts+oBI0toPI=icQ+*^B~f5tAZfK)hdu4>?Gzp!P6Y)8 zHX9oNva+)1{rmTbiHSj4T3Vuu;El@6%$#g&Y{cu=uc6Us$iu?}M1-$jzv9W0Ctxrb zIC0_xT!lbRP7b4?p@C{^Yw`T~bEws7^7Qny)xj4pUSM%?5jvfYVdvob`Z^9CJO~dD z50_ailgWNnsZ`+e`RMNM29L+HsesjL#r*s{;^N}mG5~2a%DHF2NRyrO9kIgUx26xVRW1k;qO-#>dCe-`|guCr`R$ z3=IwaG(0?v+1Xi?mX^Zb-yd8q7XYxjx{9f(Dd==M=ZP2{9ZhG>oS~kc9;fkBUtdom zk%%r|zDy>Q>5H@YiH(h=BS(&qUaxn`&}cLi6cj{RSy@iwRIk@lN=gbvMn;me8&U{` zLaM5&a>&5$?rxGwrIeJEpt-r3_yq|(w-va5sV&Yi0*C@84W>-D&J@nUIvdwVI1#lqU!8m6YEFgiL4xm*r`KoI3l zNu*LKy1Kd`5D3uL)ME9(mp5Ci`)(LDUS3}JH+bKz3UmwQC#t;@3=2l52CMIy`&>?*I@ZnEGV`C#pBob1oR1Q_%WHNoZ zdi5%a#bTgwu9EEYQ^ zk-xt`6&4mc&Cty(4Gj&YxVSj#=;&~8vbD99_U_$F>FMb%m87eyi;f*TMj;^~P7_6^ z(@{i31Z8Ju+bc<4ULH+PPa{4)9_i`nd>2acb4EtS{g##%ym|8mTCLWmBr7W`c<|r> zm`o;4pFZtUNpf>@8A_#+>gwt+F);y+Mnhg+UbZ^;^5sj+&(EW$r^jANR##VX`0!zD z%8s*j_UzgJsMTr&1O&ifFo4J7*=CZBjSbAt&m%rQ-Yw(*ABw1`C|E2O3=a?67@Lxr zmX-#UN@aiO%9Se=5D-AOZ{H?2N}^CG6eJW1own;rrIPr3J~cHpxoy{P-n>aX9*eVY;xNreN zp%6?a6W_jl!_3SK8X6iN=9I)AJo02RoEg>;65uKf#{|Fo%9ZjD;eS)W_r)?%#Sy@3qKmZ;+ gdbI673;xyX4|K|o#&F$NzW@LL07*qoM6N<$f{y2(J^%m! literal 0 HcmV?d00001 diff --git a/magic/icons/mosaic_shaped_hex_pattern.png b/magic/icons/mosaic_shaped_hex_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..ed6959533e162fdeaae9967362b63c81b0838394 GIT binary patch literal 1688 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 literal 0 HcmV?d00001 diff --git a/magic/icons/mosaic_shaped_irregular_pattern.png b/magic/icons/mosaic_shaped_irregular_pattern.png new file mode 100644 index 0000000000000000000000000000000000000000..32e6b6a8b2d197534d19bfc4a674590808b29253 GIT binary patch literal 6204 zcmXAu2RM}t8^@24m6ddiBxHr`tdPBuBw5+SA$uizCgWt~wG+bYwc}jef>ihmEd*Y9JvNU#vOM3l#zrH}@pMb>m17uNoLkh84#)ngpS2y2B zL`E=1B_w<+%dOU>i2OF_^8Wr9is|CbYgeDz3{>8#Ui;_UFz0*Qv0pz7ejRXFaP}m5 zH%-6ZIT_4;p46AP9x%Nh!Y(aSv;Sgx|3y&$#y*QV)}$=2<>SYXZfB=~#|uKiE$FL~ z%)x4|u0m>RY6H{L@q2qdqfQbitcgZ}o-M{$;MT3#l8VOG2SI->d-Oi5Xn1*L{ zBJ-%t^6obkB+coMIy`(aQU9Fg?4awe+s0Hwo##~Gz8T9MA4)knIa)H}pT1a=j@4DZ z-%|~-PikCdpEn&%HkK116z5~%2E^ft2LbZLgamHsUGt$`^8^Uf#sDUrqRSGQRLp1+ z#LV^~ZM4d2InGwJd%=Sj89U>**x5<4xVX4E(?az5WN$pH|28vPmzTa&vE5n(E>v1k zfgzzm$YfLN6~FPm)-Felu*$$&vtUq$?LDA6WVStgTDQB|Y zGoi)<4lkK&aNniCXd+aG8XIkMzIwdyojb7>$8!w6EJw@v@!d^PFJHoItOlKJw$X@4 zNWAowrB2a`{O2EJ`@Fl8i;Hzo5GxI2n4}dkHO3}Ii=Sm~W zmZhBF*8%eJZc>yL_}K9pSN!D9pSWa3X6Dv`0a_=CtLbvwn>+jaZ5#VHXvt;_oBj@$ zQJ3w^T#0~ z!>`%8ve~7k%}GKzS2rY&SC{?*TpDgrYf23<$krjvA0!KJK_ugd%M32oPwMR5w28ws zp8kC{f_WRbXB@EMKdr2;PFiZfk3=GkisNdd@M|4#1DC1K#?N2t^Kp&aHGM20`nDqe zUhgKvJf?#KjxP(Ms0@etE9ST7?+IyMdWwUSQyE!HtjXZ` z_(h0#QBDx^u;Ueo93=voCFM>y>&6%u7zkys7||FfqPW%?c@gF68r3!%(qSEHUJ<31 zAF5Xzq01Ygz!qXE7-dp6<-J+au*VFKFgQ6$RWeKgiO48qr;ASLwcA=PshI1PoGz_@ z`E0ZQ?wM>|T^$=OnZiT;Nmns3G2g{>`+=b$qSy{S(pP*b6vR<9*VQ2DQY>or_B?g< z^_6vXKj_~e*alC(ri-~rv3wYFf}Y_t-1e2#=ewf8N!Pd5)zu{;BNG!EO5o+~or}e$ zWbxCISqd`_OijH;iN{1olaH9YPRKuy-6Ce8Ce7V1x?f>nW^DBhTq=<}f*9A=N5!G;Ty*46-EVppCS%zVAX9J*IAVptBua+igNjltonS{25)ykU zHu0=-F_7ur-rl9(GTAMrE5vxVZRYb&?&r4xah8%PHN9Av43xA3hXR>DBTGQWE{=WHQeF~f{ z9UNK(Ny%5qqS}m%jaw!rSmcj4m32^4V`I@HBL=)FTB2+*d0;@s)QAwsu0CI+b)`|w zf{$77ty{O=IWVVdzw~_fKyH`*yW{P-Eh+hvouNR2_}yJ^FlkUE_MHCY$J}($x@88J zVmoGb{Y38Gjjx&Vi}gO)+!U@hxn(QL6xzX&NT!raD}Fybj~C=E>uzvk-wSQ&x4m}z z8zJyEZc=e&Ww#8lKC9nvLYXL*8Q9p{lfs7{J$fX-@qV!J_|H8kO^7duHbe#VGf7lA zm-gI`D}qmAxBmvnKln&`c}JX?3hoDgL=i~{XMQ48j!RHrKRs&eu2hu}!4)9^Mx!i< zzeh*sf&xtnD3P6=Ek|l`5tVkubK%Ps01+rluv^fVul@a=91SKCtKW+sjgF3n45B!_ zW0Z0gYE9JykT!~QS0!C6ZEcAm$lS@%ZiM%*LDoNDv7ow-4ax#nzHxc^__WTtCHyhs zPImW*f=qO*yN8w}^E^n(IEfW%936^oIy>1|I}M&~y#V+FYS&62Zo*5iB!EV?TMAJ4K7#a!>o#P!$G4RDr)3-_;h=YFKWn2$!ZLA%gy?8WRAO zp4;-BeBn}a6}02!qzjMO9f(xZbbN2`eI1flJ&x)B2FOoW+c}h4d~$MdAVfL9W2~gt9;CrCcY{=Nkng1qTqJ~yfz&XIk zAz^ugyrAbJc)V4m(I!aTuMD}MgSP9|&~T*GEFnM;@;O}qBw!VAfYf97wOy)#h6w3Z z+0(U88D5=0<437*unnX@-RPd`Z`7fjx4vdYF$951xB?GfSxfuy`YFb@ItDW;E zC*6QJRjsLx1`ae>gEOqLQT}UhuY2Edu5y&Hs3>7(ubSft^eXfP&<-@n?5vfOvvbSZ zt^`#Uc5lo+XBN{hPlV9c)>hd3!e5baUC5%5GA0imuZ>T&Kj-cP%OVhXU0xNLY!G5w zX-f}}Br+~-Z-X)euomz^P|rc~PcaM#kYYEP>~l>vDYK0=D0xgDs|sSL#}Be7#X=3O zI#KHxHI!@Wv%T2+m+j#6Xd}O-hGE4k!*k`imshi`Xd+8y&jM|Hm+?ycrZXV{#1zyS zn)YK&O=V?eXh8v&Y`{Un!cUVSlsM=$D3f;r0I(t;8XWn93G{%viCP69j(r{>y>>Q( zJNMlYsh@?Rg72&A9;!$U%L@hT2?j-2XsG(u^%d`X0p zQu&1>1zUc8{_^kNFU>2|u_izsrT!Kz2M4~7!m38Xp=cbj88g4Z;B7^tQQ}`@noI?6 zFr)KK1uwVPK#}l|wa%>`1i-((UlHt$14=J+0OT`}xyH!Y+}%wEumKGYdf(aE3A_M3 z!6xPNi}94}3QKx{rTsyUi304e>P;xM0Hj`ImoB)<;cEnL{Xn-snW#LHnLOc_Lt$q*WmGh&Ppr zh9)0_xh#HPnU@|29Vfiy8}Q&a8#CJ4-#;^w-0{jvrywF!VRJnP%6n*q^WN*O`Psj_ zYo%Vfy1dQvTM0Tv?DQ0sA3t^)bFSk%ySmP)0@CRv(`%v$Gm3cygGVh3NFm4*v8oy$ ze`*itkV>Cx^_}OxE#2H`fx%JE&RhpMDHlM3S*X>s-%tEo)386~pO%%?J~D!Y{)G~g z79&Z$Nl$^i-AP+)hha+8h(M8J$6mECpLcJIWeBv81}CBFLrzxJ{D(05*gSn&P#mz~ zCS@tkERCa6Ec>rj3NUQ$a4CmJ*1}oy#n0|b;C$`Ym4#{b28KVke94FjOJfF{Brdm9 z83|Oe2#bj+caLK1`_B6>Rbu~=@#h=( zU1s!4sR0o3G>(}sK&5FKI4Bk0o#nyCfBv?&6KhJ7gcHD|u(q~lWMN^S-St&o8SNm> zoF(V)GyRw&L~iTeJko$KrF|vNkqh;m5WEYdu60%z%CKteSEJSl&s$$Yn7bk%e`PQc z63ger4>Q;bGm=&Cz+U%T9$jAMg`$U%w#O0kVt?{^E{tZ08Ze+WdMij|at(Sp zJ5%xV^8+!|`-Fb4k_Qb33SM4cj~sU7>XBigzLBki(c`+2FM_^Dud2wA_#w~h!2=q= zLe1OVZ>F&8QfMErl5={tu4IHF-u(p_u9QO_sYGUAXn2V_YIge&JifB3>KpwPiTr-1 z@*Ib|R;Vg{zK-ZVFnfS6D|@Dt!iVgu8yj8FrZO@z8ZvPm)^7EaY1!Ew;iNQ1<3sB{ zHc(YibKJ?~;`i|#m6?*RN@WJh9EkxXR8uh2%jeKMd-lwqIsk=wwY-fzQ3wwY2atm{ zh3Np81bT1QEo~trmO-f1QdmJS^|EymZVkPOx5MN@r@#gP)D1ub)LkW%I#Nl16!eo0 za9hN_>`&jFjhTW}b0x6X8Gwhix1sjd)`V*Li61_qhbPpp2NGjV?(3!N6?1y~-Jn5< zroY3lNh@mR6QzAF!>_?apjr6E4iiC9fgLJ(pbT{TA3T(jVCwwQ^qD-nqGM#Hr7&5G zOL&vl3fr$95DoGa&GYvq(C6A8ztq*?#Q5ofH zR#WlWcb-#+!F-i5Fc)W1k3Y2yOV%lRMqyQppbtN0b|?ooQOa#5)XvPzgsqE$Og2e; zmog_^%i8)E+cswajGzbbLJ2V1i|P zJIrC~Z^qRw`1$xC4+9zYs1GhTsMxCEW$SWZW;! zG>@^!iwv-+u@X(!XfCHJhXECah)AW-WS&n!Co+O&brB$lEsz&0ab{S~XjqOqKM}sd z%5V+nnIx($)Vh+aezGsGrKqrQuY*VY$Km!8PCzW%N!yhpTmiZ)S_qbCkxB&6#LFuy zv!=$^12zdjP1z5&;)5v>zT3T$?wd1;z&9*XZXsfqg)vQ4RjsQxvcOJ&yJkFU0dS%1 zTIRR*xWdG*dOdr_uh|293H1w51Ij@WnRnCpKYhMjICOb^CJk}|{@{W`2ViR$lWGyf z1a1a$OdS=D>3u);tA5g@x~ArG*kb`CDByg${o66avjJQ(&)|AF@cij$@6^1}~x#D`# zq0hKC_#=^wLh@ovLxUMlwXpZAF{kpQyhv+@lL5dPdU=Xv~GtZpY`}4q`a1CCtM`Yw=6IiyB>yI zKb|2KnD{CcdPxBW&h)_YAa+=aB;)jpKEr7Irspa0v$HriUhJ{C%?kk->U93SCcaHY z*d_-6lBX)M$Gp33-zOq@x2cV#~SvJzztmeorA@k4O(noQ;Ow>`ve$$@)a_Sm7F?nPy zxZ&8*Pq$fXHXXD>u`6#LU9BEpuXhYbj~q0(}GTt%OH4;AlVwW=b4~8l7 zzG^d~)j;^a87z6!ZbJM6u}vb=-0&08OF&?Rq3`+#milvel(cQstQ^86GSRP?O`Z5K zS&S|@7vsQH=_xMg*wrRFSku1MDGCQ28g`6?GpOD7@AS{O(;w{n`}^aNw!hPR?bwrX jMrb<9f9JyX&xn|1)@Bfkg{Sb}0SHZ19hGt=%dr0e>(9ZY literal 0 HcmV?d00001 diff --git a/magic/icons/mosaic_shaped_square.png b/magic/icons/mosaic_shaped_square.png new file mode 100644 index 0000000000000000000000000000000000000000..75a793148ac1597339e50058cf0dd1a4bed94740 GIT binary patch literal 2029 zcmVPx+r%6OXR7l6wmtAZV*%inCXJ+nrCdA3aks*l_KoFw9Zo-nRp{WEbfe=Vt#6wY$ z5KAQrXnCmGhwUSMX?ZJBrF~$fMO(E?k+$kqqO=7GHn1R+3a=d+Ad13A$%iq)#GcrR zXFPYtw-50|gB!}ewLNb$zqxnL)j8*X&mjOpQ4|mnYOPYKpi-$omgQx+=Xnr9Kv5Jd zXRhmlh#<@IzcC?%zrG(p3a>Fmk|dlwc@o{--Ox160#Fe`D8*tibo=&g+_-TA$BrGt z+O=ydj4^w0Z=vRLId<{lMP##C96o#)t*xz|BuRGlU|J@VkwlqX+Fyx?yRO@w%jG^98XAh(wvFE2Ubm&C<*2Hv_W{6hoVTOV=x5<@SXsGp zC3<^%(~(HzLq$=hg%HfP?eEpq)tw53LK5C!3K1a`3OTy2f7;*QKjed(H*bCs3WWwF zNdjZ+nWkyK>+kP>QpI<#UAy)bW9*15%V3QCgE97pzP`RP03?&iQO4L$WLfTKj6qS9 zueNU8`WJuiWHLF+82gbVN$qcP&_977BD;nKpE(h^HQWLKB7zXYCL-YjA`;biuY4Qe zE&z^iVNx|=WzX|kYgkN(rGGYfo)=z@3n4&6t)Az}f#Q*gsMY5HVl~AT2GHp17IEDLjUbGrry2R{e!1b~{)=if6;v)OgsH#$g?B#E6n zccQhm6^yYZ39xM&mmWYJsdGf--!mp#z=uyTP+S}W$wzjr?jIqBHk#Jp?)z#Hq zH4Gy@H#dhhYu1?2X!LEySRMd4=S_;D+}Cy8Fbo479UY0r#>U->qHrMuan8SE+x8{K zm>!Kr5sSq>Td`urPi0y5s{Dt!T<&84l2W~jTvb)S>FeuT2u+FHe`Y_0^ zUAs0cNm9HT)=|b-wy&?x0f1C0D#Ib?cnJHkC>}B%&E2S}V&kBuPrd z+9?P2p|ifj&r_$ zWMpK+_3PIc9W)HXjYJ|J#pCfm2V~}DI2=BuC<+Y2m~ComIv$V59|UB^&~^QN#u%EK znw~T?G#re_;}!rU5((Y5?fZ}mgP)Mg{K4UQbCsG;&Qy2HyK%$Js(u7G2?Rp>EOcZUIo8h zTZU(d$P4y^B!tjv90)!$Aw=!qq5JtrM4AwS0`mq{-@Wo}fGYslYyO3*FSMkC<#JiI zEbDkOnREj!|G{#(j7p^f&Uu?{+eebgWU%Gm#W{!PdElIH=A8c^l}atO{G9X6RR-5} zcip*j=lx*I&pB`NtDSRxFp)^ylVv$4gwQR^I$kc9RUyQpgJWZ30PumPX$OKs)6~=y z%H=XfM@OYnsdS1l_Osy7^y0+}6pKZSjEpGRZ1y*`LsPL>#ETa%FfuX{i$o%SsvVlj z(=Vbn%<-35|Wmb#p)e0BA)#lCdLfUB7j3eS61#We{W z`gEUNnc?2=)Po5uKO%3O;c=_5s8@PXYunQ-*l_LErUV0~fb3W?9yf+FZ^X{e)R=uU nbXgD=!|#3iQ#lXVuKg_C!0j=8ac@@@(A^B4u6{1-oD!M<09$N< literal 0 HcmV?d00001 diff --git a/magic/sounds/mosaic_shaped_hex.ogg b/magic/sounds/mosaic_shaped_hex.ogg new file mode 100644 index 0000000000000000000000000000000000000000..31924da2dfec62708a3e8d99edf03b4880ca0b84 GIT binary patch literal 9031 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 literal 0 HcmV?d00001 diff --git a/magic/sounds/mosaic_shaped_irregular.ogg b/magic/sounds/mosaic_shaped_irregular.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d9a77ec90fe2965ea3927048c1032038afd2c672 GIT binary patch literal 13604 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 literal 0 HcmV?d00001 diff --git a/magic/sounds/mosaic_shaped_square.ogg b/magic/sounds/mosaic_shaped_square.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6265e36cb80aeb129ee4e7648b5eee7e1b5d9e39 GIT binary patch literal 4220 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 RnYq6wj!ysM^iJgB_J2wIr91!t literal 0 HcmV?d00001 diff --git a/magic/src/mosaic_shaped.c b/magic/src/mosaic_shaped.c new file mode 100644 index 000000000..fbd7b0405 --- /dev/null +++ b/magic/src/mosaic_shaped.c @@ -0,0 +1,579 @@ +/* + mosaic_shaped.c + + mosaic_shaped, Add a mosaic_shaped effect to the image using a combination of other tools. + Requires the mosaic_shapedAll sharpen and noise tools. + Tux Paint - A simple drawing program for children. + + Credits: Andrew Corcoran + + Copyright (c) 2002-2009 by Bill Kendrick and others; see AUTHORS.txt + bill@newbreedsoftware.com + http://www.tuxpaint.org/ + + 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + (See COPYING.txt) + + Last updated: May 6, 2009 + $Id$ +*/ + +#include +#include +#include +#include "tp_magic_api.h" +#include "SDL_image.h" +#include "SDL_mixer.h" +#include +#include +#include + + +#ifndef gettext_noop +#define gettext_noop(String) String +#endif + +static void mosaic_shaped_sharpen_pixel(void * ptr, SDL_Surface * canvas, SDL_Surface * last, int x, int y); +static void reset_counter(SDL_Surface * canvas, Uint8 * counter); +static void fill_square(magic_api * api, SDL_Surface * canvas, int x, int y, int size, Uint32 color); +static void deform(magic_api * api, SDL_Surface * srfc); +static void do_mosaic_shaped_full(void * ptr, SDL_Surface * canvas, SDL_Surface * last, int which, SDL_Rect * update_rect); +static void mosaic_shaped_fill(void * ptr_to_api, int which, SDL_Surface * canvas, + SDL_Surface * last, int x, int y); + +Uint32 mosaic_shaped_api_version(void); +int mosaic_shaped_init(magic_api * api); +int mosaic_shaped_get_tool_count(magic_api * api); + SDL_Surface * mosaic_shaped_get_icon(magic_api * api, int which); +char * mosaic_shaped_get_name(magic_api * api, int which); + +char * mosaic_shaped_get_description(magic_api * api, int which, int mode); + +void mosaic_shaped_drag(magic_api * api, int which, SDL_Surface * canvas, + SDL_Surface * last, int ox, int oy, int x, int y, + SDL_Rect * update_rect); + +void mosaic_shaped_click(magic_api * api, int which, int mode, + SDL_Surface * canvas, SDL_Surface * last, + int x, int y, SDL_Rect * update_rect); + +void mosaic_shaped_release(magic_api * api, int which, + SDL_Surface * canvas, SDL_Surface * last, + int x, int y, SDL_Rect * update_rect); + +void mosaic_shaped_shutdown(magic_api * api); + +void mosaic_shaped_set_color(magic_api * api, Uint8 r, Uint8 g, Uint8 b); + +int mosaic_shaped_requires_colors(magic_api * api, int which); + +void mosaic_shaped_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas); + +void mosaic_shaped_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas); + +int mosaic_shaped_modes(magic_api * api, int which); + +int scan_fill(magic_api * api, SDL_Surface * canvas, SDL_Surface * srfc,int x,int y, int fill_edge, int fill_tile, int size, Uint32 color); + + + + +static const int mosaic_shaped_AMOUNT= 300; +static const int mosaic_shaped_RADIUS = 16; +static const double mosaic_shaped_SHARPEN = 1.0; +Uint8 * mosaic_shaped_counted; +Uint8 * mosaic_shaped_done; +Uint8 mosaic_shaped_r, mosaic_shaped_g, mosaic_shaped_b; + +int mosaic_shaped_average_r, mosaic_shaped_average_g, mosaic_shaped_average_b, mosaic_shaped_average_count; +Uint32 pixel_average, black, white; + +enum { + TOOL_SQUARE, + TOOL_HEX, + TOOL_IRREGULAR, + mosaic_shaped_NUM_TOOLS +}; + +static Mix_Chunk * mosaic_shaped_snd_effect[mosaic_shaped_NUM_TOOLS]; +static SDL_Surface * canvas_shaped; +static SDL_Surface * canvas_back; +static SDL_Surface * mosaic_shaped_pattern; + +const char * mosaic_shaped_snd_filenames[mosaic_shaped_NUM_TOOLS] = { + "mosaic_shaped_square.ogg", + "mosaic_shaped_hex.ogg", + "mosaic_shaped_irregular.ogg", /* FIXME */ +}; + +const char * mosaic_shaped_icon_filenames[mosaic_shaped_NUM_TOOLS] = { + "mosaic_shaped_square.png", + "mosaic_shaped_hex.png", + "mosaic_shaped_irregular.png", +}; + +const char * mosaic_shaped_pattern_filenames[mosaic_shaped_NUM_TOOLS] = { + "mosaic_shaped_square_pattern.png", + "mosaic_shaped_hex_pattern.png", + "mosaic_shaped_irregular_pattern.png", +}; + +const char * mosaic_shaped_names[mosaic_shaped_NUM_TOOLS] = { + gettext_noop("Mosaic square"), + gettext_noop("Mosaic hexagon"), + gettext_noop("Mosaic irregular"), + +}; + +const char * mosaic_shaped_descs[mosaic_shaped_NUM_TOOLS][2] = { + {gettext_noop("Click and move the mouse to add a mosaic squared effect to parts of your picture."), + gettext_noop("Click to add a mosaic squared effect to your entire picture."),}, + + {gettext_noop("Click and move the mouse to add a mosaic hexagonal effect to parts of your picture."), + gettext_noop("Click to add a mosaic hexagonal effect to your entire picture."),}, + + {gettext_noop("Click and move the mouse to add a irregular mosaic to parts of your picture."), + gettext_noop("Click to add a irregular mosaic to your entire picture."),}, +}; + +Uint32 mosaic_shaped_api_version(void) { return(TP_MAGIC_API_VERSION); } + +//Load sounds +int mosaic_shaped_init(magic_api * api){ + int i; + char fname[1024]; + mosaic_shaped_pattern = NULL; + for (i = 0; i < mosaic_shaped_NUM_TOOLS; i++){ + snprintf(fname, sizeof(fname), "%s/sounds/magic/%s", api->data_directory, mosaic_shaped_snd_filenames[i]); + mosaic_shaped_snd_effect[i] = Mix_LoadWAV(fname); + } + return(1); +} + +int mosaic_shaped_get_tool_count(magic_api * api ATTRIBUTE_UNUSED){ + return(mosaic_shaped_NUM_TOOLS); +} + +// Load our icons: +SDL_Surface * mosaic_shaped_get_icon(magic_api * api, int which){ + char fname[1024]; + snprintf(fname, sizeof(fname), "%simages/magic/%s", api->data_directory, mosaic_shaped_icon_filenames[which]); + return(IMG_Load(fname)); +} + +// Return our names, localized: +char * mosaic_shaped_get_name(magic_api * api ATTRIBUTE_UNUSED, int which){ + return(strdup(gettext_noop(mosaic_shaped_names[which]))); +} + +// Return our descriptions, localized: +char * mosaic_shaped_get_description(magic_api * api ATTRIBUTE_UNUSED, int which, int mode){ + return(strdup(gettext_noop(mosaic_shaped_descs[which][mode-1]))); +} + +//Calculates the grey scale value for a rgb pixel +static int mosaic_shaped_grey(Uint8 r1,Uint8 g1,Uint8 b1){ + return 0.3*r1+.59*g1+0.11*b1; +} + +// Do the effect for the full image +static void do_mosaic_shaped_full(void * ptr, SDL_Surface * canvas, SDL_Surface * last ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED){ + int i, j; + Uint32 mosaic_shaped_color; + magic_api * api = (magic_api *) ptr; + + mosaic_shaped_color = SDL_MapRGBA(canvas->format, mosaic_shaped_r, mosaic_shaped_g, mosaic_shaped_b, 0); + + for( i = 3; i < canvas->w - 3; i +=2) + { + api->playsound(mosaic_shaped_snd_effect[which], 128, 255); + api->update_progress_bar(); + + for (j = 3; j < canvas->h - 3; j +=2) + { + if(!mosaic_shaped_done[canvas->w * j + i]) + if (!mosaic_shaped_counted[canvas->w * j + i]) + if(api->getpixel(canvas_shaped, i, j) != black ) + { + mosaic_shaped_average_r = 0; + mosaic_shaped_average_g = 0; + mosaic_shaped_average_b = 0; + mosaic_shaped_average_count = 0; + + scan_fill(api, canvas, canvas_shaped, i, j, 1, 0, 1, mosaic_shaped_color); + + if (mosaic_shaped_average_count > 0) + { + reset_counter(canvas, mosaic_shaped_counted); + int size = 0; + pixel_average = SDL_MapRGB(canvas->format, mosaic_shaped_average_r / mosaic_shaped_average_count, mosaic_shaped_average_g / mosaic_shaped_average_count, mosaic_shaped_average_b / mosaic_shaped_average_count); + scan_fill(api, canvas, canvas_shaped, i, j, 0, 1, size, pixel_average); + } + } + } + } +} + +/* Fills a tesera */ +static void mosaic_shaped_fill(void * ptr_to_api, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas, + SDL_Surface * last ATTRIBUTE_UNUSED, int x, int y) +{ + magic_api * api = (magic_api *) ptr_to_api; + x = clamp(0, x, canvas->w - 1); + y = clamp(0,y,canvas->h - 1); + Uint32 mosaic_shaped_color; + mosaic_shaped_color = SDL_MapRGBA(canvas->format, mosaic_shaped_r, mosaic_shaped_g, mosaic_shaped_b, 0); + mosaic_shaped_average_r = 0; + mosaic_shaped_average_g = 0; + mosaic_shaped_average_b = 0; + mosaic_shaped_average_count = 0; + if (api->getpixel(canvas_shaped, x, y) == black) return; + scan_fill(api, canvas, canvas_shaped, x, y, 1, 0, 1, mosaic_shaped_color); + + if (mosaic_shaped_average_count > 0) + { + int size = 0; + pixel_average = SDL_MapRGB(canvas->format, mosaic_shaped_average_r / mosaic_shaped_average_count, mosaic_shaped_average_g / mosaic_shaped_average_count, mosaic_shaped_average_b / mosaic_shaped_average_count); + reset_counter(canvas, mosaic_shaped_counted); + scan_fill(api, canvas, canvas_shaped, x, y, 0, 1, size, pixel_average); + } +} + +// Affect the canvas on drag: +void mosaic_shaped_drag(magic_api * api, int which, SDL_Surface * canvas, + SDL_Surface * last, int ox, int oy, int x, int y, + SDL_Rect * update_rect){ + + api->line(api, which, canvas, last, ox, oy, x, y, 1, mosaic_shaped_fill); + + update_rect->x = min(ox, x) - mosaic_shaped_pattern->w; + update_rect->y = min(oy, y) - mosaic_shaped_pattern->h; + update_rect->w = max(ox, x) + mosaic_shaped_pattern->w - update_rect->x; + update_rect->h = max(oy, y) + mosaic_shaped_pattern->h - update_rect->y; + api->playsound(mosaic_shaped_snd_effect[which], (x * 255) / canvas->w, 255); +} + +// Affect the canvas on click: +void mosaic_shaped_click(magic_api * api, int which, int mode, + SDL_Surface * canvas, SDL_Surface * last, + int x, int y, SDL_Rect * update_rect){ + + + if (mode == MODE_FULLSCREEN) + { + update_rect->x = 0; + update_rect->y = 0; + update_rect->w = canvas->w; + update_rect->h = canvas->h; + + do_mosaic_shaped_full(api, canvas, last, which, update_rect); + + api->playsound(mosaic_shaped_snd_effect[which], 128, 255); + } + + else + mosaic_shaped_drag(api, which, canvas, last, x, y, x, y, update_rect); +} + +// Affect the canvas on release: +void mosaic_shaped_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, + SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED, + int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED) +{ +} + +// No setup happened: +void mosaic_shaped_shutdown(magic_api * api ATTRIBUTE_UNUSED) +{ + //Clean up sounds + int i; + for(i=0; igetpixel(last, x+i, y+j), last->format, &r1, &g1, &b1); + grey = mosaic_shaped_grey(r1,g1,b1); + sobel_1 += grey * sobel_weights_1[i+1][j+1]; + sobel_2 += grey * sobel_weights_2[i+1][j+1]; + } + } + + temp = sqrt(sobel_1*sobel_1 + sobel_2*sobel_2); + temp = (temp/1443)*255.0; + if (temp > 25) + api->putpixel(canvas_shaped, x, y, SDL_MapRGBA(canvas_shaped->format, 0, 0, 0, 0)); +} + + + +void mosaic_shaped_switchin(magic_api * api, int which, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas) +{ + int y, x; + int i, j; + SDL_Rect rect; + SDL_Surface * surf_aux; + + mosaic_shaped_counted = (Uint8 *) malloc(sizeof(Uint8) * (canvas->w * canvas->h)); + if (mosaic_shaped_counted == NULL) + { + fprintf(stderr, "\nError: Can't build drawing touch mask!\n"); + exit(1); + } + + mosaic_shaped_done = (Uint8 *) malloc(sizeof(Uint8) * (canvas->w * canvas->h)); + if (mosaic_shaped_done == NULL) + { + fprintf(stderr, "\nError: Can't build drawing touch mask!\n"); + exit(1); + } + + Uint32 amask = ~(canvas->format->Rmask | + canvas->format->Gmask | + canvas->format->Bmask); + + canvas_shaped = SDL_CreateRGBSurface(SDL_SWSURFACE, + canvas->w, + canvas->h, + canvas->format->BitsPerPixel, + canvas->format->Rmask, + canvas->format->Gmask, + canvas->format->Bmask, amask); + + surf_aux = SDL_CreateRGBSurface(SDL_SWSURFACE, + canvas->w + 10, + canvas->h + 10, + canvas->format->BitsPerPixel, + canvas->format->Rmask, + canvas->format->Gmask, + canvas->format->Bmask, amask); + char fname[1024]; + snprintf(fname, sizeof(fname), "%simages/magic/%s", api->data_directory, mosaic_shaped_pattern_filenames[which]); +mosaic_shaped_pattern = IMG_Load(fname); + rect.w = mosaic_shaped_pattern->w; + rect.h = mosaic_shaped_pattern->h; + for( i = 0; i < surf_aux->w; i += mosaic_shaped_pattern->w) + for( j = 0; j < surf_aux->h; j += mosaic_shaped_pattern->h) + { + rect.x = i; + rect.y = j; + SDL_BlitSurface(mosaic_shaped_pattern, NULL, surf_aux, &rect); + } + + if(which == TOOL_IRREGULAR) + deform(api, surf_aux); + SDL_SetAlpha(surf_aux, 0 , SDL_ALPHA_OPAQUE); + SDL_BlitSurface(surf_aux, NULL, canvas_shaped, NULL); + SDL_FreeSurface(surf_aux); + + black = SDL_MapRGBA(canvas->format, 0, 0, 0, 0); + white = SDL_MapRGBA(canvas->format, 255, 255, 255, 0); + + + + /* Two black lines at the edges */ + for (i = 0; i < canvas->w; i++) + { + api->putpixel(canvas_shaped, i, 0, black); + api->putpixel(canvas_shaped, i, 1, black); + api->putpixel(canvas_shaped, i, canvas->h - 1, black); + api->putpixel(canvas_shaped, i, canvas->h - 2, black); + } + + for (j = 0; j < canvas->h; j++) + { + api->putpixel(canvas_shaped, 0, j, black); + api->putpixel(canvas_shaped, 1, j, black); + api->putpixel(canvas_shaped, canvas->w - 1, j, black); + api->putpixel(canvas_shaped, canvas->w - 2, j, black); + } + + + /* A copy of canvas at switchin, will be used to draw from it as snapshot changes at each click */ + canvas_back = SDL_CreateRGBSurface(SDL_SWSURFACE, + canvas->w, + canvas->h, + canvas->format->BitsPerPixel, + canvas->format->Rmask, + canvas->format->Gmask, + canvas->format->Bmask, amask); + + SDL_BlitSurface(canvas, NULL, canvas_back, NULL); + + if(which != TOOL_SQUARE) /* The pattern for square is small enouth to not need an additional shape */ + for (y = 0; y < canvas->h; y++){ + for (x=0; x < canvas->w; x++){ + mosaic_shaped_sharpen_pixel(api, canvas_shaped, canvas, x, y); + } + } + + reset_counter(canvas, mosaic_shaped_counted); + reset_counter(canvas, mosaic_shaped_done); +} + +void mosaic_shaped_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED) +{ + SDL_FreeSurface(canvas_shaped); + SDL_FreeSurface(canvas_back); + SDL_FreeSurface(mosaic_shaped_pattern); + free (mosaic_shaped_counted); +} + +int mosaic_shaped_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) +{ + return(MODE_PAINT|MODE_FULLSCREEN); +} + +void reset_counter(SDL_Surface * canvas, Uint8 * counter) +{ + int i, j; + + for (j = 0; j < canvas->h; j++) + for (i = 0; i < canvas->w; i++) + counter[j * canvas->w + i] = 0; + +} + + +int scan_fill(magic_api * api, SDL_Surface * canvas, SDL_Surface * srfc,int x,int y, int fill_edge, int fill_tile, int size, Uint32 color) +{ + int leftx, rightx; + Uint8 r, g, b, a; + int i; + leftx = x - 1; + rightx = x + 1; + + if (mosaic_shaped_counted[y * srfc->w + x] == 1) return (0); + + if (api->getpixel(srfc, x, y) == black) + { + if (fill_edge == 1) + fill_square(api, canvas, x, y, size, color); + return(0); /* No need to check more */ + } + if (fill_tile == 1) + { + Uint32 shadow; + Uint8 shr, shg, shb, sha; + Uint8 cnvsr, cnvsg, cnvsb, cnvsa; + shadow = api->getpixel(srfc, x, y); + SDL_GetRGBA(shadow, srfc->format, &shr, &shg, &shb, &sha); + SDL_GetRGBA(pixel_average, srfc->format, &cnvsr, &cnvsg, &cnvsb, &cnvsa); + shadow = SDL_MapRGBA(canvas->format, (shr * cnvsr) /255, (shg * cnvsg) /255, (shb * cnvsb) /255, 0);//(shr + cnvsr) /2, ; + api->putpixel(canvas, x, y, shadow); + mosaic_shaped_counted[y * canvas->w + x] = 1; + mosaic_shaped_done[y * canvas->w + x] = 1; + + } + + else + { + SDL_GetRGBA(api->getpixel(canvas_back, x, y), canvas_back->format, &r, &g, &b, &a); + mosaic_shaped_average_r += r; + mosaic_shaped_average_g +=g; + mosaic_shaped_average_b += b; + mosaic_shaped_average_count +=1; + mosaic_shaped_counted[y * canvas->w + x] = 1; + } + + /* Search right */ + while (scan_fill(api, canvas, srfc, rightx, y, fill_edge, fill_tile, size, color) && (rightx < canvas->w)) + { + rightx ++; + } + + /* Search left */ + while (scan_fill(api, canvas, srfc, leftx, y, fill_edge, fill_tile, size, color) && (leftx >= 0)) + { + leftx --; + } + + /* Top / bottom */ + for (i = leftx; i <= rightx; i++) + { + if(y > 0) scan_fill(api, canvas, srfc, i, y - 1, fill_edge, fill_tile, size, color); + if(y + 1 < canvas->w) scan_fill(api, canvas, srfc, i, y + 1, fill_edge, fill_tile, size, color); + } + return (1); +} + + +void fill_square(magic_api * api, SDL_Surface * canvas, int x, int y, int size, Uint32 color) +{ + int i, j; + for (i = (x - size); i < (x + 1 + size); i++) + for(j = (y - size); j < (y + 1 + size); j++) + { + api->putpixel(canvas, i, j, color); + } +} + +void deform(magic_api * api, SDL_Surface * srfc) +{ + int i, j; + for (j = 0; j < srfc->h; j++) + for (i = 0; i < srfc->w; i++) + { + api->putpixel(srfc, i, j, api->getpixel(srfc, i + sin(j * M_PI / 90 ) * 10 + 10, j)); + } + + for (i = 0; i < srfc->w; i++) + for (j = 0; j < srfc->h; j++) + { + api->putpixel(srfc, i, j, api->getpixel(srfc, i, j + sin(i * M_PI / 90 ) * 10 + 10)); + } +}