|
|
1.1 root 1: /*
2: * Copyright (c) 1985 University of Alberta *
3: */
4:
5: #ifndef lint
6: static char *rcsid_dofile_c = "$Header: dofile.c,v 10.2 86/02/01 15:59:47 tony Rel $";
7: #endif
8:
9: #include "site.h"
10: #include "imPdefs.h"
11: #include "imPcodes.h"
12: #include "impv.h"
13: #include <stdio.h>
14: #ifndef XWIND
15: #include <pixrect/pixrect_hs.h>
16: #endif
17:
18: dofile()
19: {
20: register int i, j, code;
21: register struct glyph *gp;
22: register unsigned char *p;
23: #ifdef COLOR
24: register int k, *tp;
25: int t, tmp[1000];
26: unsigned char setcolor();
27: #endif COLOR
28: short rwid, iwid;
29: short hsize, vsize;
30: MSKWORD mw;
31:
32: while ((code = gc()) == '@') /* skip document control stuff */
33: while ((code = gc()) != ')')
34: if (code == '"') while(gc() != '"');
35: do{
36: if(code & 0200) decode(code);
37: switch(code){
38: case ASP0:
39: HPos += SpaceSize;
40: break;
41: case ASP1:
42: HPos += SpaceSize + 1;
43: break;
44: case AM:
45: EXTSIGN(1);
46: HPos += V(1);
47: break;
48: case AMM:
49: HPos--;
50: break;
51: case AMP:
52: HPos++;
53: break;
54: case ASRULE:
55: EXTSIGN(3);
56: P_rule();
57: break;
58: case ABRULE:
59: P_rule();
60: break;
61: case ASGLY:
62: EXTSIGN(4);
63: EXTSIGN(6);
64: case ABGLY:
65: fam = (V(1)>>7)&0177;
66: if(family[fam] == 0){
67: family[fam] = (struct glyph *)malloc((unsigned)sizeof font0);
68: for(i=127; i >= 0; i--)
69: family[fam][i].bits = 0;
70: fam_rot[fam] = (V(1)>>14) & 03;
71: }
72: gp = &family[fam][0177&V(1)];
73: gp->advance = V(2);
74: gp->left = V(4);
75: gp->top = V(6);
76: rwid = ( V(3) + 7) >> 3;
77: #ifdef COLOR
78: if( slide )
79: {
80: gp->width = (V(3) + 2) / 3;
81: gp->height = (V(5) + 2) / 3;
82: iwid = gp->height * gp->width;
83: gp->bits = (unsigned char *)malloc((unsigned)iwid);
84: for (p = gp->bits, i = iwid; i--;) *p++ = 0;
85: for (tp = tmp, i = (gp->width * 3); i--;) *tp++ = 0;
86:
87: for (i = 0; i < V(5); i++)
88: {
89: for (j = 0; j < rwid; j++)
90: {
91: t = gc();
92: for (k = 8; k--;)
93: tmp[j * 8 + (7 - k)]
94: = (t & (1 << k)) ? 1 : 0;
95: }
96: tp = tmp;
97: p = &gp->bits[i/3 * gp->width];
98: for (j = gp->width; j--;)
99: *p++ += *tp++ + *tp++ + *tp++;
100: }
101: for (p = gp->bits, i = iwid; i--; p++)
102: *p = (*p + 1) / 2;
103: } else
104: #endif COLOR
105: {
106: gp->width = (V(3) + 1) >> 1;
107: gp->height = (V(5) + 1) >> 1;
108: /*round size to nearest byte size */
109: iwid = ( gp->width + 7) >> 3;
110: gp->bits = (unsigned char *)malloc((unsigned)gp->height * iwid);
111: /* for the height of the glyph */
112: for (i=0; i<V(5); i++) {
113: /* point at the bytes of glyph storage*/
114: p = &gp->bits[(i>>1) * iwid];
115: /* for two bytes at a time */
116: for (j=0; j < rwid; j += 2, p++) {
117: /* squeez the first byte 4 left */
118: mw = map8_4[gc()]<<4;
119: /* if not the last byte squeez */
120: /* in another */
121: if (j < (rwid - 1))
122: mw |= map8_4[gc()];
123: /* or store byte if i odd */
124: if(i&1) *p |= mw;
125: /* store byte if even */
126: else *p = mw;
127: }
128: }
129: }
130: break;
131: case ADELC:
132: case ADELG:
133: gp = &family[0177 & (V(1)>>7) ][0177 & V(1)];
134: if(gp->bits) free((char *)gp->bits);
135: gp->bits = 0;
136: break;
137: case ADELF:
138: fam =0177 & V(1);
139: if(family[fam] == 0) break;
140: for(i = 127; i >= 0; i--){
141: gp = &family[fam][i];
142: if(gp->bits) free((char *)gp->bits);
143: gp->bits = 0;
144: }
145: break;
146: case AMARGIN:
147: BeginOfLine = V(1);
148: break;
149: case ABSKIP:
150: InterLine = V(1);
151: break;
152: case AN:
153: HPos = BeginOfLine;
154: VPos += InterLine;
155: break;
156: case AEND:
157: if( ppause()) return;
158: case APAGE:
159: HPos = VPos = 0;
160: break;
161: case AF:
162: CurFamily =0177&V(1);
163: break;
164: case ASETSP:
165: SpaceSize = V(1);
166: break;
167: case AH:
168: if( V(1) & 01) HPos += V(1) >> 1;
169: else HPos = V(1) >> 1;
170: break;
171: case AV:
172: if( V(1) & 01) VPos += V(1) >> 1;
173: else VPos = V(1) >> 1;
174: break;
175: case ASET_HV_SYS:
176: /*page orientation not done*/
177: set_hv_sys();
178: break;
179: case ASET_ABS_H:
180: /*set abs major advance pos*/
181: HPos = V(1);
182: break;
183: case ASET_ABS_V:
184: /*set abs minor advance pos*/
185: VPos = V(1);
186: break;
187: case ASET_REL_H:
188: /*set rel major advance pos*/
189: HPos += V(1);
190: break;
191: case ASET_REL_V:
192: /*set rel minor advance pos*/
193: VPos += V(1);
194: break;
195: case AROTMS:
196: /*set advance directions not done*/
197: advance_dir = v(1);
198: break;
199: case AMMOVE:
200: /*add to main dir not done*/
201: if(orient == 0) HPos += V(1);
202: break;
203: case ASMOVE:
204: /*add to main dir not done*/
205: if(orient == 0) VPos += V(1);
206: break;
207: case ACREATE_MAP:
208: /*create font map not done*/
209: /* get name and size*/
210: map_name = v(1);
211: ntuples = v(2);
212: /* read and throw away bytes */
213: for (i=0;i<ntuples*4;i++) (void)gc();
214: #ifdef notdef
215: /* get memory for ntuples*/
216: map = (map_ptr *)malloc(ntuples * sizeof int);
217: /* read in map */
218: for(i=0;i<ntuples;i++) {
219: get and store byte word byte
220: map = map;
221: }
222: #endif
223: break;
224: case ACREATE_FAMILY:
225: /* create family table not done */
226: /* get family name and size*/
227: fam_in = v(1);
228: ntuples = v(2);
229: for (i=0;i<ntuples;i++) {
230: (void)gc();
231: while(gc()!=NULL);
232: }
233: #ifdef notdef
234: /* get memory for ntuples*/
235: /* read in family */
236: for(i=0;i<ntuples;i++) {
237: get and store byte string*
238: }
239: #endif
240: break;
241: case AFORCE_GLY_DELETE:
242: /*delete marked glyphs */
243: break;
244: case ASET_PATH:
245: /*get a line path */
246: /*get vertexcount*/
247: vertex_count = V(1);
248: path_point = (struct path *)malloc
249: (vertex_count * 2 * (sizeof(short)));
250: #ifdef COLOR
251: if (slide)
252: for (i=0; i<vertex_count; i++) {
253: (path_point+i)->hor = getint() / 3;
254: (path_point+i)->vert = getint() / 3;
255: }
256: else
257: #endif COLOR
258: {
259: for (i=0; i<vertex_count; i++) {
260: (path_point+i)->hor = (getint() >> 1);
261: (path_point+i)->vert = (getint() >> 1);
262: }
263: }
264: break;
265: case ASET_TEXTURE:
266: /*set texture for lines? */
267: fam = (V(1) >> 7) & 0177;
268: member = V(1) & 0177;
269: break;
270: case ASET_PEN:
271: /*set pen diameter */
272: #ifdef COLOR
273: if(slide)
274: diameter = (v(1)+2) / 3;
275: else
276: #endif COLOR
277: diameter = (v(1)+1) > 1;
278: break;
279: case ADRAW_PATH:
280: /* draw a path of bits or lines */
281: operation = v(1);
282: if (diameter < 4){ /* draw up to 4 || lines */
283: for(j=0; j<(vertex_count-1); j++){
284: for(i=0; i<diameter; i++){
285: draw_path1((path_point+j)->hor,
286: (path_point+j)->vert,
287: (path_point+j+1)->hor,
288: (path_point+j+1)->vert);
289: }
290: }
291: }
292: else {
293: /* draw a path wider than 4 lines */
294: for(j=0; j<vertex_count; j++) (void)fflush(stdout);
295: }
296: break;
297: case AFILL_PATH:
298: /* fill in a polygon not done*/
299: operation = v(1);
300: break;
301: case ABIT_MAP:
302: /* get a bit map not done*/
303: operation = v(1);
304: hsize = v(2);
305: vsize = v(3);
306: Prnt_Bitmap(hsize,vsize);
307: break;
308: case ASET_MAGNIFICATION:
309: magnification = v(1);
310: break;
311: case ASET_PUSH_MASK:
312: /* set the state mask */
313: push_mask = V(1);
314: break;
315: case APUSH:
316: /*push a state onto the state stack */
317: push_stack[pushed] = (struct state *)
318: malloc((unsigned)sizeof pstack);
319: stap = push_stack[pushed];
320: stap->push_mask =push_mask;
321: if(push_mask& 0400) {
322: stap->diameter = diameter;
323: stap->texture = texture;
324: }
325: if(push_mask& 0200) stap->SpaceSize = SpaceSize;
326: if(push_mask& 0100) stap->InterLine = InterLine;
327: if(push_mask& 040) stap->BeginOfLine = BeginOfLine;
328: if(push_mask& 020) stap->fam = fam;
329: if(push_mask& 010) {
330: stap->HPos = HPos;
331: stap->VPos = VPos;
332: }
333: if(push_mask& 04) stap->advance_dir = advance_dir;
334: if(push_mask& 02) {
335: stap->horigin = horigin;
336: stap->vorigin = vorigin;
337: }
338: if(push_mask& 01) stap->orient = orient;
339: pushed++;
340: break;
341: case APOP:
342: /*pop a state off the state stack */
343: if(pushed >= 1) {
344: pushed--;
345: stap = push_stack[pushed];
346: push_mask = stap->push_mask;
347: if(push_mask& 0400) {
348: diameter = stap->diameter;
349: texture = stap->texture;
350: }
351: if(push_mask& 0200) SpaceSize = stap->SpaceSize;
352: if(push_mask& 0100) InterLine = stap->InterLine;
353: if(push_mask& 040) BeginOfLine = stap->BeginOfLine;
354: if(push_mask& 020) fam = stap->fam;
355: if(push_mask& 010) {
356: HPos = stap->HPos;
357: VPos = stap->VPos;
358: }
359: if(push_mask& 04) advance_dir = stap->advance_dir;
360: if(push_mask& 02) {
361: horigin = stap->horigin;
362: vorigin = stap->vorigin;
363: }
364: if(push_mask& 01) orient = stap->orient;
365: free((char *)push_stack[pushed]);
366: }
367: else fprintf(stderr, "Can not pop more states\n");
368: break;
369: case ADEFINE_MACRO:
370: /* define a macro */
371: /* get the name v(1) and length V(2) of the macro*/
372: #ifdef COLOR
373: if (v(1) == 255)
374: {
375: if (gc() == 0 )
376: {
377: bc.red = (float)gc();
378: bc.green = (float)gc();
379: bc.blue = (float)gc();
380: if( slide )
381: {
382: backcolor = setcolor(0);
383: p = (unsigned char *)(mpr_d(pscreen)->md_image);
384: for (i = scr_size; i--;)
385: *p++ = backcolor;
386: }
387: }
388: else
389: {
390: cc.red = (float)gc();
391: cc.green = (float)gc();
392: cc.blue = (float)gc();
393: }
394: }
395: else
396: #endif COLOR
397: {
398: macro[v(1)].length = V(2);
399: macro_length = V(2);
400: /* get space equal to length */
401: mp = macro[v(1)].pointer =
402: (unsigned char *)malloc((unsigned)macro_length);
403: /*read the macro into the got space*/
404: for(i=0;i<macro_length; i++) mp[i] = gc();
405: }
406: break;
407: case AEXECUTE_MACRO:
408: /* execute a macro */
409: macro_length = macro[v(1)].length;
410: mp = macro[v(1)].pointer;
411: macro_on = TRUE;
412: break;
413: case ANOP:
414: break;
415: default:
416: if(!(code&0200)) {
417: gp = &family[CurFamily][code];
418: Prnt_Glyph(&family[CurFamily][code]);
419: }
420: else {
421: (void)write(1,'$',1);
422: }
423: }
424: }
425: while (AEOF != (code=gc()) );
426: }
427:
428: char r_mask[9] = {
429: 0, 01, 03, 07, 017, 037, 077, 0177, 0377 };
430: char l_mask[9] = {
431: 0377, 0376, 0374, 0370, 0360, 0340, 0300, 0200, 00 };
432: Prnt_Glyph(gp)
433: register struct glyph *gp;
434: {
435: register int i, bit_width, skew;
436: register unsigned char *sp, *base;
437: register unsigned char *bp = gp->bits;
438: short x_bit_pos, y_bit_pos;
439: #ifdef COLOR
440: short int j;
441: unsigned char setcolor();
442: #endif COLOR
443:
444: #ifdef COLOR
445: if( slide )
446: {
447: x_bit_pos = (HPos - gp->left + 2) / 3;
448: y_bit_pos = (VPos - gp->top + 2) / 3;
449: base = ((unsigned char *)(mpr_d(pscreen)->md_image))
450: + y_bit_pos * scr_x + x_bit_pos;
451: }
452: else
453: #endif COLOR
454: {
455: x_bit_pos = (HPos - gp->left + 1) >> 1;
456: y_bit_pos = (VPos - gp->top + 1) >> 1;
457: if(((((HPos+1) >>1) + gp->width) > scr_x) ||
458: ((((VPos+1)>>1) + gp->height) > scr_y) || bp == 0)
459: {
460: big++;
461: return;
462: }
463: if((x_bit_pos < 0) || (y_bit_pos < 0) )
464: {
465: (void)write(1,'-',1);
466: little++;
467: return;
468: }
469: #ifdef XWIND
470: base = pscreen
471: #else XWIND
472: base = ((unsigned char *)(mpr_d(pscreen)->md_image))
473: #endif XWIND
474: + (y_bit_pos * wide) + (x_bit_pos >> 3);
475: }
476: /* skew is bits displacement of glyph from a byte edge*/
477: skew = 8 - (x_bit_pos & 07);
478:
479: #ifdef COLOR
480: if (slide)
481: {
482: for (i = gp->height; i--; base += scr_x)
483: {
484: sp = base;
485: for (j = gp->width; j--;)
486: if( *bp != 0 )
487: *sp++ = setcolor(*bp++);
488: else
489: {
490: bp++;
491: sp++;
492: }
493: }
494: }
495: else
496: #endif COLOR
497: {
498: for(i = gp->height; i--; base += wide){
499: sp = base;
500: for(bit_width = gp->width; bit_width > 0;){
501: if(skew == 8){
502: *sp++ |= *bp++;
503: bit_width -= 8;
504: }
505: else {
506: *sp++ |= (*bp >> (8 - skew)) & r_mask[skew];
507: if((bit_width -= skew) <= 0){
508: bp++;
509: break;
510: }
511: *sp |= (*bp++ << skew) & l_mask[skew];
512: bit_width -= (8 - skew);
513: }
514: }
515: }
516: }
517: HPos += gp->advance;
518: }
519:
520: char l_bits[8] = {
521: 0377, 0200, 0300, 0340, 0360, 0370, 0374, 0376};
522: P_rule()
523: {
524: register int i, bit_width, skew;
525: register unsigned char *sp, *base;
526: register int bits_l;
527: short x_bit_pos, y_bit_pos;
528:
529: if(((V(1) + HPos) > 2048) || ((V(2) + VPos) > 2640)) {
530: big++;
531: return;
532: }
533: x_bit_pos = (HPos + 1) >> 1;
534: y_bit_pos = (VPos + V(3) + 1) >> 1;
535: if((x_bit_pos < 0) || (y_bit_pos < 0)){
536: (void)write(1,'-',1);
537: little++;
538: return;
539: }
540: #ifdef XWIND
541: base = pscreen
542: #else
543: base = ((unsigned char *)(mpr_d(pscreen)->md_image))
544: #endif
545: + (y_bit_pos * wide) + (x_bit_pos >> 3);
546: skew = 8 - (x_bit_pos & 07);
547: V(1) = (V(1) + 1) >> 1;
548: V(2) = (V(2) + 1) >> 1;
549: for(i = V(2); i--; base += wide){
550: sp = base;
551: for(bit_width = V(1); bit_width > 0;){
552: bits_l = l_bits[bit_width>7 ? 0 : bit_width];
553: if(skew == 8){
554: *sp++ |= bits_l;
555: bit_width -= 8;
556: }
557: else {
558: *sp++ |= (bits_l >> (8 - skew)) & r_mask[skew];
559: if((bit_width -= skew) <= 0) break;
560: *sp |= (bits_l << skew) & l_mask[skew];
561: bit_width -= (8 - skew);
562: }
563: }
564: }
565: }
566:
567: set_hv_sys()
568: {
569: register int norigin, naxes, norient;
570:
571: /*set a logical page orientation relative to the physical pagenot done*/
572: norigin = (v(1)>>5 )& 03;
573: naxes = (v(1)>>3)& 03;
574: norient = v(1)&07;
575: if(norient < 4) orient = (orient+norient)%4;
576: else orient = norient - 4;
577: set_axes(naxes, norigin);
578:
579: }
580:
581: set_axes(ax, or)
582: int ax, or;
583: {
584: switch (ax){
585: case 0:
586: break;
587: case 1:
588: hvangle = -hvangle;
589: break;
590: case 2:
591: hvangle = 1;
592: break;
593: case 3:
594: hvangle = -1;
595: break;
596: }
597: set_origin(or);
598: }
599:
600: set_origin(or)
601: int or;
602: {
603: /*set the origin of the logical page relative to the physical*/
604: switch (or){
605: case 0:
606: break;
607: case 1:
608: break;
609: case 2:
610: originlv = 0;
611: switch (orient){
612: case 0:
613: originlh = 0;
614: break;
615: case 1:
616: originlh = MAXx;
617: break;
618: case 2:
619: case 3:
620: originlh = MAXy;
621: break;
622: }
623: case 3:
624: if(orient == 1 ||orient == 3){
625: originlh = xpos;
626: originlv = ypos;
627: }
628: else{
629: originlv = xpos;
630: originlh = ypos;
631: }
632: break;
633: }
634: }
635:
636: draw_path1(x0, y0, x1, y1) /* draw line from here to x0, y0, x1, y1 */
637: int x0, y0, x1, y1;
638: {
639: int d, xd, yd, dx, dy, incr1, incr2;
640: int i, numdots;
641: int motincrx, motincry;
642:
643: xd = x1 - x0;
644: yd = y1 - y0;
645: dx = abs(xd);
646: dy = abs(yd);
647: /* sort between vertical, horizontal and in between */
648: put1(x0, y0);
649: if (xd == 0) {
650: numdots = abs (yd);
651: motincry = (yd<0)? -1 : 1;
652: for (i = 0; i < numdots; i++) {
653: y0 += motincry;
654: put1(x0, y0);
655: }
656: return;
657: }
658: if (yd == 0) {
659: numdots = abs (xd);
660: motincrx = (xd<0)? -1 : 1;
661: for (i = 0; i < numdots; i++) {
662: x0 += motincrx;
663: put1(x0, y0);
664: }
665: return;
666: }
667: if (abs (xd) > abs (yd)) { /* slope less than 1 */
668: d = 2 * dy -dx;
669: incr1 = 2 * dy;
670: incr2 = 2 * (dy - dx);
671: numdots = abs (xd);
672: motincrx = (xd<0)? -1 : 1;
673: motincry = (yd<0)? -1 : 1;
674: for (i = 0; i < numdots; i++) {
675: put1(x0, y0);
676: x0 += motincrx;
677: if(d < 0) d = d + incr1;
678: else{
679: y0 += motincry;
680: d = d + incr2;
681: }
682: }
683: }
684: else { /* slope more than 1 */
685: d = 2 * dx -dy;
686: incr1 = 2 * dx;
687: incr2 = 2 * (dx - dy);
688: numdots = abs (yd);
689: motincrx = (xd<0)? -1 : 1;
690: motincry = (yd<0)? -1 : 1;
691: for (i = 0; i < numdots; i++) {
692: put1(x0, y0);
693: y0 += motincry;
694: if(d < 0) d = d + incr1;
695: else{
696: x0 += motincrx;
697: d = d + incr2;
698: }
699: }
700: }
701: }
702:
703:
704: /* set the value of a t byte (texture) */
705: t_byte(x, y)
706: int x, y;
707: {
708:
709: if(fam == 0 && member == 0)
710: return(r_mask[9]);
711: /* else find the byte in the glyph mask */
712: return( *(family[fam][member].bits + ((x & 017) >> 3) + 2 * (y & 017)) );
713: }
714:
715: /* put a pixel onto a page image. */
716: put1(x,y)
717: int x, y;
718: {
719: register int skew;
720: short x_bit_pos, y_bit_pos;
721: register unsigned char *pbyte, tbyte;
722: #ifdef COLOR
723: unsigned char setcolor();
724: #endif COLOR
725:
726: x_bit_pos = x;
727: y_bit_pos = y;
728: if((x_bit_pos > scr_x) || (y_bit_pos > scr_y)) {
729: (void)write(1, "+pix", 4);
730: return;
731: }
732: if((x_bit_pos < 0) || (y_bit_pos < 0) ) {
733: (void)write(1,'-',1);
734: return;
735: }
736: #ifdef COLOR
737: if( slide )
738: {
739: pbyte = ((unsigned char *)(mpr_d(pscreen)->md_image))
740: + (y_bit_pos * scr_x) + x_bit_pos;
741: }
742: else
743: #endif COLOR
744: {
745: #ifdef XWIND
746: pbyte = pscreen
747: #else
748: pbyte = ((unsigned char *)(mpr_d(pscreen)->md_image))
749: #endif
750: +(y_bit_pos * wide) + (x_bit_pos >> 3);
751: }
752: /* skew is bits displacement of pixel from a byte edge*/
753: skew = 8 - (x_bit_pos & 07);
754: #ifdef COLOR
755: if(slide)
756: {
757: switch(operation) {
758: case(0):
759: *pbyte = backcolor;
760: break;
761: case(3):
762: case(7):
763: default:
764: *pbyte = setcolor(5);
765: break;
766: }
767: }
768: else
769: #endif COLOR
770: {
771: switch(operation)
772: {
773: case(0): /* clear the bit */
774: if (skew == 8) *pbyte &= r_mask[skew-1];
775: else *pbyte &= (r_mask[skew-1] | l_mask[skew+1]);
776: return;
777: case(3): /* opaque with t bit */
778: tbyte = t_byte(x, y);
779: if (skew == 8) *pbyte &= r_mask[skew-1];
780: else *pbyte &= (r_mask[skew-1] | l_mask[skew+1]);
781: if (skew == 8) tbyte &= r_mask[skew-1];
782: else tbyte &= (r_mask[skew-1] | l_mask[skew+1]);
783: *pbyte &= tbyte;
784: return;
785: case(7):/* or with t bit */
786: tbyte = t_byte(x, y);
787: if (skew == 8) tbyte &= r_mask[skew-1];
788: else tbyte &= (r_mask[skew-1] | l_mask[skew+1]);
789: *pbyte |= tbyte;
790: return;
791: default: /* black the bit */
792: if(skew == 8) *(pbyte-1) |= 1;
793: else *pbyte |= 1 << skew;
794: return;
795: }
796: }
797: }
798:
799: #ifdef notdef
800: /* put a line onto a page image. */
801: putline(xstart,xend,y)
802: int xstart,xend,y;
803: {
804: register int nbytes, xh, xs, i;
805: unsigned char pbyte, tbyte, *scptr;
806:
807: /* find how many bytes are affected by the line*/
808: nbytes=1;
809: if (xstart/8 != xend/8) nbytes += xend/8 - xstart/8;
810: switch(operation){
811: case(0): /* clear the bytes */
812: for(i=0; i< nbytes; i++){
813: xh = xstart/8;
814: xs = xstart%8;
815: #ifdef XWIND
816: scptr = pscreen;
817: #else
818: scptr = (unsigned char *)(mpr_d(pscreen)->md_image);
819: #endif
820: pbyte = *scptr+y*wide+xh;
821: if((xend+1)/8 > xh+1)
822: pbyte &= l_mask[xs];
823: else
824: pbyte &= (l_mask[xs]
825: & r_mask[(xend+1)%8]);
826: *(scptr+y*wide+xh) = pbyte;
827: xstart = xstart + 8 - xs;
828: }
829: return;
830:
831: case(15):/* black the bit */
832: for(i=0; i< nbytes; i++){
833: xh = xstart/8;
834: xs = xstart%8;
835: pbyte = *scptr+y*wide+xh;
836: if((xend+1)/8 > xh+1)
837: pbyte &= r_mask[8 - xs];
838: else
839: pbyte &= (r_mask[8 - xs]
840: & l_mask[8 - (xend+1)%8]);
841: *(scptr+y*wide+xh) = pbyte;
842: xstart = xstart + 8 - xs;
843: }
844: return;
845:
846: case(3): /* opaque with t bit */
847: for(i=0; i< nbytes; i++){
848: xh = xstart >> 3;
849: xs = xstart & 07;
850: pbyte = *scptr+wide*y+xh;
851: if((xend+1)/8 > xh+1)
852: pbyte &= l_mask[xs]
853: & t_byte(xstart, (xstart+8-xs), y);
854: else
855: pbyte &= (l_mask[xs]
856: & r_mask[(xend+1)%8])
857: & t_byte(xstart, xend, y);
858: *(scptr+y*wide+xh) = pbyte;
859: xstart = xstart + 8 - xs;
860: }
861: return;
862:
863: case(7):/* or with t bit */
864: for(i=0; i< nbytes; i++){
865: xh = xstart/8;
866: xs = xstart%8;
867: pbyte = *scptr+wide*y+xh;
868: if((xend+1)/8 > xh+1)
869: pbyte |=
870: t_byte(xstart, (xstart+8-xs), y);
871: else
872: pbyte |=
873: t_byte(xstart, xend, y);
874: *(scptr+y*wide+xh) = pbyte;
875: xstart = xstart + 8 - xs;
876: }
877: return;
878: }
879: }
880: #endif
881: Prnt_Bitmap(hsize, vsize)
882: short int hsize, vsize;
883: {
884: register short int i, j, k, l;
885: register unsigned char *sp;
886: unsigned char mw, *base, *basev, *baseb;
887: short x_bit_pos, y_bit_pos;
888:
889: /*
890: * get the bits and put them ???
891: */
892: x_bit_pos = (HPos + 1) >> 1;
893: y_bit_pos = (VPos + 1) >> 1;
894: if((((HPos+hsize*4+1) >> 1) > scr_x) || (((VPos+vsize*32+1) >> 1) > scr_y)){
895: big++;
896: return;
897: }
898: if((x_bit_pos < 0) || (y_bit_pos < 0) ) {
899: (void)write(1,'-',1);
900: little++;
901: return;
902: }
903: #ifdef XWIND
904: base = pscreen
905: #else
906: base = ((unsigned char *)(mpr_d(pscreen)->md_image))
907: #endif
908: +(y_bit_pos * wide) + (x_bit_pos >> 3);
909: basev = base;
910: if(magnification == 0) for(i=0;i<vsize;i++) {
911: /* rows of cols of 32*32 blocks */
912: baseb = basev;
913: /* cols of 32*32 blocks */
914: for(j=0;j<hsize;j++) {
915: sp = baseb;
916: /* block of 32*32 */
917: for(k=0;k<32;k++) {
918: /* row of 32 bits in 32*32 block*/
919: /* point at the bytes of glyph storage*/
920: /* for two bytes at a time */
921: for (l=0; l < 2; l++, sp++) {
922: /* squeez the first byte 4 left */
923: mw = map8_4[gc()]<<4;
924: mw |= map8_4[gc()];
925: /* or store byte if k odd */
926: if(k&1) *sp |= mw;
927: /* store byte if even */
928: else *sp = mw;
929: }
930: sp = baseb + wide * ((1+k)>>1);
931: /* add 1 line to v pos if odd*/
932: }
933: baseb = basev + 2 * (j+1);
934: /* add 16 bits to h pos */
935: }
936: basev = base + wide * 16 *(i+1);
937: /* squeeze to 1/2 height*/
938: }
939: else if (magnification == 1)
940: for (i=0; i<vsize; i++) {
941: baseb = basev;
942: for (j=0; j<hsize; j++) {
943: sp = baseb;
944: for (k=0; k<32; k++) {
945: /* point at the bytes of glyph storage*/
946: for (l=4; l; l--) *sp++ = gc();
947: sp += 124;
948: }
949: baseb += 4;
950: }
951: basev = base + wide * 32 *i;
952: }
953: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.