@@ -26,6 +26,16 @@ struct color colors_2bit[4];
26
26
struct color colors_4bit [16 ];
27
27
struct color colors_8bit [256 ];
28
28
29
+ #define DEFAULT_X_SHIFT 2.5
30
+ #define DEFAULT_Y_SHIFT 1.0
31
+ #define DEFAULT_X_SCALE 3.5
32
+ #define DEFAULT_Y_SCALE 2.1
33
+
34
+ struct viewport {
35
+ double x_shift , y_shift ;
36
+ double x_scale , y_scale ;
37
+ };
38
+
29
39
void get_window_size (display , window , height , width )
30
40
Display * display ;
31
41
Window window ;
@@ -65,12 +75,13 @@ double time_in_seconds()
65
75
return t / 60.0 ;
66
76
}
67
77
68
- void calculate (display , window , gc , palette , palette_size )
78
+ void calculate (display , window , gc , palette , palette_size , viewport )
69
79
Display * display ;
70
80
Window window ;
71
81
GC gc ;
72
82
unsigned long int * palette ;
73
83
size_t palette_size ;
84
+ struct viewport viewport ;
74
85
{
75
86
unsigned int i , col , row , iteration ;
76
87
double width , height , x0 , y0 , x , y , xtemp ;
@@ -89,10 +100,10 @@ void calculate(display, window, gc, palette, palette_size)
89
100
for (row = 0 ; row < lines ; row ++ )
90
101
{
91
102
// printf("Row: %u\n", row);q
92
- y0 = (row * 2.1 / height ) - 1 ;
103
+ y0 = (row * viewport . y_scale / height ) - viewport . y_shift ;
93
104
for (col = 0 ; col < cols ; col ++ )
94
105
{
95
- x0 = (col * 3.5 / width ) - 2.5 ;
106
+ x0 = (col * viewport . x_scale / width ) - viewport . x_shift ;
96
107
x = 0.0 ;
97
108
y = 0.0 ;
98
109
iteration = 0 ;
@@ -113,7 +124,7 @@ void calculate(display, window, gc, palette, palette_size)
113
124
}
114
125
115
126
finish = time_in_seconds ();
116
- printf ("Height: %u, Width: %u, Time: %0.3f Seconds\n" , lines , cols , (finish - start ));
127
+ printf ("Height: %u, Width: %u, Time: %0.3f Seconds (Viewport: {x - %0.3f, y - %0.3f, x * %0.3f, y * %0.3f}) \n" , lines , cols , (finish - start ), viewport . x_shift , viewport . y_shift , viewport . x_scale , viewport . y_scale );
117
128
118
129
}
119
130
@@ -215,8 +226,6 @@ void initialize_colors()
215
226
}
216
227
}
217
228
218
- printf ("Initialized %u colors.\n" , idx );
219
-
220
229
}
221
230
222
231
void create_palette (display , colormap , palette , colors , size )
@@ -258,10 +267,16 @@ int main(argc,argv)
258
267
unsigned int width , height , lastWidth , lastHeight ;
259
268
struct color * colors = colors_8bit ;
260
269
Colormap colormap ;
261
-
270
+ struct viewport viewport ;
271
+ int max_iterations = 256 ;
262
272
unsigned long palette [256 ];
273
+ int x_center , y_center ;
263
274
264
- int max_iterations = 256 ;
275
+ viewport .x_shift = DEFAULT_X_SHIFT ;
276
+ viewport .y_shift = DEFAULT_Y_SHIFT ;
277
+ viewport .x_scale = DEFAULT_X_SCALE ;
278
+ viewport .y_scale = DEFAULT_Y_SCALE ;
279
+
265
280
if (argc > 1 )
266
281
{
267
282
max_iterations = atoi (argv [1 ]);
@@ -271,6 +286,7 @@ int main(argc,argv)
271
286
exit (1 );
272
287
}
273
288
}
289
+
274
290
initialize_colors ();
275
291
276
292
/* setup display/screen */
@@ -347,7 +363,7 @@ int main(argc,argv)
347
363
get_window_size (display , window , & height , & width );
348
364
if (width != lastWidth || height != lastHeight )
349
365
{
350
- calculate (display , window , gc , palette , max_iterations );
366
+ calculate (display , window , gc , palette , max_iterations , viewport );
351
367
}
352
368
lastWidth = width ;
353
369
lastHeight = height ;
@@ -359,6 +375,23 @@ int main(argc,argv)
359
375
break ;
360
376
case ButtonPress :
361
377
/* Mouse button was pressed. */
378
+ /* reposition the center of the viewport to the point that was clicked */
379
+ x_center = width / 2 ;
380
+ y_center = height / 2 ;
381
+ viewport .x_shift -= (double )(event .xbutton .x - x_center ) / (double )width * viewport .x_scale ;
382
+ viewport .y_shift -= (double )(event .xbutton .y - y_center ) / (double )height * viewport .y_scale ;
383
+ /* increase or decrease the scale of the viewport depending on the button pressed */
384
+ if (event .xbutton .button == 1 )
385
+ {
386
+ viewport .x_scale *= 0.75 ;
387
+ viewport .y_scale *= 0.75 ;
388
+ }
389
+ else if (event .xbutton .button == 3 )
390
+ {
391
+ viewport .x_scale *= 1.25 ;
392
+ viewport .y_scale *= 1.25 ;
393
+ }
394
+ calculate (display , window , gc , palette , max_iterations , viewport );
362
395
break ;
363
396
case KeyPress :
364
397
/* Key input. */
0 commit comments