1
0

Fix clipping and implement GPUTCHR with scale

This commit is contained in:
otya128
2016-12-18 12:56:40 +09:00
parent e329b544fb
commit 8cfa862d4e

View File

@@ -803,7 +803,13 @@ class Graphic2 : Graphic
override void gpset(int page, int x, int y, uint color) override void gpset(int page, int x, int y, uint color)
{ {
buffer[y * width + x] = color; auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w;
int cy2 = wa.y + wa.h;
if (x >= wa.x && y >= wa.y && x < cx2 && y < cy2)
{
buffer[y * width + x] = color;
}
df = true; df = true;
} }
@@ -870,8 +876,8 @@ class Graphic2 : Graphic
ey = y2; ey = y2;
} }
auto wa = writeArea[petitcom.displaynum]; auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w; int cx2 = wa.x + wa.w - 1;
int cy2 = wa.y + wa.h; int cy2 = wa.y + wa.h - 1;
void drawLine1(int y) void drawLine1(int y)
{ {
for (int x = sx; x <= ex; x++) for (int x = sx; x <= ex; x++)
@@ -919,8 +925,8 @@ class Graphic2 : Graphic
ey = y2; ey = y2;
} }
auto wa = writeArea[petitcom.displaynum]; auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w; int cx2 = wa.x + wa.w - 1;
int cy2 = wa.y + wa.h; int cy2 = wa.y + wa.h - 1;
//clipping //clipping
if (wa.x > sx) if (wa.x > sx)
{ {
@@ -1004,7 +1010,7 @@ class Graphic2 : Graphic
auto wa = writeArea[petitcom.displaynum]; auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w; int cx2 = wa.x + wa.w;
int cy2 = wa.y + wa.h; int cy2 = wa.y + wa.h;
int sx, sy, w = rect.w, h = rect.h; int sx, sy, w = rect.w * scalex, h = rect.h * scaley;
//clipping //clipping
if (wa.x > x) if (wa.x > x)
{ {
@@ -1041,15 +1047,15 @@ class Graphic2 : Graphic
} }
} }
int* grpfbuffer = cast(int*)petitcom.console.GRPF.surface.pixels; int* grpfbuffer = cast(int*)petitcom.console.GRPF.surface.pixels;
for (int i = sy; i < sy + h; i ++)
{
for (int j = sx; j < sx + w; j++)
{
font[i * 8 + j] = mulColor(grpfbuffer[rect.x + j + (rect.y + i) * GRPFWidth], color);
}
}
if (scalex == 1 && scaley == 1) if (scalex == 1 && scaley == 1)
{ {
for (int i = sy; i < sy + h; i ++)
{
for (int j = sx; j < sx + w; j++)
{
font[i * 8 + j] = mulColor(grpfbuffer[rect.x + j + (rect.y + i) * GRPFWidth], color);
}
}
for (int iy = sy; iy < sy + h; iy++) for (int iy = sy; iy < sy + h; iy++)
{ {
for (int ix = sx; ix < sx + w; ix++) for (int ix = sx; ix < sx + w; ix++)
@@ -1060,6 +1066,24 @@ class Graphic2 : Graphic
} }
} }
} }
return;
}
for (int i = sy / scaley; i < (sy + h) / scaley; i ++)
{
for (int j = sx / scalex; j < (sx + w) / scalex; j++)
{
font[i * 8 + j] = mulColor(grpfbuffer[rect.x + j + (rect.y + i) * GRPFWidth], color);
}
}
for (int iy = sy; iy < sy + h; iy++)
{
for (int ix = sx; ix < sx + w; ix++)
{
if (font[iy / scaley * 8 + ix / scalex] >> 24/*is trans*/)
{
(buffer + (y + iy) * width + x + ix)[0] = font[iy / scaley * 8 + ix / scaley];
}
}
} }
} }
override void gputchr(int page, int x, int y, wstring text, int scalex, int scaley, uint color) override void gputchr(int page, int x, int y, wstring text, int scalex, int scaley, uint color)