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