root/dev/rasops/rasops_bitops.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. NAME

    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_ */

/* [<][>][^][v][top][bottom][index][help] */