Annotation of 43BSD/contrib/X/ximpv/dofile.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.