diff --git a/libctru/source/console.c b/libctru/source/console.c index 66c856e77..6704583a2 100644 --- a/libctru/source/console.c +++ b/libctru/source/console.c @@ -95,7 +95,7 @@ static void consoleCls(int mode) { colTemp = currentConsole->cursorX ; rowTemp = currentConsole->cursorY ; - while(i++ < ((currentConsole->windowHeight * currentConsole->windowWidth) - (rowTemp * currentConsole->consoleWidth + colTemp))) + while(i++ < ((currentConsole->windowHeight * currentConsole->windowWidth) - (rowTemp * currentConsole->windowWidth + colTemp))) consolePrintChar(' '); currentConsole->cursorX = colTemp; @@ -107,8 +107,8 @@ static void consoleCls(int mode) { colTemp = currentConsole->cursorX ; rowTemp = currentConsole->cursorY ; - currentConsole->cursorY = 0; - currentConsole->cursorX = 0; + currentConsole->cursorY = 1; + currentConsole->cursorX = 1; while (i++ < (rowTemp * currentConsole->windowWidth + colTemp)) consolePrintChar(' '); @@ -119,14 +119,14 @@ static void consoleCls(int mode) { } case 2: { - currentConsole->cursorY = 0; - currentConsole->cursorX = 0; + currentConsole->cursorY = 1; + currentConsole->cursorX = 1; while(i++ < currentConsole->windowHeight * currentConsole->windowWidth) consolePrintChar(' '); - currentConsole->cursorY = 0; - currentConsole->cursorX = 0; + currentConsole->cursorY = 1; + currentConsole->cursorX = 1; break; } } @@ -136,51 +136,44 @@ static void consoleCls(int mode) { static void consoleClearLine(int mode) { //--------------------------------------------------------------------------------- - int i = 0; - int colTemp; + int i, colTemp; switch (mode) { case 0: - { - colTemp = currentConsole->cursorX ; + colTemp = currentConsole->cursorX; - while(i++ < (currentConsole->windowWidth - colTemp)) { + for (i=0; i < currentConsole->windowWidth - colTemp + 1; i++) { consolePrintChar(' '); } currentConsole->cursorX = colTemp; break; - } case 1: - { colTemp = currentConsole->cursorX ; - currentConsole->cursorX = 0; + currentConsole->cursorX = 1; - while(i++ < ((currentConsole->windowWidth - colTemp)-2)) { + for(i=0; i < colTemp - 1; i++) { consolePrintChar(' '); } currentConsole->cursorX = colTemp; break; - } case 2: - { colTemp = currentConsole->cursorX ; - currentConsole->cursorX = 0; + currentConsole->cursorX = 1; - while(i++ < currentConsole->windowWidth) { + for(i=0; i < currentConsole->windowWidth; i++) { consolePrintChar(' '); } currentConsole->cursorX = colTemp; break; - } } gfxFlushBuffers(); } @@ -355,6 +348,10 @@ static void consoleSetColorState(int code) static void consoleHandleColorEsc(int argCount) { + escapeSeq.color.bg = currentConsole->bg; + escapeSeq.color.fg = currentConsole->fg; + escapeSeq.color.flags = currentConsole->flags; + for (int arg = 0; arg < argCount; arg++) { int code = escapeSeq.args[arg]; @@ -433,7 +430,7 @@ static void consoleHandleColorEsc(int argCount) if(escapeSeq.colorArgCount == 3) { escapeSeq.color.bg = RGB8_to_565(escapeSeq.colorArgs[0], escapeSeq.colorArgs[1], escapeSeq.colorArgs[2]); - escapeSeq.color.flags |= CONSOLE_FG_CUSTOM; + escapeSeq.color.flags |= CONSOLE_BG_CUSTOM; escapeSeq.state = ESC_BUILDING_UNKNOWN; } default: @@ -441,15 +438,14 @@ static void consoleHandleColorEsc(int argCount) } } escapeSeq.argIdx = 0; -} -static void consoleColorApply(void) -{ currentConsole->bg = escapeSeq.color.bg; currentConsole->fg = escapeSeq.color.fg; currentConsole->flags = escapeSeq.color.flags; + } + //--------------------------------------------------------------------------------- ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len) { //--------------------------------------------------------------------------------- @@ -531,7 +527,7 @@ ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len) { if (!escapeSeq.hasArg && !escapeSeq.argIdx) escapeSeq.args[0] = 1; currentConsole->cursorY = currentConsole->cursorY + escapeSeq.args[0]; - if (currentConsole->cursorY >= currentConsole->windowHeight) + if (currentConsole->cursorY > currentConsole->windowHeight) currentConsole->cursorY = currentConsole->windowHeight; escapeSeq.state = ESC_NONE; break; @@ -556,14 +552,7 @@ ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len) { //--------------------------------------- case 'H': case 'f': - if (escapeSeq.argIdx == 0 && !escapeSeq.hasArg) - { - escapeSeq.args[0] = 1; - escapeSeq.args[1] = 1; - } - if (escapeSeq.argIdx == 1 && !escapeSeq.hasArg) - escapeSeq.args[1] = 1; - consolePosition(escapeSeq.args[0], escapeSeq.args[1]); + consolePosition(escapeSeq.args[1], escapeSeq.args[0]); escapeSeq.state = ESC_NONE; break; //--------------------------------------- @@ -609,7 +598,6 @@ ssize_t con_write(struct _reent *r,void *fd,const char *ptr, size_t len) { if (escapeSeq.argIdx == 0 && !escapeSeq.hasArg) escapeSeq.args[escapeSeq.argIdx++] = 0; if (escapeSeq.hasArg) escapeSeq.argIdx++; consoleHandleColorEsc(escapeSeq.argIdx); - consoleColorApply(); escapeSeq.state = ESC_NONE; break; default: @@ -762,17 +750,17 @@ static void newRow() { currentConsole->cursorY ++; - if(currentConsole->cursorY >= currentConsole->windowHeight) { - currentConsole->cursorY --; - u16 *dst = ¤tConsole->frameBuffer[(currentConsole->windowX * 8 * 240) + (239 - (currentConsole->windowY * 8))]; + if(currentConsole->cursorY > currentConsole->windowHeight) { + currentConsole->cursorY = currentConsole->windowHeight; + u16 *dst = ¤tConsole->frameBuffer[((currentConsole->windowX - 1 ) * 8 * 240) + (239 - ((currentConsole->windowY) * 8))]; u16 *src = dst - 8; int i,j; - for (i=0; iwindowWidth*8; i++) { + for (i=0; i<(currentConsole->windowWidth)*8; i++) { u32 *from = (u32*)((int)src & ~3); u32 *to = (u32*)((int)dst & ~3); - for (j=0;j<(((currentConsole->windowHeight-1)*8)/2);j++) *(to--) = *(from--); + for (j=0;j<(((currentConsole->windowHeight-2)*8)/2);j++) *(to--) = *(from--); dst += 240; src += 240; } @@ -829,8 +817,8 @@ void consoleDrawChar(int c) { int i; - int x = (currentConsole->cursorX + currentConsole->windowX) * 8; - int y = ((currentConsole->cursorY + currentConsole->windowY) *8 ); + int x = (currentConsole->cursorX - 1 + currentConsole->windowX - 1 ) * 8; + int y = ((currentConsole->cursorY - 1 + currentConsole->windowY - 1 ) *8 ); u16 *screen = ¤tConsole->frameBuffer[(x * 240) + (239 - (y + 7))]; @@ -873,7 +861,7 @@ void consolePrintChar(int c) { if(currentConsole->cursorX < 1) { if(currentConsole->cursorY > 1) { - currentConsole->cursorX = currentConsole->windowX - 1; + currentConsole->cursorX = currentConsole->windowWidth; currentConsole->cursorY--; } else { currentConsole->cursorX = 1; @@ -884,7 +872,7 @@ void consolePrintChar(int c) { break; case 9: - currentConsole->cursorX += currentConsole->tabSize - ((currentConsole->cursorX)%(currentConsole->tabSize)); + for(int i=0; itabSize; i++) consolePrintChar(' '); break; case 10: newRow(); @@ -916,12 +904,15 @@ void consoleSetWindow(PrintConsole* console, int x, int y, int width, int height if(!console) console = currentConsole; + if (x < 1) x = 1; + if (y < 1) y = 1; + console->windowWidth = width; console->windowHeight = height; console->windowX = x; console->windowY = y; - console->cursorX = 0; - console->cursorY = 0; + console->cursorX = 1; + console->cursorY = 1; }