1
0

Implement GPSET,GLINE,GBOX,GFILL,GCLS

This commit is contained in:
otya128
2016-12-17 21:16:11 +09:00
parent af524152ab
commit ade3bd9f99
2 changed files with 198 additions and 7 deletions

View File

@@ -114,8 +114,8 @@ class Graphic
}
bool[2] visibles = [true, true];
private int[2] showPage = [0, 1];
private int[2] usePage = [0, 1];
protected int[2] showPage = [0, 1];
protected int[2] usePage = [0, 1];
bool visible()
{
return visibles[petitcom.displaynum];
@@ -411,6 +411,7 @@ class GraphicFBO : Graphic
}
override @property void useGRP(int page)
{
super.useGRP = page;
glBindFramebufferEXT(GL_FRAMEBUFFER, this.GRP[page].buffer);
}
override @property int useGRP()
@@ -731,7 +732,7 @@ class GraphicFBO : Graphic
}
}
class GraphicPBO : Graphic
class Graphic2 : Graphic
{
this(PetitComputer p)
{
@@ -748,39 +749,221 @@ class GraphicPBO : Graphic
foreach(g; GRP)
{
g.createTexture(petitcom.renderer, petitcom.textureScaleMode);
g.createBuffer();
}
}
override void initVM()
{
SDL_GL_MakeCurrent(petitcom.window, petitcom.contextVM);
glAlphaFunc(GL_GEQUAL, 0.1f);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_TEXTURE_2D);
glDisable(GL_ALPHA_TEST);
glDisable(GL_DEPTH_TEST);
}
int olddisplay;
override void display(int display)
{
if (df)
{
glBindTexture(GL_TEXTURE_2D, this.GRP[usePage[olddisplay]].glTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
df = false;
}
olddisplay = display;
buffer = cast(int*)this.GRP[usePage[display]].surface.pixels;
}
bool df;
void updateTexture()
{
glBindTexture(GL_TEXTURE_2D, this.GRP[useGRP].glTexture);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
}
override void updateVM()
{
if (df)
{
updateTexture;
df = false;
}
}
int* buffer;
override @property void useGRP(int page)
{
updateVM;
super.useGRP(page);
buffer = cast(int*)this.GRP[useGRP].surface.pixels;
}
override @property int useGRP()
{
return super.useGRP;
}
override void gpset(int page, int x, int y, uint color)
{
buffer[y * height + x] = color;
df = true;
}
import std.math;
override void gline(int page, int x, int y, int x2, int y2, uint color)
{
int dx = abs(x2 - x);
int dy = abs(y2 - y);
int sx, sy;
if (x < x2)
sx = 1;
else
sx = -1;
if (y < y2)
sy = 1;
else
sy = -1;
int err = dx - dy;
auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w;
int cy2 = wa.y + wa.h;
while (true)
{
if (x >= wa.x && y >= wa.y && x < cx2 && y < cy2)
buffer[y * height + x] = color;
if (x == x2 && y == y2) break;
int e2 = 2 * err;
if (e2 > -dy)
{
err = err - dy;
x = x + sx;
}
if (e2 < dx)
{
err = err + dx;
y = y + sy;
}
}
df = true;
}
override void gbox(int page, int x, int y, int x2, int y2, uint color)
{
int sx, sy, ex, ey;
if (x > x2)
{
sx = x2;
ex = x;
}
else
{
sx = x;
ex = x2;
}
if (y > y2)
{
sy = y2;
ey = y;
}
else
{
sy = y;
ey = y2;
}
auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w;
int cy2 = wa.y + wa.h;
void drawLine1(int y)
{
for (int x = sx; x <= ex; x++)
{
if (x >= wa.x && y >= wa.y && x < cx2 && y < cy2)
buffer[y * height + x] = color;
}
}
drawLine1(sy);
drawLine1(ey);
void drawLine2(int x)
{
for (int y = sy; y <= ey; y++)
{
if (x >= wa.x && y >= wa.y && x < cx2 && y < cy2)
buffer[y * height + x] = color;
}
}
drawLine2(ex);
drawLine2(sx);
df = true;
}
override void gfill(int page, int x, int y, int x2, int y2, uint color)
{
int sx, sy, ex, ey;
if (x > x2)
{
sx = x2;
ex = x;
}
else
{
sx = x;
ex = x2;
}
if (y > y2)
{
sy = y2;
ey = y;
}
else
{
sy = y;
ey = y2;
}
auto wa = writeArea[petitcom.displaynum];
int cx2 = wa.x + wa.w;
int cy2 = wa.y + wa.h;
//clipping
if (wa.x > sx)
{
if (wa.x > ex)
{
return;
}
sx = wa.x;
}
if (cx2 < ex)
{
if (cx2 < sx)
{
return;
}
ex = cx2;
}
if (wa.y > sy)
{
if (wa.y > ey)
{
return;
}
sy = wa.y;
}
if (cy2 < ey)
{
if (cy2 < sy)
{
return;
}
ey = cy2;
}
for (y = sy; y <= ey; y++)
{
(buffer + y * height + sx)[0..(ex - sx + 1)] = color;
}
df = true;
}
override void gcls(int page, uint color)
{
gfill(page, 0, 0, width - 1, height - 1, color);
}
override void gpaint(int page, int x, int y, uint color)
@@ -799,13 +982,21 @@ class GraphicPBO : Graphic
{
}
void drawCharacter(int x, int y, int scalex, int scaley, wchar c)
{
auto rect = petitcom.console.fontTable[c];
}
override void gputchr(int page, int x, int y, wstring text, int scalex, int scaley, uint color)
{
int* grpfbuffer = cast(int*)petitcom.console.GRPF.surface.pixels;
foreach (c; text)
{
}
}
override int gspoit(int page, int x, int y)
{
return 0;
return buffer[y * height + x];
}
override void gsave(int savepage, int x, int y, int w, int h, double[] array, int flag)

View File

@@ -140,6 +140,7 @@ class GraphicPage
glDeleteTextures(1, &glTexture);
buffer = render = glTexture = 0;
}
}
version(Windows)
@@ -926,7 +927,7 @@ class PetitComputer
slot = new Slot[5];
keybuffer = new Key[128];
init();
graphic = new GraphicPBO(this);
graphic = new Graphic2(this);
keybuffermutex = new Mutex();
grpmutex = new Mutex();
sprite = new Sprite(this);
@@ -942,7 +943,6 @@ class PetitComputer
renderCondition.wait();
}
graphic.initVM();
display(0);
xscreen(0, 512, 4);
auto startTicks = SDL_GetTicks();
Parser parser;