]> 4ch.mooo.com Git - 16.git/blobdiff - 16/w_modex/XBLITBUF.CPP
modified: 16/DOS_GFX.EXE
[16.git] / 16 / w_modex / XBLITBUF.CPP
diff --git a/16/w_modex/XBLITBUF.CPP b/16/w_modex/XBLITBUF.CPP
new file mode 100644 (file)
index 0000000..9852832
--- /dev/null
@@ -0,0 +1,1027 @@
+#include <conio.h>\r
+#include <mem.h>\r
+#include <stdio.h>\r
+\r
+#include "xtypes.hpp"\r
+#include "modex.hpp"\r
+#include "xpal.hpp"\r
+#include "xblitbuf.hpp"\r
+\r
+#define SEQU_ADDR       0x3C4\r
+#define GRACON_ADDR     0x3CE\r
+\r
+\r
+void\r
+clear_blitbuf(blitbuf *buf)\r
+{\r
+    buf->xsize = 0;\r
+    buf->ysize = 0;\r
+\r
+    delete buf->image;\r
+}\r
+\r
+\r
+void\r
+fill_blitbuf(BYTE color, blitbuf *buf)\r
+{\r
+    memset(buf->image, color, buf->xsize * buf->ysize);\r
+}\r
+\r
+\r
+void\r
+alloc_blitbuf(blitbuf *buf, DIST xsize, DIST ysize)\r
+{\r
+    buf->xsize = xsize;\r
+    buf->ysize = ysize;\r
+    buf->image = new BYTE[xsize * ysize];\r
+}\r
+\r
+\r
+void\r
+lin_2_pln_blitbuf(blitbuf *buf)\r
+{\r
+    int i, j, size;\r
+    BYTE *oldbuf;\r
+    BYTE *newbuf;\r
+    BYTE *src_ptr;\r
+    BYTE *dest_ptr;\r
+\r
+    oldbuf = buf->image;\r
+\r
+    size = (buf->xsize * buf->ysize);\r
+    newbuf = new BYTE[size];\r
+    size = (size >> 2);\r
+\r
+    dest_ptr = newbuf;\r
+\r
+    for (i=0; i < 4; i++) {\r
+        src_ptr = oldbuf + i;\r
+\r
+        j=size;\r
+        while (j--) {\r
+            *dest_ptr++ = *src_ptr;\r
+            src_ptr += 4;\r
+        }\r
+    }\r
+\r
+    buf->image = newbuf;\r
+    delete oldbuf;\r
+}\r
+\r
+\r
+void\r
+pln_2_lin_blitbuf(blitbuf *buf)\r
+{\r
+    int i, j, size;\r
+    BYTE *oldbuf;\r
+    BYTE *newbuf;\r
+    BYTE *src_ptr;\r
+    BYTE *dest_ptr;\r
+\r
+    oldbuf = buf->image;\r
+\r
+    size = (buf->xsize * buf->ysize);\r
+    newbuf = new BYTE[size];\r
+    size = (size >> 2);\r
+\r
+    src_ptr = oldbuf;\r
+    for (i=0; i < 4; i++) {\r
+        dest_ptr = newbuf + i;\r
+\r
+        j=size;\r
+        while (j--) {\r
+            *dest_ptr = *src_ptr++;\r
+            dest_ptr += 4;\r
+        }\r
+    }\r
+\r
+    buf->image = newbuf;\r
+    delete oldbuf;\r
+}\r
+\r
+\r
+void\r
+vanilla_bitblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    short int ysize, plane, i, j, loop, skip, rewind, len;\r
+    short int xsize[4];\r
+    BYTE *base_vga;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    // Length of bitmap in each plane\r
+    plane = (x & 3);\r
+    i = buf->xsize + plane - 1;\r
+    xsize[0] = ((i--) >> 2);\r
+    xsize[1] = ((i--) >> 2);\r
+    xsize[2] = ((i--) >> 2);\r
+    xsize[3] = (i >> 2) + 1;\r
+\r
+    for (i=plane; i < 3; i++) {\r
+        xsize[i]++;\r
+    }\r
+\r
+    ysize = buf->ysize;\r
+    base_vga = RowsX[y] + (x >> 2) + activeStart;\r
+    write_plane = -1;\r
+\r
+    for (loop = 0; loop < 4; loop++) {\r
+        len = xsize[plane];\r
+        rewind = buf->xsize - (len << 2);\r
+        skip = widthBytes - len;\r
+        buf_ptr = buf->image + loop;\r
+        vga_ptr = base_vga;\r
+\r
+        outpw(SEQU_ADDR, plane_mask[plane++]);\r
+        if (plane == 4) {\r
+            plane = 0;\r
+            base_vga++;\r
+        }\r
+\r
+        i=ysize;\r
+        while (i--) {\r
+            j=len;\r
+            while (j--) {\r
+                *vga_ptr++ = *buf_ptr;\r
+                buf_ptr += 4;\r
+            }\r
+\r
+            buf_ptr += rewind;\r
+            vga_ptr += skip;\r
+        }\r
+    }\r
+}\r
+\r
+\r
+void\r
+vanilla_getblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    // Do nothing\r
+}\r
+\r
+\r
+void\r
+aligned_bitblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    short int i, j, plane, skip, xsize, ysize;\r
+    BYTE *base_vga;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    xsize = (buf->xsize >> 2);\r
+    ysize = buf->ysize;\r
+    skip = widthBytes - xsize;\r
+    base_vga = RowsX[y] + (x >> 2) + activeStart;\r
+\r
+    for (plane=0; plane < 4; plane++) {\r
+        buf_ptr = buf->image + plane;\r
+        vga_ptr = base_vga;\r
+\r
+        outpw(SEQU_ADDR, plane_mask[plane]);\r
+\r
+        i=ysize;\r
+        while (i--) {\r
+            j=xsize;\r
+            while (j--) {\r
+                *vga_ptr++ = *buf_ptr;\r
+                buf_ptr += 4;\r
+            }\r
+            vga_ptr += skip;\r
+        }\r
+    }\r
+\r
+    write_plane = 3;\r
+}\r
+\r
+\r
+void\r
+aligned_getblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    short int i, j, plane, skip, xsize, ysize;\r
+    BYTE *base_vga;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    xsize = (buf->xsize >> 2);\r
+    ysize = buf->ysize;\r
+    skip = widthBytes - xsize;\r
+    base_vga = RowsX[y] + (x >> 2) + activeStart;\r
+\r
+    for (plane=0; plane < 4; plane++) {\r
+        buf_ptr = buf->image + plane;\r
+        vga_ptr = base_vga;\r
+\r
+        outpw(GRACON_ADDR, read_mask[plane]);\r
+\r
+        i=ysize;\r
+        while (i--) {\r
+            j=xsize;\r
+            while (j--) {\r
+                *buf_ptr = *vga_ptr++;\r
+                buf_ptr += 4;\r
+            }\r
+            vga_ptr += skip;\r
+        }\r
+    }\r
+\r
+    read_plane = 3;\r
+}\r
+\r
+\r
+void\r
+transparent_bitblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    short int i, j, plane, skip, xsize, ysize;\r
+    BYTE *base_vga;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    xsize = (buf->xsize >> 2);\r
+    ysize = buf->ysize;\r
+    skip = widthBytes - xsize;\r
+    base_vga = RowsX[y] + (x >> 2) + activeStart;\r
+\r
+    for (plane=0; plane < 4; plane++) {\r
+        buf_ptr = buf->image + plane;\r
+        vga_ptr = base_vga;\r
+\r
+        outpw(SEQU_ADDR, plane_mask[plane]);\r
+\r
+        i=ysize;\r
+        while (i--) {\r
+            j=xsize;\r
+            while (j--) {\r
+                if (*buf_ptr) {\r
+                    *vga_ptr = *buf_ptr;\r
+                }\r
+                vga_ptr++;\r
+                buf_ptr += 4;\r
+            }\r
+            vga_ptr += skip;\r
+        }\r
+    }\r
+\r
+    write_plane = 3;\r
+}\r
+\r
+\r
+void\r
+planar_bitblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    short int i, plane, xsize, ysize;\r
+    BYTE *base_vga;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    xsize = (buf->xsize >> 2);\r
+    ysize = buf->ysize;\r
+    base_vga = RowsX[y] + (x >> 2) + activeStart;\r
+    buf_ptr = buf->image;\r
+\r
+    for (plane=0; plane < 4; plane++) {\r
+        vga_ptr = base_vga;\r
+\r
+        outpw(SEQU_ADDR, plane_mask[plane]);\r
+\r
+        i=ysize;\r
+        while (i--) {\r
+            memcpy(vga_ptr, buf_ptr, xsize);\r
+            vga_ptr += widthBytes;\r
+            buf_ptr += xsize;\r
+        }\r
+    }\r
+\r
+    write_plane = 3;\r
+}\r
+\r
+\r
+void\r
+planar_getblitX(COORD x, COORD y, blitbuf *buf)\r
+{\r
+    short int i, plane, xsize, ysize;\r
+    BYTE *base_vga;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    xsize = (buf->xsize >> 2);\r
+    ysize = buf->ysize;\r
+    base_vga = RowsX[y] + (x >> 2) + activeStart;\r
+    buf_ptr = buf->image;\r
+\r
+    for (plane=0; plane < 4; plane++) {\r
+        vga_ptr = base_vga;\r
+\r
+        outpw(GRACON_ADDR, read_mask[plane]);\r
+\r
+        i=ysize;\r
+        while (i--) {\r
+            memcpy(buf_ptr, vga_ptr, xsize);\r
+            vga_ptr += widthBytes;\r
+            buf_ptr += xsize;\r
+        }\r
+    }\r
+\r
+    read_plane = 3;\r
+}\r
+\r
+\r
+void\r
+wide_bitblitX(COORD y, blitbuf *buf)\r
+{\r
+    short int bufsize;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    write_plane = 3;\r
+    buf_ptr = buf->image;\r
+    vga_ptr = RowsX[y] + activeStart;\r
+    bufsize = (buf->ysize * widthBytes);\r
+\r
+    outpw(SEQU_ADDR, PLANE_0);\r
+    memcpy(vga_ptr, buf_ptr, bufsize);\r
+    buf_ptr += bufsize;\r
+\r
+    outpw(SEQU_ADDR, PLANE_1);\r
+    memcpy(vga_ptr, buf_ptr, bufsize);\r
+    buf_ptr += bufsize;\r
+\r
+    outpw(SEQU_ADDR, PLANE_2);\r
+    memcpy(vga_ptr, buf_ptr, bufsize);\r
+    buf_ptr += bufsize;\r
+\r
+    outpw(SEQU_ADDR, PLANE_3);\r
+    memcpy(vga_ptr, buf_ptr, bufsize);\r
+}\r
+\r
+\r
+void\r
+wide_getblitX(COORD y, blitbuf *buf)\r
+{\r
+    short int bufsize;\r
+    BYTE *vga_ptr;\r
+    BYTE *buf_ptr;\r
+\r
+    read_plane = 3;\r
+    buf_ptr = buf->image;\r
+    vga_ptr = RowsX[y] + activeStart;\r
+    bufsize = (buf->ysize * widthBytes);\r
+\r
+    outpw(GRACON_ADDR, READ_PLANE_0);\r
+    memcpy(buf_ptr, vga_ptr, bufsize);\r
+    buf_ptr += bufsize;\r
+\r
+    outpw(GRACON_ADDR, READ_PLANE_1);\r
+    memcpy(buf_ptr, vga_ptr, bufsize);\r
+    buf_ptr += bufsize;\r
+\r
+    outpw(GRACON_ADDR, READ_PLANE_2);\r
+    memcpy(buf_ptr, vga_ptr, bufsize);\r
+    buf_ptr += bufsize;\r
+\r
+    outpw(GRACON_ADDR, READ_PLANE_3);\r
+    memcpy(buf_ptr, vga_ptr, bufsize);\r
+}\r
+\r
+\r
+void\r
+save_blitbufPCX(char *fname, blitbuf *buf)\r
+{\r
+    FILE *fp;\r
+    unsigned int i, size, temp_int;\r
+    BYTE VGA_pal[768];\r
+    BYTE *buf_ptr;\r
+    BYTE temp_char, match, count;\r
+\r
+    fp = fopen(fname, "wb");\r
+\r
+    if (fp != NULL) {\r
+        // Write manufacturer's byte\r
+        temp_char = 10;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        // Write version of PCX.  5 = 256 color (PCX Version 5.0)\r
+        temp_char = 5;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        // Write encoding type, always 1 for RLE.\r
+        temp_char = 1;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        // Write bits_per_pixel = 8.\r
+        temp_char = 8;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        // Write starting X and Y coords\r
+        temp_int = 0;\r
+        fwrite(&temp_int, 2, 1, fp);\r
+        fwrite(&temp_int, 2, 1, fp);\r
+\r
+        // Write X size\r
+        temp_int = (buf->xsize - 1);\r
+        fwrite(&temp_int, 2, 1, fp);\r
+\r
+        // Write Y size\r
+        temp_int = (buf->ysize - 1);\r
+        fwrite(&temp_int, 2, 1, fp);\r
+\r
+        // Do HRES and VRES **\r
+        temp_int = buf->xsize;\r
+        fwrite(&temp_int, 2, 1, fp);\r
+        temp_int = buf->ysize;\r
+        fwrite(&temp_int, 2, 1, fp);\r
+\r
+        // Write 16 color palette, not used.\r
+        temp_int = 0;\r
+        i=24;\r
+        while (i--) {\r
+            fwrite(&temp_int, 2, 1, fp);\r
+        }\r
+\r
+        // Write vmode byte.\r
+        temp_char = 0;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        // Write bit_planes\r
+        temp_char = 1;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        // Write bytes_per_line\r
+        temp_int = buf->xsize;\r
+        fwrite(&temp_int, 2, 1, fp);\r
+\r
+        // Write palette type\r
+        temp_int = 1;\r
+        fwrite(&temp_int, 2, 1, fp);\r
+\r
+        // Write junk filler\r
+        temp_int = 0;\r
+        i=29;\r
+        while (i--) {\r
+            fwrite(&temp_int, 2, 1, fp);\r
+        }\r
+\r
+        // Write the actual image\r
+        buf_ptr = buf->image;\r
+        size = (buf->xsize * buf->ysize);\r
+\r
+        count = 0;\r
+        match = *buf_ptr;\r
+\r
+        i=size;\r
+        while (i--) {\r
+            temp_char = *buf_ptr++;\r
+\r
+            if ((temp_char == match) && (count < 63)) {\r
+               count++;\r
+            } else {\r
+                if ((count == 1) && (match < 192)) {\r
+                    // Write single byte\r
+                    fwrite(&match,1,1,fp);\r
+                } else {\r
+                    // Write run of pixels\r
+                    count += 192;\r
+                    fwrite(&count, 1, 1, fp);\r
+                    fwrite(&match, 1, 1, fp);\r
+                }\r
+                count = 1;\r
+                match = temp_char;\r
+            }\r
+        }\r
+\r
+        if ((count == 1) && (match < 192)) {\r
+            // Write single byte\r
+            fwrite(&match,1,1,fp);\r
+        } else {\r
+            // Write run of pixels\r
+            count += 192;\r
+            fwrite(&count, 1, 1, fp);\r
+            fwrite(&match, 1, 1, fp);\r
+        }\r
+\r
+        // Write palette verification byte\r
+        temp_char = 12;\r
+        fwrite(&temp_char, 1, 1, fp);\r
+\r
+        get_paletteX(VGA_pal);\r
+\r
+        // Write 256 color palette\r
+        fwrite(VGA_pal, 1, 768, fp);\r
+\r
+        fclose(fp);\r
+    }\r
+}\r
+\r
+\r
+int\r
+load_blitbufPCX(char *fname, blitbuf *buf)\r
+{\r
+    FILE *fp;\r
+    int size;\r
+    BYTE VGA_pal[768];\r
+    BYTE PCX_byte, RLE_byte;\r
+    BYTE *buf_ptr;\r
+    BYTE *end_of_buf;\r
+\r
+    fp = fopen(fname, "rb");\r
+\r
+    if (fp == NULL) {\r
+        buf->xsize = 0;\r
+        buf->ysize = 0;\r
+        buf->image = NULL;\r
+        return 0;\r
+    } else {\r
+        fseek(fp, 8, SEEK_SET);\r
+        fread(&buf->xsize, 2, 1, fp);\r
+        fread(&buf->ysize, 2, 1, fp);\r
+\r
+        buf->xsize++;\r
+        buf->ysize++;\r
+\r
+        size = (buf->xsize * buf->ysize);\r
+\r
+        buf->image = new BYTE[size];\r
+        buf_ptr = buf->image;\r
+        end_of_buf = buf_ptr + size;\r
+\r
+        // Load 256 color PCX palette\r
+        fseek(fp, -768, SEEK_END);\r
+        fread(VGA_pal, 1, 768, fp);\r
+\r
+        set_paletteX(VGA_pal);\r
+\r
+        fseek(fp, 128, SEEK_SET);\r
+\r
+        while (buf_ptr < end_of_buf) {\r
+            // Read next packet\r
+            fread(&PCX_byte, 1, 1, fp);\r
+\r
+            if (PCX_byte < 192) {\r
+                // Raw Pixel\r
+                *buf_ptr++ = PCX_byte;\r
+            } else {\r
+                // RLE Pixels\r
+                PCX_byte = PCX_byte & 0x3F;\r
+                fread(&RLE_byte, 1, 1, fp);\r
+                memset(buf_ptr, RLE_byte, PCX_byte);\r
+                buf_ptr += PCX_byte;\r
+            }\r
+        }\r
+\r
+        fclose(fp);\r
+        return 1;\r
+    }\r
+}\r
+\r
+\r
+void\r
+scale_blitbuf(DIST dest_x, DIST dest_y, blitbuf *buf1, blitbuf *buf2)\r
+{\r
+    unsigned long ErrorAccX, ErrorAccY, ErrorAdjX, ErrorAdjY;\r
+    DIST oldx, oldy, newx, newy;\r
+    short int i, j, count;\r
+    BYTE *src_base;\r
+    BYTE *src_ptr;\r
+    BYTE *dest_ptr;\r
+    BYTE *newbuf;\r
+\r
+    oldx = buf1->xsize;\r
+    oldy = buf1->ysize;\r
+    newx = dest_x;\r
+    newy = dest_y;\r
+\r
+    newbuf = new BYTE[newx * newy];\r
+\r
+    src_base = buf1->image;\r
+    dest_ptr = newbuf;\r
+\r
+    // My bitmap scaling routine.  As you probably noticed, it's\r
+    // pretty Bresenhammy!\r
+\r
+    ErrorAccY = 0x8000;\r
+\r
+    if (newx > oldx) {\r
+        // Biggering\r
+        ErrorAdjX = ((((unsigned long)newx) << 16) /\r
+                     (((unsigned long)oldx)));\r
+\r
+        ErrorAdjY = ((((unsigned long)newy) << 16) /\r
+                     (((unsigned long)oldy)));\r
+\r
+        i=oldy;\r
+        while (i--) {\r
+            ErrorAccX = 0x8000;\r
+            src_ptr = src_base;\r
+\r
+            j=oldx;\r
+            while (j--) {\r
+                ErrorAccX += ErrorAdjX;\r
+                if (count = (ErrorAccX >> 16)) {\r
+                    ErrorAccX &= 0xFFFFL;\r
+                    while (count--) {\r
+                        *dest_ptr++ = *src_ptr;\r
+                    }\r
+                }\r
+                src_ptr++;\r
+            }\r
+\r
+            ErrorAccY += ErrorAdjY;\r
+            count = (ErrorAccY >> 16) - 1;\r
+            while (count--) {\r
+                memcpy(dest_ptr, dest_ptr - newx, newx);\r
+                dest_ptr += newx;\r
+            }\r
+            ErrorAccY &= 0xFFFFL;\r
+            src_base += oldx;\r
+        }\r
+    } else {\r
+        // Smallering\r
+        ErrorAdjX = ((((unsigned long)oldx) << 16) /\r
+                     (((unsigned long)newx)));\r
+\r
+        ErrorAdjY = ((((unsigned long)oldy) << 16) /\r
+                     (((unsigned long)newy)));\r
+\r
+        i=newy;\r
+        while (i--) {\r
+            ErrorAccX = 0x8000;\r
+            src_ptr = src_base;\r
+\r
+            j=newx;\r
+            while (j--) {\r
+                *dest_ptr++ = *src_ptr;\r
+                ErrorAccX += ErrorAdjX;\r
+                src_ptr += (ErrorAccX >> 16);\r
+                ErrorAccX &= 0xFFFFL;\r
+            }\r
+\r
+            ErrorAccY += ErrorAdjY;\r
+            src_base += (oldx * (ErrorAccY >> 16));\r
+            ErrorAccY &= 0xFFFFL;\r
+        }\r
+    }\r
+\r
+    if (buf2 == NULL) {\r
+        delete buf1->image;\r
+        buf1->xsize = newx;\r
+        buf1->ysize = newy;\r
+        buf1->image = newbuf;\r
+    } else {\r
+        if (buf2->image != NULL) {\r
+            delete buf2->image;\r
+        }\r
+        buf2->xsize = newx;\r
+        buf2->ysize = newy;\r
+        buf2->image = newbuf;\r
+    }\r
+}\r
+\r
+\r
+void\r
+vertical_scale_blitbuf(DIST dest_y, blitbuf *buf1, blitbuf *buf2)\r
+{\r
+    unsigned long ErrorAccY, ErrorAdjY;\r
+    DIST xsize, oldy, newy;\r
+    short int i, count;\r
+    BYTE *src_ptr;\r
+    BYTE *dest_ptr;\r
+    BYTE *newbuf;\r
+\r
+    xsize = buf1->xsize;\r
+    oldy = buf1->ysize;\r
+    newy = dest_y;\r
+\r
+    newbuf = new BYTE[xsize * newy];\r
+\r
+    src_ptr = buf1->image;\r
+    dest_ptr = newbuf;\r
+\r
+    // My bitmap scaling routine.  As you probably noticed, it's\r
+    // pretty Bresenhammy!\r
+\r
+    ErrorAccY = 0x8000;\r
+    ErrorAdjY = ((((unsigned long)newy) << 16) /\r
+                 (((unsigned long)oldy)));\r
+\r
+    if (newy >= oldy) {\r
+        // Biggering\r
+        i=oldy;\r
+        while (i--) {\r
+            ErrorAccY += ErrorAdjY;\r
+            if (count = (ErrorAccY >> 16)) {\r
+                ErrorAccY &= 0xFFFFL;\r
+\r
+                while (count--) {\r
+                    memcpy(dest_ptr, src_ptr, xsize);\r
+                    dest_ptr += xsize;\r
+                }\r
+            }\r
+\r
+            src_ptr += xsize;\r
+        }\r
+    } else {\r
+        // Smallering\r
+        i=oldy;\r
+        while (i--) {\r
+            ErrorAccY += ErrorAdjY;\r
+            if (ErrorAccY & ~0xFFFFL) {\r
+                ErrorAccY &= 0xFFFFL;\r
+                memcpy(dest_ptr, src_ptr, xsize);\r
+                dest_ptr += xsize;\r
+            }\r
+\r
+            src_ptr += xsize;\r
+        }\r
+    }\r
+\r
+    if (buf2 == NULL) {\r
+        delete buf1->image;\r
+        buf1->ysize = newy;\r
+        buf1->image = newbuf;\r
+    } else {\r
+        if (buf2->image != NULL) {\r
+            delete buf2->image;\r
+        }\r
+        buf2->xsize = xsize;\r
+        buf2->ysize = newy;\r
+        buf2->image = newbuf;\r
+    }\r
+}\r
+\r
+\r
+void\r
+greyscale_blitbuf(blitbuf *buf)\r
+{\r
+    BYTE temp_pal[768];\r
+    BYTE *buf_ptr;\r
+    BYTE *temp;\r
+    BYTE r, g;\r
+    unsigned int i;\r
+\r
+    buf_ptr = buf->image;\r
+\r
+    get_paletteX(temp_pal, 0);\r
+\r
+    for (i = (buf->xsize * buf->ysize); i; i--) {\r
+        temp = temp_pal + ((*buf_ptr) * 3);\r
+        r = *temp++;\r
+        g = *temp++;\r
+\r
+        *buf_ptr++ = ((r * 19) + (g * 37) + (*temp << 3)) >> 6;\r
+    }\r
+}\r
+\r
+\r
+void\r
+RGB_blitbuf(blitbuf *buf)\r
+{\r
+    BYTE temp_pal[768];\r
+    BYTE *buf_ptr;\r
+    BYTE *temp;\r
+    BYTE r, g, b;\r
+    unsigned int i;\r
+\r
+    buf_ptr = buf->image;\r
+\r
+    get_paletteX(temp_pal, 0);\r
+\r
+    for (i = (buf->xsize * buf->ysize); i; i--) {\r
+        temp = temp_pal + ((*buf_ptr) * 3);\r
+        r = (*temp) + 4;\r
+        temp++;\r
+        g = (*temp) + 4;\r
+        temp++;\r
+        b = (*temp) + 8;\r
+\r
+        *buf_ptr++ = ((r >> 3) << 5) + ((g >> 3) << 2) + (b >> 4);\r
+    }\r
+}\r
+\r
+\r
+void\r
+flip_vertical_blitbuf(blitbuf *buf)\r
+{\r
+    BYTE *top;\r
+    BYTE *bottom;\r
+    BYTE *temp;\r
+    DIST i, x, y;;\r
+\r
+    x = buf->xsize;\r
+    y = buf->ysize;\r
+\r
+    temp = new BYTE[x];\r
+\r
+    top = buf->image;\r
+    bottom = buf->image + (x * (y-1));\r
+\r
+    i = (y >> 1);\r
+    while (i--) {\r
+        memcpy(temp, top, x);\r
+        memcpy(top, bottom, x);\r
+        memcpy(bottom, temp, x);\r
+        top += x;\r
+        bottom -= x;\r
+    }\r
+\r
+    delete temp;\r
+}\r
+\r
+\r
+void\r
+flip_horizontal_blitbuf(blitbuf *buf)\r
+{\r
+    BYTE *buf_ptr;\r
+    BYTE *temp_ptr;\r
+    BYTE *temp;\r
+    DIST i, j, x;\r
+\r
+    x = buf->xsize;\r
+\r
+    temp = new BYTE[x];\r
+\r
+    buf_ptr = buf->image;\r
+\r
+    i = buf->ysize;\r
+    while (i--) {\r
+        memcpy(temp, buf_ptr, x);\r
+        temp_ptr = temp + (x - 1);\r
+        j=x;\r
+        while (j--) {\r
+            *buf_ptr++ = *temp_ptr--;\r
+        }\r
+    }\r
+\r
+    delete temp;\r
+}\r
+\r
+\r
+void\r
+brighten_blitbuf(SBYTE factor, blitbuf *buf)\r
+{\r
+    BYTE *buf_ptr;\r
+    short int scratch;\r
+    unsigned int i;\r
+\r
+    buf_ptr = buf->image;\r
+\r
+    for (i = (buf->xsize * buf->ysize); i; i--) {\r
+        scratch = (*buf_ptr + factor);\r
+        if (scratch <= 0) {\r
+            *buf_ptr++ = 0;\r
+        } else if (scratch >= 63) {\r
+            *buf_ptr++ = 63;\r
+        } else {\r
+            *buf_ptr++ = scratch;\r
+        }\r
+    }\r
+}\r
+\r
+\r
+void\r
+stretch_blitbuf(BYTE factor, blitbuf *buf)\r
+{\r
+    BYTE *buf_ptr;\r
+    short int scratch;\r
+    unsigned int i;\r
+\r
+    buf_ptr = buf->image;\r
+\r
+    for (i = (buf->xsize * buf->ysize); i; i--) {\r
+        scratch = ((((*buf_ptr - 32) * factor) + 8) >> 4) + 32;\r
+        if (scratch <= 0) {\r
+            *buf_ptr++ = 0;\r
+        } else if (scratch >= 63) {\r
+            *buf_ptr++ = 63;\r
+        } else {\r
+            *buf_ptr++ = scratch;\r
+        }\r
+    }\r
+}\r
+\r
+\r
+void\r
+pixelize(DIST pixfactor, blitbuf *buf)\r
+{\r
+    // Do nothing\r
+}\r
+\r
+\r
+void\r
+GREYconvolve_blitbuf(BYTE *kernel, blitbuf *buf)\r
+{\r
+    // Do nothing\r
+}\r
+\r
+\r
+void\r
+RGBconvolve_blitbuf(BYTE *kernel, blitbuf *buf)\r
+{\r
+    // Do nothing\r
+}\r
+\r
+\r
+void\r
+scale_scanline(BYTE *source, BYTE *dest, DIST smap_size, DIST dmap_size,\r
+    DIST dline_size)\r
+{\r
+    unsigned long ErrorAcc, ErrorAdj;\r
+    short int i, temp, invert;\r
+\r
+    ErrorAcc = 0x8000;\r
+\r
+    // Prepare for backwards scanlines\r
+    if (dline_size >= 0) {\r
+        invert = 0;\r
+    } else {\r
+        invert = 1;\r
+        dline_size = -dline_size;\r
+    }\r
+\r
+    if (dline_size > smap_size) {\r
+        // Biggering\r
+        if (smap_size == 0) {\r
+            return;\r
+        }\r
+        ErrorAdj = ((((unsigned long)dline_size) << 16) /\r
+                    (((unsigned long)smap_size)));\r
+\r
+        i=smap_size;\r
+        while (i--) {\r
+            ErrorAcc += ErrorAdj;\r
+            temp = (ErrorAcc >> 16);\r
+            ErrorAcc &= 0xFFFFL;\r
+            while (temp--) {\r
+                *dest++ = *source;\r
+            }\r
+            source++;\r
+        }\r
+    } else {\r
+        // Smallering\r
+        if (dline_size == 0) {\r
+            memset(dest, 0, dmap_size);\r
+        } else {\r
+            temp = dmap_size - dline_size;\r
+            i = temp >> 1;\r
+            temp -= i;\r
+            while (i--) {\r
+                *dest++ = 0;\r
+            }\r
+\r
+            ErrorAdj = ((((unsigned long)smap_size) << 16) /\r
+                        (((unsigned long)dline_size)));\r
+\r
+            i=dline_size;\r
+\r
+            while (i--) {\r
+                *dest++ = *source;\r
+                ErrorAcc += ErrorAdj;\r
+                source += (ErrorAcc >> 16);\r
+                ErrorAcc &= 0xFFFFL;\r
+            }\r
+\r
+            while (temp--) {\r
+                *dest++ = 0;\r
+            }\r
+        }\r
+    }\r
+}\r
+\r
+\r
+int\r
+load_blitbufRAW(char *rawname, char *palname, blitbuf *buf)\r
+{\r
+    FILE *fp;\r
+    BYTE VGA_pal[768];\r
+\r
+    fp = fopen(rawname, "rb");\r
+\r
+    if (fp == NULL) {\r
+        buf->xsize = 0;\r
+        buf->ysize = 0;\r
+        buf->image = NULL;\r
+        return 0;\r
+    } else {\r
+        buf->xsize = 320;\r
+        buf->ysize = 200;\r
+        buf->image = new BYTE[64000L];\r
+\r
+        // Load image\r
+        fread(buf->image, 64000L, 1, fp);\r
+\r
+        if (palname == NULL) {\r
+            fread(VGA_pal, 1, 768, fp);\r
+            set_paletteX(VGA_pal);\r
+            fclose(fp);\r
+        } else {\r
+            fclose(fp);\r
+            fp = fopen(palname, "rb");\r
+            if (fp != NULL) {\r
+                fread(VGA_pal, 1, 768, fp);\r
+                set_paletteX(VGA_pal);\r
+                fclose(fp);\r
+            }\r
+        }\r
+\r
+        return 1;\r
+    }\r
+}\r
+\r