I couldn't upload it to GGI... where would I do that?  (permission
denied).  It'd be a bit silly to put it onto my geocities site:
http://www.geocities.com/Tokyo/Spa/1076
(or apparently http://www.geocities.com/winterlion :)

Anyways, any feedback (or patches :) would be most apreciated.  I'm just
taking a peek at writing a scaling-target...  growl.  Don't feel like it
right now - am hacking on an opengl-character editor!  (don't ask.  may
not get finished so...  but i'm basing on this really cool gtk-app called
'me3d' which unfortunately is based on an -old- gtk so first order is to
update :)

Anyone wanna write a simple one? :)  Go ahead and use the scaling code...
afaik it's public....  Just on principle I included it below:

incidentally, while the svgalib emu seems to work fine for visual stuff,
my keyboard has -never- worked.  When I load 'zgv' the only way to exit is
alt-sysrq-K.  *grr*.  That's why I made this patched abuse!

G'day, eh? :)
        - Teunis

Scaling code (clipped to protect the innocent/guilty :)
--- as in this code is unusable without additional stuff that happens to be
in the abuse patch-- but it's a start anyways :)

note:  predefined variables here:
extern unsigned int xres,yres;   /* set to 319,199 fwiw */
static const ggi_directbuffer  *sw_dbuf;
ggi_mode     sw_gmod;
ggi_visual_t sw_vis;
ggi_pixel    sw_pal[256];
        /* for nonworking bit... palette emu I'll leave to palemu! */

int sw_do_scale = FALSE;        /* TRUE if autoscale enabled */
void sw_calculateMaps(int srcWidth, int srcHeight,int dstWidth,int dstHeight);

then in init:
   sw_calculateMaps(source width, source height, dest width, dest height);


int* srcrows=NULL;
int* srccols=NULL;

void sw_calculateMaps(int srcWidth, int srcHeight,int destWidth,int destHeight)
  {
  srcrows = new int[destHeight + 1];
  for (int y = 0; y <= destHeight; y++)
     {
     srcrows[y] = (2 * y * srcHeight + srcHeight) / (2 * destHeight);
     }
  srccols = new int[destWidth + 1];
  for (int x = 0; x <= destWidth; x++)
     {
     srccols[x] = (2 * x * srcWidth + srcWidth) / (2 * destWidth);
     }
  };

void put_part(image *im, int x, int y, int x1, int y1, int x2, int y2)
{
  unsigned long screen_off;
  int ys,ye,         // ystart, yend
        xs,xe,      
        yy;
  unsigned char *line_addr;

  if (y>(int)yres || x>(int)xres) return ;
  CHECK(y1>=0 && y2>=y1 && x1>=0 && x2>=x1);

  if (y<0) { y1+=-y; y=0; }
  ys=y1;
  if (y+(y2-y1)>=(int)yres) 
       ye=(int)yres-y+y1-1;
  else ye=y2;

  if (x<0) { x1+=-x; x=0; }
  xs=x1;
  if (x+(x2-x1)>=(int)xres)
       xe=(int)xres-x+x1-1;
  else xe=x2;
  if (xs>xe || ys>ye) return ;

   if (sw_do_scale)
     {
        /* substitute 320,200 for source width,height */
        int sx, sy, dx;
        int dx1 = (2 * xs * sw_gmod.visible.x + 320 - 1) / (2 * 320);
        int dy1 = (2 * ys * sw_gmod.visible.y + 200 - 1) / (2 * 200);
        int dxe = (2 * ((xe-xs)+1) * sw_gmod.visible.x + 320 - 1) / (2 * 320);
        int adx = (2 * x  * sw_gmod.visible.x + 320 - 1) / (2 * 320);
        int ady = (2 * y  * sw_gmod.visible.y + 200 - 1) / (2 * 200);
        void* src;
        void* dest;
        if (sw_gmod.graphtype == GT_8BIT)
          {
             unsigned char* root = (unsigned char*) sw_dbuf->write;
             root += sw_orig[ady];
             for (int yy = dy1; (sy=srcrows[yy]) <= ye; yy++,root+=sw_orig[1])
               {
                  src  = im->scan_line(sy);
                  dest = root + adx;
                  for (dx = 0; dx <= dxe; dx++)
                    { 
                       sx = srccols[dx+dx1];
                       ((unsigned char*)dest)[dx] = ((unsigned char*)src)[sx];
                    }
               }
          }
        else if ((sw_gmod.graphtype == GT_15BIT) ||
                 (sw_gmod.graphtype == GT_16BIT))
          {
             unsigned char* root = (unsigned char*) sw_dbuf->write;
             root += sw_orig[ady];
             for (int yy = dy1; (sy=srcrows[yy]) <= ye; yy++,root+=sw_orig[1])
               {
                  src  = im->scan_line(sy);
                  dest = root + (adx<<1);
                  for (dx = 0; dx <= dxe; dx++)
                    { 
                       sx = srccols[dx+dx1];
                       ((unsigned short*)dest)[dx] = 
                         sw_pal[((unsigned char*)src)[sx]];
                    }
               }
          }
     }
   else
     {
        void* dest;
        int size;
        // find the memory offset for the scan line of interest
        screen_off=sw_orig[y];
        for (yy=ys;yy<=ye;yy++,screen_off+=sw_orig[1])
          {
             line_addr=im->scan_line(yy)+xs;  // get address of image scan line
             dest = (unsigned char*)sw_dbuf->write + screen_off + x;
             size = xe-xs+1;
             memcpy(dest,line_addr,size);
             y++; 
          };
     };
   ggiFlush(sw_vis);
}

Reply via email to