- case IBITMAP:
- image = newBitImage(xwidth, ywidth);
- for (x=0; x<oimage->rgb.used; x++)
- {
- *(image->rgb.red + x) = *(oimage->rgb.red + x);
- *(image->rgb.green + x) = *(oimage->rgb.green + x);
- *(image->rgb.blue + x) = *(oimage->rgb.blue + x);
- }
- image->rgb.used = oimage->rgb.used;
- destline = image->data;
- destlinelen = (xwidth / 8) + (xwidth % 8 ? 1 : 0);
- srcline = oimage->data;
- srclinelen = (oimage->width / 8) + (oimage->width % 8 ? 1 : 0);
- for (y=0, ysrc=*(yindex + y); y<ywidth; y++)
- {
- while (ysrc != *(yindex + y))
- {
- ysrc++;
- srcline += srclinelen;
- }
- srcptr = srcline;
- destptr = destline;
- srcmask = 0x80;
- destmask = 0x80;
- bit = srcmask & *srcptr;
- for (x=0, xsrc=*(xindex + x); x<xwidth; x++)
- {
- if (xsrc != *(xindex + x))
- {
- do
- {
- xsrc++;
- if (!(srcmask >>= 1))
- {
- srcmask = 0x80;
- srcptr++;
- }
- }
- while (xsrc != *(xindex + x));
-
- bit = srcmask & *srcptr;
- }
- if (bit)
- *destptr |= destmask;
- if (!(destmask >>= 1))
- {
- destmask = 0x80;
- destptr++;
- }
- }
- destline += destlinelen;
- }
- break;
-
- case IRGB:
- image = newRGBImage(xwidth, ywidth, oimage->depth);
- for (x=0; x<oimage->rgb.used; x++)
- {
- *(image->rgb.red + x) = *(oimage->rgb.red + x);
- *(image->rgb.green + x) = *(oimage->rgb.green + x);
- *(image->rgb.blue + x) = *(oimage->rgb.blue + x);
- }
- image->rgb.used = oimage->rgb.used;
-
- pixlen = oimage->pixlen;
- destptr = image->data;
- srcline = oimage->data;
- srclinelen = oimage->width * pixlen;
- for (y=0, ysrc=*(yindex + y); y<ywidth; y++)
- {
- while (ysrc != *(yindex + y))
- {
- ysrc++;
- srcline += srclinelen;
- }
-
- srcptr = srcline;
- value = memToVal(srcptr, image->pixlen);
-
- for (x=0, xsrc=*(xindex + x); x<xwidth; x++)
- {
- if (xsrc != *(xindex + x))
- {
- do
- {
- xsrc++;
- srcptr++;
- }
- while (xsrc != *(xindex + x));
- value = memToVal(srcptr, 1);
- }
- valToMem(value, destptr, 1);
- destptr++;
- }
- }
- break;
-
- default:
- /* no zooming */
- return(oimage);
- break;
- }
-
- free((byte *)xindex);
- free((byte *)yindex);
-
- printf("done\n");
-
- return(image);
-}