[BACK]Return to rasops24.c CVS log [TXT][DIR] Up to [local] / sys / dev / rasops

Annotation of sys/dev/rasops/rasops24.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: rasops24.c,v 1.5 2002/07/27 22:17:49 miod Exp $       */
        !             2: /*     $NetBSD: rasops24.c,v 1.12 2000/04/12 14:22:29 pk Exp $ */
        !             3:
        !             4: /*-
        !             5:  * Copyright (c) 1999 The NetBSD Foundation, Inc.
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * This code is derived from software contributed to The NetBSD Foundation
        !             9:  * by Andrew Doran.
        !            10:  *
        !            11:  * Redistribution and use in source and binary forms, with or without
        !            12:  * modification, are permitted provided that the following conditions
        !            13:  * are met:
        !            14:  * 1. Redistributions of source code must retain the above copyright
        !            15:  *    notice, this list of conditions and the following disclaimer.
        !            16:  * 2. Redistributions in binary form must reproduce the above copyright
        !            17:  *    notice, this list of conditions and the following disclaimer in the
        !            18:  *    documentation and/or other materials provided with the distribution.
        !            19:  * 3. All advertising materials mentioning features or use of this software
        !            20:  *    must display the following acknowledgement:
        !            21:  *     This product includes software developed by the NetBSD
        !            22:  *     Foundation, Inc. and its contributors.
        !            23:  * 4. Neither the name of The NetBSD Foundation nor the names of its
        !            24:  *    contributors may be used to endorse or promote products derived
        !            25:  *    from this software without specific prior written permission.
        !            26:  *
        !            27:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
        !            28:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            29:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            30:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            31:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            32:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            33:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            34:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            35:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            36:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            37:  * POSSIBILITY OF SUCH DAMAGE.
        !            38:  */
        !            39:
        !            40: #include <sys/param.h>
        !            41: #include <sys/systm.h>
        !            42: #include <sys/time.h>
        !            43:
        !            44: #include <machine/endian.h>
        !            45:
        !            46: #include <dev/wscons/wsdisplayvar.h>
        !            47: #include <dev/wscons/wsconsio.h>
        !            48: #include <dev/rasops/rasops.h>
        !            49:
        !            50: void   rasops24_erasecols(void *, int, int, int, long);
        !            51: void   rasops24_eraserows(void *, int, int, long);
        !            52: void   rasops24_putchar(void *, int, int, u_int, long attr);
        !            53: #ifndef RASOPS_SMALL
        !            54: void   rasops24_putchar8(void *, int, int, u_int, long attr);
        !            55: void   rasops24_putchar12(void *, int, int, u_int, long attr);
        !            56: void   rasops24_putchar16(void *, int, int, u_int, long attr);
        !            57: void   rasops24_makestamp(struct rasops_info *, long);
        !            58:
        !            59: /*
        !            60:  * 4x1 stamp for optimized character blitting
        !            61:  */
        !            62: static int32_t stamp[64];
        !            63: static long    stamp_attr;
        !            64: static int     stamp_mutex;    /* XXX see note in readme */
        !            65: #endif
        !            66:
        !            67: /*
        !            68:  * XXX this confuses the hell out of gcc2 (not egcs) which always insists
        !            69:  * that the shift count is negative.
        !            70:  *
        !            71:  * offset = STAMP_SHIFT(fontbits, nibble #) & STAMP_MASK
        !            72:  * destination int32_t[0] = STAMP_READ(offset)
        !            73:  * destination int32_t[1] = STAMP_READ(offset + 4)
        !            74:  * destination int32_t[2] = STAMP_READ(offset + 8)
        !            75:  */
        !            76: #define STAMP_SHIFT(fb,n)      ((n*4-4) >= 0 ? (fb)>>(n*4-4):(fb)<<-(n*4-4))
        !            77: #define STAMP_MASK             (0xf << 4)
        !            78: #define STAMP_READ(o)          (*(int32_t *)((caddr_t)stamp + (o)))
        !            79:
        !            80: /*
        !            81:  * Initialize rasops_info struct for this colordepth.
        !            82:  */
        !            83: void
        !            84: rasops24_init(ri)
        !            85:        struct rasops_info *ri;
        !            86: {
        !            87:
        !            88:        switch (ri->ri_font->fontwidth) {
        !            89: #ifndef RASOPS_SMALL
        !            90:        case 8:
        !            91:                ri->ri_ops.putchar = rasops24_putchar8;
        !            92:                break;
        !            93:        case 12:
        !            94:                ri->ri_ops.putchar = rasops24_putchar12;
        !            95:                break;
        !            96:        case 16:
        !            97:                ri->ri_ops.putchar = rasops24_putchar16;
        !            98:                break;
        !            99: #endif
        !           100:        default:
        !           101:                ri->ri_ops.putchar = rasops24_putchar;
        !           102:                break;
        !           103:        }
        !           104:
        !           105:        if (ri->ri_rnum == 0) {
        !           106:                ri->ri_rnum = 8;
        !           107:                ri->ri_rpos = 0;
        !           108:                ri->ri_gnum = 8;
        !           109:                ri->ri_gpos = 8;
        !           110:                ri->ri_bnum = 8;
        !           111:                ri->ri_bpos = 16;
        !           112:        }
        !           113:
        !           114:        ri->ri_ops.erasecols = rasops24_erasecols;
        !           115:        ri->ri_ops.eraserows = rasops24_eraserows;
        !           116: }
        !           117:
        !           118: /*
        !           119:  * Put a single character. This is the generic version.
        !           120:  * XXX this bites - we should use masks.
        !           121:  */
        !           122: void
        !           123: rasops24_putchar(cookie, row, col, uc, attr)
        !           124:        void *cookie;
        !           125:        int row, col;
        !           126:        u_int uc;
        !           127:        long attr;
        !           128: {
        !           129:        int fb, width, height, cnt, clr[2];
        !           130:        struct rasops_info *ri;
        !           131:        u_char *dp, *rp, *fr;
        !           132:
        !           133:        ri = (struct rasops_info *)cookie;
        !           134:
        !           135: #ifdef RASOPS_CLIPPING
        !           136:        /* Catches 'row < 0' case too */
        !           137:        if ((unsigned)row >= (unsigned)ri->ri_rows)
        !           138:                return;
        !           139:
        !           140:        if ((unsigned)col >= (unsigned)ri->ri_cols)
        !           141:                return;
        !           142: #endif
        !           143:
        !           144:        rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
        !           145:        height = ri->ri_font->fontheight;
        !           146:        width = ri->ri_font->fontwidth;
        !           147:
        !           148:        clr[1] = ri->ri_devcmap[((u_int)attr >> 24) & 0xf];
        !           149:        clr[0] = ri->ri_devcmap[((u_int)attr >> 16) & 0xf];
        !           150:
        !           151:        if (uc == ' ') {
        !           152:                u_char c = clr[0];
        !           153:                while (height--) {
        !           154:                        dp = rp;
        !           155:                        rp += ri->ri_stride;
        !           156:
        !           157:                        for (cnt = width; cnt; cnt--) {
        !           158:                                *dp++ = c >> 16;
        !           159:                                *dp++ = c >> 8;
        !           160:                                *dp++ = c;
        !           161:                        }
        !           162:                }
        !           163:        } else {
        !           164:                uc -= ri->ri_font->firstchar;
        !           165:                fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
        !           166:
        !           167:                while (height--) {
        !           168:                        dp = rp;
        !           169:                        fb = fr[3] | (fr[2] << 8) | (fr[1] << 16) |
        !           170:                            (fr[0] << 24);
        !           171:                        fr += ri->ri_font->stride;
        !           172:                        rp += ri->ri_stride;
        !           173:
        !           174:                        for (cnt = width; cnt; cnt--, fb <<= 1) {
        !           175:                                if ((fb >> 31) & 1) {
        !           176:                                        *dp++ = clr[1] >> 16;
        !           177:                                        *dp++ = clr[1] >> 8;
        !           178:                                        *dp++ = clr[1];
        !           179:                                } else {
        !           180:                                        *dp++ = clr[0] >> 16;
        !           181:                                        *dp++ = clr[0] >> 8;
        !           182:                                        *dp++ = clr[0];
        !           183:                                }
        !           184:                        }
        !           185:                }
        !           186:        }
        !           187:
        !           188:        /* Do underline */
        !           189:        if ((attr & 1) != 0) {
        !           190:                u_char c = clr[1];
        !           191:
        !           192:                rp -= ri->ri_stride << 1;
        !           193:
        !           194:                while (width--) {
        !           195:                        *rp++ = c >> 16;
        !           196:                        *rp++ = c >> 8;
        !           197:                        *rp++ = c;
        !           198:                }
        !           199:        }
        !           200: }
        !           201:
        !           202: #ifndef RASOPS_SMALL
        !           203: /*
        !           204:  * Recompute the blitting stamp.
        !           205:  */
        !           206: void
        !           207: rasops24_makestamp(ri, attr)
        !           208:        struct rasops_info *ri;
        !           209:        long attr;
        !           210: {
        !           211:        u_int fg, bg, c1, c2, c3, c4;
        !           212:        int i;
        !           213:
        !           214:        fg = ri->ri_devcmap[((u_int)attr >> 24) & 0xf] & 0xffffff;
        !           215:        bg = ri->ri_devcmap[((u_int)attr >> 16) & 0xf] & 0xffffff;
        !           216:        stamp_attr = attr;
        !           217:
        !           218:        for (i = 0; i < 64; i += 4) {
        !           219: #if BYTE_ORDER == LITTLE_ENDIAN
        !           220:                c1 = (i & 32 ? fg : bg);
        !           221:                c2 = (i & 16 ? fg : bg);
        !           222:                c3 = (i & 8 ? fg : bg);
        !           223:                c4 = (i & 4 ? fg : bg);
        !           224: #else
        !           225:                c1 = (i & 8 ? fg : bg);
        !           226:                c2 = (i & 4 ? fg : bg);
        !           227:                c3 = (i & 16 ? fg : bg);
        !           228:                c4 = (i & 32 ? fg : bg);
        !           229: #endif
        !           230:                stamp[i+0] = (c1 <<  8) | (c2 >> 16);
        !           231:                stamp[i+1] = (c2 << 16) | (c3 >>  8);
        !           232:                stamp[i+2] = (c3 << 24) | c4;
        !           233:
        !           234: #if BYTE_ORDER == LITTLE_ENDIAN
        !           235:                if ((ri->ri_flg & RI_BSWAP) == 0) {
        !           236: #else
        !           237:                if ((ri->ri_flg & RI_BSWAP) != 0) {
        !           238: #endif
        !           239:                        stamp[i+0] = swap32(stamp[i+0]);
        !           240:                        stamp[i+1] = swap32(stamp[i+1]);
        !           241:                        stamp[i+2] = swap32(stamp[i+2]);
        !           242:                }
        !           243:        }
        !           244: }
        !           245:
        !           246: /*
        !           247:  * Put a single character. This is for 8-pixel wide fonts.
        !           248:  */
        !           249: void
        !           250: rasops24_putchar8(cookie, row, col, uc, attr)
        !           251:        void *cookie;
        !           252:        int row, col;
        !           253:        u_int uc;
        !           254:        long attr;
        !           255: {
        !           256:        struct rasops_info *ri;
        !           257:        int height, so, fs;
        !           258:        int32_t *rp;
        !           259:        u_char *fr;
        !           260:
        !           261:        /* Can't risk remaking the stamp if it's already in use */
        !           262:        if (stamp_mutex++) {
        !           263:                stamp_mutex--;
        !           264:                rasops24_putchar(cookie, row, col, uc, attr);
        !           265:                return;
        !           266:        }
        !           267:
        !           268:        ri = (struct rasops_info *)cookie;
        !           269:
        !           270: #ifdef RASOPS_CLIPPING
        !           271:        if ((unsigned)row >= (unsigned)ri->ri_rows) {
        !           272:                stamp_mutex--;
        !           273:                return;
        !           274:        }
        !           275:
        !           276:        if ((unsigned)col >= (unsigned)ri->ri_cols) {
        !           277:                stamp_mutex--;
        !           278:                return;
        !           279:        }
        !           280: #endif
        !           281:
        !           282:        /* Recompute stamp? */
        !           283:        if (attr != stamp_attr)
        !           284:                rasops24_makestamp(ri, attr);
        !           285:
        !           286:        rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
        !           287:        height = ri->ri_font->fontheight;
        !           288:
        !           289:        if (uc == (u_int)-1) {
        !           290:                int32_t c = stamp[0];
        !           291:                while (height--) {
        !           292:                        rp[0] = rp[1] = rp[2] = rp[3] = rp[4] = rp[5] = c;
        !           293:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           294:                }
        !           295:        } else {
        !           296:                uc -= ri->ri_font->firstchar;
        !           297:                fr = (u_char *)ri->ri_font->data + uc*ri->ri_fontscale;
        !           298:                fs = ri->ri_font->stride;
        !           299:
        !           300:                while (height--) {
        !           301:                        so = STAMP_SHIFT(fr[0], 1) & STAMP_MASK;
        !           302:                        rp[0] = STAMP_READ(so);
        !           303:                        rp[1] = STAMP_READ(so + 4);
        !           304:                        rp[2] = STAMP_READ(so + 8);
        !           305:
        !           306:                        so = STAMP_SHIFT(fr[0], 0) & STAMP_MASK;
        !           307:                        rp[3] = STAMP_READ(so);
        !           308:                        rp[4] = STAMP_READ(so + 4);
        !           309:                        rp[5] = STAMP_READ(so + 8);
        !           310:
        !           311:                        fr += fs;
        !           312:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           313:                }
        !           314:        }
        !           315:
        !           316:        /* Do underline */
        !           317:        if ((attr & 1) != 0) {
        !           318:                int32_t c = STAMP_READ(52);
        !           319:
        !           320:                DELTA(rp, -(ri->ri_stride << 1), int32_t *);
        !           321:                rp[0] = rp[1] = rp[2] = rp[3] = rp[4] = rp[5] = c;
        !           322:        }
        !           323:
        !           324:        stamp_mutex--;
        !           325: }
        !           326:
        !           327: /*
        !           328:  * Put a single character. This is for 12-pixel wide fonts.
        !           329:  */
        !           330: void
        !           331: rasops24_putchar12(cookie, row, col, uc, attr)
        !           332:        void *cookie;
        !           333:        int row, col;
        !           334:        u_int uc;
        !           335:        long attr;
        !           336: {
        !           337:        struct rasops_info *ri;
        !           338:        int height, so, fs;
        !           339:        int32_t *rp;
        !           340:        u_char *fr;
        !           341:
        !           342:        /* Can't risk remaking the stamp if it's already in use */
        !           343:        if (stamp_mutex++) {
        !           344:                stamp_mutex--;
        !           345:                rasops24_putchar(cookie, row, col, uc, attr);
        !           346:                return;
        !           347:        }
        !           348:
        !           349:        ri = (struct rasops_info *)cookie;
        !           350:
        !           351: #ifdef RASOPS_CLIPPING
        !           352:        if ((unsigned)row >= (unsigned)ri->ri_rows) {
        !           353:                stamp_mutex--;
        !           354:                return;
        !           355:        }
        !           356:
        !           357:        if ((unsigned)col >= (unsigned)ri->ri_cols) {
        !           358:                stamp_mutex--;
        !           359:                return;
        !           360:        }
        !           361: #endif
        !           362:
        !           363:        /* Recompute stamp? */
        !           364:        if (attr != stamp_attr)
        !           365:                rasops24_makestamp(ri, attr);
        !           366:
        !           367:        rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
        !           368:        height = ri->ri_font->fontheight;
        !           369:
        !           370:        if (uc == (u_int)-1) {
        !           371:                int32_t c = stamp[0];
        !           372:                while (height--) {
        !           373:                        rp[0] = rp[1] = rp[2] = rp[3] =
        !           374:                        rp[4] = rp[5] = rp[6] = rp[7] = rp[8] = c;
        !           375:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           376:                }
        !           377:        } else {
        !           378:                uc -= ri->ri_font->firstchar;
        !           379:                fr = (u_char *)ri->ri_font->data + uc*ri->ri_fontscale;
        !           380:                fs = ri->ri_font->stride;
        !           381:
        !           382:                while (height--) {
        !           383:                        so = STAMP_SHIFT(fr[0], 1) & STAMP_MASK;
        !           384:                        rp[0] = STAMP_READ(so);
        !           385:                        rp[1] = STAMP_READ(so + 4);
        !           386:                        rp[2] = STAMP_READ(so + 8);
        !           387:
        !           388:                        so = STAMP_SHIFT(fr[0], 0) & STAMP_MASK;
        !           389:                        rp[3] = STAMP_READ(so);
        !           390:                        rp[4] = STAMP_READ(so + 4);
        !           391:                        rp[5] = STAMP_READ(so + 8);
        !           392:
        !           393:                        so = STAMP_SHIFT(fr[1], 1) & STAMP_MASK;
        !           394:                        rp[6] = STAMP_READ(so);
        !           395:                        rp[7] = STAMP_READ(so + 4);
        !           396:                        rp[8] = STAMP_READ(so + 8);
        !           397:
        !           398:                        fr += fs;
        !           399:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           400:                }
        !           401:        }
        !           402:
        !           403:        /* Do underline */
        !           404:        if ((attr & 1) != 0) {
        !           405:                int32_t c = STAMP_READ(52);
        !           406:
        !           407:                DELTA(rp, -(ri->ri_stride << 1), int32_t *);
        !           408:                rp[0] = rp[1] = rp[2] = rp[3] =
        !           409:                rp[4] = rp[5] = rp[6] = rp[7] = rp[8] = c;
        !           410:        }
        !           411:
        !           412:        stamp_mutex--;
        !           413: }
        !           414:
        !           415: /*
        !           416:  * Put a single character. This is for 16-pixel wide fonts.
        !           417:  */
        !           418: void
        !           419: rasops24_putchar16(cookie, row, col, uc, attr)
        !           420:        void *cookie;
        !           421:        int row, col;
        !           422:        u_int uc;
        !           423:        long attr;
        !           424: {
        !           425:        struct rasops_info *ri;
        !           426:        int height, so, fs;
        !           427:        int32_t *rp;
        !           428:        u_char *fr;
        !           429:
        !           430:        /* Can't risk remaking the stamp if it's already in use */
        !           431:        if (stamp_mutex++) {
        !           432:                stamp_mutex--;
        !           433:                rasops24_putchar(cookie, row, col, uc, attr);
        !           434:                return;
        !           435:        }
        !           436:
        !           437:        ri = (struct rasops_info *)cookie;
        !           438:
        !           439: #ifdef RASOPS_CLIPPING
        !           440:        if ((unsigned)row >= (unsigned)ri->ri_rows) {
        !           441:                stamp_mutex--;
        !           442:                return;
        !           443:        }
        !           444:
        !           445:        if ((unsigned)col >= (unsigned)ri->ri_cols) {
        !           446:                stamp_mutex--;
        !           447:                return;
        !           448:        }
        !           449: #endif
        !           450:
        !           451:        /* Recompute stamp? */
        !           452:        if (attr != stamp_attr)
        !           453:                rasops24_makestamp(ri, attr);
        !           454:
        !           455:        rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
        !           456:        height = ri->ri_font->fontheight;
        !           457:
        !           458:        if (uc == (u_int)-1) {
        !           459:                int32_t c = stamp[0];
        !           460:                while (height--) {
        !           461:                        rp[0] = rp[1] = rp[2] = rp[3] =
        !           462:                        rp[4] = rp[5] = rp[6] = rp[7] =
        !           463:                        rp[8] = rp[9] = rp[10] = rp[11] = c;
        !           464:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           465:                }
        !           466:        } else {
        !           467:                uc -= ri->ri_font->firstchar;
        !           468:                fr = (u_char *)ri->ri_font->data + uc*ri->ri_fontscale;
        !           469:                fs = ri->ri_font->stride;
        !           470:
        !           471:                while (height--) {
        !           472:                        so = STAMP_SHIFT(fr[0], 1) & STAMP_MASK;
        !           473:                        rp[0] = STAMP_READ(so);
        !           474:                        rp[1] = STAMP_READ(so + 4);
        !           475:                        rp[2] = STAMP_READ(so + 8);
        !           476:
        !           477:                        so = STAMP_SHIFT(fr[0], 0) & STAMP_MASK;
        !           478:                        rp[3] = STAMP_READ(so);
        !           479:                        rp[4] = STAMP_READ(so + 4);
        !           480:                        rp[5] = STAMP_READ(so + 8);
        !           481:
        !           482:                        so = STAMP_SHIFT(fr[1], 1) & STAMP_MASK;
        !           483:                        rp[6] = STAMP_READ(so);
        !           484:                        rp[7] = STAMP_READ(so + 4);
        !           485:                        rp[8] = STAMP_READ(so + 8);
        !           486:
        !           487:                        so = STAMP_SHIFT(fr[1], 0) & STAMP_MASK;
        !           488:                        rp[9] = STAMP_READ(so);
        !           489:                        rp[10] = STAMP_READ(so + 4);
        !           490:                        rp[11] = STAMP_READ(so + 8);
        !           491:
        !           492:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           493:                        fr += fs;
        !           494:                }
        !           495:        }
        !           496:
        !           497:        /* Do underline */
        !           498:        if ((attr & 1) != 0) {
        !           499:                int32_t c = STAMP_READ(52);
        !           500:
        !           501:                DELTA(rp, -(ri->ri_stride << 1), int32_t *);
        !           502:                rp[0] = rp[1] = rp[2] = rp[3] =
        !           503:                rp[4] = rp[5] = rp[6] = rp[7] =
        !           504:                rp[8] = rp[9] = rp[10] = rp[11] = c;
        !           505:        }
        !           506:
        !           507:        stamp_mutex--;
        !           508: }
        !           509: #endif /* !RASOPS_SMALL */
        !           510:
        !           511: /*
        !           512:  * Erase rows. This is nice and easy due to alignment.
        !           513:  */
        !           514: void
        !           515: rasops24_eraserows(cookie, row, num, attr)
        !           516:        void *cookie;
        !           517:        int row, num;
        !           518:        long attr;
        !           519: {
        !           520:        int n9, n3, n1, cnt, stride, delta;
        !           521:        u_int32_t *dp, clr, stamp[3];
        !           522:        struct rasops_info *ri;
        !           523:
        !           524:        /*
        !           525:         * If the color is gray, we can cheat and use the generic routines
        !           526:         * (which are faster, hopefully) since the r,g,b values are the same.
        !           527:         */
        !           528:        if ((attr & 4) != 0) {
        !           529:                rasops_eraserows(cookie, row, num, attr);
        !           530:                return;
        !           531:        }
        !           532:
        !           533:        ri = (struct rasops_info *)cookie;
        !           534:
        !           535: #ifdef RASOPS_CLIPPING
        !           536:        if (row < 0) {
        !           537:                num += row;
        !           538:                row = 0;
        !           539:        }
        !           540:
        !           541:        if ((row + num) > ri->ri_rows)
        !           542:                num = ri->ri_rows - row;
        !           543:
        !           544:        if (num <= 0)
        !           545:                return;
        !           546: #endif
        !           547:
        !           548:        clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
        !           549:        stamp[0] = (clr <<  8) | (clr >> 16);
        !           550:        stamp[1] = (clr << 16) | (clr >>  8);
        !           551:        stamp[2] = (clr << 24) | clr;
        !           552:
        !           553: #if BYTE_ORDER == LITTLE_ENDIAN
        !           554:        if ((ri->ri_flg & RI_BSWAP) == 0) {
        !           555: #else
        !           556:        if ((ri->ri_flg & RI_BSWAP) != 0) {
        !           557: #endif
        !           558:                stamp[0] = swap32(stamp[0]);
        !           559:                stamp[1] = swap32(stamp[1]);
        !           560:                stamp[2] = swap32(stamp[2]);
        !           561:        }
        !           562:
        !           563:        /*
        !           564:         * XXX the wsdisplay_emulops interface seems a little deficient in
        !           565:         * that there is no way to clear the *entire* screen. We provide a
        !           566:         * workaround here: if the entire console area is being cleared, and
        !           567:         * the RI_FULLCLEAR flag is set, clear the entire display.
        !           568:         */
        !           569:        if (num == ri->ri_rows && (ri->ri_flg & RI_FULLCLEAR) != 0) {
        !           570:                stride = ri->ri_stride;
        !           571:                num = ri->ri_height;
        !           572:                dp = (int32_t *)ri->ri_origbits;
        !           573:                delta = 0;
        !           574:        } else {
        !           575:                stride = ri->ri_emustride;
        !           576:                num *= ri->ri_font->fontheight;
        !           577:                dp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale);
        !           578:                delta = ri->ri_delta;
        !           579:        }
        !           580:
        !           581:        n9 = stride / 36;
        !           582:        cnt = (n9 << 5) + (n9 << 2); /* (32*n9) + (4*n9) */
        !           583:        n3 = (stride - cnt) / 12;
        !           584:        cnt += (n3 << 3) + (n3 << 2); /* (8*n3) + (4*n3) */
        !           585:        n1 = (stride - cnt) >> 2;
        !           586:
        !           587:        while (num--) {
        !           588:                for (cnt = n9; cnt; cnt--) {
        !           589:                        dp[0] = stamp[0];
        !           590:                        dp[1] = stamp[1];
        !           591:                        dp[2] = stamp[2];
        !           592:                        dp[3] = stamp[0];
        !           593:                        dp[4] = stamp[1];
        !           594:                        dp[5] = stamp[2];
        !           595:                        dp[6] = stamp[0];
        !           596:                        dp[7] = stamp[1];
        !           597:                        dp[8] = stamp[2];
        !           598:                        dp += 9;
        !           599:                }
        !           600:
        !           601:                for (cnt = n3; cnt; cnt--) {
        !           602:                        dp[0] = stamp[0];
        !           603:                        dp[1] = stamp[1];
        !           604:                        dp[2] = stamp[2];
        !           605:                        dp += 3;
        !           606:                }
        !           607:
        !           608:                for (cnt = 0; cnt < n1; cnt++)
        !           609:                        *dp++ = stamp[cnt];
        !           610:
        !           611:                DELTA(dp, delta, int32_t *);
        !           612:        }
        !           613: }
        !           614:
        !           615: /*
        !           616:  * Erase columns.
        !           617:  */
        !           618: void
        !           619: rasops24_erasecols(cookie, row, col, num, attr)
        !           620:        void *cookie;
        !           621:        int row, col, num;
        !           622:        long attr;
        !           623: {
        !           624:        int n12, n4, height, cnt, slop, clr, stamp[3];
        !           625:        struct rasops_info *ri;
        !           626:        int32_t *dp, *rp;
        !           627:        u_char *dbp;
        !           628:
        !           629:        /*
        !           630:         * If the color is gray, we can cheat and use the generic routines
        !           631:         * (which are faster, hopefully) since the r,g,b values are the same.
        !           632:         */
        !           633:        if ((attr & 4) != 0) {
        !           634:                rasops_erasecols(cookie, row, col, num, attr);
        !           635:                return;
        !           636:        }
        !           637:
        !           638:        ri = (struct rasops_info *)cookie;
        !           639:
        !           640: #ifdef RASOPS_CLIPPING
        !           641:        /* Catches 'row < 0' case too */
        !           642:        if ((unsigned)row >= (unsigned)ri->ri_rows)
        !           643:                return;
        !           644:
        !           645:        if (col < 0) {
        !           646:                num += col;
        !           647:                col = 0;
        !           648:        }
        !           649:
        !           650:        if ((col + num) > ri->ri_cols)
        !           651:                num = ri->ri_cols - col;
        !           652:
        !           653:        if (num <= 0)
        !           654:                return;
        !           655: #endif
        !           656:
        !           657:        rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + col*ri->ri_xscale);
        !           658:        num *= ri->ri_font->fontwidth;
        !           659:        height = ri->ri_font->fontheight;
        !           660:
        !           661:        clr = ri->ri_devcmap[(attr >> 16) & 0xf] & 0xffffff;
        !           662:        stamp[0] = (clr <<  8) | (clr >> 16);
        !           663:        stamp[1] = (clr << 16) | (clr >>  8);
        !           664:        stamp[2] = (clr << 24) | clr;
        !           665:
        !           666: #if BYTE_ORDER == LITTLE_ENDIAN
        !           667:        if ((ri->ri_flg & RI_BSWAP) == 0) {
        !           668: #else
        !           669:        if ((ri->ri_flg & RI_BSWAP) != 0) {
        !           670: #endif
        !           671:                stamp[0] = swap32(stamp[0]);
        !           672:                stamp[1] = swap32(stamp[1]);
        !           673:                stamp[2] = swap32(stamp[2]);
        !           674:        }
        !           675:
        !           676:        /*
        !           677:         * The current byte offset mod 4 tells us the number of 24-bit pels
        !           678:         * we need to write for alignment to 32-bits. Once we're aligned on
        !           679:         * a 32-bit boundary, we're also aligned on a 4 pixel boundary, so
        !           680:         * the stamp does not need to be rotated. The following shows the
        !           681:         * layout of 4 pels in a 3 word region and illustrates this:
        !           682:         *
        !           683:         *      aaab bbcc cddd
        !           684:         */
        !           685:        slop = (long)rp & 3;    num -= slop;
        !           686:        n12 = num / 12;         num -= (n12 << 3) + (n12 << 2);
        !           687:        n4 = num >> 2;          num &= 3;
        !           688:
        !           689:        while (height--) {
        !           690:                dbp = (u_char *)rp;
        !           691:                DELTA(rp, ri->ri_stride, int32_t *);
        !           692:
        !           693:                /* Align to 4 bytes */
        !           694:                /* XXX handle with masks, bring under control of RI_BSWAP */
        !           695:                for (cnt = slop; cnt; cnt--) {
        !           696:                        *dbp++ = (clr >> 16);
        !           697:                        *dbp++ = (clr >> 8);
        !           698:                        *dbp++ = clr;
        !           699:                }
        !           700:
        !           701:                dp = (int32_t *)dbp;
        !           702:
        !           703:                /* 12 pels per loop */
        !           704:                for (cnt = n12; cnt; cnt--) {
        !           705:                        dp[0] = stamp[0];
        !           706:                        dp[1] = stamp[1];
        !           707:                        dp[2] = stamp[2];
        !           708:                        dp[3] = stamp[0];
        !           709:                        dp[4] = stamp[1];
        !           710:                        dp[5] = stamp[2];
        !           711:                        dp[6] = stamp[0];
        !           712:                        dp[7] = stamp[1];
        !           713:                        dp[8] = stamp[2];
        !           714:                        dp += 9;
        !           715:                }
        !           716:
        !           717:                /* 4 pels per loop */
        !           718:                for (cnt = n4; cnt; cnt--) {
        !           719:                        dp[0] = stamp[0];
        !           720:                        dp[1] = stamp[1];
        !           721:                        dp[2] = stamp[2];
        !           722:                        dp += 3;
        !           723:                }
        !           724:
        !           725:                /* Trailing slop */
        !           726:                /* XXX handle with masks, bring under control of RI_BSWAP */
        !           727:                dbp = (u_char *)dp;
        !           728:                for (cnt = num; cnt; cnt--) {
        !           729:                        *dbp++ = (clr >> 16);
        !           730:                        *dbp++ = (clr >> 8);
        !           731:                        *dbp++ = clr;
        !           732:                }
        !           733:        }
        !           734: }

CVSweb