summaryrefslogtreecommitdiffstats
path: root/private/mvdm/softpc.new/host/src/nt_munge.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/mvdm/softpc.new/host/src/nt_munge.c')
-rw-r--r--private/mvdm/softpc.new/host/src/nt_munge.c556
1 files changed, 556 insertions, 0 deletions
diff --git a/private/mvdm/softpc.new/host/src/nt_munge.c b/private/mvdm/softpc.new/host/src/nt_munge.c
new file mode 100644
index 000000000..5c48df4ee
--- /dev/null
+++ b/private/mvdm/softpc.new/host/src/nt_munge.c
@@ -0,0 +1,556 @@
+/*
+ * SoftPC Revision 3.0
+ *
+ * Title : Win32 mungeing routines.
+ *
+ * Description : This module contains the functions required to produce
+ * destination compatible pixel patterns from SoftPC video
+ * memory.
+ *
+ * Author : Jerry Sexton (based on X_munge.c)
+ *
+ * Notes :
+ *
+ */
+
+#include <windows.h>
+#include "insignia.h"
+#include "host_def.h"
+
+#include "xt.h"
+#include "gvi.h"
+#include "gmi.h"
+#include "gfx_upd.h"
+#include "egagraph.h"
+#include <conapi.h>
+#include "nt_graph.h"
+
+/*(
+========================= ega_colour_hi_munge =============================
+
+PURPOSE: Munge interleaved EGA plane data to bitmap form using lookup tables.
+INPUT: (unsigned char *) plane0_ptr - ptr to plane0 data
+ (int) width - # of groups of 4 bytes on the line
+ (unsigned int *) dest_ptr - ptr to output buffer
+ (unsigned int *) lut0_ptr - munging luts
+ (int) height - # of scanlines to output (1 or 2)
+ (int) line_offset - distance to next scanline
+OUTPUT: A nice bitmap in dest_ptr
+
+===========================================================================
+)*/
+
+GLOBAL VOID
+ega_colour_hi_munge(unsigned char *plane0_ptr, int width,
+ unsigned int *dest_ptr, unsigned int *lut0_ptr,
+ int height, int line_offset)
+{
+ unsigned int *lut1_ptr = lut0_ptr + LUT_OFFSET;
+ unsigned int *lut2_ptr = lut1_ptr + LUT_OFFSET;
+ unsigned int *lut3_ptr = lut2_ptr + LUT_OFFSET;
+ FAST unsigned int hi_res;
+ FAST unsigned int lo_res;
+ FAST unsigned int *l_ptr;
+ FAST half_word *data;
+
+ /* make sure we get the line offset in ints not bytes */
+ line_offset /= sizeof(int);
+ data = (half_word *) plane0_ptr;
+
+ /* convert each input byte in turn */
+ if (get_plane_mask() == 0xf) /* all planes enabled */
+ {
+ for ( ; width > 0; width--)
+ {
+ /* Get 8 bytes (2 longs) of output data from 1 byte of plane 0
+ ** data
+ */
+
+ l_ptr = &lut0_ptr [*data++ << 1];
+ hi_res = *l_ptr++;
+ lo_res = *l_ptr;
+
+ /* Or in the output data from plane 1 */
+ l_ptr = &lut1_ptr [*data++ << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+
+ /* Or in the output data from plane 2 */
+ l_ptr = &lut2_ptr [*data++ << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+
+ /* Or in the output data from plane 3 */
+ l_ptr = &lut3_ptr [*data++ << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+
+ /* Output the data to the buffer */
+ if (height == 2)
+ {
+ /* scanline doubling */
+ *(dest_ptr + line_offset) = hi_res;
+ *dest_ptr++ = hi_res;
+ *(dest_ptr + line_offset) = lo_res;
+ *dest_ptr++ = lo_res;
+ }
+ else
+ {
+ /* not scanline doubling */
+ *dest_ptr++ = hi_res;
+ *dest_ptr++ = lo_res;
+ }
+ }
+ }
+ else
+ {
+ for ( ; width > 0; width--)
+ {
+ /* Get 8 bytes (2 longs) of output data from 1 byte of plane 0
+ ** data
+ */
+
+ if (get_plane_mask() & 1)
+ {
+ l_ptr = &lut0_ptr [*data++ << 1];
+ hi_res = *l_ptr++;
+ lo_res = *l_ptr;
+ }
+ else
+ {
+ hi_res = 0;
+ lo_res = 0;
+ data++;
+ }
+
+ /* Conditionally Or in the output data from plane 1 */
+ if (get_plane_mask() & 2)
+ {
+ l_ptr = &lut1_ptr [*data++ << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Conditionally Or in the output data from plane 2 */
+ if (get_plane_mask() & 4)
+ {
+ l_ptr = &lut2_ptr [*data++ << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Conditionally Or in the output data from plane 3 */
+ if (get_plane_mask() & 8)
+ {
+ l_ptr = &lut3_ptr [*data++ << 1];
+ hi_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Output the data to the buffer */
+ if (height == 2)
+ {
+ /* scanline doubling */
+ *(dest_ptr + line_offset) = hi_res;
+ *dest_ptr++ = hi_res;
+ *(dest_ptr + line_offset) = lo_res;
+ *dest_ptr++ = lo_res;
+ }
+ else
+ {
+ /* not scanline doubling */
+ *dest_ptr++ = hi_res;
+ *dest_ptr++ = lo_res;
+ }
+ }
+ }
+} /* ega_colour_hi_munge */
+
+#ifdef BIGWIN
+/*(
+========================= ega_colour_hi_munge_big ===========================
+
+PURPOSE: Munge interleaved EGA plane data to bitmap data for big windows.
+INPUT: (unsigned char *) plane0_ptr - ptr to EGA plane 0 data
+ (int) width - number of bytes to convert
+ (unsigned int *) dest_ptr - output buffer ptr
+ (unsigned int *) lut0_ptr - ptr to luts
+ (int) height - # of scanlines to output (1 or 3)
+ (int) line_offset - distance to next scanline
+OUTPUT: A nice bitmap in the output buffer
+
+=============================================================================
+)*/
+
+GLOBAL VOID
+ega_colour_hi_munge_big(unsigned char *plane0_ptr, int width,
+ unsigned int *dest_ptr, unsigned int *lut0_ptr,
+ int height, int line_offset)
+{
+ unsigned int *lut1_ptr = lut0_ptr + BIG_LUT_OFFSET;
+ unsigned int *lut2_ptr = lut1_ptr + BIG_LUT_OFFSET;
+ unsigned int *lut3_ptr = lut2_ptr + BIG_LUT_OFFSET;
+ FAST unsigned int hi_res;
+ FAST unsigned int med_res;
+ FAST unsigned int lo_res;
+ FAST unsigned int *l_ptr;
+ FAST half_word *data;
+
+ /* make sure we get the line offset in ints not bytes */
+ line_offset /= sizeof(int);
+ data = (half_word *) plane0_ptr;
+
+ if (get_plane_mask() == 0xf)
+ {
+ for ( ; width > 0; width--)
+ {
+ /* From one byte of input data in plane 0, get 12 bytes
+ ** of output data.
+ */
+
+ l_ptr = &lut0_ptr [*data++ * 3];
+ hi_res = *l_ptr++;
+ med_res = *l_ptr++;
+ lo_res = *l_ptr;
+
+ /* Or in the stuff from plane 1 */
+ l_ptr = &lut1_ptr [*data++ * 3];
+ hi_res |= *l_ptr++;
+ med_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+
+ /* Or in the stuff from plane 2 */
+ l_ptr = &lut2_ptr [*data++ * 3];
+ hi_res |= *l_ptr++;
+ med_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+
+ /* Or in the stuff from plane 3 */
+ l_ptr = &lut3_ptr [*data++ * 3];
+ hi_res |= *l_ptr++;
+ med_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+
+ /* Output the munged data */
+ if (height == 3)
+ {
+ /* triple the scanlines */
+ *(dest_ptr + 2*line_offset) = hi_res;
+ *(dest_ptr + line_offset) = hi_res;
+ *dest_ptr++ = hi_res;
+ *(dest_ptr + 2*line_offset) = med_res;
+ *(dest_ptr + line_offset) = med_res;
+ *dest_ptr++ = med_res;
+ *(dest_ptr + 2*line_offset) = lo_res;
+ *(dest_ptr + line_offset) = lo_res;
+ *dest_ptr++ = lo_res;
+ }
+ else
+ {
+ /* just one scanline */
+ *dest_ptr++ = hi_res;
+ *dest_ptr++ = med_res;
+ *dest_ptr++ = lo_res;
+ }
+ }
+ }
+ else
+ {
+ for ( ; width > 0; width--)
+ {
+ /* From one byte of input data in plane 0, get 12 bytes
+ ** of output data.
+ */
+
+ if (get_plane_mask() & 1)
+ {
+ l_ptr = &lut0_ptr [*data++ * 3];
+ hi_res = *l_ptr++;
+ med_res = *l_ptr++;
+ lo_res = *l_ptr;
+ }
+ else
+ {
+ data++;
+ hi_res = 0;
+ med_res = 0;
+ lo_res = 0;
+ }
+
+ /* Or in the stuff from plane 1 */
+ if (get_plane_mask() & 2)
+ {
+ l_ptr = &lut1_ptr [*data++ * 3];
+ hi_res |= *l_ptr++;
+ med_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Or in the stuff from plane 2 */
+ if (get_plane_mask() & 4)
+ {
+ l_ptr = &lut2_ptr [*data++ * 3];
+ hi_res |= *l_ptr++;
+ med_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Or in the stuff from plane 3 */
+ if (get_plane_mask() & 8)
+ {
+ l_ptr = &lut3_ptr [*data++ * 3];
+ hi_res |= *l_ptr++;
+ med_res |= *l_ptr++;
+ lo_res |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Output the munged data */
+ if (height == 3)
+ {
+ /* triple the scanlines */
+ *(dest_ptr + 2*line_offset) = hi_res;
+ *(dest_ptr + line_offset) = hi_res;
+ *dest_ptr++ = hi_res;
+ *(dest_ptr + 2*line_offset) = med_res;
+ *(dest_ptr + line_offset) = med_res;
+ *dest_ptr++ = med_res;
+ *(dest_ptr + 2*line_offset) = lo_res;
+ *(dest_ptr + line_offset) = lo_res;
+ *dest_ptr++ = lo_res;
+ }
+ else
+ {
+ /* just one scanline */
+ *dest_ptr++ = hi_res;
+ *dest_ptr++ = med_res;
+ *dest_ptr++ = lo_res;
+ }
+ }
+ }
+} /* ega_colour_hi_munge_big */
+
+/*(
+========================= ega_colour_hi_munge_huge ========================
+
+PURPOSE: Munge interleaved EGA plane data to bitmap form using lookup tables.
+INPUT: (unsigned char *) plane0_ptr - ptr to plane0 data
+ (int) width - # of bytes on the line
+ (unsigned int *) dest_ptr - ptr to output buffer
+ (unsigned int *) lut0_ptr - munging luts
+ (int) height - # of scanlines to output (1 or 2)
+ (int) line_offset - distance to next scanline
+OUTPUT: A nice X image in dest_ptr
+
+===========================================================================
+)*/
+
+GLOBAL VOID
+ega_colour_hi_munge_huge(unsigned char *plane0_ptr, int width,
+ unsigned int *dest_ptr, unsigned int *lut0_ptr,
+ int height, int line_offset)
+{
+ unsigned int *lut1_ptr = lut0_ptr + HUGE_LUT_OFFSET;
+ unsigned int *lut2_ptr = lut1_ptr + HUGE_LUT_OFFSET;
+ unsigned int *lut3_ptr = lut2_ptr + HUGE_LUT_OFFSET;
+ FAST unsigned int res4;
+ FAST unsigned int res3;
+ FAST unsigned int res2;
+ FAST unsigned int res1;
+ FAST unsigned int *l_ptr;
+ FAST half_word *data;
+
+ /* make sure we get the line offset in ints not bytes */
+ line_offset /= sizeof(int);
+ data = (half_word *) plane0_ptr;
+
+ /* convert each input byte in turn */
+ if (get_plane_mask() == 0xf)
+ {
+ for ( ; width > 0; width--)
+ {
+ /* Get 16 bytes of output data from 1 byte of plane 0
+ ** data
+ */
+
+ l_ptr = &lut0_ptr [*data++ << 2];
+ res4 = *l_ptr++;
+ res3 = *l_ptr++;
+ res2 = *l_ptr++;
+ res1 = *l_ptr;
+
+ /* Or in the output data from plane 1 */
+ l_ptr = &lut1_ptr [*data++ << 2];
+ res4 |= *l_ptr++;
+ res3 |= *l_ptr++;
+ res2 |= *l_ptr++;
+ res1 |= *l_ptr;
+
+ /* Or in the output data from plane 2 */
+ l_ptr = &lut2_ptr [*data++ << 2];
+ res4 |= *l_ptr++;
+ res3 |= *l_ptr++;
+ res2 |= *l_ptr++;
+ res1 |= *l_ptr;
+
+ /* Or in the output data from plane 3 */
+ l_ptr = &lut3_ptr [*data++ << 2];
+ res4 |= *l_ptr++;
+ res3 |= *l_ptr++;
+ res2 |= *l_ptr++;
+ res1 |= *l_ptr;
+
+ /* Output the data to the buffer */
+ if (height == 4)
+ {
+ /* scanline doubling */
+ *(dest_ptr + 3*line_offset) = res4;
+ *(dest_ptr + 2*line_offset) = res4;
+ *(dest_ptr + line_offset) = res4;
+ *dest_ptr++ = res4;
+ *(dest_ptr + 3*line_offset) = res3;
+ *(dest_ptr + 2*line_offset) = res3;
+ *(dest_ptr + line_offset) = res3;
+ *dest_ptr++ = res3;
+ *(dest_ptr + 3*line_offset) = res2;
+ *(dest_ptr + 2*line_offset) = res2;
+ *(dest_ptr + line_offset) = res2;
+ *dest_ptr++ = res2;
+ *(dest_ptr + 3*line_offset) = res1;
+ *(dest_ptr + 2*line_offset) = res1;
+ *(dest_ptr + line_offset) = res1;
+ *dest_ptr++ = res1;
+ }
+ else
+ {
+ /* not scanline doubling */
+ *dest_ptr++ = res4;
+ *dest_ptr++ = res3;
+ *dest_ptr++ = res2;
+ *dest_ptr++ = res1;
+ }
+ }
+ }
+ else
+ {
+ for ( ; width > 0; width--)
+ {
+ /* Get 16 bytes of output data from 1 byte of plane 0
+ ** data
+ */
+
+ if (get_plane_mask() & 1)
+ {
+ l_ptr = &lut0_ptr [*data++ << 2];
+ res4 = *l_ptr++;
+ res3 = *l_ptr++;
+ res2 = *l_ptr++;
+ res1 = *l_ptr;
+ }
+ else
+ {
+ res4 = 0;
+ res3 = 0;
+ res2 = 0;
+ res1 = 0;
+ data++;
+ }
+
+ /* Or in the output data from plane 1 */
+ if (get_plane_mask() & 2)
+ {
+ l_ptr = &lut1_ptr [*data++ << 2];
+ res4 |= *l_ptr++;
+ res3 |= *l_ptr++;
+ res2 |= *l_ptr++;
+ res1 |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Or in the output data from plane 2 */
+ if (get_plane_mask() & 4)
+ {
+ l_ptr = &lut2_ptr [*data++ << 2];
+ res4 |= *l_ptr++;
+ res3 |= *l_ptr++;
+ res2 |= *l_ptr++;
+ res1 |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Or in the output data from plane 3 */
+ if (get_plane_mask() & 8)
+ {
+ l_ptr = &lut3_ptr [*data++ << 2];
+ res4 |= *l_ptr++;
+ res3 |= *l_ptr++;
+ res2 |= *l_ptr++;
+ res1 |= *l_ptr;
+ }
+ else
+ {
+ data++;
+ }
+
+ /* Output the data to the buffer */
+ if (height == 4)
+ {
+ /* scanline doubling */
+ *(dest_ptr + 3*line_offset) = res4;
+ *(dest_ptr + 2*line_offset) = res4;
+ *(dest_ptr + line_offset) = res4;
+ *dest_ptr++ = res4;
+ *(dest_ptr + 3*line_offset) = res3;
+ *(dest_ptr + 2*line_offset) = res3;
+ *(dest_ptr + line_offset) = res3;
+ *dest_ptr++ = res3;
+ *(dest_ptr + 3*line_offset) = res2;
+ *(dest_ptr + 2*line_offset) = res2;
+ *(dest_ptr + line_offset) = res2;
+ *dest_ptr++ = res2;
+ *(dest_ptr + 3*line_offset) = res1;
+ *(dest_ptr + 2*line_offset) = res1;
+ *(dest_ptr + line_offset) = res1;
+ *dest_ptr++ = res1;
+ }
+ else
+ {
+ /* not scanline doubling */
+ *dest_ptr++ = res4;
+ *dest_ptr++ = res3;
+ *dest_ptr++ = res2;
+ *dest_ptr++ = res1;
+ }
+ }
+ }
+} /* ega_colour_hi_munge_huge */
+#endif /* BIGWIN */