]> git.imager.perl.org - imager.git/blob - dynfilt/mandelbrot.c
-document that you don't want the FT2 freetype.h in the include path
[imager.git] / dynfilt / mandelbrot.c
1 #include "pluginst.h"
2
3
4 char evalstr[]="Mandlebrot renderer";
5
6 /* Example Mandlebrot generator */
7
8 /* input parameters
9    image is the image object.
10 */
11
12
13 #define MXITER 256
14
15 static
16 int
17 mandel(float x, float y) {
18   float xn, yn;
19   float xo, yo;
20   float dist;
21   int iter = 1;
22   /*    Z(n+1) = Z(n) ^2 + c */
23
24   /* printf("(%.2f, %.2f) -> \n", x,y);   */
25
26   xo = x;
27   yo = y;
28
29   while( xo*xo+yo*yo <= 10 && iter < MXITER) {
30     xn = xo*xo-yo*yo + x;
31     yn = 2*xo*yo     + y;
32     xo=xn;
33     yo=yn;
34     iter++;
35   }
36   return (iter == MXITER)?0:iter;
37 }
38
39
40
41 void mandlebrot(void *INP) {
42
43   i_img *im;
44   i_color vl;
45   int i,bytes,x,y;
46   int idx;
47   
48   float xs, ys;
49   float div;
50
51   i_color icl[256];
52   srand(12235);
53   for(i=1;i<256; i++) {
54     icl[i].rgb.r = 100+(int) (155.0*rand()/(RAND_MAX+1.0));
55     icl[i].rgb.g = 100+(int) (155.0*rand()/(RAND_MAX+1.0));
56     icl[i].rgb.g = 100+(int) (155.0*rand()/(RAND_MAX+1.0));
57   }
58
59   icl[0].rgb.r = 0;
60   icl[0].rgb.g = 0;
61   icl[0].rgb.g = 0;
62     
63
64   
65   if ( !getOBJ("image","Imager::ImgRaw",&im) ) { fprintf(stderr,"Error: image is missing\n"); }
66   
67   fprintf(stderr,"mandlebrot: parameters: (im 0x%x)\n",im);
68   bytes=im->bytes;
69
70   fprintf(stderr, "mandlebrot: image info:\n size (%d,%d)\n channels (%d)\n channel mask (%d)\n bytes (%d)\n",im->xsize,im->ysize,im->channels,im->ch_mask,im->bytes); 
71   div = 2.5;
72
73   xs = 0.8*div;
74   ys = 0.5*div;
75   
76   div /= im->xsize;
77
78
79   fprintf(stderr, "Divider: %f \n", div);
80   for(y = 0; y < im->ysize; y ++) {
81     for(x = 0; x < im->xsize; x ++ ) {
82       idx = mandel(x*div-xs , y*div-ys);
83       idx = (idx>255)?255:idx;
84       i_ppix(im,x,y,&icl[idx]); 
85     }
86   }
87 }
88
89
90
91 func_ptr function_list[]={
92   {
93     "mandlebrot",
94     mandlebrot,
95     "callseq => ['image'], \
96     callsub => sub { my %hsh=@_; DSO_call($DSO_handle,0,\\%hsh); } \
97     "
98   },
99   {NULL,NULL,NULL}};
100
101
102 /* Remember to double backslash backslashes within Double quotes in C */
103