mirror of
https://github.com/deater/dos33fsprogs.git
synced 2024-12-30 22:32:48 +00:00
925 lines
27 KiB
C
925 lines
27 KiB
C
/* ---------------------------------------------------------------------
|
|
Bmp2DHR (C) Copyright Bill Buckels 2014.
|
|
All Rights Reserved.
|
|
|
|
Module Name - Description
|
|
-------------------------
|
|
|
|
b2d.h - header file for b2d.c (main program)
|
|
|
|
Licence Agreement
|
|
-----------------
|
|
|
|
You have a royalty-free right to use, modify, reproduce and
|
|
distribute this source code in any way you find useful, provided
|
|
that you agree that Bill Buckels has no warranty obligations or
|
|
liability resulting from said distribution in any way whatsoever. If
|
|
you don't agree, remove this source code and related files from your
|
|
computer now.
|
|
|
|
Written by: Bill Buckels
|
|
Email: bbuckels@mts.net
|
|
|
|
Version 1.0
|
|
Developed between Aug 2014 and December 2014 with "standard parts".
|
|
|
|
Bmp2DHR reads a monochrome, 16 color, 256 color, or 24 bit BMP and writes
|
|
Apple II color or monochrome HGR or DHGR files.
|
|
|
|
*/
|
|
|
|
#ifndef BMP2SHR_H
|
|
#define BMP2SHR_H 1
|
|
|
|
/* ***************************************************************** */
|
|
/* ========================== includes ============================= */
|
|
/* ***************************************************************** */
|
|
|
|
#include "tomthumb.h"
|
|
|
|
/* ***************************************************************** */
|
|
/* ========================== defines ============================== */
|
|
/* ***************************************************************** */
|
|
|
|
/* file name length max */
|
|
#define MAXF 256
|
|
|
|
#define SUCCESS 0
|
|
#define INVALID -1
|
|
#define RETRY 911
|
|
#define BIN_OUTPUT 1
|
|
#define SPRITE_OUTPUT 2
|
|
|
|
/* constants for the biCompression field in a BMP header */
|
|
#define BI_RGB 0L
|
|
#define BI_RLE8 1L
|
|
#define BI_RLE4 2L
|
|
|
|
/* DHGR, DLGR, LGR colors - LGR color order */
|
|
#define LOBLACK 0
|
|
#define LORED 1
|
|
#define LODKBLUE 2
|
|
#define LOPURPLE 3
|
|
#define LODKGREEN 4
|
|
#define LOGRAY 5
|
|
#define LOMEDBLUE 6
|
|
#define LOLTBLUE 7
|
|
#define LOBROWN 8
|
|
#define LOORANGE 9
|
|
#define LOGREY 10
|
|
#define LOPINK 11
|
|
#define LOLTGREEN 12
|
|
#define LOYELLOW 13
|
|
#define LOAQUA 14
|
|
#define LOWHITE 15
|
|
|
|
/* HGR color constants */
|
|
#define HBLACK 0
|
|
#define HGREEN 1
|
|
#define HVIOLET 2
|
|
#define HORANGE 3
|
|
#define HBLUE 4
|
|
#define HWHITE 5
|
|
|
|
#define RED 0
|
|
#define GREEN 1
|
|
#define BLUE 2
|
|
|
|
#define FLOYDSTEINBERG 1
|
|
#define JARVIS 2
|
|
#define STUCKI 3
|
|
#define ATKINSON 4
|
|
#define BURKES 5
|
|
#define SIERRA 6
|
|
#define SIERRATWO 7
|
|
#define SIERRALITE 8
|
|
#define BUCKELS 9
|
|
#define CUSTOM 10
|
|
|
|
#define ASCIIZ 0
|
|
#define CRETURN 13
|
|
#define LFEED 10
|
|
|
|
#define PSEUDOMAX 100
|
|
|
|
/* ***************************************************************** */
|
|
/* ========================== typedefs ============================= */
|
|
/* ***************************************************************** */
|
|
|
|
/* Bitmap Header structures */
|
|
typedef struct __attribute__((__packed__)) tagBITMAPINFOHEADER {
|
|
uint32_t biSize;
|
|
uint32_t biWidth;
|
|
uint32_t biHeight;
|
|
uint16_t biPlanes;
|
|
uint16_t biBitCount;
|
|
uint32_t biCompression;
|
|
uint32_t biSizeImage;
|
|
uint32_t biXPelsPerMeter;
|
|
uint32_t biYPelsPerMeter;
|
|
uint32_t biClrUsed;
|
|
uint32_t biClrImportant;
|
|
} BITMAPINFOHEADER;
|
|
|
|
typedef struct __attribute__((__packed__)) tagBITMAPFILEHEADER
|
|
|
|
{
|
|
uint8_t bfType[2];
|
|
uint32_t bfSize;
|
|
uint16_t bfReserved1;
|
|
uint16_t bfReserved2;
|
|
uint32_t bfOffBits;
|
|
} BITMAPFILEHEADER;
|
|
|
|
typedef struct __attribute__((__packed__)) tagBMPHEADER {
|
|
BITMAPFILEHEADER bfi;
|
|
BITMAPINFOHEADER bmi;
|
|
} BMPHEADER;
|
|
|
|
typedef struct __attribute__((__packed__)) tagRGBQUAD {
|
|
uint8_t rgbBlue;
|
|
uint8_t rgbGreen;
|
|
uint8_t rgbRed;
|
|
uint8_t rgbReserved;
|
|
} RGBQUAD;
|
|
|
|
|
|
/* ***************************************************************** */
|
|
/* =================== prototypes as required ===================== */
|
|
/* ***************************************************************** */
|
|
|
|
int16_t GetUserTextFile(void);
|
|
int dhrgetpixel(int x,int y);
|
|
|
|
/* ***************************************************************** */
|
|
/* ========================== globals ============================== */
|
|
/* ***************************************************************** */
|
|
|
|
/* output buffers */
|
|
uint8_t *dhrbuf;
|
|
uint8_t *hgrbuf;
|
|
|
|
/* static structures for processing */
|
|
BITMAPFILEHEADER bfi;
|
|
BITMAPINFOHEADER bmi;
|
|
BMPHEADER mybmp,maskbmp;
|
|
RGBQUAD sbmp[256], maskpalette[256]; /* super vga - applewin */
|
|
|
|
/* overlay file for screen titling and framing and "cleansing" */
|
|
FILE *fpmask = NULL;
|
|
uint8_t remap[256];
|
|
|
|
char bmpfile[MAXF], dibfile[MAXF], scaledfile[MAXF], previewfile[MAXF], reformatfile[MAXF], maskfile[MAXF], fmask[MAXF];
|
|
char spritefile[MAXF], mainfile[MAXF],auxfile[MAXF],a2fcfile[MAXF],usertextfile[MAXF],vbmpfile[MAXF],fname[MAXF];
|
|
|
|
/* HGR file designations for systems with long file names */
|
|
/* these match the HGR output options selected */
|
|
char hgrcolor[MAXF],hgrmono[MAXF],hgrwork[MAXF];
|
|
|
|
int mono = 0, dosheader = 0, spritemask = 0, tags=0;
|
|
int backgroundcolor = 0, quietmode = 1, diffuse = 0, merge = 0, scale = 0, applesoft = 0, outputtype = BIN_OUTPUT;
|
|
int reformat = 0, debug = 0;
|
|
int preview = 0, vbmp = 0, hgroutput = 0;
|
|
int overlay = 0, maskpixel=0, overcolor=0, clearcolor=5;
|
|
|
|
/* 2 x 2 general purpose cross-hatching */
|
|
int xmatrix = 0, ymatrix = 0, threshold = 0;
|
|
|
|
uint16_t bmpwidth = 0, bmpheight = 0, spritewidth = 0;
|
|
|
|
/* classic size alternate windowed output */
|
|
/* applies to 320 x 200, 640 x 400, and 640 x 480 only */
|
|
/* for 320 x 200 the window is 280 x 192 */
|
|
/* for 640 x the window is 560 x 384 */
|
|
/* output is always 280 x 192 */
|
|
/* for 640 output is merged 2 x 2 */
|
|
int16_t justify = 0, jxoffset = -1, jyoffset = -1;
|
|
|
|
/* HGR setting - by default, double colors is off and pixels are set individually */
|
|
int doubleblack = 0, doublewhite = 0, doublecolors = 1, ditheroneline = 0;
|
|
|
|
/* error diffusion dithering settings */
|
|
int globalclip = 0;
|
|
int ditherstart = 0;
|
|
int bleed = 16;
|
|
int paletteclip = 0;
|
|
|
|
/* custom dither file support */
|
|
int16_t customdivisor;
|
|
int16_t customdither[3][11];
|
|
|
|
uint8_t msk[]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
|
|
int reverse = 0;
|
|
|
|
/* the line buffers in this program are designed to hold a 320 pixel scanline...
|
|
for reusability in other modules and for other Apple II modes
|
|
including SHR 320 */
|
|
/* for DHGR monochrome they must hold a scanline 560 pixels wide */
|
|
uint8_t bmpscanline[1920],
|
|
bmpscanline2[1920],
|
|
dibscanline1[1920],
|
|
dibscanline2[1920],
|
|
dibscanline3[1920],
|
|
dibscanline4[1920],
|
|
previewline[1920],
|
|
maskline[560];
|
|
|
|
/* Floyd-Steinberg Etc. Dithering */
|
|
uint8_t dither = 0, errorsum = 0, serpentine = 0;
|
|
/* color channel buffers for Floyd-Steinberg Etc. Dithering */
|
|
/* note that these are arrays of short integers (2 bytes * 320) */
|
|
/* current line contains current scanline values
|
|
+ (plus) seed values (error values) from previous line
|
|
|
|
these error values are the linear distance in a scale of 0-255
|
|
between the real color and the nearest palette color.
|
|
|
|
each of the r,g,b color channels is separate.
|
|
|
|
a psychovisual palette match is done with the real color
|
|
to get the near color from the palette
|
|
|
|
the dither error is then applied to neighboring pixels
|
|
using the dithering filter's distribution pattern
|
|
|
|
later on when the color channels are finally reconstructed
|
|
a psychovisual palette match is done again to get the dither
|
|
color.
|
|
|
|
if preview is turned-on the output can be viewed in
|
|
a BMP viewer.
|
|
|
|
*/
|
|
int16_t redDither[640],greenDither[640],blueDither[640];
|
|
/* seed values from previous line */
|
|
int16_t redSeed[640],greenSeed[640],blueSeed[640];
|
|
int16_t redSeed2[640],greenSeed2[640],blueSeed2[640];
|
|
int16_t *colorptr, *seedptr, *seed2ptr, color_error;
|
|
|
|
int colorbleed = 100;
|
|
|
|
/* color hgr dither routines */
|
|
/* these buffers correspond to redDither, blueDither, greenDither */
|
|
int16_t redSave[320], greenSave[320], blueSave[320];
|
|
int16_t OrangeBlueError[320], GreenVioletError[320];
|
|
uint8_t HgrPixelPalette[320];
|
|
uint8_t dither7 = 0, hgrdither = 0;
|
|
|
|
/* HGR output routines */
|
|
uint8_t palettebits[40], hgrpaltype = 255; /* Both palettes are active by default */
|
|
uint8_t hgrcolortype = 0;
|
|
uint8_t work280[280], buf280[560];
|
|
|
|
/* built-in palette options */
|
|
/* based on DHGR, DLGR, LGR colors */
|
|
/* LGR color order */
|
|
uint8_t kegs32colors[16][3] = {
|
|
{0,0,0}, /* black */
|
|
{221,0,51}, /* red */
|
|
{0,0,153}, /* dk blue */
|
|
{221,0,221}, /* purple */
|
|
{0,119,0}, /* dk green */
|
|
{85,85,85}, /* gray */
|
|
{34,34,255}, /* med blue */
|
|
{102,170,255}, /* lt blue */
|
|
{136,85,34}, /* brown */
|
|
{255,102,0}, /* orange */
|
|
{170,170,170}, /* grey */
|
|
{255,153,136}, /* pink */
|
|
{0,221,0}, /* lt green */
|
|
{255,255,0}, /* yellow */
|
|
{0,255,153}, /* aqua */
|
|
{255,255,255}/* white */
|
|
};
|
|
uint8_t ciderpresscolors[16][3] = {
|
|
{0,0,0}, /* black */
|
|
{221,0,51}, /* red */
|
|
{0,0,153}, /* dk blue */
|
|
{221,34,221}, /* purple */
|
|
{0,119,34}, /* dk green */
|
|
{85,85,85}, /* gray */
|
|
{34,34,255}, /* med blue */
|
|
{102,170,255}, /* lt blue */
|
|
{136,85,0}, /* brown */
|
|
{255,102,0}, /* orange */
|
|
{170,170,170}, /* grey */
|
|
{255,153,136}, /* pink */
|
|
{17,221,0}, /* lt green */
|
|
{255,255,0}, /* yellow */
|
|
{68,255,153}, /* aqua */
|
|
{255,255,255}/* white */
|
|
};
|
|
|
|
uint8_t awinoldcolors[16][3] = {
|
|
{0,0,0}, /* black */
|
|
{208,0,48}, /* red */
|
|
{0,0,128}, /* dk blue */
|
|
{255,0,255}, /* purple */
|
|
{0,128,0}, /* dk green */
|
|
{128,128,128}, /* gray */
|
|
{0,0,255}, /* med blue */
|
|
{96,160,255}, /* lt blue */
|
|
{128,80,0}, /* brown */
|
|
{255,128,0}, /* orange */
|
|
{192,192,192}, /* grey */
|
|
{255,144,128}, /* pink */
|
|
{0,255,0}, /* lt green */
|
|
{255,255,0}, /* yellow */
|
|
{64,255,144}, /* aqua */
|
|
{255,255,255} /* white */
|
|
};
|
|
|
|
uint8_t awinnewcolors[16][3] = {
|
|
{0,0,0}, /* black */
|
|
{157,9,102}, /* red */
|
|
{42,42,229}, /* dk blue */
|
|
{199,52,255}, /* purple */
|
|
{0,118,26}, /* dk green */
|
|
{128,128,128}, /* gray */
|
|
{13,161,255}, /* med blue */
|
|
{170,170,255}, /* lt blue */
|
|
{85,85,0}, /* brown */
|
|
{242,94,0}, /* orange */
|
|
{192,192,192}, /* grey */
|
|
{255,137,229}, /* pink */
|
|
{56,203,0}, /* lt green */
|
|
{213,213,26}, /* yellow */
|
|
{98,246,153}, /* aqua */
|
|
{255,255,255} /* white */
|
|
};
|
|
|
|
/* http://en.wikipedia.org/wiki/List_of_8-bit_computer_hardware_palettes */
|
|
uint8_t wikipedia[16][3] = {
|
|
{0,0,0}, /* black */
|
|
{114,38,64}, /* red */
|
|
{64,51,127}, /* dk blue */
|
|
{228,52,254}, /* purple */
|
|
{14,89,64}, /* dk green */
|
|
{128,128,128}, /* gray */
|
|
{27,154,254}, /* med blue */
|
|
{191,179,255}, /* lt blue */
|
|
{64,76,0}, /* brown */
|
|
{228,101,1}, /* orange */
|
|
{128,128,128}, /* grey */
|
|
{241,166,191}, /* pink */
|
|
{27,203,1}, /* lt green */
|
|
{191,204,128}, /* yellow */
|
|
{141,217,191}, /* aqua */
|
|
{255,255,255} /* white */
|
|
};
|
|
|
|
/* http://wsxyz.net/tohgr.html */
|
|
/* Sheldon Simm's palette from todhr */
|
|
/*
|
|
|
|
Sheldon is clipping the black and white ranges.
|
|
|
|
The usual reason for doing this is for dirty images (caused by poor digitizing or
|
|
sampling or re-sampling color depth loss due to scaling). By using a clipping threshold
|
|
at either end of the rgb range, blacks that are not quite black don't match to some other
|
|
dark color and whites that are not quite white don't match to some other light color.
|
|
|
|
I too put this in place as a clipping option when I wrote Bmp2SHR about a year ago in my
|
|
Brooks output routines but it worked a little differently. I didn't build it into a
|
|
palette for one thing.
|
|
|
|
Sheldon's weighting favours clipping blue gun values at both ends of the range.
|
|
|
|
Red is clipped more than green in the high range, and green is clipped more than
|
|
red in the low range.
|
|
|
|
static Pixel pal[] = {
|
|
{ 1, 4, 8}, // 0 black
|
|
{ 32, 54, 212}, // 1 dk blue
|
|
{ 51, 111, 0}, // 2 dk green
|
|
{ 7, 168, 225}, // 3 med blue
|
|
{ 99, 77, 0}, // 4 brown
|
|
{ 126, 126, 126}, // 5 gray
|
|
{ 67, 200, 0}, // 6 lt green
|
|
{ 93, 248, 133}, // 7 aqua
|
|
{ 148, 12, 125}, // 8 red
|
|
{ 188, 55, 255}, // 9 purple
|
|
{ 126, 126, 126}, // A grey
|
|
{ 158, 172, 255}, // B lt blue
|
|
{ 249, 86, 29}, // C orange
|
|
{ 255, 129, 236}, // D pink
|
|
{ 221, 206, 23}, // E yellow
|
|
{ 248, 250, 244} // F white
|
|
|
|
Also note that I use the array name grpal. This was used as a palette in
|
|
one of Sheldon's previous versions. Since I have propagated this array name
|
|
to my code and my code is working fine with it, I have no plans to change it
|
|
to maintain currency with Sheldon's code.
|
|
|
|
*/
|
|
uint8_t grpal[16][3] = {
|
|
{0,0,0}, /* black */
|
|
{148,12,125}, /* red - hgr 0*/
|
|
{32,54,212}, /* dk blue - hgr 0 */
|
|
{188,55,255}, /* purple - default HGR overlay color */
|
|
{51,111,0}, /* dk green - hgr 0 */
|
|
{126,126,126}, /* gray - hgr 0 */
|
|
{7,168,225}, /* med blue - alternate HGR overlay color */
|
|
{158,172,255}, /* lt blue - hgr 0 */
|
|
{99,77,0}, /* brown - hgr 0 */
|
|
{249,86,29}, /* orange */
|
|
{126,126,126}, /* grey - hgr 0 */
|
|
{255,129,236}, /* pink - hgr 0 */
|
|
{67,200,0}, /* lt green */
|
|
{221,206,23}, /* yellow - hgr 0 */
|
|
{93,248,133}, /* aqua - hgr 0 */
|
|
{255,255,255} /* white */
|
|
};
|
|
|
|
/* Sheldon still uses the RGB values from his old palette for HGR conversion */
|
|
uint8_t hgrpal[16][3] = {
|
|
{0x00,0x00,0x00}, /* black */
|
|
{0xad,0x18,0x28}, /* red */
|
|
{0x55,0x1b,0xe1}, /* dk blue */
|
|
{0xe8,0x2c,0xf8}, /* purple 232,44,248 - default hgr overlay color */
|
|
{0x01,0x73,0x63}, /* dk green */
|
|
{0x7e,0x82,0x7f}, /* gray */
|
|
{0x34,0x85,0xfc}, /* med blue - 52,133,252 - alternate HGR overlay color */
|
|
{0xd1,0x95,0xff}, /* lt blue */
|
|
{0x33,0x6f,0x00}, /* brown */
|
|
{0xd0,0x81,0x01}, /* orange */
|
|
{0x7f,0x7e,0x77}, /* grey */
|
|
{0xfe,0x93,0xa3}, /* pink */
|
|
{0x1d,0xd6,0x09}, /* lt green */
|
|
{0xae,0xea,0x22}, /* yellow */
|
|
{0x5b,0xeb,0xd9}, /* aqua */
|
|
{0xff,0xff,0xff} /* white */
|
|
};
|
|
|
|
/* Kegs32 uses Super Convert's colors */
|
|
uint8_t SuperConvert[16][3] = {
|
|
0,0,0, /* black */
|
|
221,0,51, /* red - hgr 0*/
|
|
0,0,153, /* dk blue - hgr 0 */
|
|
221,0,221, /* purple */
|
|
0,119,0, /* dk green - hgr 0 */
|
|
85,85,85, /* gray - hgr 0 */
|
|
34,34,255, /* med blue */
|
|
102,170,255, /* lt blue - hgr 0 */
|
|
136,85,34, /* brown - hgr 0 */
|
|
255,102,0, /* orange */
|
|
170,170,170, /* grey - hgr 0 */
|
|
255,153,136, /* pink - hgr 0 */
|
|
0,221,0, /* lt green */
|
|
255,255,0, /* yellow - hgr 0 */
|
|
0,255,153, /* aqua - hgr 0 */
|
|
255,255,255};/* white */
|
|
|
|
uint8_t Jace[16][3] = {
|
|
0,0,0, /* black */
|
|
177,0,93, /* red */
|
|
32,41,255, /* dk blue */
|
|
210,41,255, /* purple */
|
|
0,127,34, /* dk green */
|
|
127,127,127, /* gray */
|
|
0,168,255, /* med blue */
|
|
160,168,255, /* lt blue */
|
|
94,86,0, /* brown */
|
|
255,86,0, /* orange */
|
|
127,127,127, /* grey */
|
|
255,127,220, /* pink */
|
|
44,213,0, /* lt green */
|
|
222,213,0, /* yellow */
|
|
77,255,161, /* aqua */
|
|
255,255,255}; /* white */
|
|
|
|
/* https://github.com/cybernesto/VBMP/wiki/Converting-a-picture-into-a-DHGR-color-image-using-the-GIMP */
|
|
/* Robert Munafo - http://mrob.com/pub/xapple2/colors.html */
|
|
uint8_t Cybernesto[16][3] = {
|
|
0, 0, 0, /* 0 Black */
|
|
227, 30, 96, /* 1 Magenta */
|
|
96, 78,189, /* 8 Dark Blue */
|
|
255, 68,253, /* 9 Violet */
|
|
0,163, 96, /* 4 Dark Green */
|
|
156,156,156, /* 5 Grey1 */
|
|
20,207,253, /* 12 Medium Blue */
|
|
208,195,255, /* 13 Light Blue */
|
|
96,114, 3, /* 2 Brown */
|
|
255,106, 60, /* 3 Orange */
|
|
156,156,156, /* 10 Grey2 */
|
|
255,160,208, /* 11 Pink */
|
|
20,245, 60, /* 6 Green */
|
|
208,221,141, /* 7 Yellow */
|
|
114,255,208, /* 14 Aqua */
|
|
255,255,255}; /* 15 White */
|
|
|
|
/* pseudopalette support */
|
|
int16_t pseudocount = 0;
|
|
int16_t pseudolist[PSEUDOMAX];
|
|
uint16_t pseudowork[16][3];
|
|
|
|
/* "merged" pseudo palette average RGB values*/
|
|
/* initial values are the average values of p5 NTSC and p12 RGB */
|
|
uint8_t PseudoPalette[16][3] = {
|
|
0,0,0,
|
|
184,6,88,
|
|
16,27,182,
|
|
204,27,238,
|
|
25,115,0,
|
|
105,105,105,
|
|
20,101,240,
|
|
130,171,255,
|
|
117,81,17,
|
|
252,94,14,
|
|
148,148,148,
|
|
255,141,186,
|
|
33,210,0,
|
|
238,230,11,
|
|
46,251,143,
|
|
255,255,255};
|
|
|
|
|
|
/* ------------------------------------------------------------------------------ */
|
|
/* skip this if you think that this program has been clean up to now. */
|
|
/* this is more like an egg I laid than an easter egg. */
|
|
/* some legacy stuff - unhacked skeletons in my closet */
|
|
/* from the AppleX Aztec C65 distribution - not everything always goes as planned */
|
|
/* ------------------------------------------------------------------------------ */
|
|
|
|
/* "designer" palettes - VGA style mapping colors from BMPA2FC */
|
|
/* these are in the lo-res color order, same as above */
|
|
/* in BMPA2FC these were in IBM-PC default BIOS order */
|
|
|
|
/* Serious doubt! */
|
|
/* at this point, I wonder how well BMPA2FC mapped colors from BMP's */
|
|
/* not very well I think - but it's an old MS-DOS utility and no point
|
|
in worrying about it now - new users who find this can play with it */
|
|
|
|
/* this first array was my first attempt at establishing something that looked like
|
|
24 bit Lo-Res Colors - I am not even sure where I got the colors
|
|
they looked like what I wanted at the time before I knew a little more
|
|
|
|
the rest of the palettes in here were just pasted forward from ClipShop
|
|
but with a couple of minor changes to accomodate the move to Windows Paint for Xp
|
|
and the 16 color BMP's which have been stable ever since.
|
|
|
|
why the default palette changed between XP and Windows 3.1 I have no clue.
|
|
|
|
*/
|
|
|
|
/* If someone happens to use my canvas scheme from
|
|
my old utilities or whatever, having these here will at least save them
|
|
from ending-up with work that needs to be redone if they expected remapping */
|
|
|
|
/* goes with the canvas bmp that I put out there with AppleX */
|
|
uint8_t rgbCanvasArray[16][3] = {
|
|
0 , 0 , 0 ,
|
|
208, 0 , 48 ,
|
|
0 , 0 , 128,
|
|
255, 0 , 255,
|
|
0 , 128, 0 ,
|
|
128, 128, 128,
|
|
0 , 0 , 255,
|
|
96 , 160, 255,
|
|
128, 80 , 0 ,
|
|
255, 128, 0 ,
|
|
192, 192, 192,
|
|
255, 144, 128,
|
|
0 , 255, 0 ,
|
|
255, 255, 0 ,
|
|
64 , 255, 144,
|
|
255, 255, 255};
|
|
|
|
/* this might work with old Win16 16 color BMP's */
|
|
uint8_t rgbBmpArray[16][3] = {
|
|
0 ,0 , 0 ,
|
|
191,0 , 0 ,
|
|
0 ,0 , 191,
|
|
191,0 , 191,
|
|
0 ,191, 0 ,
|
|
128,128, 128,
|
|
0 ,191, 191,
|
|
0 ,0 , 255,
|
|
191,191, 0 ,
|
|
255,0 , 0 ,
|
|
192,192, 192,
|
|
255,0 , 255,
|
|
0 ,255, 0 ,
|
|
255,255, 0 ,
|
|
0 ,255, 255,
|
|
255,255, 255};
|
|
|
|
/* this might work with new Win32 16 color BMP's */
|
|
uint8_t rgbXmpArray[16][3] = {
|
|
0 , 0 , 0 ,
|
|
128, 0 , 0 ,
|
|
0 , 0 , 128,
|
|
128, 0 , 128,
|
|
0 , 128, 0 ,
|
|
128, 128, 128,
|
|
0 , 128, 128,
|
|
0 , 0 , 255,
|
|
128, 128, 0 ,
|
|
255, 0 , 0 ,
|
|
192, 192, 192,
|
|
255, 0 , 255,
|
|
0 , 255, 0 ,
|
|
255, 255, 0 ,
|
|
0 , 255, 255,
|
|
255, 255, 255};
|
|
|
|
/* from the bios in some PC I had */
|
|
uint8_t rgbVgaArray[16][3] = {
|
|
0 , 0 , 0 ,
|
|
255, 0 , 0 ,
|
|
0 , 0 , 255,
|
|
255, 0 , 255,
|
|
0 , 255, 0 ,
|
|
85 , 85 , 85 ,
|
|
0 , 255, 255,
|
|
85 , 85 , 255,
|
|
255, 255, 0 ,
|
|
255, 85 , 85 ,
|
|
192, 192, 192,
|
|
255, 85 , 255,
|
|
85 , 255, 85 ,
|
|
255, 255, 85 ,
|
|
85 , 255, 255,
|
|
255, 255, 255};
|
|
|
|
/* some old ZSoft VGA Pcx Colors */
|
|
uint8_t rgbPcxArray[16][3] = {
|
|
0 , 0 , 0 ,
|
|
170, 0 , 0 ,
|
|
0 , 0 , 170,
|
|
170, 0 , 170,
|
|
0 , 170, 0 ,
|
|
85 , 85 , 85 ,
|
|
0 , 170, 170,
|
|
85 , 85 , 255,
|
|
170, 170, 0 ,
|
|
255, 85 , 85 ,
|
|
170, 170, 170,
|
|
255, 85 , 255,
|
|
85 , 255, 85 ,
|
|
255, 255, 85 ,
|
|
85 , 255, 255,
|
|
255, 255, 255};
|
|
|
|
/* ------------------------------------------------------------------- */
|
|
/* end of legacy unhacked hack, and back to something that makes sense */
|
|
/* ------------------------------------------------------------------- */
|
|
|
|
/* palette work arrays */
|
|
uint8_t rgbArray[16][3], rgbAppleArray[16][3], rgbPreview[16][3], rgbUser[16][3];
|
|
double rgbLuma[16], rgbDouble[16][3];
|
|
double rgbOrangeDouble[3][3], rgbGreenDouble[3][3];
|
|
double rgbOrangeLuma[3], rgbGreenLuma[3];
|
|
|
|
double rgbLumaBrighten[16], rgbDoubleBrighten[16][3];
|
|
double rgbLumaDarken[16], rgbDoubleDarken[16][3];
|
|
|
|
/* provides base address for page1 hires scanlines */
|
|
unsigned HB[]={
|
|
0x2000, 0x2400, 0x2800, 0x2C00, 0x3000, 0x3400, 0x3800, 0x3C00,
|
|
0x2080, 0x2480, 0x2880, 0x2C80, 0x3080, 0x3480, 0x3880, 0x3C80,
|
|
0x2100, 0x2500, 0x2900, 0x2D00, 0x3100, 0x3500, 0x3900, 0x3D00,
|
|
0x2180, 0x2580, 0x2980, 0x2D80, 0x3180, 0x3580, 0x3980, 0x3D80,
|
|
0x2200, 0x2600, 0x2A00, 0x2E00, 0x3200, 0x3600, 0x3A00, 0x3E00,
|
|
0x2280, 0x2680, 0x2A80, 0x2E80, 0x3280, 0x3680, 0x3A80, 0x3E80,
|
|
0x2300, 0x2700, 0x2B00, 0x2F00, 0x3300, 0x3700, 0x3B00, 0x3F00,
|
|
0x2380, 0x2780, 0x2B80, 0x2F80, 0x3380, 0x3780, 0x3B80, 0x3F80,
|
|
0x2028, 0x2428, 0x2828, 0x2C28, 0x3028, 0x3428, 0x3828, 0x3C28,
|
|
0x20A8, 0x24A8, 0x28A8, 0x2CA8, 0x30A8, 0x34A8, 0x38A8, 0x3CA8,
|
|
0x2128, 0x2528, 0x2928, 0x2D28, 0x3128, 0x3528, 0x3928, 0x3D28,
|
|
0x21A8, 0x25A8, 0x29A8, 0x2DA8, 0x31A8, 0x35A8, 0x39A8, 0x3DA8,
|
|
0x2228, 0x2628, 0x2A28, 0x2E28, 0x3228, 0x3628, 0x3A28, 0x3E28,
|
|
0x22A8, 0x26A8, 0x2AA8, 0x2EA8, 0x32A8, 0x36A8, 0x3AA8, 0x3EA8,
|
|
0x2328, 0x2728, 0x2B28, 0x2F28, 0x3328, 0x3728, 0x3B28, 0x3F28,
|
|
0x23A8, 0x27A8, 0x2BA8, 0x2FA8, 0x33A8, 0x37A8, 0x3BA8, 0x3FA8,
|
|
0x2050, 0x2450, 0x2850, 0x2C50, 0x3050, 0x3450, 0x3850, 0x3C50,
|
|
0x20D0, 0x24D0, 0x28D0, 0x2CD0, 0x30D0, 0x34D0, 0x38D0, 0x3CD0,
|
|
0x2150, 0x2550, 0x2950, 0x2D50, 0x3150, 0x3550, 0x3950, 0x3D50,
|
|
0x21D0, 0x25D0, 0x29D0, 0x2DD0, 0x31D0, 0x35D0, 0x39D0, 0x3DD0,
|
|
0x2250, 0x2650, 0x2A50, 0x2E50, 0x3250, 0x3650, 0x3A50, 0x3E50,
|
|
0x22D0, 0x26D0, 0x2AD0, 0x2ED0, 0x32D0, 0x36D0, 0x3AD0, 0x3ED0,
|
|
0x2350, 0x2750, 0x2B50, 0x2F50, 0x3350, 0x3750, 0x3B50, 0x3F50,
|
|
0x23D0, 0x27D0, 0x2BD0, 0x2FD0, 0x33D0, 0x37D0, 0x3BD0, 0x3FD0};
|
|
|
|
/*
|
|
|
|
The following is logically reordered to match the lores
|
|
color order...
|
|
|
|
Repeated
|
|
Binary
|
|
Color aux1 main1 aux2 main2 Pattern
|
|
Black 00 00 00 00 0000
|
|
Magenta 08 11 22 44 0001
|
|
Dark Blue 11 22 44 08 1000
|
|
Violet 19 33 66 4C 1001
|
|
Dark Green 22 44 08 11 0100
|
|
Grey1 2A 55 2A 55 0101
|
|
Medium Blue 33 66 4C 19 1100
|
|
Light Blue 3B 77 6E 5D 1101
|
|
Brown 44 08 11 22 0010
|
|
Orange 4C 19 33 66 0011
|
|
Grey2 55 2A 55 2A 1010
|
|
Pink 5D 3B 77 6E 1011
|
|
Green 66 4C 19 33 0110
|
|
Yellow 6E 5D 3B 77 0111
|
|
Aqua 77 6E 5D 3B 1110
|
|
White 7F 7F 7F 7F 1111
|
|
|
|
*/
|
|
|
|
/* the following array is based on the above */
|
|
uint8_t dhrbytes[16][4] = {
|
|
0x00,0x00,0x00,0x00,
|
|
0x08,0x11,0x22,0x44,
|
|
0x11,0x22,0x44,0x08,
|
|
0x19,0x33,0x66,0x4C,
|
|
0x22,0x44,0x08,0x11,
|
|
0x2A,0x55,0x2A,0x55,
|
|
0x33,0x66,0x4C,0x19,
|
|
0x3B,0x77,0x6E,0x5D,
|
|
0x44,0x08,0x11,0x22,
|
|
0x4C,0x19,0x33,0x66,
|
|
0x55,0x2A,0x55,0x2A,
|
|
0x5D,0x3B,0x77,0x6E,
|
|
0x66,0x4C,0x19,0x33,
|
|
0x6E,0x5D,0x3B,0x77,
|
|
0x77,0x6E,0x5D,0x3B,
|
|
0x7F,0x7F,0x7F,0x7F};
|
|
|
|
int16_t lores = 0, loresoutput = 0, appletop = 0;
|
|
|
|
/* base addresses for Apple II primary text page */
|
|
/* also the base addresses for the 48 scanline pairs */
|
|
/* for Apple II lores graphics mode 40 x 48 x 16 colors */
|
|
unsigned textbase[24]={
|
|
0x0400,
|
|
0x0480,
|
|
0x0500,
|
|
0x0580,
|
|
0x0600,
|
|
0x0680,
|
|
0x0700,
|
|
0x0780,
|
|
0x0428,
|
|
0x04A8,
|
|
0x0528,
|
|
0x05A8,
|
|
0x0628,
|
|
0x06A8,
|
|
0x0728,
|
|
0x07A8,
|
|
0x0450,
|
|
0x04D0,
|
|
0x0550,
|
|
0x05D0,
|
|
0x0650,
|
|
0x06D0,
|
|
0x0750,
|
|
0x07D0};
|
|
|
|
/* the following is used to remap
|
|
double lo res 4 bit colors
|
|
from bank 0 to bank 1 */
|
|
uint8_t dloauxcolor[16] = {
|
|
0,8,1,9,2,10,3,11,4,12,5,13,6,14,7,15};
|
|
|
|
/* the following is used to remap
|
|
double lo res 4 bit colors
|
|
from bank 1 to bank 0 */
|
|
|
|
/*
|
|
uint8_t dlomaincolor[16] = {
|
|
0,2,4,6,8,10,12,14,1,3,5,7,9,11,13,15};
|
|
|
|
*/
|
|
|
|
/* resizing tables */
|
|
|
|
/* use as-is to use for 320 x 200 */
|
|
/* merge 4 pixels into one to use for 640 x 400 */
|
|
uint8_t mix25to24[24][2] = {
|
|
24,1,
|
|
23,2,
|
|
22,3,
|
|
21,4,
|
|
20,5,
|
|
19,6,
|
|
18,7,
|
|
17,8,
|
|
16,9,
|
|
15,10,
|
|
14,11,
|
|
13,12,
|
|
12,13,
|
|
11,14,
|
|
10,15,
|
|
9,16,
|
|
8,17,
|
|
7,18,
|
|
6,19,
|
|
5,20,
|
|
4,21,
|
|
3,22,
|
|
2,23,
|
|
1,24};
|
|
|
|
/*
|
|
|
|
To scale from 320 to 280, a 7 part mix is used from each pixel
|
|
in the following pattern with a ratio of 8:7
|
|
|
|
00000001 11111122 22222333 33334444 44455555 55666666 67777777
|
|
00000000 11111111 22222222 33333333 44444444 55555555 66666666
|
|
|
|
*/
|
|
|
|
uint8_t pixel320to280[7][4] = {
|
|
7,1,0,1,
|
|
6,2,1,2,
|
|
5,3,2,3,
|
|
4,4,3,4,
|
|
3,5,4,5,
|
|
2,6,5,6,
|
|
1,7,6,7};
|
|
|
|
|
|
/* http://en.wikipedia.org/wiki/List_of_8-bit_computer_hardware_palettes */
|
|
uint8_t rgbVBMP[16][3] = {
|
|
0,0,0, /* black */
|
|
114,38,64, /* red */
|
|
64,51,127, /* dk blue */
|
|
228,52,254, /* purple */
|
|
14,89,64, /* dk green */
|
|
128,128,128, /* gray */
|
|
27,154,254, /* med blue */
|
|
191,179,255, /* lt blue */
|
|
64,76,0, /* brown */
|
|
228,101,1, /* orange */
|
|
128,128,128, /* grey */
|
|
241,166,191, /* pink */
|
|
27,203,1, /* lt green */
|
|
191,204,128, /* yellow */
|
|
141,217,191, /* aqua */
|
|
255,255,255};/* white */
|
|
|
|
uint8_t RemapLoToHi[16] = {
|
|
LOBLACK,
|
|
LORED,
|
|
LOBROWN,
|
|
LOORANGE,
|
|
LODKGREEN,
|
|
LOGRAY,
|
|
LOLTGREEN,
|
|
LOYELLOW,
|
|
LODKBLUE,
|
|
LOPURPLE,
|
|
LOGREY,
|
|
LOPINK,
|
|
LOMEDBLUE,
|
|
LOLTBLUE,
|
|
LOAQUA,
|
|
LOWHITE};
|
|
|
|
/* 560 x 192 - verbatim DHGR mono output format */
|
|
uint8_t mono192[62] ={
|
|
0x42, 0x4D, 0x3E, 0x36, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
|
|
0x00, 0x00, 0x30, 0x02, 0x00, 0x00, 0xC0, 0x00,
|
|
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00};
|
|
|
|
/* 280 x 192 - verbatim HGR output format */
|
|
uint8_t mono280[62] ={
|
|
0x42, 0x4D, 0x3E, 0x1B, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x28, 0x00,
|
|
0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 0xC0, 0x00,
|
|
0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00};
|
|
|
|
uint8_t dhgr2hgr[16] = {
|
|
HBLACK,
|
|
HBLACK,
|
|
HBLACK,
|
|
HVIOLET,
|
|
HBLACK,
|
|
HBLACK,
|
|
HBLUE,
|
|
HBLACK,
|
|
HBLACK,
|
|
HORANGE,
|
|
HBLACK,
|
|
HBLACK,
|
|
HGREEN,
|
|
HBLACK,
|
|
HBLACK,
|
|
HWHITE};
|
|
|
|
#endif
|