1 /*
2 Copyright (C) 1992 Norbert Meyer. All rights reserved.
3 Distributed by Free Software Foundation, Inc.
4
5 This file is part of HP2xx.
6
7 HP2xx is distributed in the hope that it will be useful, but
8 WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
9 to anyone for the consequences of using it or for whether it serves any
10 particular purpose or works at all, unless he says so in writing. Refer
11 to the GNU General Public License, Version 2 or later, for full details.
12
13 Everyone is granted permission to copy, modify and redistribute
14 HP2xx, but only under the conditions described in the GNU General Public
15 License. A copy of this license is supposed to have been
16 given to you along with HP2xx so you can know your rights and
17 responsibilities. It should be in a file named COPYING. Among other
18 things, the copyright notice and this notice must be preserved on all
19 copies.
20
21 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
22 */
23
24 /**
25 ** TO_ATARI.C: Zweite Version f�r einen Atari-Previewer im
26 ** Rahmen des HP2xx-Projektes von Heinz Werntges.
27 **
28 ** Die erste Version f�r einen Atari-Previewer
29 ** wertete jeweils die tempor�re Datei aus, in der
30 ** zun�chst in einem HP2xx-spezifischem Code alle
31 ** Plot-Anweisungen gesammelt werden (Diese
32 ** Zwischendatei wird von HP2xx benutzt, um
33 ** anschlie�end daraus zum einen die HP2xx-Bitmap zu
34 ** erzeugen, und zum anderen um auf dieser Grundlage
35 ** vektororientierte Datei-Formate wie das
36 ** Postscript-Format zu errechnen).
37 **
38 ** Dieses Vorgehen hatte aber einen entscheidenden
39 ** Nachteil: Da der Vektorteil von HP2xx von Zeit zu
40 ** Zeit weiterentwickelt wird, mu�te dann jeweils
41 ** auch der Atari-Previewer angepa�t werden.
42 **
43 ** Daher wertet die neue Version nun nicht mehr den
44 ** Vektorteil des HP2xx aus. Stattdessen wird die
45 ** von HP2xx zur Verf�gung gestellte Bitmap als
46 ** Berechnungsgrundlage genommen. F�r die Bitmap ist
47 ** ein festes Format garantiert, so da� der
48 ** Previewer auf lange Sicht nicht mehr ge�ndert
49 ** werden mu�.
50 **
51 ** Der Atari-Previewer nutzt nur VDI-Zeichenbefehle.
52 ** Dadurch ist er zwar nicht gerade einer der
53 ** schnellsten, sollte aber in jeder auf dem Atari
54 ** verf�gbaren Graphikaufl�sung arbeiten.
55 **
56 ** Zudem bietet der Previewer bescheidenen
57 ** Bedienungskomfort (Scrollen durch ein zu gro�
58 ** geratenes Bild per Pfeiltasten, Hilfstext
59 ** abrufbar). Auf eine komplette Fensterverwaltung
60 ** wurde jedoch verzichtet. Dies h�tte den Previewer
61 ** zum einen unn�tig aufgebl�ht und zum anderen w�re
62 ** es schon irgendwie merkw�rdig gewesen, wenn nach
63 ** einem rein buchstabenorientiertem Programmteil
64 ** auf einmal ein typisches GEM-Programm auf dem
65 ** Schirm erscheint.
66 **
67 ** Damit der Benutzer sich nicht so sehr mit den
68 ** Besonderheiten seines Bildschirms herumplagen
69 ** mu�, beachtet der Atari-Previewer Bildschirm-
70 ** aufl�sungen mit sehr ungleich gro�en Pixeln (ein
71 ** typischer Fall ist die mittlere Aufl�sung f�r den
72 ** Atari ST). Ist also in der Bitmap f�r die x- und
73 ** die y-Richtung jeweils die gleiche Aufl�sung
74 ** gew�hlt, so erscheint im Preview ein Kreis
75 ** (wenigstens so ungef�hr) auch auf dem Bildschirm
76 ** als Kreis - unabh�ngig davon, ob man etwas
77 ** merkw�rdige Graphikeigenschaften in seinem
78 ** Rechner hat oder nicht.
79 **
80 ** Bisher wurde der Previewer mit folgenden
81 ** Bildschirmaufl�sungen getestet (sollte aber - wie
82 ** gesagt - auch bei anderen Bildschirmaufl�sungen
83 ** laufen):
84 **
85 ** - ST niedrig ( 320 x 200, 16 Farben)
86 **
87 ** - ST mittel ( 640 x 200, 4 Farben)
88 **
89 ** - ST hoch ( 640 x 400, monochrom)
90 **
91 ** Trotz ausf�hrlicher Test mu� aber darauf
92 ** hingewiesen werden, da� die Benutzung des
93 ** Atari-Previewer auf eigene Gefahr geschieht.
94 **/
95
96 /** V. 0.00 16.05.92 NM Null-Version (nicht lauff�hig)
97 ** V. 1.00 22.05.92 NM erste lauff�hige Version
98 **/
99
100 /**
101 ** Standard-Header f�r GEM-Programme:
102 **/
103
104 #include <tos.h>
105 #include <vdi.h>
106 #include <aes.h>
107 #include <stdio.h>
108 #include <stdlib.h>
109
110 /**
111 ** Header f�r HP2xx:
112 **/
113
114 #include "bresnham.h"
115 #include "hp2xx.h"
116
117 /**
118 ** erg�nzende Standard-Definitionen f�r GEM-Programme:
119 **/
120
121 typedef enum { /* boolean definieren */
122 FALSCH,
123 WAHR
124 } boolean;
125
126 #define CON 2 /* Console (VT-52) */
127
128
129 /*
130 * weitere Definitionen:
131 */
132
133 #define CLS printf("%cE",27); /* Bildschirm l�schen */
134
135 /* Scancodes: */
136 #define SC_H 35 /* H \ */
137 #define SC_HELP 98 /* Help > gl. Fkt. */
138 #define SC_F1 59 /* F1 / */
139 #define SC_I 23 /* I f�r Info */
140 #define SC_Q 16 /* Q \ Programm- */
141 #define SC_ESC 1 /* Esc / abbruch */
142 #define SC_PF_LKS 75 /* Pfeil links */
143 #define SC_C_PF_LKS 115 /* Control Pfeil links */
144 #define SC_PF_RTS 77 /* Pfeil rechts */
145 #define SC_C_PF_RTS 116 /* Control Pfeil rechts */
146 #define SC_PF_OBN 72 /* Pfeil nach oben */
147 #define SC_PF_UTN 80 /* Pfeil nach unten */
148
149 /* Sondertastenbits: */
150 #define KB_SHIFT_RTS 1 /* Shift-rechts */
151 #define KB_SHIFT_LKS 2 /* Shift-links */
152 #define KB_CONTROL 4 /* Control */
153 #define KB_ALTERNATE 8 /* Alternate */
154
155
156 /*
157 * globale Variablen f�r GEM-Programme:
158 */
159
160 int gl_apid; /* Applikations-Identifikationsnummer */
161
162 int phys_handle, /* physikalisches Handle (GRAF_HANDLE) */
163 vdi_handle; /* VDI-Handle (V_OPENVWK) */
164
165 int gl_hchar, /* H�he, */
166 gl_wchar, /* Breite eines Standard-Zeichens */
167 gl_hbox, /* H�he, Breite der Box um ein */
168 gl_wbox; /* Zeichen des Standard-Zeichensatzes */
169
170 int w_text, /* Anzahl Standard-Zeichen pro Zeile */
171 h_text; /* Anzahl Zeilen */
172
173 int work_in[12], /* Parameter�bergabe-Felder f�r */
174 work_out[57], /* VDI-Aufrufe (inkl. V_OPENVWK) */
175 pxyarray[10];
176
177 int cntrl[12], /* vom VDI und AES benutzte Parameter- */
178 initin[128], /* �bergabefelder */
179 ptsin[128],
180 intout[128],
181 ptsout[128];
182
183 int w_screen, /* Gr��e des Schirms insgesamt */
184 h_screen,
185 w_pixel, /* Pixelbreite /-h�he in 1/1000 mm */
186 h_pixel,
187 color_max, /* gleichzeitig verf�gbare Farben */
188 color_palette; /* Anzahl Farben insgesamt */
189
190 /**
191 ** Globale Variablen f�r den ATARI-Previewer
192 **/
193
194 int rx, /* Reale Schirmpositionen, Gr��e des */
195 rx_min, /* Schirms und Korrekturfaktoren f�r */
196 rx_max, /* nicht quadratische Pixel */
197 rx_factor,
198 ry,
199 ry_min,
200 ry_max,
201 ry_factor;
202
203 static Byte rx_reihe[3000]; /* eine Pixelreihe auf dem */
204 /* Schirm (sollte auch f�r Gro�-*/
205 /* bildschirme reichen) */
206
207 int sx_min, /* Schirmausma�e nach Korrektur f�r */
208 sx_max, /* nicht quadratische Pixel */
209 sy_min,
210 sy_max;
211
212 int dx, /* Darzustellender Bildausschnitt nach */
213 dx_min, /* Korrektur f�r nicht quadratische */
214 dx_max, /* Pixel */
215 dy,
216 dy_min,
217 dy_max;
218
219 int px, /* Position innerhalb und Gr��e der */
220 px_min, /* Bitmap (in Pixeleinheiten) */
221 px_max,
222 py,
223 py_min,
224 py_max;
225
226 int ox, /* Offset zur Umrechnung vom p- ins d- */
227 oy; /* System */
228
229 /**
230 ** Funktionsprototypen f�r GEM-Initialisation:
231 **/
232
233 boolean open_vwork (void); /* �ffnet virtuele Workstation */
234 void close_vwork (void); /* Schlie�t virt. Workstation */
235
236 /**
237 ** HP2xx - Funktionsprototypen:
238 **/
239
240 void PicBuf_to_ATARI (PicBuf *, PAR *); /* GEM-Initialisierung und */
241 /* Termination (Hauptprg.) */
242
243 void preview (PicBuf *); /* Vorbelegungen, Tasten- */
244 /* dr�cke auswerten */
245
246 void hilfe (void); /* Gibt Hilfstext aus */
247
248 void info (void); /* Bildschirmparameter-Info */
249
250 void zeichne (PicBuf *); /* F�hrt Graphik aus */
251
252 int lese_pixel(PicBuf *); /* Liest einzeln. Pixel */
253 void zeichne_pixelreihe (void); /* Zeichnet Pixelreihe */
254
255
256 /*------------------------------------------------------------------*/
257
258
259 /**
260 ** open_vwork: �ffnet die Workstation, fragt wichtigste Kenndaten
261 ** ab
262 **/
263
open_vwork(void)264 boolean open_vwork(void)
265 {
266 int i;
267
268 if ((gl_apid = appl_init()) != -1) {
269
270 /* phys. Handle und Standard-Zeichengr��e erfragen */
271
272 phys_handle = graf_handle(&gl_wchar, &gl_hchar, &gl_wbox,
273 &gl_hbox);
274 vdi_handle = phys_handle;
275
276 /* work_in vorbesetzen, virtuelle Workstation auf */
277 /* Bildschirm �ffnen */
278
279 work_in[0] = phys_handle; /* Handle-Nr. */
280 for (i = 1; i < 10; work_in[i++] = 1); /* alles Standard */
281 work_in[10] = 2; /* RC-Koordinaten */
282 v_opnvwk( work_in, &vdi_handle, work_out ); /* Bildschirm �ffnen*/
283
284 /* Kenngr��en des Desktops abfragen */
285
286 w_pixel = work_out[3]; /* Pixelbreite /-h�he */
287 h_pixel = work_out[4]; /* in 1/1000 mm */
288 color_max = work_out[13]; /* gleichz.darstellb.Farb. */
289 color_palette = work_out[39]; /* verf�gbare Farben */
290 w_screen = work_out[0] + 1; /* Bildschirmbreite /-h�he */
291 h_screen = work_out[1] + 1; /* in Pixeln */
292 vq_chcells(vdi_handle, &h_text, &w_text); /* in Stand.zeichen */
293
294
295
296 /* Maus abschalten (hier kein Maus-bedienbares Programm) */
297
298 graf_mouse(M_OFF, NULL);
299
300 return(WAHR);
301
302 } else
303 return(FALSCH);
304 }
305
306
307 /*------------------------------------------------------------------*/
308
309
310 /**
311 ** close_vwork: Schaltet die Maus wieder an,
312 ** schlie�t die Workstation
313 ** und die Applikation
314 **/
315
close_vwork(void)316 void close_vwork(void)
317 {
318 graf_mouse(M_ON, NULL);
319
320 v_clsvwk(vdi_handle);
321
322 appl_exit();
323 }
324
325
326 /*------------------------------------------------------------------*/
327
328 /**
329 ** lese_pixel: Liest ein einzelnes Pixel aus der Bitmap
330 **
331 **/
lese_pixel(PicBuf * picbuf)332 int lese_pixel(PicBuf *picbuf)
333 {
334
335 static int py_alt = -1; /* Vergleich, ob noch aktuelle Zeile */
336 static RowBuf *zeile; /* Pointer auf Zeile in Bitmap */
337
338 /* int byte_pos; Welches Byte (nicht Bit !) ? */
339 /* int byte_inhalt; Inhalt des Bytes in der Zeile */
340 /* int bit_pos; Lage des ges. Bits (Pixels) im Byte */
341 /* int bit_inhalt; Bit (Pixel) gesetzt ? */
342
343 py = dy - dy_min + oy;
344 px = dx - dx_min + ox;
345
346 if (py != py_alt) {
347
348 zeile = get_RowBuf(picbuf, picbuf->nr - (py + 1));
349
350 } /* endif */
351
352 /** Urspr�ngliche Version ...
353 ** byte_pos = px >> 3;
354 ** byte_inhalt = (int) zeile->buf[byte_pos];
355 **
356 ** bit_pos = px % 8;
357 ** bit_inhalt = (byte_inhalt >> (7 - bit_pos)) & 1;
358 **
359 ** neue Version ...
360 **/
361 return((((int) zeile->buf[px >> 3]) >> (7 - (px % 8))) & 1);
362
363 }
364
365 /*------------------------------------------------------------------*/
366
367 /**
368 ** zeichne_pixelreihe: Gibt eine Pixelreihe auf dem Schirm aus
369 **
370 **/
zeichne_pixelreihe(void)371 void zeichne_pixelreihe (void)
372 {
373
374 register int in_Arbeit = 0; /* Gerade Linienst�ck in Arbeit?*/
375 register int start; /* Beginn ... */
376 register int stop; /* ... Ende eines Linienst�cks */
377 register int pos = 0; /* Position 0 ... n */
378 register int n = rx_max - rx_min;
379
380 while (pos <= n) {
381
382 if (rx_reihe[pos] != 0) {
383
384 /* Pixel gesetzt */
385 if (in_Arbeit == 0) {
386
387 start = pos;
388 in_Arbeit = 1;
389
390 } /* endif */
391
392 stop = pos;
393
394 } else {
395
396 /* Pixel nicht gesetzt */
397 if (in_Arbeit == 1) {
398
399 /* Linie ausgeben */
400 pxyarray[0] = dx_min / rx_factor + start; /* x1 */
401 pxyarray[1] = ry; /* y1 */
402 pxyarray[2] = dx_min / rx_factor + stop; /* x2 */
403 pxyarray[3] = ry; /* y2 */
404 v_pline(vdi_handle, 2, pxyarray);
405
406 in_Arbeit = 0;
407
408 } /* endif */
409
410 } /* endif */
411
412 if (pos == n) {
413
414 if (in_Arbeit == 1) {
415
416 /* Linie ausgeben */
417 pxyarray[0] = dx_min / rx_factor + start; /* x1 */
418 pxyarray[1] = ry; /* y1 */
419 pxyarray[2] = dx_min / rx_factor + stop; /* x2 */
420 pxyarray[3] = ry; /* y2 */
421 v_pline(vdi_handle, 2, pxyarray);
422
423 } /* endif */
424
425 } /* endif */
426
427 pos += 1;
428
429 } /* endwhile */
430
431 }
432
433
434 /*------------------------------------------------------------------*/
435
436 /**
437 ** zeichne: Steuert das eigentliche Darstellen der Graphik
438 **
439 **/
440
zeichne(PicBuf * picbuf)441 void zeichne (PicBuf *picbuf)
442 {
443
444 register int i; /* Z�hler f�r kleine Hilfsschleifen */
445 register int rx_n; /* Z�hler zum "Sammeln" von Pixeln */
446 register int ry_n; /* Z�hler zum "Sammeln" von Pixelreihen */
447 int pixel; /* Einzelnes Pixel */
448
449 CLS /* Bildschirm l�schen */
450
451 /* Ggf. graue / gr�ne R�nder am Bildschirmrand */
452
453 if (sx_max > px_max) {
454
455 /* seitlichen Rand zeichnen */
456
457 if (dx_min > 0) {
458
459 /* linker Rand */
460 pxyarray[0] = 0; /* x1 */
461 pxyarray[1] = 0; /* y1 */
462 pxyarray[2] = (dx_min - 1) / rx_factor; /* x2 */
463 pxyarray[3] = h_screen - 1; /* y2 */
464 v_bar(vdi_handle, pxyarray);
465
466 } /* endif */
467
468 if (dx_max < w_screen * rx_factor - 1) {
469
470 /* rechter Rand */
471 pxyarray[0] = (dx_max + 1) / rx_factor; /* x1 */
472 pxyarray[1] = 0; /* y1 */
473 pxyarray[2] = w_screen - 1; /* x2 */
474 pxyarray[3] = h_screen - 1; /* y2 */
475 v_bar(vdi_handle, pxyarray);
476
477 } /* endif */
478
479 } /* endif */
480
481 if (sy_max > py_max) {
482
483 /* Rand oben/unten zeichnen */
484
485 if (dy_min > 0) {
486
487 /* oberer Rand */
488 pxyarray[0] = 0; /* x1 */
489 pxyarray[1] = 0; /* y1 */
490 pxyarray[2] = w_screen - 1; /* x2 */
491 pxyarray[3] = (dy_min - 1) / ry_factor; /* y2 */
492 v_bar(vdi_handle, pxyarray);
493
494 } /* endif */
495
496 if (dy_max < h_screen * ry_factor - 1) {
497
498 /* unterer Rand */
499 pxyarray[0] = 0; /* x1 */
500 pxyarray[1] = (dy_max + 1) / ry_factor; /* y1 */
501 pxyarray[2] = w_screen - 1; /* x2 */
502 pxyarray[3] = h_screen - 1; /* y2 */
503 v_bar(vdi_handle, pxyarray);
504
505 } /* endif */
506
507 } /* endif */
508
509
510 /* Steuerung der Pixeldarstellung */
511
512 dy = dy_min;
513 ry = ry_min;
514
515 while (dy <= dy_max) {
516
517 for (i = 0; i <= rx_max - rx_min; i++) {
518
519 rx_reihe[i] = 0;
520
521 } /* endfor */
522
523 ry_n = 1;
524
525 while (ry_n <= ry_factor && dy <= dy_max) {
526
527 dx = dx_min;
528 rx = rx_min;
529
530 while (dx <= dx_max) {
531
532 rx_n = 1;
533
534 while (rx_n <= rx_factor && dx <= dx_max) {
535
536 pixel = lese_pixel(picbuf);
537 rx_reihe[rx - rx_min] = rx_reihe[rx - rx_min] | pixel;
538 dx += 1;
539 rx_n += 1;
540
541 } /* endwhile */
542
543 rx += 1;
544
545 } /* endwhile */
546
547 ry_n += 1;
548 dy += 1;
549
550 } /* endwhile */
551
552 zeichne_pixelreihe();
553 ry += 1;
554
555 } /* endwhile */
556
557 }
558
559
560 /*------------------------------------------------------------------*/
561
562 /**
563 ** hilfe: Gibt Hilfstext aus
564 **
565 **/
566
hilfe(void)567 void hilfe (void)
568 {
569
570 static char *hilfe80 =
571
572 " ATARI PREVIEWER H I L F E\n"
573 " ==========================\n"
574 "\n"
575 " <H>\n"
576 "oder <Help> Diesen Hilfstext anzeigen lassen\n"
577 "oder <F1>\n"
578 "\n"
579 " <I> Information �ber wichtigste Kenngr��en des Bildschirms\n"
580 " anzeigen lassen\n"
581 "\n"
582 " <Esc> Previewer verlassen, Programm beenden\n"
583 "oder <Q>\n"
584 "\n"
585 " <Pfeiltasten> Verschieben des aktuellen Bildausschnittes in Richtung\n"
586 " des Pfeils (wenn m�glich). Die Verschiebung kann durch\n"
587 " gleichzeitiges Dr�cken weiterer Tasten variiert\n"
588 " werden:\n"
589 "\n"
590 " <keine weitere Taste> bildschirmweise verschieben\n"
591 " <Control> jeweils 1/8 Bildschirmbreite\n"
592 " <Shift> pixelweise verschieben\n"
593 "\n"
594 "\n"
595 ">>> Zur Programmfortsetzung bitte Taste dr�cken <<<";
596
597 static char *hilfe40 =
598
599 "ATARI PREVIEWER H I L F E\n"
600 "==========================\n"
601 "<H> oder <Help> oder <F1>\n"
602 " Diesen Hilfstext anzeigen lassen\n"
603 "<I>\n"
604 " Information �ber wichtigste Kenn-\n"
605 " gr��en des Bildschirms anzeigen\n"
606 " lassen\n"
607 "<Esc> oder <Q>\n"
608 " Previewer verlassen, Programm\n"
609 " beenden\n"
610 "<Pfeiltasten>\n"
611 " Verschieben des aktuellen Bildaus-\n"
612 " schnittes in Richtung des Pfeils\n"
613 " (wenn m�glich). Die Verschiebung\n"
614 " kann durch gleichzeitiges Dr�cken\n"
615 " weiterer Tasten variiert werden:\n"
616 " <keine weitere Taste>\n"
617 " bildschirmweise verschieben\n"
618 " <Control>\n"
619 " jeweils 1/8 Bildschirmbreite\n"
620 " <Shift>\n"
621 " pixelweise verschieben\n"
622 "\n"
623 ">>> Bitte Taste dr�cken <<<";
624
625
626 CLS
627
628 if (w_text < 80) {
629
630 fprintf(stderr, "%s",hilfe40);
631
632 } else {
633
634 fprintf(stderr, "%s",hilfe80);
635
636 } /* endif */
637
638 }
639
640 /*------------------------------------------------------------------*/
641
642 /**
643 ** info: Gibt Information �ber alle wichtigen Kenngr��en der
644 ** aktuellen Bildschirmaufl�sung aus
645 **
646 **/
647
info(void)648 void info (void)
649 {
650
651 CLS /* Bildschirm l�schen */
652
653 fprintf(stderr, "Bildschirmkenngr��en-Info\n");
654 fprintf(stderr, "=========================\n\n");
655
656 fprintf(stderr, "Bildschirmbreite: %4d\n",w_screen);
657 fprintf(stderr, "-h�he [Pixel]: %4d\n",h_screen);
658 fprintf(stderr, "\n");
659 fprintf(stderr, "Pixelbreite [%cm]: %4d\n",230,w_pixel);
660 fprintf(stderr, "Pixelh�he [%cm]: %4d\n",230,h_pixel);
661 fprintf(stderr, " ( Verh.(x / y) %c %4d\n",247,rx_factor);
662 fprintf(stderr, " Verh.(y / x) %c %4d )\n",247,ry_factor);
663 fprintf(stderr, "\n");
664 fprintf(stderr, "Buchstabenbreite: %4d\n",gl_wchar);
665 fprintf(stderr, "- h�he [Pixel]: %4d\n",gl_hchar);
666 fprintf(stderr, "\n");
667 fprintf(stderr, "\"Box\"breite: %4d\n",gl_wbox);
668 fprintf(stderr, "\"Box\"h�he [Pixel]: %4d\n",gl_hbox);
669 fprintf(stderr, "\n");
670 fprintf(stderr, "Zeichen/Zeile: %4d\n",w_text);
671 fprintf(stderr, "Zeilen/Bildschirm: %4d\n",h_text);
672 fprintf(stderr, "\n");
673 fprintf(stderr, "Farbenzahl: %4d\n",color_max);
674 fprintf(stderr, "Farbennuancen: %4d\n",color_palette);
675
676 fprintf(stderr, "\n>>> Taste dr�cken <<<\n");
677
678 }
679
680 /*------------------------------------------------------------------*/
681
682 /**
683 ** preview: Koordiniert alle Aktivit�ten wie Hilfstext anzeigen,
684 ** eigentlichen Preview durchf�hren, Tastendr�cke aus-
685 ** werten usw.
686 **
687 **/
688
preview(PicBuf * picbuf)689 void preview(PicBuf *picbuf)
690 {
691 long scancode; /* Scancode der gedr�ckten Taste */
692 long kbret = 0; /* Stellung der Sondertasten */
693 boolean newdraw; /* Neues Zeichnen n�tig? */
694
695 /* Ausgabe der Begr��ungsmeldung */
696 fprintf(stderr, "\n\n");
697 fprintf(stderr, "ATARI-Preview\n");
698 fprintf(stderr, "=============\n");
699 fprintf(stderr, "\n");
700 fprintf(stderr, "Bitte Taste dr�cken:\n");
701 fprintf(stderr, "\n");
702 fprintf(stderr, "<H>, <F1> oder <Help> f�r Hilfstext\n");
703 fprintf(stderr, "<Q> oder <Esc> f�r Abbruch\n");
704 fprintf(stderr, "<beliebige Taste> f�r Preview\n");
705 fprintf(stderr, "\n");
706 fprintf(stderr, "Hinweis:\n");
707 fprintf(stderr, "Die Hilfe-Funktion ist auch w�hrend\n");
708 fprintf(stderr, "des Previews aktiv\n");
709
710 scancode = (Bconin(CON) >> 16) & 255; /* Tastendruck abwarten */
711 /* Scancode extrahieren */
712
713 if (scancode != SC_Q && scancode != SC_ESC) {
714
715 /* erstmalige Vorbesetzung der Variablen der */
716 /* verschiedenen Pixelsysteme */
717
718 rx_factor = (int)((float)w_pixel / (float)h_pixel + 0.5);
719 rx_factor = (rx_factor > 1) ? rx_factor : 1;
720 ry_factor = (int)((float)h_pixel / (float)w_pixel + 0.5);
721 ry_factor = (ry_factor > 1) ? ry_factor : 1;
722
723 sx_min = 0;
724 sx_max = w_screen * rx_factor;
725 sy_min = 0;
726 sy_max = h_screen * ry_factor;
727
728 px_min = 0;
729 px_max = picbuf->nc;
730 py_min = 0;
731 py_max = picbuf->nr;
732
733 ox = 0;
734 oy = 0;
735
736 if (sx_max > px_max) {
737 dx_min = (sx_max - px_max) / 2;
738 dx_max = sx_max - dx_min - 1 - ((sx_max - px_max) % 2);
739 } else {
740 dx_min = sx_min;
741 dx_max = sx_max - 1;
742 }
743 if (sy_max > py_max) {
744 dy_min = (sy_max - py_max) / 2;
745 dy_max = sy_max - dy_min - 1 - ((sy_max - py_max) % 2);
746 } else {
747 dy_min = sy_min;
748 dy_max = sy_max - 1;
749 }
750
751 rx_min = dx_min / rx_factor;
752 rx_max = dx_max / rx_factor;
753 ry_min = dy_min / ry_factor;
754 ry_max = dy_max / ry_factor;
755
756
757 /* Graphikparameter zum Zeichnen vorbesetzen */
758
759 /* Clipping an Bildschirmgrenzen */
760 pxyarray[0] = 0; pxyarray[1] = 0;
761 pxyarray[2] = w_screen - 1; pxyarray[3] = h_screen - 1;
762 vs_clip(vdi_handle, 1, pxyarray);
763
764 /* Stil f�r Fl�chen: grau (s/w) oder gr�n (Farbe) */
765 vsf_perimeter(vdi_handle, 0); /* kein Rahmen */
766 if(color_max < 4) {
767 vsf_interior(vdi_handle, 2); /* F�llstil: Muster */
768 vsf_style(vdi_handle, 4); /* Muster: grau */
769 vsf_color(vdi_handle, BLACK); /* F�llfarbe */
770 } else {
771 vsf_interior(vdi_handle, 1); /* F�llstil: voll */
772 vsf_color(vdi_handle, GREEN); /* F�llfarbe */
773 } /* endif */
774
775 /* Stil f�r Linien festlegen */
776 vsl_type(vdi_handle, SOLID); /* Linienstil */
777 vsl_width(vdi_handle, 1); /* L.breite (ungerade!) */
778 vsl_ends(vdi_handle,0,0); /* Linienenden */
779 vsl_color(vdi_handle, BLACK); /* Linienfarbe */
780
781
782 /* Schleifenvorbereitung: Vom Begr��ungstext aus */
783 /* darf nur <H>, <Help> oder <F1> eine Bedeutung haben */
784 if (scancode != SC_H && scancode != SC_HELP &&
785 scancode != SC_F1)
786 scancode = 0;
787 /* es soll immer am Anfang einmal gezeichnet werden */
788 newdraw = TRUE;
789
790 /* Tastaturabfrage-Schleife, bis Ende gew�nscht */
791 while (scancode != SC_Q && scancode != SC_ESC) {
792
793 /* Hilfstext auf Wunsch ausgeben */
794
795 if (scancode == SC_H || scancode == SC_HELP ||
796 scancode == SC_F1) {
797
798 hilfe();
799 newdraw = TRUE;
800
801 } else {
802
803 /* Graphik-Information auf Wunsch ausgeben */
804
805 if (scancode == SC_I) {
806
807 info();
808 newdraw = TRUE;
809
810 } else {
811
812
813
814 /* gem�� letztem Tastendruck - wenn sinnvoll - */
815 /* Bildausschnitt neu zeichnen */
816
817 /* Tastendruckauswertung */
818 if (scancode == SC_PF_OBN || scancode == SC_PF_UTN) {
819
820 if (sy_max < py_max) {
821
822 if (scancode == SC_PF_OBN) {
823
824 if (oy > 0) {
825
826 if ((kbret & KB_CONTROL) > 0) {
827
828 oy -= sy_max / 8;
829
830 } else {
831
832 if (((kbret & KB_SHIFT_RTS) | (kbret & KB_SHIFT_LKS)) > 0) {
833
834 oy -= 1;
835
836 } else {
837
838 oy -= sy_max;
839
840 } /* endif */
841
842 } /* endif */
843
844 if (oy < 0) {
845
846 oy = 0;
847
848 } /* endif */
849
850 newdraw = TRUE;
851
852 } /* endif */
853
854 } else {
855
856 if (oy < py_max - sy_max) {
857
858 if ((kbret & KB_CONTROL) > 0) {
859
860 oy += sy_max / 8;
861
862 } else {
863
864 if (((kbret & KB_SHIFT_RTS) | (kbret & KB_SHIFT_LKS)) > 0) {
865
866 oy += 1;
867
868 } else {
869
870 oy += sy_max;
871
872 } /* endif */
873
874 } /* endif */
875
876 if (oy > py_max - sy_max) {
877
878 oy = py_max - sy_max;
879
880 } /* endif */
881
882 newdraw = TRUE;
883
884 } /* endif */
885
886 } /* endif */
887
888 } /* endif */
889
890 } else {
891
892 if (scancode == SC_PF_RTS || scancode == SC_C_PF_RTS ||
893 scancode == SC_PF_LKS || scancode == SC_C_PF_LKS) {
894
895 if (sx_max < px_max) {
896
897 if (scancode == SC_PF_LKS || scancode == SC_C_PF_LKS) {
898
899 if (ox > 0) {
900
901 if (scancode == SC_C_PF_LKS) {
902
903 ox -= sx_max / 8;
904
905 } else {
906
907 if (((kbret & KB_SHIFT_RTS) | (kbret & KB_SHIFT_LKS))> 0) {
908
909 ox -= 1;
910
911 } else {
912
913 ox -= sx_max;
914
915 } /* endif */
916
917 } /* endif */
918
919 if (ox < 0) {
920
921 ox = 0;
922
923 } /* endif */
924
925 newdraw = TRUE;
926
927 } /* endif */
928
929 } else {
930
931 if (ox < px_max - sx_max) {
932
933 if (scancode == SC_C_PF_RTS) {
934
935 ox += sx_max / 8;
936
937 } else {
938
939 if (((kbret & KB_SHIFT_LKS) | (kbret & KB_SHIFT_RTS)) > 0) {
940
941 ox += 1;
942
943 } else {
944
945 ox += sx_max;
946
947 } /* endif */
948
949 } /* endif */
950
951 if (ox > px_max - sx_max) {
952
953 ox = px_max - sx_max;
954
955 } /* endif */
956
957 newdraw = TRUE;
958
959 } /* endif */
960
961 } /* endif */
962
963 } /* endif */
964
965 } /* endif */
966
967 } /* endif */
968
969 if (newdraw == TRUE) {
970
971 zeichne(picbuf);
972 newdraw = FALSE;
973
974 } /* endif */
975
976 } /* endif */
977
978 } /* endif */
979
980 /* Tastendruck abwarten, Scancode extrahieren */
981 scancode = (Bconin(CON) >> 16) & 255;
982 kbret = Kbshift(-1); /* Sondertasten abfr. */
983
984 } /* endwhile */
985
986
987 } /* endif */
988
989 }
990
991 /*------------------------------------------------------------------*/
992
993
994 /**
995 ** PicBuf_to_ATARI: Hauptprogramm:
996 ** - Initialisierung und Beenden des GEM
997 ** - Aufruf der eigentlichen Preview-Funktionen
998 **/
999
PicBuf_to_ATARI(PicBuf * picbuf,PAR * par)1000 void PicBuf_to_ATARI (PicBuf *picbuf, PAR *par)
1001 {
1002 if (open_vwork() == TRUE) {
1003
1004 Cursconf(0,1); /* Cursor aus */
1005 preview(picbuf); /* Previewer aufrufen */
1006 Cursconf(1,1); /* Cursor ein */
1007 close_vwork();
1008
1009 } else {
1010
1011 fprintf(stderr, "HP2xx - ATARI-Previewer\n");
1012 fprintf(stderr, "Fehler bei der GEM-Initialisierung!");
1013 exit(ERROR);
1014
1015 }
1016 }
1017
1018
1019