Skip to content
Snippets Groups Projects
Commit 730c3242 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

Start of minimal RIPv2 support.

Just the easy stuff (scaling, extended colours, border toggle, filled
rectangle)
parent f9da3080
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #2079 passed
...@@ -242,6 +242,11 @@ static struct { ...@@ -242,6 +242,11 @@ static struct {
struct ciolib_pixels *clipboard; struct ciolib_pixels *clipboard;
int lchars; int lchars;
int curstype; int curstype;
int x_dim;
int y_dim;
int x_max;
int y_max;
bool borders;
} rip = { } rip = {
RIP_STATE_BOL, RIP_STATE_BOL,
RIP_STATE_FLUSHING, RIP_STATE_FLUSHING,
...@@ -264,6 +269,11 @@ static struct { ...@@ -264,6 +269,11 @@ static struct {
NULL, NULL,
0, 0,
_NORMALCURSOR, _NORMALCURSOR,
640,
350,
640,
350,
true,
}; };
   
static const uint16_t rip_line_patterns[4] = { static const uint16_t rip_line_patterns[4] = {
...@@ -353,6 +363,52 @@ static const uint16_t ega_palette[64][3] = { ...@@ -353,6 +363,52 @@ static const uint16_t ega_palette[64][3] = {
{0xffff, 0xffff, 0xffff} {0xffff, 0xffff, 0xffff}
}; };
   
static const uint8_t default_mapped[256][3] = {
{ 0, 0, 0}, { 0, 0,42}, { 0,42, 0}, { 0,42,42}, {42, 0, 0}, {42, 0,42},
{42,21, 0}, {42,42,42}, {21,21,21}, {21,21,63}, {21,63,21}, {21,63,63},
{63,21,21}, {63,21,63}, {63,63,21}, {63,63,63}, { 0, 0, 0}, { 4, 4, 4},
{ 8, 8, 8}, {13,13,13}, {17,17,17}, {21,21,21}, {25,25,25}, {29,29,29},
{34,34,34}, {38,38,38}, {42,42,42}, {46,46,46}, {50,50,50}, {55,55,55},
{59,59,59}, {63,63,63}, { 0, 0, 0}, { 0, 0,21}, { 0, 0,42}, { 0, 0,63},
{ 0, 9, 0}, { 0, 9,21}, { 0, 9,42}, { 0, 9,63}, { 0,18, 0}, { 0,18,21},
{ 0,18,42}, { 0,18,63}, { 0,27, 0}, { 0,27,21}, { 0,27,42}, { 0,27,63},
{ 0,36, 0}, { 0,36,21}, { 0,36,42}, { 0,36,63}, { 0,45, 0}, { 0,45,21},
{ 0,45,42}, { 0,45,63}, { 0,54, 0}, { 0,54,21}, { 0,54,42}, { 0,54,63},
{ 0,63, 0}, { 0,63,21}, { 0,63,42}, { 0,63,63}, {10, 0, 0}, {10, 0,21},
{10, 0,42}, {10, 0,63}, {10, 9, 0}, {10, 9,21}, {10, 9,42}, {10, 9,63},
{10,18, 0}, {10,18,21}, {10,18,42}, {10,18,63}, {10,27, 0}, {10,27,21},
{10,27,42}, {10,27,63}, {10,36, 0}, {10,36,21}, {10,36,42}, {10,36,63},
{10,45, 0}, {10,45,21}, {10,45,42}, {10,45,63}, {10,54, 0}, {10,54,21},
{10,54,42}, {10,54,63}, {10,63, 0}, {10,63,21}, {10,63,42}, {10,63,63},
{21, 0, 0}, {21, 0,21}, {21, 0,42}, {21, 0,63}, {21, 9, 0}, {21, 9,21},
{21, 9,42}, {21, 9,63}, {21,18, 0}, {21,18,21}, {21,18,42}, {21,18,63},
{21,27, 0}, {21,27,21}, {21,27,42}, {21,27,63}, {21,36, 0}, {21,36,21},
{21,36,42}, {21,36,63}, {21,45, 0}, {21,45,21}, {21,45,42}, {21,45,63},
{21,54, 0}, {21,54,21}, {21,54,42}, {21,54,63}, {21,63, 0}, {21,63,21},
{21,63,42}, {21,63,63}, {31, 0, 0}, {31, 0,21}, {31, 0,42}, {31, 0,63},
{31, 9, 0}, {31, 9,21}, {31, 9,42}, {31, 9,63}, {31,18, 0}, {31,18,21},
{31,18,42}, {31,18,63}, {31,27, 0}, {31,27,21}, {31,27,42}, {31,27,63},
{31,36, 0}, {31,36,21}, {31,36,42}, {31,36,63}, {31,45, 0}, {31,45,21},
{31,45,42}, {31,45,63}, {31,54, 0}, {31,54,21}, {31,54,42}, {31,54,63},
{31,63, 0}, {31,63,21}, {31,63,42}, {31,63,63}, {42, 0, 0}, {42, 0,21},
{42, 0,42}, {42, 0,63}, {42, 9, 0}, {42, 9,21}, {42, 9,42}, {42, 9,63},
{42,18, 0}, {42,18,21}, {42,18,42}, {42,18,63}, {42,27, 0}, {42,27,21},
{42,27,42}, {42,27,63}, {42,36, 0}, {42,36,21}, {42,36,42}, {42,36,63},
{42,45, 0}, {42,45,21}, {42,45,42}, {42,45,63}, {42,54, 0}, {42,54,21},
{42,54,42}, {42,54,63}, {42,63, 0}, {42,63,21}, {42,63,42}, {42,63,63},
{52, 0, 0}, {52, 0,21}, {52, 0,42}, {52, 0,63}, {52, 9, 0}, {52, 9,21},
{52, 9,42}, {52, 9,63}, {52,18, 0}, {52,18,21}, {52,18,42}, {52,18,63},
{52,27, 0}, {52,27,21}, {52,27,42}, {52,27,63}, {52,36, 0}, {52,36,21},
{52,36,42}, {52,36,63}, {52,45, 0}, {52,45,21}, {52,45,42}, {52,45,63},
{52,54, 0}, {52,54,21}, {52,54,42}, {52,54,63}, {52,63, 0}, {52,63,21},
{52,63,42}, {52,63,63}, {63, 0, 0}, {63, 0,21}, {63, 0,42}, {63, 0,63},
{63, 9, 0}, {63, 9,21}, {63, 9,42}, {63, 9,63}, {63,18, 0}, {63,18,21},
{63,18,42}, {63,18,63}, {63,27, 0}, {63,27,21}, {63,27,42}, {63,27,63},
{63,36, 0}, {63,36,21}, {63,36,42}, {63,36,63}, {63,45, 0}, {63,45,21},
{63,45,42}, {63,45,63}, {63,54, 0}, {63,54,21}, {63,54,42}, {63,54,63},
{63,63, 0}, {63,63,21}, {63,63,42}, {63,63,63}
};
static uint8_t curr_ega_palette[16] = { static uint8_t curr_ega_palette[16] = {
0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63 0, 1, 2, 3, 4, 5, 20, 7, 56, 57, 58, 59, 60, 61, 62, 63
}; };
...@@ -7509,11 +7565,12 @@ rv_reset(const char * const var, const void * const data) ...@@ -7509,11 +7565,12 @@ rv_reset(const char * const var, const void * const data)
rip.color = 0; rip.color = 0;
rip.viewport.sx = 0; rip.viewport.sx = 0;
rip.viewport.sy = 0; rip.viewport.sy = 0;
rip.viewport.ex = 639; rip.viewport.ex = rip.x_dim - 1;
rip.viewport.ey = 349; rip.viewport.ey = rip.y_dim - 1;
rip.line_pattern = rip_line_patterns[0]; rip.line_pattern = rip_line_patterns[0];
rip.line_width = 0; rip.line_width = 0;
rip.curstype = _NORMALCURSOR; rip.curstype = _NORMALCURSOR;
rip.borders = true;
_setcursortype(rip.curstype); _setcursortype(rip.curstype);
reinit_screen(C80X43, NULL, 8, 8); reinit_screen(C80X43, NULL, 8, 8);
memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette)); memcpy(&curr_ega_palette, &default_ega_palette, sizeof(curr_ega_palette));
...@@ -7550,6 +7607,78 @@ rv_restore(const char * const var, const void * const data) ...@@ -7550,6 +7607,78 @@ rv_restore(const char * const var, const void * const data)
return NULL; return NULL;
} }
   
static uint32_t
map_rip_color(int color)
{
uint32_t col = 0;
struct dac_colors *dac = NULL;
if (color < 16)
col = ega_colours[color];
else if (color < 256) {
col = 0x80000000
| ((default_mapped[color][0] << 2 | (default_mapped[color][0] & 3)) << 16)
| ((default_mapped[color][1] << 2 | (default_mapped[color][1] & 3)) << 8)
| ((default_mapped[color][2] << 2 | (default_mapped[color][2] & 3)));
}
else
fprintf(stderr, "Unable to map %d\n", color);
if (dac) {
col = 0x80000000 | (dac->red << 16) | (dac->green << 8) | (dac->blue);
}
return col;
}
static int
unmap_rip_x(int x)
{
double dx = x;
dx *= rip.x_dim;
dx /= rip.x_max;
return roundl(dx);
}
static int
unmap_rip_y(int y)
{
double dy = y;
dy *= rip.y_dim;
dy /= rip.y_max;
return roundl(dy);
}
static int
map_rip_x(int x)
{
double dx = x;
dx *= rip.x_max;
dx /= rip.x_dim;
return roundl(dx);
}
static int
map_rip_y(int y)
{
double dy = y;
dy *= rip.y_max;
dy /= rip.y_dim;
return roundl(dy);
}
static void
scale_setpixel(int x, int y, uint32_t color)
{
if (!(color & 0x80000000) && color < 256)
color = map_rip_color(color);
setpixel(map_rip_x(x), map_rip_y(y), color);
}
static void
rip_setpixel(int x, int y, int color)
{
setpixel(map_rip_x(x), map_rip_y(y), map_rip_color(color));
}
static char * static char *
rv_erase(const char * const var, const void * const data) rv_erase(const char * const var, const void * const data)
{ {
...@@ -7561,7 +7690,7 @@ rv_erase(const char * const var, const void * const data) ...@@ -7561,7 +7690,7 @@ rv_erase(const char * const var, const void * const data)
return NULL; return NULL;
for (y = rip.viewport.sy; y <= rip.viewport.ey; y++) { for (y = rip.viewport.sy; y <= rip.viewport.ey; y++) {
for (x = rip.viewport.sx; x <= rip.viewport.ex; x++) for (x = rip.viewport.sx; x <= rip.viewport.ex; x++)
setpixel(x, y, ega_colours[0]); rip_setpixel(x, y, 0);
} }
return NULL; return NULL;
case 'T': case 'T':
...@@ -7847,10 +7976,10 @@ draw_pixel(int x, int y) ...@@ -7847,10 +7976,10 @@ draw_pixel(int x, int y)
pix = getpixels(rip.viewport.sx + x, rip.viewport.sy + y, rip.viewport.sx + x, rip.viewport.sy + y, 0); pix = getpixels(rip.viewport.sx + x, rip.viewport.sy + y, rip.viewport.sx + x, rip.viewport.sy + y, 0);
if (pix == NULL) if (pix == NULL)
return; return;
setpixel(rip.viewport.sx + x, rip.viewport.sy + y, ega_colours[pixel2color(pix->pixels[0]) ^ rip.color]); rip_setpixel(rip.viewport.sx + x, rip.viewport.sy + y, pixel2color(pix->pixels[0]) ^ rip.color);
} }
else { else {
setpixel(rip.viewport.sx + x, rip.viewport.sy + y, ega_colours[rip.color]); rip_setpixel(rip.viewport.sx + x, rip.viewport.sy + y, rip.color);
} }
} }
   
...@@ -7862,7 +7991,7 @@ set_pixel(int x, int y, uint32_t fg) ...@@ -7862,7 +7991,7 @@ set_pixel(int x, int y, uint32_t fg)
return; return;
if (y < 0 || y > (rip.viewport.ey - rip.viewport.sy)) if (y < 0 || y > (rip.viewport.ey - rip.viewport.sy))
return; return;
setpixel(rip.viewport.sx + x, rip.viewport.sy + y, fg); scale_setpixel(rip.viewport.sx + x, rip.viewport.sy + y, fg);
} }
   
static void static void
...@@ -7874,9 +8003,9 @@ fill_pixel(int x, int y) ...@@ -7874,9 +8003,9 @@ fill_pixel(int x, int y)
return; return;
   
if (rip.fill_pattern[y & 0x07] & (0x80 >> (x & 0x07))) if (rip.fill_pattern[y & 0x07] & (0x80 >> (x & 0x07)))
setpixel(x, y, ega_colours[rip.fill_color]); rip_setpixel(x, y, rip.fill_color);
else else
setpixel(x, y, ega_colours[0]); rip_setpixel(x, y, 0);
} }
   
static int static int
...@@ -8852,8 +8981,8 @@ do_popup(const char * const str) ...@@ -8852,8 +8981,8 @@ do_popup(const char * const str)
if (width < 29 + 29 + (strlen(question) * 8)) if (width < 29 + 29 + (strlen(question) * 8))
width = 29 + 29 + (strlen(question) * 8); width = 29 + 29 + (strlen(question) * 8);
// TODO: Scale to actual screen... // TODO: Scale to actual screen...
x1 = (640 - width) / 2; x1 = (rip.x_dim - width) / 2;
y1 = (350 - height) / 2; y1 = (rip.y_dim - height) / 2;
x2 = x1 + width - 1; x2 = x1 + width - 1;
y2 = y1 + height - 1; y2 = y1 + height - 1;
pix = getpixels(x1, y1, x2, y2, false); pix = getpixels(x1, y1, x2, y2, false);
...@@ -8910,7 +9039,7 @@ do_popup(const char * const str) ...@@ -8910,7 +9039,7 @@ do_popup(const char * const str)
set_line(x2 - 12, y2 - 7, x1 + 12, y2 - 7, black, 0xffff, 1); set_line(x2 - 12, y2 - 7, x1 + 12, y2 - 7, black, 0xffff, 1);
set_line(x1 + 12, y2 - 7, x1 + 12, y1 + 26, black, 0xffff, 1); set_line(x1 + 12, y2 - 7, x1 + 12, y1 + 26, black, 0xffff, 1);
   
x = (640 - strlen(question) * 8) / 2; x = (rip.x_dim - strlen(question) * 8) / 2;
y = y1 + 12; y = y1 + 12;
oc = rip.color; oc = rip.color;
ox = rip.x; ox = rip.x;
...@@ -8963,6 +9092,9 @@ do_popup(const char * const str) ...@@ -8963,6 +9092,9 @@ do_popup(const char * const str)
switch(ch) { switch(ch) {
case CIO_KEY_MOUSE: case CIO_KEY_MOUSE:
getmouse(&mevent); getmouse(&mevent);
// HACK...
mevent.startx_res = unmap_rip_x(mevent.startx_res);
mevent.starty_res = unmap_rip_y(mevent.starty_res);
if (mevent.event == CIOLIB_MOUSE_MOVE) { if (mevent.event == CIOLIB_MOUSE_MOVE) {
if (mevent.startx_res >= x1 + 14 && mevent.startx_res <= x2 - 14 && if (mevent.startx_res >= x1 + 14 && mevent.startx_res <= x2 - 14 &&
mevent.starty_res >= y1 + 27 && mevent.starty_res <= y2 - 8) { mevent.starty_res >= y1 + 27 && mevent.starty_res <= y2 - 8) {
...@@ -9143,7 +9275,7 @@ static void ...@@ -9143,7 +9275,7 @@ static void
reinit_screen(enum text_modes mode, uint8_t *font, int fx, int fy) reinit_screen(enum text_modes mode, uint8_t *font, int fx, int fy)
{ {
// TODO: Mystery rows in 8x8 mode... // TODO: Mystery rows in 8x8 mode...
struct ciolib_pixels *pix = getpixels(0, 0, 639, 349, false); struct ciolib_pixels *pix = getpixels(0, 0, rip.x_max - 1, rip.y_max - 1, false);
struct cterminal oldcterm = *cterm; struct cterminal oldcterm = *cterm;
int old_hold = hold_update; int old_hold = hold_update;
int cols = 80; int cols = 80;
...@@ -9201,7 +9333,7 @@ reinit_screen(enum text_modes mode, uint8_t *font, int fx, int fy) ...@@ -9201,7 +9333,7 @@ reinit_screen(enum text_modes mode, uint8_t *font, int fx, int fy)
gotoxy(1, 1); gotoxy(1, 1);
// This is to force a vmem flush... // This is to force a vmem flush...
freepixels(getpixels(0, 0, 1, 1, true)); freepixels(getpixels(0, 0, 1, 1, true));
setpixels(0, 0, 639, 349, 0, 0, pix, NULL); setpixels(0, 0, rip.x_max - 1, rip.y_max - 1, 0, 0, pix, NULL);
setwindow(cterm); setwindow(cterm);
hold_update = old_hold; hold_update = old_hold;
freepixels(pix); freepixels(pix);
...@@ -9263,10 +9395,12 @@ full_ellipse(int xc, int yc, int a, int b, bool fill) ...@@ -9263,10 +9395,12 @@ full_ellipse(int xc, int yc, int a, int b, bool fill)
} }
} }
if (rip.color) { if (rip.color) {
if (rip.borders) {
draw_pixel(xc+x, yc-y); draw_pixel(xc+x, yc-y);
draw_pixel(xc-x, yc+y); draw_pixel(xc-x, yc+y);
} }
} }
}
draw_pixel(xc+x, yc+y); draw_pixel(xc+x, yc+y);
if(t + b2*x <= crit1 || /* e(x+1,y-1/2) <= 0 */ if(t + b2*x <= crit1 || /* e(x+1,y-1/2) <= 0 */
t+a2*y <= crit3) /* e(x+1/2,y) <= 0 */ t+a2*y <= crit3) /* e(x+1/2,y) <= 0 */
...@@ -9500,7 +9634,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -9500,7 +9634,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
args = parse_string(rawargs); args = parse_string(rawargs);
   
//SLEEP(100); //SLEEP(100);
//printf("Level: %d, Sublevel: %d, Cmd: '%c', args: '%s'\n", level, sublevel, cmd, args); printf("Level: %d, Sublevel: %d, Cmd: '%c', args: '%s'\n", level, sublevel, cmd, args);
switch (level) { switch (level) {
case 0: case 0:
switch (sublevel) { switch (sublevel) {
...@@ -9734,7 +9868,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -9734,7 +9868,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
y1 > (rip.viewport.ey - rip.viewport.sy)) y1 > (rip.viewport.ey - rip.viewport.sy))
break; break;
arg1 = parse_mega(&args[4], 2); arg1 = parse_mega(&args[4], 2);
if (arg1 < 0 || arg1 > 15) if (arg1 < 0 || arg1 > 255)
break; break;
arg2 = rip.viewport.ey; arg2 = rip.viewport.ey;
pthread_mutex_lock(&vstatlock); pthread_mutex_lock(&vstatlock);
...@@ -9748,9 +9882,9 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -9748,9 +9882,9 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
   
for (i = 0; i < 50; i++) { for (i = 0; i < 50; i++) {
SLEEP(50); SLEEP(50);
setpixel(x1, y1, fg); scape_setpixel(x1, y1, fg);
SLEEP(50); SLEEP(50);
setpixel(x1, y1, xx); scale_setpixel(x1, y1, xx);
} }
#endif #endif
struct ciolib_pixels *pix = getpixels(rip.viewport.sx, rip.viewport.sy, rip.viewport.ex, arg2, false); struct ciolib_pixels *pix = getpixels(rip.viewport.sx, rip.viewport.sy, rip.viewport.ex, arg2, false);
...@@ -9797,6 +9931,41 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -9797,6 +9931,41 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
GET_XY2(); GET_XY2();
draw_line(x1, y1, x2, y2); draw_line(x1, y1, x2, y2);
break; break;
case 'K': // RIP_FILLED_RECTANGLE (v2.A2)
handled = true;
if (no_viewport())
break;
GET_XY2();
// Yes, it really works this way... TODO: Check if others do too.
if (x1 > x2) {
arg1 = x2;
x2 = x1;
x1 = arg1;
}
if (y1 > y2) {
arg1 = y2;
y2 = y1;
y1 = arg1;
}
for (arg1 = y1; arg1 <= y2; arg1++) {
for (arg2 = x1; arg2 <= x2; arg2++) {
fill_pixel(arg2, arg1);
}
}
if (rip.borders) {
draw_line(x1, y1, x2, y1);
draw_line(x2, y1, x2, y2);
draw_line(x2, y2, x1, y2);
draw_line(x1, y2, x1, y1);
}
break;
case 'N': // RIP_SET_BORDER (v2.A3)
handled = true;
arg1 = parse_mega(&args[0], 2);
if (arg1 == -1)
break;
rip.borders = arg1;
break;
case 'V': // RIP_OVAL_ARC !|V <x> <y> <st_ang> <e_ang> <radx> <rady> case 'V': // RIP_OVAL_ARC !|V <x> <y> <st_ang> <e_ang> <radx> <rady>
// (TODO: Are these seriously exactly the same?) // (TODO: Are these seriously exactly the same?)
case 'O': // RIP_OVAL !|O <x> <y> <st_ang> <end_ang> <x_rad> <y_rad> case 'O': // RIP_OVAL !|O <x> <y> <st_ang> <end_ang> <x_rad> <y_rad>
...@@ -9937,7 +10106,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -9937,7 +10106,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
arg2 = parse_mega(&args[2], 2); arg2 = parse_mega(&args[2], 2);
if (arg2 == -1) if (arg2 == -1)
break; break;
if (arg2 > 15) if (arg2 > 255)
break; break;
rip.fill_color = arg2; rip.fill_color = arg2;
memcpy(rip.fill_pattern, rip_fill_patterns[arg1], 8); memcpy(rip.fill_pattern, rip_fill_patterns[arg1], 8);
...@@ -10122,7 +10291,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10122,7 +10291,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
handled = true; handled = true;
arg1 = parse_mega(&args[0], 2); arg1 = parse_mega(&args[0], 2);
arg2 = parse_mega(&args[2], 2); arg2 = parse_mega(&args[2], 2);
if (arg1 < 0 || arg1 > 15) if (arg1 < 0 || arg1 > 255)
break; break;
if (arg2 < 0 || arg2 > 63) if (arg2 < 0 || arg2 > 63)
break; break;
...@@ -10143,7 +10312,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10143,7 +10312,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
*/ */
handled = true; handled = true;
arg1 = parse_mega(&args[0], 2); arg1 = parse_mega(&args[0], 2);
if (arg1 >= 0 && arg1 <= 15) if (arg1 >= 0 && arg1 <= 255)
rip.color = arg1; rip.color = arg1;
break; break;
case 'e': // RIP_ERASE_WINDOW !|e case 'e': // RIP_ERASE_WINDOW !|e
...@@ -10156,6 +10325,17 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10156,6 +10325,17 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
handled = true; handled = true;
rv_erase("ETW", NULL); rv_erase("ETW", NULL);
break; break;
case 'f': // RIP_SET_WORLD_FRAME (v2.A0)
handled = true;
GET_XY();
rip.x_dim = x1;
rip.y_dim = y1;
// TODO: Hack... we should likely scale both directions...
rip.viewport.sx = 0;
rip.viewport.sy = 0;
rip.viewport.ex = x1 - 1;
rip.viewport.ey = y1 - 1;
break;
case 'g': // RIP_GOTOXY !|g <x> <y> case 'g': // RIP_GOTOXY !|g <x> <y>
/* This command sets the position of the text cursor in the TTY Text /* This command sets the position of the text cursor in the TTY Text
* window, if it is active. If inactive (if the dimensions are * window, if it is active. If inactive (if the dimensions are
...@@ -10288,8 +10468,8 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10288,8 +10468,8 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
break; break;
arg1 = parse_mega(&args[0], 2); arg1 = parse_mega(&args[0], 2);
struct point *argv = malloc(sizeof(struct point) * arg1); struct point *argv = malloc(sizeof(struct point) * arg1);
x1 = 639; x1 = rip.x_dim - 1;
y1 = 349; y1 = rip.x_dim - 1;
x2 = 0; x2 = 0;
y2 = 0; y2 = 0;
// Read lines and calculate extents // Read lines and calculate extents
...@@ -10423,7 +10603,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10423,7 +10603,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
if (parse_mega(&args[14], 2) < 0) if (parse_mega(&args[14], 2) < 0)
break; break;
arg1 = parse_mega(&args[16], 2); arg1 = parse_mega(&args[16], 2);
if (arg1 < 0 || arg1 > 16) if (arg1 < 0 || arg1 > 255)
break; break;
rip.fill_pattern[0] = parse_mega(&args[0], 2) & 0xff; rip.fill_pattern[0] = parse_mega(&args[0], 2) & 0xff;
rip.fill_pattern[1] = parse_mega(&args[2], 2) & 0xff; rip.fill_pattern[1] = parse_mega(&args[2], 2) & 0xff;
...@@ -11233,21 +11413,21 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -11233,21 +11413,21 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
arg1 = argv[3] & (BUTTON_FLAG1_CLIPBOARD | BUTTON_FLAG1_ICON | BUTTON_FLAG1_PLAIN); // Flags arg1 = argv[3] & (BUTTON_FLAG1_CLIPBOARD | BUTTON_FLAG1_ICON | BUTTON_FLAG1_PLAIN); // Flags
if (arg1 & (arg1 - 1)) if (arg1 & (arg1 - 1))
break; break;
if (argv[5] > 15) // dfore if (argv[5] > 255) // dfore
break; break;
if (argv[6] > 15) // back if (argv[6] > 255) // back
break; break;
if (argv[7] > 15) // bright if (argv[7] > 255) // bright
break; break;
if (argv[8] > 15) // dark if (argv[8] > 255) // dark
break; break;
if (argv[9] > 15) // surface if (argv[9] > 255) // surface
break; break;
if (argv[10] > 35) // group_no if (argv[10] > 255) // group_no
break; break;
if (argv[12] > 15) // uline_col if (argv[12] > 255) // uline_col
break; break;
if (argv[13] > 15) // corner_col if (argv[13] > 255) // corner_col
break; break;
rip.bstyle.width = argv[0]; rip.bstyle.width = argv[0];
rip.bstyle.height = argv[1]; rip.bstyle.height = argv[1];
...@@ -11817,7 +11997,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -11817,7 +11997,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
arg3 &= 0x0F; arg3 &= 0x0F;
break; break;
} }
setpixel(rip.viewport.sx + x1 + x, rip.viewport.sy + y1 + y, ega_colours[arg3]); rip_setpixel(rip.viewport.sx + x1 + x, rip.viewport.sy + y1 + y, arg3);
} }
} }
break; break;
...@@ -12196,7 +12376,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -12196,7 +12376,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
} }
free(args); free(args);
if (!handled) { if (!handled) {
printf("Unhandled command: Level: %d, SubLevel: %d, cmd: %d\n", level, sublevel, cmd); printf("Unhandled command: Level: %d, SubLevel: %d, cmd: %d, args: %s\n", level, sublevel, cmd, args);
fflush(stdout); fflush(stdout);
} }
} }
...@@ -12323,7 +12503,7 @@ draw_glyph(uint8_t ch) ...@@ -12323,7 +12503,7 @@ draw_glyph(uint8_t ch)
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
for (j = 0; j < 8; j++) { for (j = 0; j < 8; j++) {
if (this_font[fontoffset] & (0x80 >> j)) if (this_font[fontoffset] & (0x80 >> j))
setpixel(amiga_x + j, amiga_y - 1 + i, cterm->fg_color); scale_setpixel(amiga_x + j, amiga_y - 1 + i, cterm->fg_color);
} }
fontoffset++; fontoffset++;
} }
...@@ -12367,13 +12547,13 @@ draw_glyph(uint8_t ch) ...@@ -12367,13 +12547,13 @@ draw_glyph(uint8_t ch)
for (j = 0; j < width; j++) { for (j = 0; j < width; j++) {
if ((*pd) & (1 << (currbit))) { if ((*pd) & (1 << (currbit))) {
if (doubled) { if (doubled) {
setpixel(amiga_x + (j*2), amiga_y + voff + (i*2), cterm->fg_color); scale_setpixel(amiga_x + (j*2), amiga_y + voff + (i*2), cterm->fg_color);
setpixel(amiga_x + (j*2)+1, amiga_y + voff + (i*2), cterm->fg_color); scale_setpixel(amiga_x + (j*2)+1, amiga_y + voff + (i*2), cterm->fg_color);
setpixel(amiga_x + (j*2), amiga_y + voff + (i*2)+1, cterm->fg_color); scale_setpixel(amiga_x + (j*2), amiga_y + voff + (i*2)+1, cterm->fg_color);
setpixel(amiga_x + (j*2)+1, amiga_y + voff + (i*2)+1, cterm->fg_color); scale_setpixel(amiga_x + (j*2)+1, amiga_y + voff + (i*2)+1, cterm->fg_color);
} }
else else
setpixel(amiga_x + j, amiga_y + voff + i, cterm->fg_color); scale_setpixel(amiga_x + j, amiga_y + voff + i, cterm->fg_color);
} }
if (--currbit == -1) { if (--currbit == -1) {
pd++; pd++;
...@@ -12451,7 +12631,7 @@ do_skypix(char *buf, size_t len) ...@@ -12451,7 +12631,7 @@ do_skypix(char *buf, size_t len)
case 1: // Set Pixel case 1: // Set Pixel
rip.x = argv[1]; rip.x = argv[1];
rip.y = argv[2]; rip.y = argv[2];
setpixel(rip.x, rip.y, cterm->fg_color); scale_setpixel(rip.x, rip.y, cterm->fg_color);
break; break;
case 2: // Draw line case 2: // Draw line
set_line(rip.x, rip.y, argv[1], argv[2], cterm->fg_color, 0xffff, 1); set_line(rip.x, rip.y, argv[1], argv[2], cterm->fg_color, 0xffff, 1);
...@@ -12464,7 +12644,7 @@ do_skypix(char *buf, size_t len) ...@@ -12464,7 +12644,7 @@ do_skypix(char *buf, size_t len)
case 4: // Rectangle Fill... case 4: // Rectangle Fill...
for (y = argv[2]; y <= argv[4]; y++) { for (y = argv[2]; y <= argv[4]; y++) {
for (x = argv[1]; x <= argv[3]; x++) { for (x = argv[1]; x <= argv[3]; x++) {
setpixel(x, y, cterm->fg_color); scale_setpixel(x, y, cterm->fg_color);
} }
} }
break; break;
...@@ -13134,8 +13314,8 @@ init_rip(int enabled) ...@@ -13134,8 +13314,8 @@ init_rip(int enabled)
rip.y = 0; rip.y = 0;
rip.viewport.sx = 0; rip.viewport.sx = 0;
rip.viewport.sy = 0; rip.viewport.sy = 0;
rip.viewport.ex = 639; rip.viewport.ex = rip.x_dim - 1;
rip.viewport.ey = 349; rip.viewport.ey = rip.y_dim - 1;
rip.color = 7; rip.color = 7;
rip.font.num = 0; rip.font.num = 0;
rip.font.vertical = 0; rip.font.vertical = 0;
...@@ -13145,6 +13325,10 @@ init_rip(int enabled) ...@@ -13145,6 +13325,10 @@ init_rip(int enabled)
memcpy(rip.fill_pattern, "\xff\xff\xff\xff\xff\xff\xff\xff", 8); memcpy(rip.fill_pattern, "\xff\xff\xff\xff\xff\xff\xff\xff", 8);
rip.line_pattern = 0xffff; rip.line_pattern = 0xffff;
rip.line_width = 1; rip.line_width = 1;
rip.x_dim = 640;
rip.x_max = 640;
rip.y_dim = 350;
rip.y_max = 350;
   
pending_len = 0; pending_len = 0;
if (pending) if (pending)
...@@ -13242,6 +13426,10 @@ rip_getch(void) ...@@ -13242,6 +13426,10 @@ rip_getch(void)
if (ch == CIO_KEY_MOUSE) { if (ch == CIO_KEY_MOUSE) {
ch = -1; ch = -1;
getmouse(&mevent); getmouse(&mevent);
mevent.startx_res = unmap_rip_x(mevent.startx_res);
mevent.starty_res = unmap_rip_y(mevent.starty_res);
mevent.endx_res = unmap_rip_x(mevent.endx_res);
mevent.endy_res = unmap_rip_y(mevent.endy_res);
if (mevent.event == CIOLIB_BUTTON_1_PRESS) { if (mevent.event == CIOLIB_BUTTON_1_PRESS) {
for (rip_pressed = rip.mfields; rip_pressed; rip_pressed = rip_pressed->next) { for (rip_pressed = rip.mfields; rip_pressed; rip_pressed = rip_pressed->next) {
if (rip_pressed->type == MOUSE_FIELD_BUTTON) { if (rip_pressed->type == MOUSE_FIELD_BUTTON) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment