Annotation of 43BSD/contrib/X/libsun/text.c, revision 1.1.1.1

1.1       root        1: #ifdef sun
                      2: /*
                      3:  * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided
                      4:  * for unrestricted use provided that this legend is included on all tape
                      5:  * media and as a part of the software program in whole or part.  Users
                      6:  * may copy or modify these drivers without charge, but are not authorized
                      7:  * to license or distribute them to anyone else except as part of a product or
                      8:  * program developed by the user.
                      9:  * 
                     10:  * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND
                     11:  * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A
                     12:  * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE
                     13:  * PRACTICE.
                     14:  *
                     15:  * The Sun X Drivers are provided with no support and without any obligation
                     16:  * on the part of Sun Microsystems, Inc. to assist in their use, correction,
                     17:  * modification or enhancement.
                     18:  * 
                     19:  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
                     20:  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X
                     21:  * DRIVERS OR ANY PART THEREOF.
                     22:  * 
                     23:  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
                     24:  * or profits or other special, indirect and consequential damages, even if
                     25:  * Sun has been advised of the possibility of such damages.
                     26:  * 
                     27:  * Sun Microsystems, Inc.
                     28:  * 2550 Garcia Avenue
                     29:  * Mountain View, California  94043
                     30:  */
                     31: 
                     32: #ifndef        lint
                     33: static char sccsid[] = "@(#)text.c 2.1 86/01/28 Copyright 1986 Sun Micro";
                     34: #endif
                     35: 
                     36: /*-
                     37:  * Copyright (c) 1986 by Sun Microsystems,  Inc.
                     38:  */
                     39: 
                     40: /*
                     41:  *     ToDo:
                     42:  *             Color
                     43:  */
                     44: 
                     45: #include "Xsun.h"
                     46: #ifndef stdin
                     47: #include <stdio.h>
                     48: #endif
                     49: #include <pixrect/memreg.h>
                     50: #include <pixrect/cg2reg.h>
                     51: 
                     52: /* I've put in some rather ugly hacks, in the name of performance.  The
                     53:    global variables private_* are really extra parameters to the batchrop
                     54:    routines.  I did this, rather than adding parameters, because I wanted to
                     55:    do the least violence to the "official" specs of batchrop -- this way X
                     56:    will vaguely work on displays that don't use one of the tuned batchrops.
                     57:        JAG */
                     58: 
                     59: int         private_fgcolor, private_bgcolor, private_czmask;
                     60: 
                     61: extern struct pixrect *PixRect;
                     62: 
                     63: PrintText(string, strlen, font, fore, back, charpad, spacepad, dstx, dsty,
                     64:          clips, clipcount, func, zmask)
                     65:     register unsigned char *string;
                     66:     FONT       *font;
                     67:     int         strlen, fore, back, charpad, spacepad, dstx, dsty;
                     68:     CLIP       *clips;
                     69:     int         clipcount, zmask;
                     70:     int         func;
                     71: {
                     72:     extern CURSOR *CurrentCursor;
                     73:     extern      CursorDisplayed;
                     74:     int         cleft, ctop, cwidth, cheight;
                     75:     int         op;
                     76:     extern char FBMap[];
                     77: #define        CHUNK   400
                     78:     unsigned char *limit = string + (strlen < CHUNK ? strlen : CHUNK);
                     79:     register    w = 0;
                     80:     static struct pr_prpos bat[CHUNK];
                     81:     int         bsize = 0;
                     82:     int         lheight;
                     83:     int         sbot, sright;
                     84: 
                     85:     private_czmask = zmask;
                     86:     private_fgcolor = fore;
                     87:     private_bgcolor = back;
                     88:     if (fore & 1)
                     89:        func += 0x20;
                     90:     if (back & 1)
                     91:        func += 0x10;
                     92:     func = FBMap[func];
                     93: #ifdef notdef
                     94:     op = SUN_FROM_X_OP(func) /* | PIX_COLOR(fore) */ ;
                     95: #else
                     96:     op = SUN_FROM_X_OP(func) | PIX_COLOR(fore);
                     97: #endif
                     98:     {
                     99:        register struct pixfont *pf = (struct pixfont *) font->data;
                    100:        register struct pr_prpos *p = bat;
                    101:        lheight = pf->pf_defaultsize.y;
                    102:        if (charpad == 0 && spacepad == 0)
                    103:            while (string < limit) {
                    104:                register struct pixchar *pc = &(pf->pf_char[*string++]);
                    105:                if (pc == 0 || pc->pc_pr == NULL)
                    106:                    continue;
                    107:                p->pr = pc->pc_pr;
                    108:                p->pos.x = pc->pc_adv.x;
                    109:                w += p->pos.x;
                    110:                p++;
                    111:                bsize++;
                    112:            }
                    113:        else {
                    114:            struct pixchar *space = &pf->pf_char[font->space];
                    115:            while (string < limit) {
                    116:                register struct pixchar *pc = &(pf->pf_char[*string++]);
                    117:                if (pc == 0 || pc->pc_pr == NULL)
                    118:                    continue;
                    119:                p->pr = pc->pc_pr;
                    120:                p->pos.x = pc->pc_adv.x + charpad;
                    121:                if (pc == space)
                    122:                    p->pos.x += spacepad;
                    123:                w += p->pos.x;
                    124:                p++;
                    125:                bsize++;
                    126:            }
                    127:        }
                    128:     }
                    129:     sbot = dsty + lheight;
                    130:     sright = dstx + w;
                    131:     if (CursorDisplayed) {
                    132:        extern DEVICE *CurrentDevice;
                    133:        register vsCursor *ms = CurrentDevice->mouse;
                    134:        register CURSOR *cs = CurrentCursor;
                    135:        if (ms->y < sbot && ms->x < sright
                    136:            && ms->y + cs->height > dsty
                    137:            && ms->x + cs->width > dstx)
                    138:            DisplayCursor(NULL);
                    139:     }
                    140:     do {
                    141:        GetNextClip(clips, cleft, ctop, cwidth, cheight);
                    142:        if (dsty >= ctop && sbot <= ctop + cheight
                    143:            && dstx >= cleft && sright <= cleft + cwidth)
                    144:            pr_batchrop(PixRect, dstx - bat[0].pos.x, dsty,
                    145:                        op | PIX_DONTCLIP, bat, bsize);
                    146:        else {
                    147:            struct pixrect *region;
                    148:            if (dsty > ctop + cheight)
                    149:                continue;
                    150:            if (dsty + lheight <= ctop)
                    151:                continue;
                    152:            region = pr_region(PixRect, cleft, ctop, cwidth, cheight);
                    153:            pr_batchrop(region, dstx - cleft - bat[0].pos.x,
                    154:                        dsty - ctop,
                    155:                        op, bat, bsize);
                    156:            pr_destroy(region);
                    157:        }
                    158:     } while (--clipcount > 0);
                    159:     if (!CursorDisplayed)
                    160:        DisplayCursor(CurrentCursor);
                    161: }
                    162: 
                    163: PrintTextMask(string, strlen, font, srcpix, charpad, spacepad, dstx, dsty,
                    164:              clips, clipcount, func, zmask)
                    165:     unsigned char *string;
                    166:     FONT       *font;
                    167:     int         strlen, srcpix, charpad, spacepad, dstx, dsty;
                    168:     CLIP       *clips;
                    169:     int         clipcount, zmask;
                    170:     register int func;
                    171: {
                    172:     extern CURSOR *CurrentCursor;
                    173:     extern      CursorDisplayed;
                    174:     int         cleft, ctop, cwidth, cheight;
                    175:     int         op;
                    176:     extern char SSMap[];
                    177: #define        CHUNK   400
                    178:     unsigned char *limit = string + (strlen < CHUNK ? strlen : CHUNK);
                    179:     register    w = 0;
                    180:     static struct pr_prpos bat[CHUNK];
                    181:     int         bsize = 0;
                    182:     int         lheight;
                    183:     int         sbot, sright;
                    184: 
                    185: 
                    186:     SetZmask(PixRect, &zmask);
                    187:     private_bgcolor = -1;
                    188:     private_fgcolor = srcpix;
                    189:     if (PixRect->pr_depth == 1) {
                    190:        if ((srcpix & 1) == 0)
                    191:            func += 0x10;
                    192:        op = SUN_FROM_X_OP(SSMap[func]) & PIX_SRC | PIX_NOT(PIX_SRC) & PIX_DST;
                    193:     }
                    194:     else
                    195:        op = SUN_FROM_X_OP(func);
                    196:     if (PixRect->pr_depth > 1)
                    197:        op |= PIX_COLOR(srcpix);
                    198:     {
                    199:        register struct pixfont *pf = (struct pixfont *) font->data;
                    200:        register struct pr_prpos *p = bat;
                    201:        lheight = pf->pf_defaultsize.y;
                    202:        if (charpad == 0 && spacepad == 0)
                    203:            while (string < limit) {
                    204:                register struct pixchar *pc = &(pf->pf_char[*string++]);
                    205:                if (pc == 0)
                    206:                    continue;
                    207:                p->pr = pc->pc_pr;
                    208:                p->pos.x = pc->pc_adv.x;
                    209:                w += p->pos.x;
                    210:                p++;
                    211:                bsize++;
                    212:            }
                    213:        else {
                    214:            struct pixchar *space = &pf->pf_char[font->space];
                    215:            while (string < limit) {
                    216:                register struct pixchar *pc = &(pf->pf_char[*string++]);
                    217:                if (pc == 0)
                    218:                    continue;
                    219:                p->pr = pc->pc_pr;
                    220:                p->pos.x = pc->pc_adv.x + charpad;
                    221:                if (pc == space)
                    222:                    p->pos.x += spacepad;
                    223:                w += p->pos.x;
                    224:                p++;
                    225:                bsize++;
                    226:            }
                    227:        }
                    228:     }
                    229:     sbot = dsty + lheight;
                    230:     sright = dstx + w;
                    231:     if (CursorDisplayed) {
                    232:        extern DEVICE *CurrentDevice;
                    233:        register vsCursor *ms = CurrentDevice->mouse;
                    234:        register CURSOR *cs = CurrentCursor;
                    235:        if (ms->y < sbot && ms->x < sright
                    236:            && ms->y + cs->height > dsty
                    237:            && ms->x + cs->width > dstx)
                    238:            DisplayCursor(NULL);
                    239:     }
                    240:     do {
                    241:        GetNextClip(clips, cleft, ctop, cwidth, cheight);
                    242:        if (dsty >= ctop && sbot <= ctop + cheight
                    243:            && dstx >= cleft && sright <= cleft + cwidth)
                    244:            pr_batchrop(PixRect, dstx - bat[0].pos.x, dsty,
                    245:                        op | PIX_DONTCLIP, bat, bsize);
                    246:        else {
                    247:            struct pixrect *region;
                    248:            if (dsty > ctop + cheight)
                    249:                continue;
                    250:            if (dsty + lheight <= ctop)
                    251:                continue;
                    252:            region = pr_region(PixRect, cleft, ctop, cwidth, cheight);
                    253:            pr_batchrop(region, dstx - cleft - bat[0].pos.x,
                    254:                        dsty - ctop,
                    255:                        op, bat, bsize);
                    256:            pr_destroy(region);
                    257:        }
                    258:     } while (--clipcount > 0);
                    259:     if (!CursorDisplayed)
                    260:        DisplayCursor(CurrentCursor);
                    261:     {
                    262:        static      allmask = -1;
                    263:        SetZmask(PixRect, &allmask);
                    264:     }
                    265: }
                    266: 
                    267: 
                    268: /*
                    269:  * Copyright (c) 1983 by Sun Microsystems, Inc.
                    270:  */
                    271: 
                    272: /*
                    273:  * Memory batchrop
                    274:  */
                    275: 
                    276: 
                    277: extern char pr_reversedst[];
                    278: extern struct pixrectops mem_ops;
                    279: 
                    280: 
                    281: 
                    282: #define MEMBATCH(IfClip, IfMask, op, IfReverse)                                \
                    283:     for (; --count >= 0; src++) {                                      \
                    284:        dst.pos.x += src->pos.x;                                        \
                    285:        dp = dp0 + (((dskew = xoff0 + dst.pos.x) >> 3) & ~1);           \
                    286:        dskew &= 0xF;                                                   \
                    287:        spr = src->pr;                                                  \
                    288:        sizex = spr->pr_size.x;                                         \
                    289:        sizey = spr->pr_size.y;                                         \
                    290:        sprd = mpr_d(spr);                                              \
                    291:        if (sprd->md_linebytes != 2)                                    \
                    292:            goto hard;                                                  \
                    293:        sp = (u_short *) sprd->md_image;                                \
                    294:        IfClip( if (dst.pos.x + sizex > limx)                           \
                    295:                    goto hard;                                          \
                    296:                if (dst.pos.y + sizey > limy)                           \
                    297:                sizey = limy - dst.pos.y;                               \
                    298:                if (dst.pos.x < 0)                                      \
                    299:                    goto hard;                                          \
                    300:                if (dst.pos.y < 0) {                                    \
                    301:                    sizey += dst.pos.y;                                 \
                    302:                    sp -= dst.pos.y;                                    \
                    303:                    dp -= pr_product(dst.pos.y, vert);                  \
                    304:                }                                                       \
                    305:                if (sizex <= 0)                                         \
                    306:                    continue;                                           \
                    307:        ,)                                                              \
                    308:        if (--sizey>=0)                                                 \
                    309:        if (dskew + sizex <= 16) {                                      \
                    310:            IfMask(     register short mask;                            \
                    311:                        mask = 0x8000;                                  \
                    312:                        sizex -= 1;                                     \
                    313:                        mask >>= sizex;                                 \
                    314:                        ((unsigned short) mask) >>= dskew;              \
                    315:                        IfReverse(mask = ~mask;,),)                     \
                    316:            do {                                                        \
                    317:                IfMask(*(u_short *) dp IfReverse(&,|)= mask;,)          \
                    318:                    *(u_short *) dp op (*sp++ >> dskew);                \
                    319:                dp += vert;                                             \
                    320:            } while (--sizey != -1);                                    \
                    321:        }                                                               \
                    322:        else {                                                          \
                    323:            IfMask(     register long mask;                             \
                    324:                        mask = 0x80000000;                              \
                    325:                        sizex -= 1;                                     \
                    326:                        mask >>= sizex;                                 \
                    327:                        ((unsigned long) mask) >>= dskew;               \
                    328:                        IfReverse(mask = ~mask;,),)                     \
                    329:            dskew = 16 - dskew;                                         \
                    330:            do {                                                        \
                    331:                IfMask(*(u_int *) dp IfReverse(&,|)= mask;,)            \
                    332:                *(u_int *) dp op (*sp++ << dskew);                      \
                    333:                dp += vert;                                             \
                    334:            } while (--sizey != -1);                                    \
                    335:        }                                                               \
                    336:     }
                    337: 
                    338: #define MTRUE(a,b) a
                    339: #define MFALSE(a,b) b
                    340: 
                    341: #define ClippedOp(mask,op,revmask) \
                    342:     if(clip) MEMBATCH(MTRUE,mask,op,revmask) \
                    343:     else MEMBATCH(MFALSE,mask,op,revmask)
                    344: 
                    345: mem_batchrop(dst, op, src, count)
                    346:     struct pr_prpos dst;
                    347:     int         op;
                    348:     struct pr_prpos *src;
                    349:     short       count;
                    350: {
                    351:     register u_short *sp;
                    352:     register char *dp;
                    353:     char       *dp0;
                    354:     register char *handy;
                    355:     register short sizex, sizey;
                    356:     register    vert, dskew;
                    357:     int         dskew0, xoff0;
                    358:     int         errors = 0;
                    359:     int         clip, limx, limy;
                    360:     int         oppassed = op;
                    361: 
                    362:     /*
                    363:      * Preliminaries: get pixrect data and image pointers; decide whether
                    364:      * clipping.  If not clipping, normalize op, else compute limits for
                    365:      * cursors for later comparisons. 
                    366:      */
                    367: 
                    368:     clip = 0;
                    369:     if (!(op & PIX_DONTCLIP)) {
                    370:        clip = 1;
                    371:        limx = dst.pr->pr_size.x;
                    372:        limy = dst.pr->pr_size.y;
                    373:     }
                    374:     op = (op >> 1) & 0xf;      /* Kill dontclip, just keep useful */
                    375:     /*
                    376:      * If destination is reverse video, invert function. FIXME: we dont
                    377:      * deal with a reverse video source. Admittedly its unlikely that
                    378:      * anyone will call batchrop with a device pixrect as source (since we
                    379:      * copy the whole pixrect), but this is a bug. 
                    380:      */
                    381:     if (mpr_d(dst.pr)->md_flags & MP_REVERSEVIDEO)
                    382:        op = pr_reversedst[op];
                    383: 
                    384:     vert = mpr_d(dst.pr)->md_linebytes;
                    385: #define dprd ((struct mpr_data *)handy)
                    386:     dprd = mpr_d(dst.pr);
                    387:     xoff0 = dprd->md_offset.x;
                    388:     dp0 = (char *) ((int) dprd->md_image
                    389:                    + pr_product(dprd->md_linebytes,
                    390:                                 dst.pos.y + dprd->md_offset.y));
                    391: #undef dprd
                    392: restart:
                    393: #define spr ((struct pixrect *)handy)
                    394: #define sprd ((struct mpr_data *)handy)
                    395:     switch (op) {
                    396:     case (PIX_SRC ^ PIX_DST) >> 1:
                    397:        ClippedOp(MFALSE, ^=, MTRUE);
                    398:        break;
                    399:     case PIX_SRC >> 1:
                    400:        ClippedOp(MTRUE, |=, MTRUE);
                    401:        break;
                    402:     case PIX_NOT(PIX_SRC) >> 1:
                    403:        ClippedOp(MTRUE, ^=, MFALSE);
                    404:        break;
                    405:     case (PIX_SRC | PIX_DST) >> 1:
                    406:        ClippedOp(MFALSE, |=, MTRUE);
                    407:        break;
                    408:     case (PIX_NOT(PIX_SRC) & PIX_DST) >> 1:
                    409:        ClippedOp(MFALSE, &=~, MTRUE);
                    410:        break;
                    411:     default:
                    412:        for (; --count >= 0; src++) {
                    413:            dst.pos.x += src->pos.x;
                    414:            errors |= mem_rop(dst.pr, dst.pos, src->pr->pr_size,
                    415:                              oppassed, src->pr, 0, 0);
                    416:        }
                    417:     }
                    418:     return errors;
                    419: hard:
                    420:     if (dst.pos.x + sizex <= 0)
                    421:        /*
                    422:         * Completely clipped on left... 
                    423:         */
                    424:        ;
                    425:     else {
                    426:        errors |= mem_rop(dst.pr, dst.pos, src->pr->pr_size,
                    427:                          oppassed, src->pr, 0, 0);
                    428:     }
                    429:     src++;
                    430:     goto restart;
                    431: }
                    432: 
                    433: /*
                    434:  * cg2batch.c: Sun2 Color batchrop
                    435:  */
                    436: 
                    437: extern struct pixrectops mem_ops;
                    438: 
                    439: 
                    440: extern short mrc_lmasktable[];
                    441: extern short mrc_rmasktable[];
                    442: 
                    443: #define resolution unused, 0
                    444: 
                    445: cg2_batchrop(dst, op, src, count)
                    446:     struct pr_prpos dst;
                    447:     int         op;
                    448:     struct pr_prpos *src;
                    449:     register int count;
                    450: {
                    451:     register short sizey;
                    452:     register int tem, w, prime, linebytes;
                    453:     register short *bx, *leftx, *ma;
                    454:     register struct memropc *ropregs;
                    455:     short       sizex;
                    456:     int         clip;
                    457:     struct pixrect *pr;
                    458:     short      *ma_homey;
                    459:     short       homex, homey, limx, limy, dstx, dsty, by;
                    460: 
                    461:     struct cg2fb *fb;
                    462:     struct mpr_data *md;
                    463:     int         oppassed = op;
                    464:     int         errors = 0;
                    465:     short       color;
                    466: 
                    467:     if (count <= 0)
                    468:        return (0);
                    469: 
                    470:     /*
                    471:      * Preliminaries: get pixrect data and frame buffer pointers; decide
                    472:      * whether clipping.  If not clipping, normalize op, else compute
                    473:      * limits for cursors for later comparisons. 
                    474:      */
                    475: #define dbd ((struct cg2pr *)leftx)
                    476:     dbd = cg2_d(dst.pr);
                    477:     homex = dbd->cgpr_offset.x;
                    478:     homey = dbd->cgpr_offset.y;
                    479: #define FB ((struct cg2fb *)leftx)
                    480:     FB = dbd->cgpr_va;
                    481:     fb = FB;
                    482: #undef dbd
                    483:     ropregs = &FB->ropcontrol[CG2_ALLROP].ropregs;
                    484:     if (op & PIX_DONTCLIP) {
                    485:        op &= ~PIX_DONTCLIP;
                    486:        clip = 0;
                    487:     }
                    488:     else {
                    489:        clip = 1;
                    490:        limx = homex + dst.pr->pr_size.x;
                    491:        limy = homey + dst.pr->pr_size.y;
                    492:     }
                    493:     dstx = homex + dst.pos.x;
                    494:     dsty = homey + dst.pos.y;
                    495:     if (private_bgcolor < 0) {
                    496:        FB->ppmask.reg = private_fgcolor;       /* set colored text */
                    497:        ropregs->mrc_pattern = -1;
                    498:        FB->ppmask.reg = ~private_fgcolor;
                    499:        ropregs->mrc_pattern = 0;
                    500:        FB->ppmask.reg = private_czmask;
                    501:        switch (op & 0x1E) {
                    502:        case PIX_SRC ^ PIX_DST:
                    503:            ropregs->mrc_op = CG_SRC & (CG_MASK ^ CG_DEST) | ~CG_SRC & CG_DEST;
                    504:            break;
                    505:        case PIX_NOT(PIX_DST):
                    506:            ropregs->mrc_op = CG_SRC & (~CG_DEST) | ~CG_SRC & CG_DEST;
                    507:            break;
                    508:        default:
                    509:            ropregs->mrc_op = CG_SRC & CG_MASK | ~CG_SRC & CG_DEST;
                    510:            break;
                    511:        }
                    512:     }
                    513:     else {
                    514:        FB->ppmask.reg = private_fgcolor & private_bgcolor;
                    515:        ropregs->mrc_op = ~0;
                    516:        FB->ppmask.reg = ~(private_fgcolor | private_bgcolor);
                    517:        ropregs->mrc_op = 0;
                    518:        FB->ppmask.reg = private_fgcolor & ~private_bgcolor;
                    519:        ropregs->mrc_op = CG_SRC;
                    520:        FB->ppmask.reg = ~private_fgcolor & private_bgcolor;
                    521:        ropregs->mrc_op = ~CG_SRC;
                    522:        FB->ppmask.reg = private_czmask;
                    523:     }
                    524:     FB->status.reg.ropmode = PWWWRD;
                    525:     linebytes = cg2_linebytes(FB, PWWWRD);
                    526: #undef FB
                    527: 
                    528:     for (; --count >= 0; src++) {
                    529:        /*
                    530:         * Update destination x and y by pre-advance amount. If no pixrect
                    531:         * for this, then skip to next. 
                    532:         */
                    533:        dstx += src->pos.x;
                    534:        pr = src->pr;
                    535:        if (pr == 0)
                    536:            continue;
                    537:        sizex = pr->pr_size.x;
                    538:        sizey = pr->pr_size.y;
                    539:        md = mpr_d(pr);
                    540:        ma = md->md_image;
                    541: 
                    542:        /*
                    543:         * Grab sizes and address of image.  If clipping (rare case
                    544:         * hopefully) compare cursors against limits. 
                    545:         */
                    546:        by = dsty;
                    547:        tem = 0;
                    548:        if (clip) {
                    549:            if (dstx + sizex > limx)
                    550:                sizex = limx - dstx;
                    551:            if (dsty + sizey > limy)
                    552:                sizey = limy - dsty;
                    553:            if (dsty < homey) { /* works if pr_depth = 1! */
                    554:                tem = homey - dsty;
                    555:                by += tem;
                    556:                ma += pr_product(tem, (md->md_linebytes >> 1));
                    557:                sizey -= tem;
                    558:                tem = 0;
                    559:            }
                    560:            if (dstx < homex) {
                    561:                tem = homex - dstx;
                    562:                ma += tem >> 4;
                    563:                sizex -= tem;
                    564:            }
                    565:            if (sizex <= 0)
                    566:                continue;
                    567:        }
                    568: 
                    569:        /*
                    570:         * Hard case: characters greater than 16 wide. 
                    571:         */
                    572:        ma_homey = ma;
                    573: 
                    574:        /* set the ROP chip word width and opcount */
                    575: 
                    576:        w = cg2_prskew(dstx);   /* source skew is 0 */
                    577:        ropregs->mrc_shift = (w & 0xF) | (1 << 8);
                    578:        prime = !w;
                    579:        w = (sizex + w + (tem & 0xF) - 1) >> 4;
                    580:        ropregs->mrc_width = w;
                    581:        ropregs->mrc_opcount = w;
                    582: 
                    583:        /* set the ROP chip end masks */
                    584: 
                    585:        ropregs->mrc_mask1 =
                    586:            mrc_lmasktable[(tem += dstx) & 0xf];
                    587:        ropregs->mrc_mask2 =
                    588:            mrc_rmasktable[(sizex + tem - 1) & 0xf];
                    589: 
                    590:        leftx = cg2_ropwordaddr(fb, 0, tem, by);
                    591:        tem = md->md_linebytes;
                    592:        if (--sizey >= 0)
                    593:            if (w) {
                    594:                w++;
                    595:                do {
                    596:                    register short i = w;
                    597:                    ma = ma_homey;
                    598:                    bx = leftx;
                    599:                    if (prime)
                    600:                        ropregs->mrc_source1 = *ma++;
                    601:                    while (i--)
                    602:                        *bx++ = *ma++;
                    603:                    (char *) ma_homey += tem;
                    604:                    (char *) leftx += linebytes;
                    605:                } while (--sizey != -1);
                    606:            }
                    607:            else {
                    608:                bx = leftx;
                    609:                ma = ma_homey;
                    610:                if (prime) {
                    611:                    ma++;
                    612:                    do {
                    613:                        ma--;
                    614:                        ropregs->mrc_source1 = *ma++;
                    615:                        *bx = *ma;
                    616:                        (char *) ma += tem;
                    617:                        (char *) bx += linebytes;
                    618:                    } while (--sizey != -1);
                    619:                }
                    620:                else
                    621:                    do {
                    622:                        *bx = *ma;
                    623:                        (char *) ma += tem;
                    624:                        (char *) bx += linebytes;
                    625:                    } while (--sizey != -1);
                    626:            }
                    627:     }
                    628: 
                    629:     return (errors);
                    630: }
                    631: 
                    632: #endif sun

unix.superglobalmegacorp.com

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