Home | History | Annotate | Line # | Download | only in common
ite_subr.c revision 1.5.108.2
      1  1.5.108.2   bouyer /*	$NetBSD: ite_subr.c,v 1.5.108.2 2011/02/17 11:59:41 bouyer Exp $	*/
      2        1.1  thorpej 
      3        1.1  thorpej /*
      4  1.5.108.2   bouyer  * Copyright (c) 1988 University of Utah.
      5        1.1  thorpej  * Copyright (c) 1990, 1993
      6        1.1  thorpej  *	The Regents of the University of California.  All rights reserved.
      7        1.2      agc  *
      8        1.2      agc  * This code is derived from software contributed to Berkeley by
      9        1.2      agc  * the Systems Programming Group of the University of Utah Computer
     10        1.2      agc  * Science Department.
     11        1.2      agc  *
     12        1.2      agc  * Redistribution and use in source and binary forms, with or without
     13        1.2      agc  * modification, are permitted provided that the following conditions
     14        1.2      agc  * are met:
     15        1.2      agc  * 1. Redistributions of source code must retain the above copyright
     16        1.2      agc  *    notice, this list of conditions and the following disclaimer.
     17        1.2      agc  * 2. Redistributions in binary form must reproduce the above copyright
     18        1.2      agc  *    notice, this list of conditions and the following disclaimer in the
     19        1.2      agc  *    documentation and/or other materials provided with the distribution.
     20        1.2      agc  * 3. Neither the name of the University nor the names of its contributors
     21        1.2      agc  *    may be used to endorse or promote products derived from this software
     22        1.2      agc  *    without specific prior written permission.
     23        1.2      agc  *
     24        1.2      agc  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     25        1.2      agc  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     26        1.2      agc  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     27        1.2      agc  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     28        1.2      agc  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     29        1.2      agc  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     30        1.2      agc  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     31        1.2      agc  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     32        1.2      agc  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     33        1.2      agc  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     34        1.2      agc  * SUCH DAMAGE.
     35        1.2      agc  *
     36        1.2      agc  * from: Utah $Hdr: ite_subr.c 1.2 92/01/20$
     37        1.2      agc  *
     38        1.2      agc  *	@(#)ite_subr.c	8.1 (Berkeley) 6/10/93
     39        1.2      agc  */
     40        1.1  thorpej 
     41        1.1  thorpej #ifdef ITECONSOLE
     42        1.1  thorpej 
     43        1.1  thorpej #include <sys/param.h>
     44        1.1  thorpej 
     45  1.5.108.1   bouyer #include <hp300/stand/common/itereg.h>
     46        1.1  thorpej 
     47        1.1  thorpej #include <hp300/stand/common/samachdep.h>
     48        1.1  thorpej #include <hp300/stand/common/itevar.h>
     49        1.1  thorpej 
     50  1.5.108.2   bouyer static void ite_writeglyph(struct ite_data *, u_char *, u_char *);
     51  1.5.108.2   bouyer 
     52        1.3  tsutsui void
     53        1.4  tsutsui ite_fontinfo(struct ite_data *ip)
     54        1.1  thorpej {
     55        1.1  thorpej 	u_long fontaddr = getword(ip, getword(ip, FONTROM) + FONTADDR);
     56        1.1  thorpej 
     57        1.1  thorpej 	ip->ftheight = getbyte(ip, fontaddr + FONTHEIGHT);
     58        1.1  thorpej 	ip->ftwidth  = getbyte(ip, fontaddr + FONTWIDTH);
     59        1.1  thorpej 	ip->rows     = ip->dheight / ip->ftheight;
     60        1.1  thorpej 	ip->cols     = ip->dwidth / ip->ftwidth;
     61        1.1  thorpej 
     62        1.1  thorpej 	if (ip->fbwidth > ip->dwidth) {
     63        1.1  thorpej 		/*
     64        1.1  thorpej 		 * Stuff goes to right of display.
     65        1.1  thorpej 		 */
     66        1.1  thorpej 		ip->fontx    = ip->dwidth;
     67        1.1  thorpej 		ip->fonty    = 0;
     68        1.1  thorpej 		ip->cpl      = (ip->fbwidth - ip->dwidth) / ip->ftwidth;
     69        1.1  thorpej 		ip->cblankx  = ip->dwidth;
     70        1.1  thorpej 		ip->cblanky  = ip->fonty + ((128 / ip->cpl) +1) * ip->ftheight;
     71  1.5.108.2   bouyer 	} else {
     72        1.1  thorpej 		/*
     73        1.1  thorpej 		 * Stuff goes below the display.
     74        1.1  thorpej 		 */
     75        1.1  thorpej 		ip->fontx   = 0;
     76        1.1  thorpej 		ip->fonty   = ip->dheight;
     77        1.1  thorpej 		ip->cpl     = ip->fbwidth / ip->ftwidth;
     78        1.1  thorpej 		ip->cblankx = 0;
     79        1.1  thorpej 		ip->cblanky = ip->fonty + ((128 / ip->cpl) + 1) * ip->ftheight;
     80        1.1  thorpej 	}
     81        1.1  thorpej }
     82        1.1  thorpej 
     83        1.3  tsutsui void
     84  1.5.108.2   bouyer ite_fontinit1bpp(struct ite_data *ip)
     85  1.5.108.2   bouyer {
     86  1.5.108.2   bouyer 	u_char *fbmem, *dp;
     87  1.5.108.2   bouyer 	int c, l, b;
     88  1.5.108.2   bouyer 	int stride, width;
     89  1.5.108.2   bouyer 
     90  1.5.108.2   bouyer 	dp = (u_char *)(getword(ip, getword(ip, FONTROM) + FONTADDR) +
     91  1.5.108.2   bouyer 	    (char *)ip->regbase) + FONTDATA;
     92  1.5.108.2   bouyer 	stride = ip->fbwidth >> 3;
     93  1.5.108.2   bouyer 	width = (ip->ftwidth + 7) / 8;
     94  1.5.108.2   bouyer 
     95  1.5.108.2   bouyer 	for (c = 0; c < 128; c++) {
     96  1.5.108.2   bouyer 		fbmem = (u_char *)FBBASE +
     97  1.5.108.2   bouyer 		    (ip->fonty + (c / ip->cpl) * ip->ftheight) * stride;
     98  1.5.108.2   bouyer 		fbmem += (ip->fontx >> 3) + (c % ip->cpl) * width;
     99  1.5.108.2   bouyer 		for (l = 0; l < ip->ftheight; l++) {
    100  1.5.108.2   bouyer 			for (b = 0; b < width; b++) {
    101  1.5.108.2   bouyer 				*fbmem++ = *dp;
    102  1.5.108.2   bouyer 				dp += 2;
    103  1.5.108.2   bouyer 			}
    104  1.5.108.2   bouyer 			fbmem -= width;
    105  1.5.108.2   bouyer 			fbmem += stride;
    106  1.5.108.2   bouyer 		}
    107  1.5.108.2   bouyer 	}
    108  1.5.108.2   bouyer }
    109  1.5.108.2   bouyer 
    110  1.5.108.2   bouyer void
    111  1.5.108.2   bouyer ite_fontinit8bpp(struct ite_data *ip)
    112        1.1  thorpej {
    113        1.1  thorpej 	int bytewidth = (((ip->ftwidth - 1) / 8) + 1);
    114        1.1  thorpej 	int glyphsize = bytewidth * ip->ftheight;
    115        1.1  thorpej 	u_char fontbuf[500];
    116        1.1  thorpej 	u_char *dp, *fbmem;
    117        1.1  thorpej 	int c, i, romp;
    118        1.1  thorpej 
    119        1.1  thorpej 	romp = getword(ip, getword(ip, FONTROM) + FONTADDR) + FONTDATA;
    120        1.1  thorpej 	for (c = 0; c < 128; c++) {
    121  1.5.108.2   bouyer 		fbmem = (u_char *)(FBBASE +
    122        1.1  thorpej 		     (ip->fonty + (c / ip->cpl) * ip->ftheight) * ip->fbwidth +
    123        1.1  thorpej 		     (ip->fontx + (c % ip->cpl) * ip->ftwidth));
    124        1.1  thorpej 		dp = fontbuf;
    125        1.1  thorpej 		for (i = 0; i < glyphsize; i++) {
    126        1.1  thorpej 			*dp++ = getbyte(ip, romp);
    127        1.1  thorpej 			romp += 2;
    128        1.1  thorpej 		}
    129  1.5.108.2   bouyer 		ite_writeglyph(ip, fbmem, fontbuf);
    130        1.1  thorpej 	}
    131        1.1  thorpej }
    132        1.1  thorpej 
    133  1.5.108.2   bouyer static void
    134        1.4  tsutsui ite_writeglyph(struct ite_data *ip, u_char *fbmem, u_char *glyphp)
    135        1.1  thorpej {
    136        1.3  tsutsui 	int bn;
    137        1.3  tsutsui 	int l, b;
    138        1.1  thorpej 
    139        1.1  thorpej 	for (l = 0; l < ip->ftheight; l++) {
    140        1.1  thorpej 		bn = 7;
    141        1.1  thorpej 		for (b = 0; b < ip->ftwidth; b++) {
    142        1.1  thorpej 			if ((1 << bn) & *glyphp)
    143        1.1  thorpej 				*fbmem++ = 1;
    144        1.1  thorpej 			else
    145        1.1  thorpej 				*fbmem++ = 0;
    146        1.1  thorpej 			if (--bn < 0) {
    147        1.1  thorpej 				bn = 7;
    148        1.1  thorpej 				glyphp++;
    149        1.1  thorpej 			}
    150        1.1  thorpej 		}
    151        1.1  thorpej 		if (bn < 7)
    152        1.1  thorpej 			glyphp++;
    153        1.1  thorpej 		fbmem -= ip->ftwidth;
    154        1.1  thorpej 		fbmem += ip->fbwidth;
    155        1.1  thorpej 	}
    156        1.1  thorpej }
    157  1.5.108.2   bouyer 
    158  1.5.108.2   bouyer /*
    159  1.5.108.2   bouyer  * The cursor is just an inverted space.
    160  1.5.108.2   bouyer  */
    161  1.5.108.2   bouyer #define flip_cursor(ip) \
    162  1.5.108.2   bouyer 	(*ip->bmv)(ip, ip->cblanky, ip->cblankx, ip->cursory * ip->ftheight, \
    163  1.5.108.2   bouyer 	    ip->cursorx * ip->ftwidth, ip->ftheight, ip->ftwidth, RR_XOR)
    164  1.5.108.2   bouyer 
    165  1.5.108.2   bouyer void
    166  1.5.108.2   bouyer ite_dio_cursor(struct ite_data *ip, int flag)
    167  1.5.108.2   bouyer {
    168  1.5.108.2   bouyer 
    169  1.5.108.2   bouyer 	switch (flag) {
    170  1.5.108.2   bouyer 	case MOVE_CURSOR:
    171  1.5.108.2   bouyer 		flip_cursor(ip);
    172  1.5.108.2   bouyer 		/* FALLTHROUGH */
    173  1.5.108.2   bouyer 	case DRAW_CURSOR:
    174  1.5.108.2   bouyer 		ip->cursorx = ip->curx;
    175  1.5.108.2   bouyer 		ip->cursory = ip->cury;
    176  1.5.108.2   bouyer 		/* FALLTHROUGH */
    177  1.5.108.2   bouyer 	default:
    178  1.5.108.2   bouyer 		flip_cursor(ip);
    179  1.5.108.2   bouyer 		break;
    180  1.5.108.2   bouyer 	}
    181  1.5.108.2   bouyer }
    182  1.5.108.2   bouyer 
    183  1.5.108.2   bouyer void
    184  1.5.108.2   bouyer ite_dio_putc1bpp(struct ite_data *ip, int c, int dy, int dx)
    185  1.5.108.2   bouyer {
    186  1.5.108.2   bouyer 
    187  1.5.108.2   bouyer 	ite_dio_windowmove1bpp(ip, charY(ip, c), charX1bpp(ip, c),
    188  1.5.108.2   bouyer 	    dy * ip->ftheight, dx * ip->ftwidth,
    189  1.5.108.2   bouyer 	    ip->ftheight, ip->ftwidth, RR_COPY);
    190  1.5.108.2   bouyer }
    191  1.5.108.2   bouyer 
    192  1.5.108.2   bouyer void
    193  1.5.108.2   bouyer ite_dio_putc8bpp(struct ite_data *ip, int c, int dy, int dx)
    194  1.5.108.2   bouyer {
    195  1.5.108.2   bouyer 
    196  1.5.108.2   bouyer 	(*ip->bmv)(ip, charY(ip, c), charX(ip, c),
    197  1.5.108.2   bouyer 	    dy * ip->ftheight, dx * ip->ftwidth,
    198  1.5.108.2   bouyer 	    ip->ftheight, ip->ftwidth, RR_COPY);
    199  1.5.108.2   bouyer }
    200  1.5.108.2   bouyer 
    201  1.5.108.2   bouyer void
    202  1.5.108.2   bouyer ite_dio_clear(struct ite_data *ip, int sy, int sx, int h, int w)
    203  1.5.108.2   bouyer {
    204  1.5.108.2   bouyer 
    205  1.5.108.2   bouyer 	(*ip->bmv)(ip, sy * ip->ftheight, sx * ip->ftwidth,
    206  1.5.108.2   bouyer 	    sy * ip->ftheight, sx * ip->ftwidth,
    207  1.5.108.2   bouyer 	    h  * ip->ftheight, w  * ip->ftwidth, RR_CLEAR);
    208  1.5.108.2   bouyer }
    209  1.5.108.2   bouyer 
    210  1.5.108.2   bouyer void
    211  1.5.108.2   bouyer ite_dio_scroll(struct ite_data *ip)
    212  1.5.108.2   bouyer {
    213  1.5.108.2   bouyer 
    214  1.5.108.2   bouyer 	flip_cursor(ip);
    215  1.5.108.2   bouyer 
    216  1.5.108.2   bouyer 	(*ip->bmv)(ip, ip->ftheight, 0, 0, 0, (ip->rows - 1) * ip->ftheight,
    217  1.5.108.2   bouyer 	    ip->cols * ip->ftwidth, RR_COPY);
    218  1.5.108.2   bouyer }
    219  1.5.108.2   bouyer 
    220  1.5.108.2   bouyer #include <hp300/stand/common/maskbits.h>
    221  1.5.108.2   bouyer 
    222  1.5.108.2   bouyer /* NOTE:
    223  1.5.108.2   bouyer  * the first element in starttab could be 0xffffffff.  making it 0
    224  1.5.108.2   bouyer  * lets us deal with a full first word in the middle loop, rather
    225  1.5.108.2   bouyer  * than having to do the multiple reads and masks that we'd
    226  1.5.108.2   bouyer  * have to do if we thought it was partial.
    227  1.5.108.2   bouyer  */
    228  1.5.108.2   bouyer int starttab[32] = {
    229  1.5.108.2   bouyer 	0x00000000,
    230  1.5.108.2   bouyer 	0x7FFFFFFF,
    231  1.5.108.2   bouyer 	0x3FFFFFFF,
    232  1.5.108.2   bouyer 	0x1FFFFFFF,
    233  1.5.108.2   bouyer 	0x0FFFFFFF,
    234  1.5.108.2   bouyer 	0x07FFFFFF,
    235  1.5.108.2   bouyer 	0x03FFFFFF,
    236  1.5.108.2   bouyer 	0x01FFFFFF,
    237  1.5.108.2   bouyer 	0x00FFFFFF,
    238  1.5.108.2   bouyer 	0x007FFFFF,
    239  1.5.108.2   bouyer 	0x003FFFFF,
    240  1.5.108.2   bouyer 	0x001FFFFF,
    241  1.5.108.2   bouyer 	0x000FFFFF,
    242  1.5.108.2   bouyer 	0x0007FFFF,
    243  1.5.108.2   bouyer 	0x0003FFFF,
    244  1.5.108.2   bouyer 	0x0001FFFF,
    245  1.5.108.2   bouyer 	0x0000FFFF,
    246  1.5.108.2   bouyer 	0x00007FFF,
    247  1.5.108.2   bouyer 	0x00003FFF,
    248  1.5.108.2   bouyer 	0x00001FFF,
    249  1.5.108.2   bouyer 	0x00000FFF,
    250  1.5.108.2   bouyer 	0x000007FF,
    251  1.5.108.2   bouyer 	0x000003FF,
    252  1.5.108.2   bouyer 	0x000001FF,
    253  1.5.108.2   bouyer 	0x000000FF,
    254  1.5.108.2   bouyer 	0x0000007F,
    255  1.5.108.2   bouyer 	0x0000003F,
    256  1.5.108.2   bouyer 	0x0000001F,
    257  1.5.108.2   bouyer 	0x0000000F,
    258  1.5.108.2   bouyer 	0x00000007,
    259  1.5.108.2   bouyer 	0x00000003,
    260  1.5.108.2   bouyer 	0x00000001
    261  1.5.108.2   bouyer };
    262  1.5.108.2   bouyer 
    263  1.5.108.2   bouyer int endtab[32] = {
    264  1.5.108.2   bouyer 	0x00000000,
    265  1.5.108.2   bouyer 	0x80000000,
    266  1.5.108.2   bouyer 	0xC0000000,
    267  1.5.108.2   bouyer 	0xE0000000,
    268  1.5.108.2   bouyer 	0xF0000000,
    269  1.5.108.2   bouyer 	0xF8000000,
    270  1.5.108.2   bouyer 	0xFC000000,
    271  1.5.108.2   bouyer 	0xFE000000,
    272  1.5.108.2   bouyer 	0xFF000000,
    273  1.5.108.2   bouyer 	0xFF800000,
    274  1.5.108.2   bouyer 	0xFFC00000,
    275  1.5.108.2   bouyer 	0xFFE00000,
    276  1.5.108.2   bouyer 	0xFFF00000,
    277  1.5.108.2   bouyer 	0xFFF80000,
    278  1.5.108.2   bouyer 	0xFFFC0000,
    279  1.5.108.2   bouyer 	0xFFFE0000,
    280  1.5.108.2   bouyer 	0xFFFF0000,
    281  1.5.108.2   bouyer 	0xFFFF8000,
    282  1.5.108.2   bouyer 	0xFFFFC000,
    283  1.5.108.2   bouyer 	0xFFFFE000,
    284  1.5.108.2   bouyer 	0xFFFFF000,
    285  1.5.108.2   bouyer 	0xFFFFF800,
    286  1.5.108.2   bouyer 	0xFFFFFC00,
    287  1.5.108.2   bouyer 	0xFFFFFE00,
    288  1.5.108.2   bouyer 	0xFFFFFF00,
    289  1.5.108.2   bouyer 	0xFFFFFF80,
    290  1.5.108.2   bouyer 	0xFFFFFFC0,
    291  1.5.108.2   bouyer 	0xFFFFFFE0,
    292  1.5.108.2   bouyer 	0xFFFFFFF0,
    293  1.5.108.2   bouyer 	0xFFFFFFF8,
    294  1.5.108.2   bouyer 	0xFFFFFFFC,
    295  1.5.108.2   bouyer 	0xFFFFFFFE
    296  1.5.108.2   bouyer };
    297  1.5.108.2   bouyer 
    298  1.5.108.2   bouyer void
    299  1.5.108.2   bouyer ite_dio_windowmove1bpp(struct ite_data *ip, int sy, int sx, int dy, int dx,
    300  1.5.108.2   bouyer     int h, int w, int func)
    301  1.5.108.2   bouyer {
    302  1.5.108.2   bouyer 	int width;		/* add to get to same position in next line */
    303  1.5.108.2   bouyer 
    304  1.5.108.2   bouyer 	unsigned int *psrcLine, *pdstLine;
    305  1.5.108.2   bouyer 				/* pointers to line with current src and dst */
    306  1.5.108.2   bouyer 	unsigned int *psrc;	/* pointer to current src longword */
    307  1.5.108.2   bouyer 	unsigned int *pdst;	/* pointer to current dst longword */
    308  1.5.108.2   bouyer 
    309  1.5.108.2   bouyer 				/* following used for looping through a line */
    310  1.5.108.2   bouyer 	unsigned int startmask, endmask;  /* masks for writing ends of dst */
    311  1.5.108.2   bouyer 	int nlMiddle;		/* whole longwords in dst */
    312  1.5.108.2   bouyer 	int nl;			/* temp copy of nlMiddle */
    313  1.5.108.2   bouyer 	unsigned int tmpSrc;	/* place to store full source word */
    314  1.5.108.2   bouyer 	int xoffSrc;		/* offset (>= 0, < 32) from which to
    315  1.5.108.2   bouyer 				   fetch whole longwords fetched
    316  1.5.108.2   bouyer 				   in src */
    317  1.5.108.2   bouyer 	int nstart;		/* number of ragged bits at start of dst */
    318  1.5.108.2   bouyer 	int nend;		/* number of ragged bits at end of dst */
    319  1.5.108.2   bouyer 	int srcStartOver;	/* pulling nstart bits from src
    320  1.5.108.2   bouyer 				   overflows into the next word? */
    321  1.5.108.2   bouyer 
    322  1.5.108.2   bouyer 	if (h == 0 || w == 0)
    323  1.5.108.2   bouyer 		return;
    324  1.5.108.2   bouyer 
    325  1.5.108.2   bouyer 	width = ip->fbwidth >> 5;
    326  1.5.108.2   bouyer 	psrcLine = ((unsigned int *) ip->fbbase) + (sy * width);
    327  1.5.108.2   bouyer 	pdstLine = ((unsigned int *) ip->fbbase) + (dy * width);
    328  1.5.108.2   bouyer 
    329  1.5.108.2   bouyer 	/* x direction doesn't matter for < 1 longword */
    330  1.5.108.2   bouyer 	if (w <= 32) {
    331  1.5.108.2   bouyer 		int srcBit, dstBit;     /* bit offset of src and dst */
    332  1.5.108.2   bouyer 
    333  1.5.108.2   bouyer 		pdstLine += (dx >> 5);
    334  1.5.108.2   bouyer 		psrcLine += (sx >> 5);
    335  1.5.108.2   bouyer 		psrc = psrcLine;
    336  1.5.108.2   bouyer 		pdst = pdstLine;
    337  1.5.108.2   bouyer 
    338  1.5.108.2   bouyer 		srcBit = sx & 0x1f;
    339  1.5.108.2   bouyer 		dstBit = dx & 0x1f;
    340  1.5.108.2   bouyer 
    341  1.5.108.2   bouyer 		while (h--) {
    342  1.5.108.2   bouyer 			getandputrop(psrc, srcBit, dstBit, w, pdst, func);
    343  1.5.108.2   bouyer 			pdst += width;
    344  1.5.108.2   bouyer 			psrc += width;
    345  1.5.108.2   bouyer 		}
    346  1.5.108.2   bouyer 	} else {
    347  1.5.108.2   bouyer 		maskbits(dx, w, startmask, endmask, nlMiddle);
    348  1.5.108.2   bouyer 		if (startmask)
    349  1.5.108.2   bouyer 			nstart = 32 - (dx & 0x1f);
    350  1.5.108.2   bouyer 		else
    351  1.5.108.2   bouyer 			nstart = 0;
    352  1.5.108.2   bouyer 		if (endmask)
    353  1.5.108.2   bouyer 			nend = (dx + w) & 0x1f;
    354  1.5.108.2   bouyer 		else
    355  1.5.108.2   bouyer 			nend = 0;
    356  1.5.108.2   bouyer 
    357  1.5.108.2   bouyer 		xoffSrc = ((sx & 0x1f) + nstart) & 0x1f;
    358  1.5.108.2   bouyer 		srcStartOver = ((sx & 0x1f) + nstart) > 31;
    359  1.5.108.2   bouyer 
    360  1.5.108.2   bouyer 		pdstLine += (dx >> 5);
    361  1.5.108.2   bouyer 		psrcLine += (sx >> 5);
    362  1.5.108.2   bouyer 
    363  1.5.108.2   bouyer 		while (h--) {
    364  1.5.108.2   bouyer 			psrc = psrcLine;
    365  1.5.108.2   bouyer 			pdst = pdstLine;
    366  1.5.108.2   bouyer 
    367  1.5.108.2   bouyer 			if (startmask) {
    368  1.5.108.2   bouyer 				getandputrop(psrc, (sx & 0x1f), (dx & 0x1f),
    369  1.5.108.2   bouyer 				    nstart, pdst, func);
    370  1.5.108.2   bouyer 				pdst++;
    371  1.5.108.2   bouyer 				if (srcStartOver)
    372  1.5.108.2   bouyer 					psrc++;
    373  1.5.108.2   bouyer 			}
    374  1.5.108.2   bouyer 
    375  1.5.108.2   bouyer 			/* special case for aligned operations */
    376  1.5.108.2   bouyer 			if (xoffSrc == 0) {
    377  1.5.108.2   bouyer 				nl = nlMiddle;
    378  1.5.108.2   bouyer 				while (nl--) {
    379  1.5.108.2   bouyer 					DoRop(*pdst, func, *psrc++, *pdst);
    380  1.5.108.2   bouyer 					pdst++;
    381  1.5.108.2   bouyer 				}
    382  1.5.108.2   bouyer 			} else {
    383  1.5.108.2   bouyer 				nl = nlMiddle + 1;
    384  1.5.108.2   bouyer 				while (--nl) {
    385  1.5.108.2   bouyer 					getunalignedword(psrc, xoffSrc, tmpSrc);
    386  1.5.108.2   bouyer 					DoRop(*pdst, func, tmpSrc, *pdst);
    387  1.5.108.2   bouyer 					pdst++;
    388  1.5.108.2   bouyer 					psrc++;
    389  1.5.108.2   bouyer 				}
    390  1.5.108.2   bouyer 			}
    391  1.5.108.2   bouyer 
    392  1.5.108.2   bouyer 			if (endmask) {
    393  1.5.108.2   bouyer 				getandputrop0(psrc, xoffSrc, nend, pdst, func);
    394  1.5.108.2   bouyer 			}
    395  1.5.108.2   bouyer 
    396  1.5.108.2   bouyer 			pdstLine += width;
    397  1.5.108.2   bouyer 			psrcLine += width;
    398  1.5.108.2   bouyer 		}
    399  1.5.108.2   bouyer 	}
    400  1.5.108.2   bouyer }
    401        1.1  thorpej #endif
    402