From 19a20f7c5aafe6d7c2ca80550d2e361d567a4ee7 Mon Sep 17 00:00:00 2001 From: otya128 Date: Sun, 4 Dec 2016 17:27:51 +0900 Subject: [PATCH] Implement ATTR function --- SMILEBASIC/builtinfunctions.d | 6 ++ SMILEBASIC/console.d | 124 +++++++++++++++++++++++----------- SMILEBASIC/error.d | 5 ++ 3 files changed, 94 insertions(+), 41 deletions(-) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 4c67fa4..ade4745 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -231,6 +231,12 @@ class BuiltinFunction p.console.consoleForeColor = cast(int)fore; p.console.consoleBackColor = cast(int)back; } + static void ATTR(PetitComputer p, int attr) + { + if (attr < 0 || attr > 15) + throw new OutOfRange("ATTR", 1); + p.console.attr = cast(otya.smilebasic.console.ConsoleAttribute)attr; + } static void VSYNC(PetitComputer p, DefaultValue!int time) { time.setDefaultValue(1); diff --git a/SMILEBASIC/console.d b/SMILEBASIC/console.d index c8d6000..54ce753 100644 --- a/SMILEBASIC/console.d +++ b/SMILEBASIC/console.d @@ -16,10 +16,20 @@ struct ConsoleCharacter wchar character; int foreColor; int backColor; - byte attr; + ConsoleAttribute attr; int z; } +enum ConsoleAttribute +{ + TROT0 = 0, + TROT90 = 1, + TROT180= 2, + TROT270 = 3, + TREVH = 4, + TREVV = 8, +} + class Console { @@ -176,6 +186,71 @@ class Console consoleWidthC = consoleWidth; consoleC = console; } + void drawCharacter(int x, int y, ConsoleCharacter ch) + { + import std.algorithm.mutation : swap; + auto fore = consoleColorGL[ch.foreColor]; + auto rect = &fontTable[ch.character]; + ConsoleAttribute rot = ch.attr & ConsoleAttribute.TROT270; + int z = ch.z; + glColor4ubv(cast(ubyte*)&fore); + float tx1 = (rect.x) / 512f - 1; + float ty1 = (rect.y + 8) / 512f - 1; + float tx2 = (rect.x + 8) / 512f - 1; + float ty2 = (rect.y) / 512f - 1; + int x1 = x * 8; + int x2 = x * 8 + 8; + int y1 = y * 8; + int y2 = y * 8 + 8; + if (ch.attr & ConsoleAttribute.TREVH) + swap(x1, x2); + if (ch.attr & ConsoleAttribute.TREVV) + swap(y1, y2); + if (rot == ConsoleAttribute.TROT0) + { + glTexCoord2f(tx1 , ty1); + glVertex3i(x1, y2, z); + glTexCoord2f(tx1, ty2); + glVertex3i(x1, y1, z); + glTexCoord2f(tx2, ty2); + glVertex3i(x2, y1, z); + glTexCoord2f(tx2, ty1); + glVertex3i(x2, y2, z); + } + if (rot == ConsoleAttribute.TROT90) + { + glTexCoord2f(tx2, ty1); + glVertex3i(x1, y2, z); + glTexCoord2f(tx1 , ty1); + glVertex3i(x1, y1, z); + glTexCoord2f(tx1, ty2); + glVertex3i(x2, y1, z); + glTexCoord2f(tx2, ty2); + glVertex3i(x2, y2, z); + } + if (rot == ConsoleAttribute.TROT180) + { + glTexCoord2f(tx2, ty2); + glVertex3i(x1, y2, z); + glTexCoord2f(tx2, ty1); + glVertex3i(x1, y1, z); + glTexCoord2f(tx1 , ty1); + glVertex3i(x2, y1, z); + glTexCoord2f(tx1, ty2); + glVertex3i(x2, y2, z); + } + if (rot == ConsoleAttribute.TROT270) + { + glTexCoord2f(tx1, ty2); + glVertex3i(x1, y2, z); + glTexCoord2f(tx2, ty2); + glVertex3i(x1, y1, z); + glTexCoord2f(tx2, ty1); + glVertex3i(x2, y1, z); + glTexCoord2f(tx1 , ty1); + glVertex3i(x2, y2, z); + } + } void render() { if(petitcom.xscreenmode == 2) @@ -211,18 +286,7 @@ class Console for(int y = 0; y < consoleHeight4; y++) for(int x = 0; x < consoleWidth4; x++) { - auto fore = consoleColorGL[console4[y][x].foreColor]; - auto rect = &fontTable[console4[y][x].character]; - glColor4ubv(cast(ubyte*)&fore); - int z = console4[y][x].z; - glTexCoord2f((rect.x) / 512f - 1 , (rect.y + 8) / 512f - 1); - glVertex3f((x * 8), (y * 8 + 8), z); - glTexCoord2f((rect.x) / 512f - 1, (rect.y) / 512f - 1); - glVertex3f((x * 8), (y * 8), z); - glTexCoord2f((rect.x + 8) / 512f - 1, (rect.y) / 512f - 1); - glVertex3f((x * 8 + 8), (y * 8), z); - glTexCoord2f((rect.x + 8) / 512f - 1, (rect.y +8) / 512f - 1); - glVertex3f((x * 8 + 8), (y * 8 + 8), z); + drawCharacter(x, y, console4[y][x]); } glEnd(); return; @@ -258,18 +322,7 @@ class Console for(int y = 0; y < consoleHeight; y++) for(int x = 0; x < consoleWidth; x++) { - auto fore = consoleColorGL[console[y][x].foreColor]; - auto rect = &fontTable[console[y][x].character]; - float z = console[y][x].z; - glColor4ubv(cast(ubyte*)&fore); - glTexCoord2f((rect.x) / 512f - 1 , (rect.y + 8) / 512f - 1); - glVertex3f((x * 8), (y * 8 + 8), z); - glTexCoord2f((rect.x) / 512f - 1, (rect.y) / 512f - 1); - glVertex3f((x * 8), (y * 8), z); - glTexCoord2f((rect.x + 8) / 512f - 1, (rect.y) / 512f - 1); - glVertex3f((x * 8 + 8), (y * 8), z); - glTexCoord2f((rect.x + 8) / 512f - 1, (rect.y +8) / 512f - 1); - glVertex3f((x * 8 + 8), (y * 8 + 8), z); + drawCharacter(x, y, console[y][x]); } glEnd(); if(petitcom.xscreenmode != 1) @@ -309,18 +362,7 @@ class Console for(int y = 0; y < consoleHeightDisplay1; y++) for(int x = 0; x < consoleWidthDisplay1; x++) { - auto fore = consoleColorGL[consoleDisplay1[y][x].foreColor]; - auto rect = &fontTable[consoleDisplay1[y][x].character]; - float z = consoleDisplay1[y][x].z; - glColor4ubv(cast(ubyte*)&fore); - glTexCoord2f((rect.x) / 512f - 1 , (rect.y + 8) / 512f - 1); - glVertex3f((x * 8), (y * 8 + 8), z); - glTexCoord2f((rect.x) / 512f - 1, (rect.y) / 512f - 1); - glVertex3f((x * 8), (y * 8), z); - glTexCoord2f((rect.x + 8) / 512f - 1, (rect.y) / 512f - 1); - glVertex3f((x * 8 + 8), (y * 8), z); - glTexCoord2f((rect.x + 8) / 512f - 1, (rect.y +8) / 512f - 1); - glVertex3f((x * 8 + 8), (y * 8 + 8), z); + drawCharacter(x, y, consoleDisplay1[y][x]); } glEnd(); } @@ -333,7 +375,7 @@ class Console } //0<=TABSTEP<=16 int TABSTEP = 4; - byte consoleAttr; + ConsoleAttribute attr; int tab; void printString(wstring text) { @@ -356,7 +398,7 @@ class Console else { auto t = min(CSRX + TABSTEP - CSRX % TABSTEP, consoleWidthC - 1); - consoleC[CSRY][CSRX..t] = ConsoleCharacter(0, consoleForeColor, consoleBackColor, consoleAttr, CSRZ); + consoleC[CSRY][CSRX..t] = ConsoleCharacter(0, consoleForeColor, consoleBackColor, attr, CSRZ); CSRX += TABSTEP - (CSRX % TABSTEP) - 1; if(CSRX + 1 >= consoleWidthC) { @@ -367,7 +409,7 @@ class Console } else if(c != '\n') { - consoleC[CSRY][CSRX] = ConsoleCharacter(c, consoleForeColor, consoleBackColor, consoleAttr, CSRZ); + consoleC[CSRY][CSRX] = ConsoleCharacter(c, consoleForeColor, consoleBackColor, attr, CSRZ); tab = tab ? 2 : 0; } CSRX++; @@ -384,7 +426,7 @@ class Console consoleC[i] = consoleC[i + 1]; } consoleC[consoleHeightC - 1] = tmp; - tmp[] = ConsoleCharacter(0, consoleForeColor, consoleBackColor, consoleAttr, CSRZ); + tmp[] = ConsoleCharacter(0, consoleForeColor, consoleBackColor, attr, CSRZ); CSRY = consoleHeightC - 1; } } diff --git a/SMILEBASIC/error.d b/SMILEBASIC/error.d index f4c622a..546a22d 100644 --- a/SMILEBASIC/error.d +++ b/SMILEBASIC/error.d @@ -87,6 +87,11 @@ class OutOfRange : SmileBasicError this.errnum = 10; super("Out of range"); } + this(string func, int arg) + { + this.errnum = 10; + super("Out of range(" ~ func ~ ":" ~ arg.to!string ~ ")"); + } } class OutOfDATA : SmileBasicError {