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

Annotation of sys/dev/rasops/rasops_bitops.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: rasops_bitops.h,v 1.3 2003/02/12 20:53:59 henric Exp $ */
        !             2: /*     $NetBSD: rasops_bitops.h,v 1.6 2000/04/12 14:22:30 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: #ifndef _RASOPS_BITOPS_H_
        !            41: #define _RASOPS_BITOPS_H_ 1
        !            42:
        !            43: /*
        !            44:  * Erase columns.
        !            45:  */
        !            46: void
        !            47: NAME(erasecols)(cookie, row, col, num, attr)
        !            48:        void *cookie;
        !            49:        int row, col, num;
        !            50:        long attr;
        !            51: {
        !            52:        int lmask, rmask, lclr, rclr, clr;
        !            53:        struct rasops_info *ri;
        !            54:        int32_t *dp, *rp;
        !            55:        int height, cnt;
        !            56:
        !            57:        ri = (struct rasops_info *)cookie;
        !            58:
        !            59: #ifdef RASOPS_CLIPPING
        !            60:        if ((unsigned)row >= (unsigned)ri->ri_rows)
        !            61:                return;
        !            62:
        !            63:        if (col < 0) {
        !            64:                num += col;
        !            65:                col = 0;
        !            66:        }
        !            67:
        !            68:        if ((col + num) > ri->ri_cols)
        !            69:                num = ri->ri_cols - col;
        !            70:
        !            71:        if (num <= 0)
        !            72:                return;
        !            73: #endif
        !            74:        col *= ri->ri_font->fontwidth << PIXEL_SHIFT;
        !            75:        num *= ri->ri_font->fontwidth << PIXEL_SHIFT;
        !            76:        height = ri->ri_font->fontheight;
        !            77:        clr = ri->ri_devcmap[(attr >> 16) & 0xf];
        !            78:        rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + ((col >> 3) & ~3));
        !            79:
        !            80:        if ((col & 31) + num <= 32) {
        !            81:                lmask = ~rasops_pmask[col & 31][num];
        !            82:                lclr = clr & ~lmask;
        !            83:
        !            84:                while (height--) {
        !            85:                        dp = rp;
        !            86:                        DELTA(rp, ri->ri_stride, int32_t *);
        !            87:
        !            88:                        *dp = (*dp & lmask) | lclr;
        !            89:                }
        !            90:        } else {
        !            91:                lmask = rasops_rmask[col & 31];
        !            92:                rmask = rasops_lmask[(col + num) & 31];
        !            93:
        !            94:                if (lmask)
        !            95:                        num = (num - (32 - (col & 31))) >> 5;
        !            96:                else
        !            97:                        num = num >> 5;
        !            98:
        !            99:                lclr = clr & ~lmask;
        !           100:                rclr = clr & ~rmask;
        !           101:
        !           102:                while (height--) {
        !           103:                        dp = rp;
        !           104:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           105:
        !           106:                        if (lmask) {
        !           107:                                *dp = (*dp & lmask) | lclr;
        !           108:                                dp++;
        !           109:                        }
        !           110:
        !           111:                        for (cnt = num; cnt > 0; cnt--)
        !           112:                                *dp++ = clr;
        !           113:
        !           114:                        if (rmask)
        !           115:                                *dp = (*dp & rmask) | rclr;
        !           116:                }
        !           117:        }
        !           118: }
        !           119:
        !           120: /*
        !           121:  * Actually paint the cursor.
        !           122:  */
        !           123: void
        !           124: NAME(do_cursor)(ri)
        !           125:        struct rasops_info *ri;
        !           126: {
        !           127:        int lmask, rmask, height, row, col, num;
        !           128:        int32_t *dp, *rp;
        !           129:
        !           130:        row = ri->ri_crow;
        !           131:        col = ri->ri_ccol * ri->ri_font->fontwidth << PIXEL_SHIFT;
        !           132:        height = ri->ri_font->fontheight;
        !           133:        num = ri->ri_font->fontwidth << PIXEL_SHIFT;
        !           134:        rp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale + ((col >> 3) & ~3));
        !           135:
        !           136:        if ((col & 31) + num <= 32) {
        !           137:                lmask = rasops_pmask[col & 31][num];
        !           138:
        !           139:                while (height--) {
        !           140:                        dp = rp;
        !           141:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           142:                        *dp ^= lmask;
        !           143:                }
        !           144:        } else {
        !           145:                lmask = ~rasops_rmask[col & 31];
        !           146:                rmask = ~rasops_lmask[(col + num) & 31];
        !           147:
        !           148:                while (height--) {
        !           149:                        dp = rp;
        !           150:                        DELTA(rp, ri->ri_stride, int32_t *);
        !           151:
        !           152:                        if (lmask != -1)
        !           153:                                *dp++ ^= lmask;
        !           154:
        !           155:                        if (rmask != -1)
        !           156:                                *dp ^= rmask;
        !           157:                }
        !           158:        }
        !           159: }
        !           160:
        !           161: /*
        !           162:  * Copy columns. Ick!
        !           163:  */
        !           164: void
        !           165: NAME(copycols)(cookie, row, src, dst, num)
        !           166:        void *cookie;
        !           167:        int row, src, dst, num;
        !           168: {
        !           169:        int tmp, lmask, rmask, height, lnum, rnum, sb, db, cnt, full;
        !           170:        int32_t *sp, *dp, *srp, *drp;
        !           171:        struct rasops_info *ri;
        !           172:
        !           173:        ri = (struct rasops_info *)cookie;
        !           174:
        !           175: #ifdef RASOPS_CLIPPING
        !           176:        if (dst == src)
        !           177:                return;
        !           178:
        !           179:        /* Catches < 0 case too */
        !           180:        if ((unsigned)row >= (unsigned)ri->ri_rows)
        !           181:                return;
        !           182:
        !           183:        if (src < 0) {
        !           184:                num += src;
        !           185:                src = 0;
        !           186:        }
        !           187:
        !           188:        if ((src + num) > ri->ri_cols)
        !           189:                num = ri->ri_cols - src;
        !           190:
        !           191:        if (dst < 0) {
        !           192:                num += dst;
        !           193:                dst = 0;
        !           194:        }
        !           195:
        !           196:        if ((dst + num) > ri->ri_cols)
        !           197:                num = ri->ri_cols - dst;
        !           198:
        !           199:        if (num <= 0)
        !           200:                return;
        !           201: #endif
        !           202:
        !           203:        cnt = ri->ri_font->fontwidth << PIXEL_SHIFT;
        !           204:        src *= cnt;
        !           205:        dst *= cnt;
        !           206:        num *= cnt;
        !           207:        row *= ri->ri_yscale;
        !           208:        height = ri->ri_font->fontheight;
        !           209:        db = dst & 31;
        !           210:
        !           211:        if (db + num <= 32) {
        !           212:                /* Destination is contained within a single word */
        !           213:                srp = (int32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
        !           214:                drp = (int32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
        !           215:                sb = src & 31;
        !           216:
        !           217:                while (height--) {
        !           218:                        GETBITS(srp, sb, num, tmp);
        !           219:                        PUTBITS(tmp, db, num, drp);
        !           220:                        DELTA(srp, ri->ri_stride, int32_t *);
        !           221:                        DELTA(drp, ri->ri_stride, int32_t *);
        !           222:                }
        !           223:
        !           224:                return;
        !           225:        }
        !           226:
        !           227:        lmask = rasops_rmask[db];
        !           228:        rmask = rasops_lmask[(dst + num) & 31];
        !           229:        lnum = (32 - db) & 31;
        !           230:        rnum = (dst + num) & 31;
        !           231:
        !           232:        if (lmask)
        !           233:                full = (num - (32 - (dst & 31))) >> 5;
        !           234:        else
        !           235:                full = num >> 5;
        !           236:
        !           237:        if (src < dst && src + num > dst) {
        !           238:                /* Copy right-to-left */
        !           239:                sb = src & 31;
        !           240:                src = src + num;
        !           241:                dst = dst + num;
        !           242:                srp = (int32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
        !           243:                drp = (int32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
        !           244:
        !           245:                src = src & 31;
        !           246:                rnum = 32 - lnum;
        !           247:                db = dst & 31;
        !           248:
        !           249:                if ((src -= db) < 0) {
        !           250:                        sp--;
        !           251:                        src += 32;
        !           252:                }
        !           253:
        !           254:                while (height--) {
        !           255:                        sp = srp;
        !           256:                        dp = drp;
        !           257:                        DELTA(srp, ri->ri_stride, int32_t *);
        !           258:                        DELTA(drp, ri->ri_stride, int32_t *);
        !           259:
        !           260:                        if (db) {
        !           261:                                GETBITS(sp, src, db, tmp);
        !           262:                                PUTBITS(tmp, 0, db, dp);
        !           263:                                dp--;
        !           264:                                sp--;
        !           265:                        }
        !           266:
        !           267:                        /* Now aligned to 32-bits wrt dp */
        !           268:                        for (cnt = full; cnt; cnt--, sp--) {
        !           269:                                GETBITS(sp, src, 32, tmp);
        !           270:                                *dp-- = tmp;
        !           271:                        }
        !           272:
        !           273:                        if (lmask) {
        !           274: #if 0
        !           275:                                if (src > sb)
        !           276:                                        sp++;
        !           277: #endif
        !           278:                                GETBITS(sp, sb, lnum, tmp);
        !           279:                                PUTBITS(tmp, rnum, lnum, dp);
        !           280:                        }
        !           281:                }
        !           282:        } else {
        !           283:                /* Copy left-to-right */
        !           284:                srp = (int32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
        !           285:                drp = (int32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
        !           286:                db = dst & 31;
        !           287:
        !           288:                while (height--) {
        !           289:                        sb = src & 31;
        !           290:                        sp = srp;
        !           291:                        dp = drp;
        !           292:                        DELTA(srp, ri->ri_stride, int32_t *);
        !           293:                        DELTA(drp, ri->ri_stride, int32_t *);
        !           294:
        !           295:                        if (lmask) {
        !           296:                                GETBITS(sp, sb, lnum, tmp);
        !           297:                                PUTBITS(tmp, db, lnum, dp);
        !           298:                                dp++;
        !           299:
        !           300:                                if ((sb += lnum) > 31) {
        !           301:                                        sp++;
        !           302:                                        sb -= 32;
        !           303:                                }
        !           304:                        }
        !           305:
        !           306:                        /* Now aligned to 32-bits wrt dp */
        !           307:                        for (cnt = full; cnt; cnt--, sp++) {
        !           308:                                GETBITS(sp, sb, 32, tmp);
        !           309:                                *dp++ = tmp;
        !           310:                        }
        !           311:
        !           312:                        if (rmask) {
        !           313:                                GETBITS(sp, sb, rnum, tmp);
        !           314:                                PUTBITS(tmp, 0, rnum, dp);
        !           315:                        }
        !           316:                }
        !           317:        }
        !           318: }
        !           319:
        !           320: #endif /* _RASOPS_BITOPS_H_ */

CVSweb