--- researchv9/jerq/src/lib/j/bitblt.c 2018/04/24 17:21:59 1.1 +++ researchv9/jerq/src/lib/j/bitblt.c 2018/04/24 17:32:48 1.1.1.2 @@ -18,7 +18,9 @@ #undef sw #define DX1 m +#undef bitblt bitblt(sm,r,dm,p,fc) +#define bitblt Sbitblt Bitmap *sm,*dm; Rectangle r; Point p; @@ -34,13 +36,19 @@ int fc; int dummy1, dummy2; /* for future use, CANNOT CHANGE */ /* NUMBER OF LOCALS DUE TO %fp */ /* TRICKS */ + + /* clip to the source Bitmap */ - if(r.origin.x < sm->rect.origin.x) + if(r.origin.x < sm->rect.origin.x){ + p.x+=sm->rect.origin.x-r.origin.x; r.origin.x=sm->rect.origin.x; + } if(r.corner.x > sm->rect.corner.x) r.corner.x=sm->rect.corner.x; - if(r.origin.y < sm->rect.origin.y) + if(r.origin.y < sm->rect.origin.y){ + p.y+=sm->rect.origin.y-r.origin.y; r.origin.y=sm->rect.origin.y; + } if(r.corner.y > sm->rect.corner.y) r.corner.y=sm->rect.corner.y; /* @@ -73,7 +81,12 @@ int fc; mask1 = ~ntmask1; mask2 = topbits[((p.x+DX1) & 31) + 1]; ntmask2 = ~mask2; - w = ((p.x+DX1) >> 5) - (p.x >> 5); /* inner loop+1: sub 1 later*/ + /* + the following code is wrong. + the moral is, do it right + */ + /*w = ((p.x+DX1) >> 5) - (p.x >> 5); /* inner loop+1: sub 1 later*/ + w = (((p.x+DX1)&~31)/32) - ((p.x&~31)/32); /* inner loop+1: sub 1 later*/ sw = ((sm->width - w) << 2); /* sleazy hack to avoid shift */ dw = ((dm->width - w) << 2); /* in outer, inner loops */ if (sm == dm) { /* may have to mess with loop order */ @@ -434,54 +447,6 @@ int fc; } while (--h > 0); break; case F_STORE | NOSHIFT: - if (w > 25) - goto widestore; - i = 25 - w; - m = (i << 2) + (i << 1); - - asm(" LLSW3 &0x2,0x10(%fp),%r0"); /* bytewidth in r0*/ - asm(" ADDW2 &4,%r0"); /* r0 +=4 for loop offsets */ - asm(" MOVAW B_FS_N,%r1"); - asm(" ADDW2 %r4,%r1"); /* r1 += &label, or jump addr*/ - m = h; /* m is free reg, use it as height */ - asm(" MOVW 0x20(%fp),%r2"); /* r2 = mask1 */ - asm(" PUSHW %ap"); /* save fp and ap */ - asm(" MOVW 0x24(%fp),%ap"); /* ap = mask2 */ - asm(" PUSHW %fp"); - asm(" MOVW %r1,%fp"); /* put jump index into fp */ - - do{ - - asm(" XORW3 0(%r7),0(%r8),%r1"); - asm(" ANDW2 %r2,%r1"); - asm(" XORW2 %r1,0(%r7)"); - - asm(" JMP 0(%fp)"); - asm("B_FS_N: "); /* label */ - asm(" MOVW 0x64(%r8),0x64(%r7)"); - asm(" MOVW 0x60(%r8),0x60(%r7)"); asm(" MOVW 0x5c(%r8),0x5c(%r7)"); - asm(" MOVW 0x58(%r8),0x58(%r7)"); asm(" MOVW 0x54(%r8),0x54(%r7)"); - asm(" MOVW 0x50(%r8),0x50(%r7)"); asm(" MOVW 0x4c(%r8),0x4c(%r7)"); asm(" MOVW 0x48(%r8),0x48(%r7)"); asm(" MOVW 0x44(%r8),0x44(%r7)"); - asm(" MOVW 0x40(%r8),0x40(%r7)"); asm(" MOVW 0x3c(%r8),0x3c(%r7)"); asm(" MOVW 0x38(%r8),0x38(%r7)"); asm(" MOVW 0x34(%r8),0x34(%r7)"); - asm(" MOVW 0x30(%r8),0x30(%r7)"); asm(" MOVW 0x2c(%r8),0x2c(%r7)"); asm(" MOVW 0x28(%r8),0x28(%r7)"); asm(" MOVW 0x24(%r8),0x24(%r7)"); - asm(" MOVW 0x20(%r8),0x20(%r7)"); asm(" MOVW 0x1c(%r8),0x1c(%r7)"); asm(" MOVW 0x18(%r8),0x18(%r7)"); - asm(" MOVW 0x14(%r8),0x14(%r7)"); - asm(" MOVW 0x10(%r8),0x10(%r7)"); - asm(" MOVW 0xc(%r8),0xc(%r7)"); - asm(" MOVW 0x8(%r8),0x8(%r7)"); - asm(" MOVW 0x4(%r8),0x4(%r7)"); - asm(" ADDW2 %r0,%r8"); - asm(" ADDW2 %r0,%r7"); - asm(" XORW3 0(%r7),0(%r8),%r1"); - asm(" ANDW2 %ap,%r1"); /* ap has mask2 */ - asm(" XORW2 %r1,0(%r7)"); - asm(" ADDW2 %r6,%r8"); - asm(" ADDW2 %r5,%r7"); - } while (--m != 0); - asm(" POPW %fp"); - asm(" POPW %ap"); - break; - /* ABOVE ALMOST EQUAL TO : */ widestore: b = w >> 2; w = w & 3;