--- /dev/null
+#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