| @@ -24,6 +24,7 @@ | |||
| #include <windows.h> | |||
| #include <stdlib.h> | |||
| #include <stdio.h> | |||
| #include "caca.h" | |||
| #include "caca_internals.h" | |||
| @@ -76,8 +77,7 @@ static int const win32_bg_palette[] = | |||
| struct driver_private | |||
| { | |||
| HANDLE hin, hout; | |||
| HANDLE front, back; | |||
| HANDLE hin, hout, screen; | |||
| CHAR_INFO *buffer; | |||
| CONSOLE_CURSOR_INFO cci; | |||
| }; | |||
| @@ -85,6 +85,7 @@ struct driver_private | |||
| static int win32_init_graphics(caca_t *kk) | |||
| { | |||
| CONSOLE_SCREEN_BUFFER_INFO csbi; | |||
| SMALL_RECT rect; | |||
| COORD size; | |||
| kk->drv.p = malloc(sizeof(struct driver_private)); | |||
| @@ -105,40 +106,37 @@ static int win32_init_graphics(caca_t *kk) | |||
| SetConsoleMode(kk->drv.p->hout, ENABLE_MOUSE_INPUT); | |||
| kk->drv.p->front = | |||
| kk->drv.p->screen = | |||
| CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, | |||
| 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); | |||
| if(!kk->drv.p->front || kk->drv.p->front == INVALID_HANDLE_VALUE) | |||
| if(!kk->drv.p->screen || kk->drv.p->screen == INVALID_HANDLE_VALUE) | |||
| return -1; | |||
| kk->drv.p->back = | |||
| CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, | |||
| 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); | |||
| if(!kk->drv.p->back || kk->drv.p->back == INVALID_HANDLE_VALUE) | |||
| return -1; | |||
| /* Set the new console size */ | |||
| size.X = kk->qq->width; | |||
| size.Y = kk->qq->height; | |||
| SetConsoleScreenBufferSize(kk->drv.p->screen, size); | |||
| if(!GetConsoleScreenBufferInfo(kk->drv.p->hout, &csbi)) | |||
| rect.Left = rect.Top = 0; | |||
| rect.Right = kk->qq->width - 1; | |||
| rect.Bottom = kk->qq->height - 1; | |||
| SetConsoleWindowInfo(kk->drv.p->screen, TRUE, &rect); | |||
| /* Report our new size to libcucul */ | |||
| if(!GetConsoleScreenBufferInfo(kk->drv.p->screen, &csbi)) | |||
| return -1; | |||
| /* Sample code to get the biggest possible window */ | |||
| //size = GetLargestConsoleWindowSize(kk->drv.p->hout); | |||
| _cucul_set_size(kk->qq, csbi.srWindow.Right - csbi.srWindow.Left + 1, | |||
| csbi.srWindow.Bottom - csbi.srWindow.Top + 1); | |||
| size.X = kk->qq->width; | |||
| size.Y = kk->qq->height; | |||
| SetConsoleScreenBufferSize(kk->drv.p->front, size); | |||
| SetConsoleScreenBufferSize(kk->drv.p->back, size); | |||
| SetConsoleMode(kk->drv.p->front, 0); | |||
| SetConsoleMode(kk->drv.p->back, 0); | |||
| SetConsoleMode(kk->drv.p->screen, 0); | |||
| GetConsoleCursorInfo(kk->drv.p->front, &kk->drv.p->cci); | |||
| GetConsoleCursorInfo(kk->drv.p->screen, &kk->drv.p->cci); | |||
| kk->drv.p->cci.dwSize = 0; | |||
| kk->drv.p->cci.bVisible = FALSE; | |||
| SetConsoleCursorInfo(kk->drv.p->front, &kk->drv.p->cci); | |||
| SetConsoleCursorInfo(kk->drv.p->back, &kk->drv.p->cci); | |||
| SetConsoleCursorInfo(kk->drv.p->screen, &kk->drv.p->cci); | |||
| SetConsoleActiveScreenBuffer(kk->drv.p->front); | |||
| SetConsoleActiveScreenBuffer(kk->drv.p->screen); | |||
| kk->drv.p->buffer = malloc(kk->qq->width * kk->qq->height | |||
| * sizeof(CHAR_INFO)); | |||
| @@ -151,8 +149,7 @@ static int win32_init_graphics(caca_t *kk) | |||
| static int win32_end_graphics(caca_t *kk) | |||
| { | |||
| SetConsoleActiveScreenBuffer(kk->drv.p->hout); | |||
| CloseHandle(kk->drv.p->back); | |||
| CloseHandle(kk->drv.p->front); | |||
| CloseHandle(kk->drv.p->screen); | |||
| SetConsoleTextAttribute(kk->drv.p->hout, FOREGROUND_INTENSITY | |||
| | FOREGROUND_RED | |||
| @@ -195,7 +192,7 @@ static void win32_display(caca_t *kk) | |||
| SMALL_RECT rect; | |||
| unsigned int i; | |||
| /* Render everything to our back buffer */ | |||
| /* Render everything to our screen buffer */ | |||
| for(i = 0; i < kk->qq->width * kk->qq->height; i++) | |||
| { | |||
| uint32_t c = kk->qq->chars[i]; | |||
| @@ -217,7 +214,7 @@ static void win32_display(caca_t *kk) | |||
| | win32_bg_palette[kk->qq->attr[i] >> 4]; | |||
| } | |||
| /* Blit the back buffer to the front buffer */ | |||
| /* Blit the screen buffer */ | |||
| size.X = kk->qq->width; | |||
| size.Y = kk->qq->height; | |||
| pos.X = pos.Y = 0; | |||
| @@ -225,9 +222,9 @@ static void win32_display(caca_t *kk) | |||
| rect.Right = kk->qq->width - 1; | |||
| rect.Bottom = kk->qq->height - 1; | |||
| #if 0 | |||
| WriteConsoleOutput(kk->drv.p->front, kk->drv.p->buffer, size, pos, &rect); | |||
| WriteConsoleOutput(kk->drv.p->screen, kk->drv.p->buffer, size, pos, &rect); | |||
| #else | |||
| WriteConsoleOutputW(kk->drv.p->front, kk->drv.p->buffer, size, pos, &rect); | |||
| WriteConsoleOutputW(kk->drv.p->screen, kk->drv.p->buffer, size, pos, &rect); | |||
| #endif | |||
| } | |||