--- ScaleFramebuffer.cc.orig Sun Jun 4 21:52:06 2000 +++ ScaleFramebuffer.cc Tue Jun 20 17:53:15 2000 @@ -33,12 +33,15 @@ } +static int tap[9] = {1,2,1,2,4,2,1,2,1}; + void ScaleFramebuffer::update( unsigned int _x, unsigned int _y, unsigned int _w, unsigned int _h ) { +#if 0 _w = (fb->width * (_w + _x ) + width - 1) / width; _h = (fb->height * (_h + _y ) + height - 1) / height; _x = fb->width * _x / width; @@ -72,6 +75,40 @@ } } } +#endif + int _w2,_h2,_x2,_y2; + _w2 = _w/2 + 4; + _h2 = _h/2 + 4; + _x2 = _x/2 - 2; + if (_x2<0) _x2=0; + if ((_x2+_w2)>(int)(width/2)) + _w2 = (int)(width/2) - _x2; + _y2 = _y/2 - 2; + if (_y2<0) _y2=0; + if ((_y2+_h2)>(int)(height/2)) + _h2 = (int)(height/2) - _y2; + _w = _w2; + _h = _h2; + _x = _x2; + _y = _y2; + unsigned int x,y; + unsigned int bl = fb->bytesPerLine; + unsigned int color; + unsigned int sum; + unsigned int cx,cy; + int kx,ky; + for (y=_y; y<_y+_h; y++) + for (x=_x; x<_x+_w; x++) + for (color=0; color<4; color++) { + sum = 0; + for (ky=-1; ky<=1; ky++) + for (kx=-1; kx<=1; kx++) { + cy = 2*y + ky; if (cy<0) cy=0; if (cy>height) cy=height; + cx = 2*x + kx; if (cx<0) cx=0; if (cx>width) cx=width; + sum += tap[3*(ky+1)+(kx+1)]*data[cy*bytesPerLine+4*cx+color]; } + fb->data[y*bl + 4*x + color] = (sum/16) & 0xf0; } + + fb->update( _x, _y, _w, _h ); }