root/dev/rasops/rasops1.c

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

DEFINITIONS

This source file includes following definitions.
  1. rasops1_init
  2. rasops1_putchar
  3. rasops1_putchar8
  4. rasops1_putchar16

    1 /*      $OpenBSD: rasops1.c,v 1.5 2006/08/03 18:42:06 miod Exp $        */
    2 /*      $NetBSD: rasops1.c,v 1.11 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 #include <machine/endian.h>
   44 
   45 #include <dev/wscons/wsdisplayvar.h>
   46 #include <dev/wscons/wsconsio.h>
   47 #include <dev/rasops/rasops.h>
   48 #include <dev/rasops/rasops_masks.h>
   49 
   50 void    rasops1_copycols(void *, int, int, int, int);
   51 void    rasops1_erasecols(void *, int, int, int, long);
   52 void    rasops1_do_cursor(struct rasops_info *);
   53 void    rasops1_putchar(void *, int, int col, u_int, long);
   54 #ifndef RASOPS_SMALL
   55 void    rasops1_putchar8(void *, int, int col, u_int, long);
   56 void    rasops1_putchar16(void *, int, int col, u_int, long);
   57 #endif
   58 
   59 /*
   60  * Initialize rasops_info struct for this colordepth.
   61  */
   62 void
   63 rasops1_init(ri)
   64         struct rasops_info *ri;
   65 {
   66         rasops_masks_init();
   67 
   68         switch (ri->ri_font->fontwidth) {
   69 #ifndef RASOPS_SMALL
   70         case 8:
   71                 ri->ri_ops.putchar = rasops1_putchar8;
   72                 break;
   73         case 16:
   74                 ri->ri_ops.putchar = rasops1_putchar16;
   75                 break;
   76 #endif
   77         default:
   78                 ri->ri_ops.putchar = rasops1_putchar;
   79                 break;
   80         }
   81 
   82         if ((ri->ri_font->fontwidth & 7) != 0) {
   83                 ri->ri_ops.erasecols = rasops1_erasecols;
   84                 ri->ri_ops.copycols = rasops1_copycols;
   85                 ri->ri_do_cursor = rasops1_do_cursor;
   86         }
   87 }
   88 
   89 /*
   90  * Paint a single character. This is the generic version, this is ugly.
   91  */
   92 void
   93 rasops1_putchar(cookie, row, col, uc, attr)
   94         void *cookie;
   95         int row, col;
   96         u_int uc;
   97         long attr;
   98 {
   99         u_int fs, rs, fb, bg, fg, lmask, rmask;
  100         u_int32_t height, width;
  101         struct rasops_info *ri;
  102         int32_t *rp;
  103         u_char *fr;
  104 
  105         ri = (struct rasops_info *)cookie;
  106 
  107 #ifdef RASOPS_CLIPPING
  108         /* Catches 'row < 0' case too */
  109         if ((unsigned)row >= (unsigned)ri->ri_rows)
  110                 return;
  111 
  112         if ((unsigned)col >= (unsigned)ri->ri_cols)
  113                 return;
  114 #endif
  115 
  116         col *= ri->ri_font->fontwidth;
  117         rp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale + ((col >> 3) & ~3));
  118         height = ri->ri_font->fontheight;
  119         width = ri->ri_font->fontwidth;
  120         col = col & 31;
  121         rs = ri->ri_stride;
  122 
  123         bg = (attr & 0x000f0000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
  124         fg = (attr & 0x0f000000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
  125 
  126         /* If fg and bg match this becomes a space character */
  127         if (fg == bg || uc == ' ') {
  128                 uc = (u_int)-1;
  129                 fr = 0;         /* shutup gcc */
  130                 fs = 0;         /* shutup gcc */
  131         } else {
  132                 uc -= ri->ri_font->firstchar;
  133                 fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
  134                 fs = ri->ri_font->stride;
  135         }
  136 
  137         /* Single word, one mask */
  138         if ((col + width) <= 32) {
  139                 rmask = rasops_pmask[col][width];
  140                 lmask = ~rmask;
  141 
  142                 if (uc == (u_int)-1) {
  143                         bg &= rmask;
  144 
  145                         while (height--) {
  146                                 *rp = (*rp & lmask) | bg;
  147                                 DELTA(rp, rs, int32_t *);
  148                         }
  149                 } else {
  150                         /* NOT fontbits if bg is white */
  151                         if (bg) {
  152                                 while (height--) {
  153                                         fb = ~(fr[3] | (fr[2] << 8) |
  154                                             (fr[1] << 16) | (fr[0] << 24));
  155                                         *rp = (*rp & lmask)
  156                                             | (MBE(fb >> col) & rmask);
  157 
  158                                         fr += fs;
  159                                         DELTA(rp, rs, int32_t *);
  160                                 }
  161                         } else {
  162                                 while (height--) {
  163                                         fb = (fr[3] | (fr[2] << 8) |
  164                                             (fr[1] << 16) | (fr[0] << 24));
  165                                         *rp = (*rp & lmask)
  166                                             | (MBE(fb >> col) & rmask);
  167 
  168                                         fr += fs;
  169                                         DELTA(rp, rs, int32_t *);
  170                                 }
  171                         }
  172                 }
  173 
  174                 /* Do underline */
  175                 if ((attr & 1) != 0) {
  176                         DELTA(rp, -(ri->ri_stride << 1), int32_t *);
  177                         *rp = (*rp & lmask) | (fg & rmask);
  178                 }
  179         } else {
  180                 lmask = ~rasops_lmask[col];
  181                 rmask = ~rasops_rmask[(col + width) & 31];
  182 
  183                 if (uc == (u_int)-1) {
  184                         width = bg & ~rmask;
  185                         bg = bg & ~lmask;
  186 
  187                         while (height--) {
  188                                 rp[0] = (rp[0] & lmask) | bg;
  189                                 rp[1] = (rp[1] & rmask) | width;
  190                                 DELTA(rp, rs, int32_t *);
  191                         }
  192                 } else {
  193                         width = 32 - col;
  194 
  195                         /* NOT fontbits if bg is white */
  196                         if (bg) {
  197                                 while (height--) {
  198                                         fb = ~(fr[3] | (fr[2] << 8) |
  199                                             (fr[1] << 16) | (fr[0] << 24));
  200 
  201                                         rp[0] = (rp[0] & lmask)
  202                                             | MBE((u_int)fb >> col);
  203 
  204                                         rp[1] = (rp[1] & rmask)
  205                                             | (MBE((u_int)fb << width) & ~rmask);
  206 
  207                                         fr += fs;
  208                                         DELTA(rp, rs, int32_t *);
  209                                 }
  210                         } else {
  211                                 while (height--) {
  212                                         fb = (fr[3] | (fr[2] << 8) |
  213                                             (fr[1] << 16) | (fr[0] << 24));
  214 
  215                                         rp[0] = (rp[0] & lmask)
  216                                             | MBE(fb >> col);
  217 
  218                                         rp[1] = (rp[1] & rmask)
  219                                             | (MBE(fb << width) & ~rmask);
  220 
  221                                         fr += fs;
  222                                         DELTA(rp, rs, int32_t *);
  223                                 }
  224                         }
  225                 }
  226 
  227                 /* Do underline */
  228                 if ((attr & 1) != 0) {
  229                         DELTA(rp, -(ri->ri_stride << 1), int32_t *);
  230                         rp[0] = (rp[0] & lmask) | (fg & ~lmask);
  231                         rp[1] = (rp[1] & rmask) | (fg & ~rmask);
  232                 }
  233         }
  234 }
  235 
  236 #ifndef RASOPS_SMALL
  237 /*
  238  * Paint a single character. This is for 8-pixel wide fonts.
  239  */
  240 void
  241 rasops1_putchar8(cookie, row, col, uc, attr)
  242         void *cookie;
  243         int row, col;
  244         u_int uc;
  245         long attr;
  246 {
  247         int height, fs, rs, bg, fg;
  248         struct rasops_info *ri;
  249         u_char *fr, *rp;
  250 
  251         ri = (struct rasops_info *)cookie;
  252 
  253 #ifdef RASOPS_CLIPPING
  254         /* Catches 'row < 0' case too */
  255         if ((unsigned)row >= (unsigned)ri->ri_rows)
  256                 return;
  257 
  258         if ((unsigned)col >= (unsigned)ri->ri_cols)
  259                 return;
  260 #endif
  261 
  262         rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
  263         height = ri->ri_font->fontheight;
  264         rs = ri->ri_stride;
  265 
  266         bg = (attr & 0x000f0000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
  267         fg = (attr & 0x0f000000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
  268 
  269         /* If fg and bg match this becomes a space character */
  270         if (fg == bg || uc == ' ') {
  271                 while (height--) {
  272                         *rp = bg;
  273                         rp += rs;
  274                 }
  275         } else {
  276                 uc -= ri->ri_font->firstchar;
  277                 fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
  278                 fs = ri->ri_font->stride;
  279 
  280                 /* NOT fontbits if bg is white */
  281                 if (bg) {
  282                         while (height--) {
  283                                 *rp = ~*fr;
  284                                 fr += fs;
  285                                 rp += rs;
  286                         }
  287                 } else {
  288                         while (height--) {
  289                                 *rp = *fr;
  290                                 fr += fs;
  291                                 rp += rs;
  292                         }
  293                 }
  294 
  295         }
  296 
  297         /* Do underline */
  298         if ((attr & 1) != 0)
  299                 rp[-(ri->ri_stride << 1)] = fg;
  300 }
  301 
  302 /*
  303  * Paint a single character. This is for 16-pixel wide fonts.
  304  */
  305 void
  306 rasops1_putchar16(cookie, row, col, uc, attr)
  307         void *cookie;
  308         int row, col;
  309         u_int uc;
  310         long attr;
  311 {
  312         int height, fs, rs, bg, fg;
  313         struct rasops_info *ri;
  314         u_char *fr, *rp;
  315 
  316         ri = (struct rasops_info *)cookie;
  317 
  318 #ifdef RASOPS_CLIPPING
  319         /* Catches 'row < 0' case too */
  320         if ((unsigned)row >= (unsigned)ri->ri_rows)
  321                 return;
  322 
  323         if ((unsigned)col >= (unsigned)ri->ri_cols)
  324                 return;
  325 #endif
  326 
  327         rp = ri->ri_bits + row * ri->ri_yscale + col * ri->ri_xscale;
  328         height = ri->ri_font->fontheight;
  329         rs = ri->ri_stride;
  330 
  331         bg = (attr & 0x000f0000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
  332         fg = (attr & 0x0f000000) ? ri->ri_devcmap[1] : ri->ri_devcmap[0];
  333 
  334         /* If fg and bg match this becomes a space character */
  335         if (fg == bg || uc == ' ') {
  336                 while (height--) {
  337                         *(int16_t *)rp = bg;
  338                         rp += rs;
  339                 }
  340         } else {
  341                 uc -= ri->ri_font->firstchar;
  342                 fr = (u_char *)ri->ri_font->data + uc * ri->ri_fontscale;
  343                 fs = ri->ri_font->stride;
  344 
  345                 /* NOT fontbits if bg is white */
  346                 if (bg) {
  347                         while (height--) {
  348                                 rp[0] = ~fr[0];
  349                                 rp[1] = ~fr[1];
  350                                 fr += fs;
  351                                 rp += rs;
  352                         }
  353                 } else {
  354                         while (height--) {
  355                                 rp[0] = fr[0];
  356                                 rp[1] = fr[1];
  357                                 fr += fs;
  358                                 rp += rs;
  359                         }
  360                 }
  361         }
  362 
  363         /* Do underline */
  364         if ((attr & 1) != 0)
  365                 *(int16_t *)(rp - (ri->ri_stride << 1)) = fg;
  366 }
  367 #endif  /* !RASOPS_SMALL */
  368 
  369 /*
  370  * Grab routines common to depths where (bpp < 8)
  371  */
  372 #define NAME(ident)     rasops1_##ident
  373 #define PIXEL_SHIFT     0
  374 
  375 #include <dev/rasops/rasops_bitops.h>

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