Home | History | Annotate | Line # | Download | only in rasops
rasops_bitops.h revision 1.10.14.1
      1  1.10.14.1      jym /* 	$NetBSD: rasops_bitops.h,v 1.10.14.1 2009/05/13 17:21:17 jym Exp $	*/
      2        1.1       ad 
      3        1.3       ad /*-
      4        1.3       ad  * Copyright (c) 1999 The NetBSD Foundation, Inc.
      5        1.1       ad  * All rights reserved.
      6        1.1       ad  *
      7        1.3       ad  * This code is derived from software contributed to The NetBSD Foundation
      8        1.7       ad  * by Andrew Doran.
      9        1.3       ad  *
     10        1.1       ad  * Redistribution and use in source and binary forms, with or without
     11        1.1       ad  * modification, are permitted provided that the following conditions
     12        1.1       ad  * are met:
     13        1.1       ad  * 1. Redistributions of source code must retain the above copyright
     14        1.1       ad  *    notice, this list of conditions and the following disclaimer.
     15        1.1       ad  * 2. Redistributions in binary form must reproduce the above copyright
     16        1.1       ad  *    notice, this list of conditions and the following disclaimer in the
     17        1.1       ad  *    documentation and/or other materials provided with the distribution.
     18        1.1       ad  *
     19        1.3       ad  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20        1.3       ad  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21        1.3       ad  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22        1.3       ad  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23        1.3       ad  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24        1.3       ad  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25        1.3       ad  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26        1.3       ad  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27        1.3       ad  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28        1.3       ad  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29        1.3       ad  * POSSIBILITY OF SUCH DAMAGE.
     30        1.1       ad  */
     31        1.1       ad 
     32        1.1       ad #ifndef _RASOPS_BITOPS_H_
     33        1.1       ad #define _RASOPS_BITOPS_H_ 1
     34        1.1       ad 
     35        1.1       ad /*
     36        1.1       ad  * Erase columns.
     37        1.1       ad  */
     38        1.1       ad static void
     39  1.10.14.1      jym NAME(erasecols)(void *cookie, int row, int col, int num, long attr)
     40        1.1       ad {
     41        1.5       ad 	int lmask, rmask, lclr, rclr, clr;
     42        1.1       ad 	struct rasops_info *ri;
     43        1.5       ad 	int32_t *dp, *rp;
     44        1.1       ad 	int height, cnt;
     45        1.6       pk 
     46        1.1       ad 	ri = (struct rasops_info *)cookie;
     47        1.1       ad 
     48        1.6       pk #ifdef RASOPS_CLIPPING
     49        1.1       ad 	if ((unsigned)row >= (unsigned)ri->ri_rows)
     50        1.1       ad 		return;
     51        1.1       ad 
     52        1.1       ad 	if (col < 0) {
     53        1.1       ad 		num += col;
     54        1.1       ad 		col = 0;
     55        1.1       ad 	}
     56        1.1       ad 
     57        1.1       ad 	if ((col + num) > ri->ri_cols)
     58        1.1       ad 		num = ri->ri_cols - col;
     59        1.6       pk 
     60        1.1       ad 	if (num <= 0)
     61        1.1       ad 		return;
     62        1.1       ad #endif
     63        1.1       ad 	col *= ri->ri_font->fontwidth << PIXEL_SHIFT;
     64        1.1       ad 	num *= ri->ri_font->fontwidth << PIXEL_SHIFT;
     65        1.1       ad 	height = ri->ri_font->fontheight;
     66        1.6       pk 	clr = ri->ri_devcmap[(attr >> 16) & 0xf];
     67        1.1       ad 	rp = (int32_t *)(ri->ri_bits + row*ri->ri_yscale + ((col >> 3) & ~3));
     68        1.1       ad 
     69        1.1       ad 	if ((col & 31) + num <= 32) {
     70        1.1       ad 		lmask = ~rasops_pmask[col & 31][num];
     71        1.1       ad 		lclr = clr & ~lmask;
     72        1.1       ad 
     73        1.1       ad 		while (height--) {
     74        1.1       ad 			dp = rp;
     75        1.1       ad 			DELTA(rp, ri->ri_stride, int32_t *);
     76        1.1       ad 
     77        1.1       ad 			*dp = (*dp & lmask) | lclr;
     78        1.1       ad 		}
     79        1.1       ad 	} else {
     80        1.1       ad 		lmask = rasops_rmask[col & 31];
     81        1.1       ad 		rmask = rasops_lmask[(col + num) & 31];
     82        1.6       pk 
     83        1.1       ad 		if (lmask)
     84        1.1       ad 			num = (num - (32 - (col & 31))) >> 5;
     85        1.1       ad 		else
     86        1.1       ad 			num = num >> 5;
     87        1.6       pk 
     88        1.1       ad 		lclr = clr & ~lmask;
     89        1.1       ad 		rclr = clr & ~rmask;
     90        1.1       ad 
     91        1.1       ad 		while (height--) {
     92        1.1       ad 			dp = rp;
     93        1.1       ad 			DELTA(rp, ri->ri_stride, int32_t *);
     94        1.1       ad 
     95        1.8  thorpej 			if (lmask) {
     96        1.8  thorpej 				*dp = (*dp & lmask) | lclr;
     97        1.8  thorpej 				dp++;
     98        1.8  thorpej 			}
     99        1.1       ad 
    100        1.1       ad 			for (cnt = num; cnt > 0; cnt--)
    101        1.1       ad 				*dp++ = clr;
    102        1.1       ad 
    103        1.1       ad 			if (rmask)
    104        1.1       ad 				*dp = (*dp & rmask) | rclr;
    105        1.1       ad 		}
    106        1.1       ad 	}
    107        1.1       ad }
    108        1.1       ad 
    109        1.1       ad /*
    110        1.1       ad  * Actually paint the cursor.
    111        1.1       ad  */
    112        1.1       ad static void
    113  1.10.14.1      jym NAME(do_cursor)(struct rasops_info *ri)
    114        1.1       ad {
    115        1.5       ad 	int lmask, rmask, height, row, col, num;
    116        1.5       ad 	int32_t *dp, *rp;
    117        1.6       pk 
    118        1.1       ad 	row = ri->ri_crow;
    119        1.1       ad 	col = ri->ri_ccol * ri->ri_font->fontwidth << PIXEL_SHIFT;
    120        1.1       ad 	height = ri->ri_font->fontheight;
    121        1.1       ad 	num = ri->ri_font->fontwidth << PIXEL_SHIFT;
    122        1.1       ad 	rp = (int32_t *)(ri->ri_bits + row * ri->ri_yscale + ((col >> 3) & ~3));
    123        1.6       pk 
    124        1.1       ad 	if ((col & 31) + num <= 32) {
    125        1.1       ad 		lmask = rasops_pmask[col & 31][num];
    126        1.1       ad 
    127        1.1       ad 		while (height--) {
    128        1.1       ad 			dp = rp;
    129        1.1       ad 			DELTA(rp, ri->ri_stride, int32_t *);
    130        1.1       ad 			*dp ^= lmask;
    131        1.1       ad 		}
    132        1.1       ad 	} else {
    133        1.1       ad 		lmask = ~rasops_rmask[col & 31];
    134        1.1       ad 		rmask = ~rasops_lmask[(col + num) & 31];
    135        1.1       ad 
    136        1.1       ad 		while (height--) {
    137        1.1       ad 			dp = rp;
    138        1.1       ad 			DELTA(rp, ri->ri_stride, int32_t *);
    139        1.1       ad 
    140        1.1       ad 			if (lmask != -1)
    141        1.1       ad 				*dp++ ^= lmask;
    142        1.1       ad 
    143        1.1       ad 			if (rmask != -1)
    144        1.1       ad 				*dp ^= rmask;
    145        1.1       ad 		}
    146        1.1       ad 	}
    147        1.1       ad }
    148        1.1       ad 
    149        1.1       ad /*
    150        1.4       ad  * Copy columns. Ick!
    151        1.1       ad  */
    152        1.1       ad static void
    153  1.10.14.1      jym NAME(copycols)(void *cookie, int row, int src, int dst, int num)
    154        1.1       ad {
    155        1.5       ad 	int tmp, lmask, rmask, height, lnum, rnum, sb, db, cnt, full;
    156        1.5       ad 	int32_t *sp, *dp, *srp, *drp;
    157        1.1       ad 	struct rasops_info *ri;
    158        1.6       pk 
    159        1.9      mrg 	sp = NULL;	/* XXX gcc */
    160        1.9      mrg 
    161        1.1       ad 	ri = (struct rasops_info *)cookie;
    162        1.1       ad 
    163        1.1       ad #ifdef RASOPS_CLIPPING
    164        1.1       ad 	if (dst == src)
    165        1.1       ad 		return;
    166        1.6       pk 
    167        1.1       ad 	/* Catches < 0 case too */
    168        1.1       ad 	if ((unsigned)row >= (unsigned)ri->ri_rows)
    169        1.1       ad 		return;
    170        1.6       pk 
    171        1.1       ad 	if (src < 0) {
    172        1.1       ad 		num += src;
    173        1.1       ad 		src = 0;
    174        1.1       ad 	}
    175        1.1       ad 
    176        1.1       ad 	if ((src + num) > ri->ri_cols)
    177        1.1       ad 		num = ri->ri_cols - src;
    178        1.1       ad 
    179        1.1       ad 	if (dst < 0) {
    180        1.1       ad 		num += dst;
    181        1.1       ad 		dst = 0;
    182        1.1       ad 	}
    183        1.1       ad 
    184        1.1       ad 	if ((dst + num) > ri->ri_cols)
    185        1.1       ad 		num = ri->ri_cols - dst;
    186        1.6       pk 
    187        1.1       ad 	if (num <= 0)
    188        1.1       ad 		return;
    189        1.1       ad #endif
    190        1.6       pk 
    191        1.1       ad 	cnt = ri->ri_font->fontwidth << PIXEL_SHIFT;
    192        1.1       ad 	src *= cnt;
    193        1.1       ad 	dst *= cnt;
    194        1.1       ad 	num *= cnt;
    195        1.1       ad 	row *= ri->ri_yscale;
    196        1.1       ad 	height = ri->ri_font->fontheight;
    197        1.4       ad 	db = dst & 31;
    198        1.1       ad 
    199        1.6       pk 	if (db + num <= 32) {
    200        1.4       ad 		/* Destination is contained within a single word */
    201        1.1       ad 		srp = (int32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
    202        1.1       ad 		drp = (int32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
    203        1.1       ad 		sb = src & 31;
    204        1.1       ad 
    205        1.1       ad 		while (height--) {
    206        1.1       ad 			GETBITS(srp, sb, num, tmp);
    207        1.1       ad 			PUTBITS(tmp, db, num, drp);
    208        1.6       pk 			DELTA(srp, ri->ri_stride, int32_t *);
    209        1.6       pk 			DELTA(drp, ri->ri_stride, int32_t *);
    210        1.1       ad 		}
    211        1.6       pk 
    212        1.1       ad 		return;
    213        1.1       ad 	}
    214        1.1       ad 
    215        1.4       ad 	lmask = rasops_rmask[db];
    216        1.1       ad 	rmask = rasops_lmask[(dst + num) & 31];
    217        1.4       ad 	lnum = (32 - db) & 31;
    218        1.6       pk 	rnum = (dst + num) & 31;
    219        1.6       pk 
    220        1.1       ad 	if (lmask)
    221        1.1       ad 		full = (num - (32 - (dst & 31))) >> 5;
    222        1.1       ad 	else
    223        1.1       ad 		full = num >> 5;
    224        1.1       ad 
    225        1.4       ad 	if (src < dst && src + num > dst) {
    226        1.4       ad 		/* Copy right-to-left */
    227        1.4       ad 		sb = src & 31;
    228        1.1       ad 		src = src + num;
    229        1.1       ad 		dst = dst + num;
    230        1.1       ad 		srp = (int32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
    231        1.1       ad 		drp = (int32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
    232        1.1       ad 
    233        1.1       ad 		src = src & 31;
    234        1.4       ad 		rnum = 32 - lnum;
    235        1.1       ad 		db = dst & 31;
    236        1.6       pk 
    237        1.4       ad 		if ((src -= db) < 0) {
    238        1.4       ad 			sp--;
    239        1.4       ad 			src += 32;
    240        1.4       ad 		}
    241        1.6       pk 
    242        1.1       ad 		while (height--) {
    243        1.1       ad 			sp = srp;
    244        1.1       ad 			dp = drp;
    245        1.6       pk 			DELTA(srp, ri->ri_stride, int32_t *);
    246        1.1       ad 			DELTA(drp, ri->ri_stride, int32_t *);
    247        1.6       pk 
    248        1.1       ad 			if (db) {
    249        1.4       ad 				GETBITS(sp, src, db, tmp);
    250        1.4       ad 				PUTBITS(tmp, 0, db, dp);
    251        1.1       ad 				dp--;
    252        1.4       ad 				sp--;
    253        1.1       ad 			}
    254        1.1       ad 
    255        1.4       ad 			/* Now aligned to 32-bits wrt dp */
    256        1.1       ad 			for (cnt = full; cnt; cnt--, sp--) {
    257        1.4       ad 				GETBITS(sp, src, 32, tmp);
    258        1.1       ad 				*dp-- = tmp;
    259        1.1       ad 			}
    260        1.1       ad 
    261        1.1       ad 			if (lmask) {
    262        1.5       ad #if 0
    263        1.5       ad 				if (src > sb)
    264        1.5       ad 					sp++;
    265        1.5       ad #endif
    266        1.4       ad 				GETBITS(sp, sb, lnum, tmp);
    267        1.4       ad 				PUTBITS(tmp, rnum, lnum, dp);
    268        1.1       ad  			}
    269        1.1       ad  		}
    270        1.1       ad 	} else {
    271        1.4       ad 		/* Copy left-to-right */
    272        1.1       ad 		srp = (int32_t *)(ri->ri_bits + row + ((src >> 3) & ~3));
    273        1.1       ad 		drp = (int32_t *)(ri->ri_bits + row + ((dst >> 3) & ~3));
    274        1.1       ad 		db = dst & 31;
    275        1.1       ad 
    276        1.1       ad 		while (height--) {
    277        1.1       ad 			sb = src & 31;
    278        1.1       ad 			sp = srp;
    279        1.1       ad 			dp = drp;
    280        1.6       pk 			DELTA(srp, ri->ri_stride, int32_t *);
    281        1.6       pk 			DELTA(drp, ri->ri_stride, int32_t *);
    282        1.6       pk 
    283        1.1       ad 			if (lmask) {
    284        1.1       ad 				GETBITS(sp, sb, lnum, tmp);
    285        1.1       ad 				PUTBITS(tmp, db, lnum, dp);
    286        1.1       ad 				dp++;
    287        1.6       pk 
    288        1.1       ad 				if ((sb += lnum) > 31) {
    289        1.1       ad 					sp++;
    290        1.1       ad 					sb -= 32;
    291        1.1       ad 				}
    292        1.1       ad 			}
    293        1.6       pk 
    294        1.4       ad 			/* Now aligned to 32-bits wrt dp */
    295        1.4       ad 			for (cnt = full; cnt; cnt--, sp++) {
    296        1.1       ad 				GETBITS(sp, sb, 32, tmp);
    297        1.1       ad 				*dp++ = tmp;
    298        1.1       ad 			}
    299        1.1       ad 
    300        1.1       ad 			if (rmask) {
    301        1.1       ad 				GETBITS(sp, sb, rnum, tmp);
    302        1.1       ad 				PUTBITS(tmp, 0, rnum, dp);
    303        1.1       ad  			}
    304        1.1       ad  		}
    305        1.1       ad  	}
    306        1.1       ad }
    307        1.5       ad 
    308        1.1       ad #endif /* _RASOPS_BITOPS_H_ */
    309