Start support for virtual dialogs

This commit is contained in:
UnknownShadow200 2025-11-08 16:07:52 +11:00
parent dca75bb289
commit db4ed0301a
6 changed files with 108 additions and 67 deletions

View File

@ -30,7 +30,7 @@
struct FontDesc titleFont, textFont, hintFont, logoFont, rowFont; struct FontDesc titleFont, textFont, hintFont, logoFont, rowFont;
/* Contains the pixels that are drawn to the window */ /* Contains the pixels that are drawn to the window */
static struct Context2D framebuffer; struct Context2D LBackend_FB;
/* The area/region of the window that needs to be redrawn and presented to the screen. */ /* The area/region of the window that needs to be redrawn and presented to the screen. */
/* If width is 0, means no area needs to be redrawn. */ /* If width is 0, means no area needs to be redrawn. */
static Rect2D dirty_rect; static Rect2D dirty_rect;
@ -191,13 +191,13 @@ void LBackend_NeedsRedraw(void* widget) {
} }
void LBackend_MarkAllDirty(void) { void LBackend_MarkAllDirty(void) {
dirty_rect.x = 0; dirty_rect.width = framebuffer.width; dirty_rect.x = 0; dirty_rect.width = LBackend_FB.width;
dirty_rect.y = 0; dirty_rect.height = framebuffer.height; dirty_rect.y = 0; dirty_rect.height = LBackend_FB.height;
} }
void LBackend_MarkAreaDirty(int x, int y, int width, int height) { void LBackend_MarkAreaDirty(int x, int y, int width, int height) {
int x1, y1, x2, y2; int x1, y1, x2, y2;
if (!Drawer2D_Clamp(&framebuffer, &x, &y, &width, &height)) return; if (!Drawer2D_Clamp(&LBackend_FB, &x, &y, &width, &height)) return;
/* union with existing dirty area */ /* union with existing dirty area */
if (dirty_rect.width) { if (dirty_rect.width) {
@ -221,14 +221,15 @@ void LBackend_InitFramebuffer(void) {
int height = max(Window_Main.Height, 1); int height = max(Window_Main.Height, 1);
Window_AllocFramebuffer(&bmp, width, height); Window_AllocFramebuffer(&bmp, width, height);
Context2D_Wrap(&framebuffer, &bmp); Context2D_Wrap(&LBackend_FB, &bmp);
/* Backing surface may be bigger then valid area */ /* Backing surface may be bigger then valid area */
framebuffer.width = width; LBackend_FB.width = width;
framebuffer.height = height; LBackend_FB.height = height;
} }
void LBackend_FreeFramebuffer(void) { void LBackend_FreeFramebuffer(void) {
Window_FreeFramebuffer(&framebuffer.bmp); Window_FreeFramebuffer(&LBackend_FB.bmp);
LBackend_FB.bmp.scan0 = NULL;
} }
@ -236,16 +237,16 @@ void LBackend_FreeFramebuffer(void) {
*------------------------------------------------------Base drawing-------------------------------------------------------* *------------------------------------------------------Base drawing-------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
static void DrawBoxBounds(BitmapCol color, int x, int y, int width, int height) { static void DrawBoxBounds(BitmapCol color, int x, int y, int width, int height) {
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
x, y, x, y,
width, yBorder); width, yBorder);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
x, y + height - yBorder, x, y + height - yBorder,
width, yBorder); width, yBorder);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
x, y, x, y,
xBorder, height); xBorder, height);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
x + width - xBorder, y, x + width - xBorder, y,
xBorder, height); xBorder, height);
} }
@ -262,7 +263,7 @@ static CC_NOINLINE void DrawWidget(struct LWidget* w) {
static CC_NOINLINE void RedrawAll(void) { static CC_NOINLINE void RedrawAll(void) {
struct LScreen* s = Launcher_Active; struct LScreen* s = Launcher_Active;
int i; int i;
s->DrawBackground(s, &framebuffer); s->DrawBackground(s, &LBackend_FB);
for (i = 0; i < s->numWidgets; i++) { for (i = 0; i < s->numWidgets; i++) {
DrawWidget(s->widgets[i]); DrawWidget(s->widgets[i]);
@ -281,7 +282,7 @@ static CC_NOINLINE void RedrawDirty(void) {
/* check if widget might need redrawing of background behind */ /* check if widget might need redrawing of background behind */
if (!w->opaque || w->last.width > w->width || w->last.height > w->height) { if (!w->opaque || w->last.width > w->width || w->last.height > w->height) {
s->ResetArea(&framebuffer, s->ResetArea(&LBackend_FB,
w->last.x, w->last.y, w->last.width, w->last.height); w->last.x, w->last.y, w->last.width, w->last.height);
LBackend_MarkAreaDirty(w->last.x, w->last.y, w->last.width, w->last.height); LBackend_MarkAreaDirty(w->last.x, w->last.y, w->last.width, w->last.height);
} }
@ -320,9 +321,9 @@ void LBackend_Tick(void) {
for (i = 0; i < Array_Elems(LBackend_Hooks); i++) for (i = 0; i < Array_Elems(LBackend_Hooks); i++)
{ {
if (LBackend_Hooks[i]) LBackend_Hooks[i](&framebuffer); if (LBackend_Hooks[i]) LBackend_Hooks[i]();
} }
Window_DrawFramebuffer(dirty_rect, &framebuffer.bmp); Window_DrawFramebuffer(dirty_rect, &LBackend_FB.bmp);
dirty_rect.x = 0; dirty_rect.width = 0; dirty_rect.x = 0; dirty_rect.width = 0;
dirty_rect.y = 0; dirty_rect.height = 0; dirty_rect.y = 0; dirty_rect.height = 0;
@ -469,13 +470,13 @@ void LBackend_ButtonDraw(struct LButton* w) {
int xOffset, yOffset; int xOffset, yOffset;
cc_bool active = w->hovered || w->selected; cc_bool active = w->hovered || w->selected;
LButton_DrawBackground(&framebuffer, w->x, w->y, w->width, w->height, active); LButton_DrawBackground(&LBackend_FB, w->x, w->y, w->width, w->height, active);
xOffset = w->width - w->_textWidth; xOffset = w->width - w->_textWidth;
yOffset = w->height - w->_textHeight; yOffset = w->height - w->_textHeight;
DrawTextArgs_Make(&args, &w->text, &titleFont, true); DrawTextArgs_Make(&args, &w->text, &titleFont, true);
if (!active) Drawer2D.Colors['f'] = Drawer2D.Colors['7']; if (!active) Drawer2D.Colors['f'] = Drawer2D.Colors['7'];
Context2D_DrawText(&framebuffer, &args, Context2D_DrawText(&LBackend_FB, &args,
w->x + xOffset / 2, w->y + yOffset / 2); w->x + xOffset / 2, w->y + yOffset / 2);
if (!active) Drawer2D.Colors['f'] = Drawer2D.Colors['F']; if (!active) Drawer2D.Colors['f'] = Drawer2D.Colors['F'];
@ -571,23 +572,23 @@ void LBackend_CheckboxDraw(struct LCheckbox* w) {
width = Display_ScaleX(CB_SIZE); width = Display_ScaleX(CB_SIZE);
height = Display_ScaleY(CB_SIZE); height = Display_ScaleY(CB_SIZE);
Gradient_Vertical(&framebuffer, boxTop, boxBottom, Gradient_Vertical(&LBackend_FB, boxTop, boxBottom,
w->x, w->y, width, height / 2); w->x, w->y, width, height / 2);
Gradient_Vertical(&framebuffer, boxBottom, boxTop, Gradient_Vertical(&LBackend_FB, boxBottom, boxTop,
w->x, w->y + height / 2, width, height / 2); w->x, w->y + height / 2, width, height / 2);
if (w->value) { if (w->value) {
const int size = 12; const int size = 12;
x = w->x + width / 2 - size / 2; x = w->x + width / 2 - size / 2;
y = w->y + height / 2 - size / 2; y = w->y + height / 2 - size / 2;
DrawIndexed(size, x, y, &framebuffer); DrawIndexed(size, x, y, &LBackend_FB);
} }
DrawBoxBounds(BITMAPCOLOR_BLACK, w->x, w->y, width, height); DrawBoxBounds(BITMAPCOLOR_BLACK, w->x, w->y, width, height);
DrawTextArgs_Make(&args, &w->text, &textFont, true); DrawTextArgs_Make(&args, &w->text, &textFont, true);
x = w->x + Display_ScaleX(CB_SIZE + CB_OFFSET); x = w->x + Display_ScaleX(CB_SIZE + CB_OFFSET);
y = w->y + (height - Drawer2D_TextHeight(&args)) / 2; y = w->y + (height - Drawer2D_TextHeight(&args)) / 2;
Context2D_DrawText(&framebuffer, &args, x, y); Context2D_DrawText(&LBackend_FB, &args, x, y);
} }
@ -735,7 +736,7 @@ void LBackend_InputUnselect(struct LInput* w) {
static void LInput_DrawOuterBorder(struct LInput* w) { static void LInput_DrawOuterBorder(struct LInput* w) {
struct LScreen* s = Launcher_Active; struct LScreen* s = Launcher_Active;
struct Context2D* ctx = &framebuffer; struct Context2D* ctx = &LBackend_FB;
BitmapCol color = Launcher_Theme.ButtonBorderColor; BitmapCol color = Launcher_Theme.ButtonBorderColor;
if (w->selected) { if (w->selected) {
@ -756,16 +757,16 @@ static void LInput_DrawInnerBorder(struct LInput* w) {
/* e.g. for modern theme: 162,131,186 --> 165,142,168 */ /* e.g. for modern theme: 162,131,186 --> 165,142,168 */
BitmapCol color = BitmapColor_Offset(Launcher_Theme.ButtonHighlightColor, 3,11,-18); BitmapCol color = BitmapColor_Offset(Launcher_Theme.ButtonHighlightColor, 3,11,-18);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
w->x + xBorder, w->y + yBorder, w->x + xBorder, w->y + yBorder,
w->width - xBorder2, yBorder); w->width - xBorder2, yBorder);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
w->x + xBorder, w->y + w->height - yBorder2, w->x + xBorder, w->y + w->height - yBorder2,
w->width - xBorder2, yBorder); w->width - xBorder2, yBorder);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
w->x + xBorder, w->y + yBorder, w->x + xBorder, w->y + yBorder,
xBorder, w->height - yBorder2); xBorder, w->height - yBorder2);
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
w->x + w->width - xBorder2, w->y + yBorder, w->x + w->width - xBorder2, w->y + yBorder,
xBorder, w->height - yBorder2); xBorder, w->height - yBorder2);
} }
@ -773,13 +774,13 @@ static void LInput_DrawInnerBorder(struct LInput* w) {
static void LInput_BlendBoxTop(struct LInput* w) { static void LInput_BlendBoxTop(struct LInput* w) {
BitmapCol color = BitmapColor_RGB(0, 0, 0); BitmapCol color = BitmapColor_RGB(0, 0, 0);
Gradient_Blend(&framebuffer, color, 75, Gradient_Blend(&LBackend_FB, color, 75,
w->x + xBorder, w->y + yBorder, w->x + xBorder, w->y + yBorder,
w->width - xBorder2, yBorder); w->width - xBorder2, yBorder);
Gradient_Blend(&framebuffer, color, 50, Gradient_Blend(&LBackend_FB, color, 50,
w->x + xBorder, w->y + yBorder2, w->x + xBorder, w->y + yBorder2,
w->width - xBorder2, yBorder); w->width - xBorder2, yBorder);
Gradient_Blend(&framebuffer, color, 25, Gradient_Blend(&LBackend_FB, color, 25,
w->x + xBorder, w->y + yBorder3, w->x + xBorder, w->y + yBorder3,
w->width - xBorder2, yBorder); w->width - xBorder2, yBorder);
} }
@ -789,7 +790,7 @@ static void LInput_DrawText(struct LInput* w, struct DrawTextArgs* args) {
if (w->text.length || !w->hintText) { if (w->text.length || !w->hintText) {
y = w->y + (w->height - w->_textHeight) / 2; y = w->y + (w->height - w->_textHeight) / 2;
Context2D_DrawText(&framebuffer, args, Context2D_DrawText(&LBackend_FB, args,
w->x + xInputOffset, y + yInputOffset); w->x + xInputOffset, y + yInputOffset);
} else { } else {
args->text = String_FromReadonly(w->hintText); args->text = String_FromReadonly(w->hintText);
@ -799,7 +800,7 @@ static void LInput_DrawText(struct LInput* w, struct DrawTextArgs* args) {
y = w->y + (w->height - hintHeight) / 2; y = w->y + (w->height - hintHeight) / 2;
Drawer2D.Colors['f'] = BitmapColor_RGB(125, 125, 125); Drawer2D.Colors['f'] = BitmapColor_RGB(125, 125, 125);
Context2D_DrawText(&framebuffer, args, Context2D_DrawText(&LBackend_FB, args,
w->x + xInputOffset, y); w->x + xInputOffset, y);
Drawer2D.Colors['f'] = BITMAPCOLOR_WHITE; Drawer2D.Colors['f'] = BITMAPCOLOR_WHITE;
} }
@ -815,7 +816,7 @@ void LBackend_InputDraw(struct LInput* w) {
LInput_DrawOuterBorder(w); LInput_DrawOuterBorder(w);
LInput_DrawInnerBorder(w); LInput_DrawInnerBorder(w);
Context2D_Clear(&framebuffer, BITMAPCOLOR_WHITE, Context2D_Clear(&LBackend_FB, BITMAPCOLOR_WHITE,
w->x + xBorder2, w->y + yBorder2, w->x + xBorder2, w->y + yBorder2,
w->width - xBorder4, w->height - yBorder4); w->width - xBorder4, w->height - yBorder4);
LInput_BlendBoxTop(w); LInput_BlendBoxTop(w);
@ -826,7 +827,7 @@ void LBackend_InputDraw(struct LInput* w) {
caretRect = LInput_MeasureCaret(w, &text); caretRect = LInput_MeasureCaret(w, &text);
if (!w->caretShow) return; if (!w->caretShow) return;
Context2D_Clear(&framebuffer, BITMAPCOLOR_BLACK, Context2D_Clear(&LBackend_FB, BITMAPCOLOR_BLACK,
caretRect.x, caretRect.y, caretRect.width, caretRect.height); caretRect.x, caretRect.y, caretRect.width, caretRect.height);
} }
@ -849,7 +850,7 @@ void LBackend_LabelUpdate(struct LLabel* w) {
void LBackend_LabelDraw(struct LLabel* w) { void LBackend_LabelDraw(struct LLabel* w) {
struct DrawTextArgs args; struct DrawTextArgs args;
DrawTextArgs_Make(&args, &w->text, LLabel_GetFont(w), true); DrawTextArgs_Make(&args, &w->text, LLabel_GetFont(w), true);
Context2D_DrawText(&framebuffer, &args, w->x, w->y); Context2D_DrawText(&LBackend_FB, &args, w->x, w->y);
} }
@ -863,7 +864,7 @@ void LBackend_LineInit(struct LLine* w, int width) {
void LBackend_LineDraw(struct LLine* w) { void LBackend_LineDraw(struct LLine* w) {
BitmapCol color = LLine_GetColor(); BitmapCol color = LLine_GetColor();
Gradient_Blend(&framebuffer, color, 128, w->x, w->y, w->width, w->height); Gradient_Blend(&LBackend_FB, color, 128, w->x, w->y, w->width, w->height);
} }
@ -884,17 +885,17 @@ static void LSlider_DrawBoxBounds(struct LSlider* w) {
BitmapCol boundsBottom = BitmapColor_RGB(150, 130, 165); BitmapCol boundsBottom = BitmapColor_RGB(150, 130, 165);
/* TODO: Check these are actually right */ /* TODO: Check these are actually right */
Context2D_Clear(&framebuffer, boundsTop, Context2D_Clear(&LBackend_FB, boundsTop,
w->x, w->y, w->x, w->y,
w->width, yBorder); w->width, yBorder);
Context2D_Clear(&framebuffer, boundsBottom, Context2D_Clear(&LBackend_FB, boundsBottom,
w->x, w->y + w->height - yBorder, w->x, w->y + w->height - yBorder,
w->width, yBorder); w->width, yBorder);
Gradient_Vertical(&framebuffer, boundsTop, boundsBottom, Gradient_Vertical(&LBackend_FB, boundsTop, boundsBottom,
w->x, w->y, w->x, w->y,
xBorder, w->height); xBorder, w->height);
Gradient_Vertical(&framebuffer, boundsTop, boundsBottom, Gradient_Vertical(&LBackend_FB, boundsTop, boundsBottom,
w->x + w->width - xBorder, w->y, w->x + w->width - xBorder, w->y,
xBorder, w->height); xBorder, w->height);
} }
@ -904,10 +905,10 @@ static void LSlider_DrawBox(struct LSlider* w) {
BitmapCol progBottom = BitmapColor_RGB(207, 181, 216); BitmapCol progBottom = BitmapColor_RGB(207, 181, 216);
int halfHeight = (w->height - yBorder2) / 2; int halfHeight = (w->height - yBorder2) / 2;
Gradient_Vertical(&framebuffer, progTop, progBottom, Gradient_Vertical(&LBackend_FB, progTop, progBottom,
w->x + xBorder, w->y + yBorder, w->x + xBorder, w->y + yBorder,
w->width - xBorder2, halfHeight); w->width - xBorder2, halfHeight);
Gradient_Vertical(&framebuffer, progBottom, progTop, Gradient_Vertical(&LBackend_FB, progBottom, progTop,
w->x + xBorder, w->y + yBorder + halfHeight, w->x + xBorder, w->y + yBorder + halfHeight,
w->width - xBorder2, halfHeight); w->width - xBorder2, halfHeight);
} }
@ -919,7 +920,7 @@ void LBackend_SliderDraw(struct LSlider* w) {
LSlider_DrawBox(w); LSlider_DrawBox(w);
curWidth = (int)((w->width - xBorder2) * w->value / LSLIDER_MAXVALUE); curWidth = (int)((w->width - xBorder2) * w->value / LSLIDER_MAXVALUE);
Context2D_Clear(&framebuffer, w->color, Context2D_Clear(&LBackend_FB, w->color,
w->x + xBorder, w->y + yBorder, w->x + xBorder, w->y + yBorder,
curWidth, w->height - yBorder2); curWidth, w->height - yBorder2);
} }
@ -971,10 +972,10 @@ static void LTable_DrawHeaderBackground(struct LTable* w) {
BitmapCol gridColor = BitmapColor_RGB(20, 20, 10); BitmapCol gridColor = BitmapColor_RGB(20, 20, 10);
if (!Launcher_Theme.ClassicBackground) { if (!Launcher_Theme.ClassicBackground) {
Context2D_Clear(&framebuffer, gridColor, Context2D_Clear(&LBackend_FB, gridColor,
w->x, w->y, w->width, w->hdrHeight); w->x, w->y, w->width, w->hdrHeight);
} else { } else {
Launcher_DrawBackground(&framebuffer, Launcher_DrawBackground(&LBackend_FB,
w->x, w->y, w->width, w->hdrHeight); w->x, w->y, w->width, w->hdrHeight);
} }
} }
@ -1002,10 +1003,10 @@ static void LTable_DrawRowsBackground(struct LTable* w) {
if (height < 0) break; if (height < 0) break;
if (color) { if (color) {
Context2D_Clear(&framebuffer, color, Context2D_Clear(&LBackend_FB, color,
w->x, y, w->width, height); w->x, y, w->width, height);
} else { } else {
Launcher_DrawBackground(&framebuffer, Launcher_DrawBackground(&LBackend_FB,
w->x, y, w->width, height); w->x, y, w->width, height);
} }
} }
@ -1017,14 +1018,14 @@ static void LTable_DrawGridlines(struct LTable* w) {
if (Launcher_Theme.ClassicBackground) return; if (Launcher_Theme.ClassicBackground) return;
x = w->x; x = w->x;
Context2D_Clear(&framebuffer, Launcher_Theme.BackgroundColor, Context2D_Clear(&LBackend_FB, Launcher_Theme.BackgroundColor,
x, w->y + w->hdrHeight, w->width, gridlineHeight); x, w->y + w->hdrHeight, w->width, gridlineHeight);
for (i = 0; i < w->numColumns; i++) { for (i = 0; i < w->numColumns; i++) {
x += w->columns[i].width; x += w->columns[i].width;
if (!w->columns[i].hasGridline) continue; if (!w->columns[i].hasGridline) continue;
Context2D_Clear(&framebuffer, Launcher_Theme.BackgroundColor, Context2D_Clear(&LBackend_FB, Launcher_Theme.BackgroundColor,
x, w->y, gridlineWidth, w->height); x, w->y, gridlineWidth, w->height);
x += gridlineWidth; x += gridlineWidth;
} }
@ -1047,7 +1048,7 @@ static void LTable_DrawHeaders(struct LTable* w) {
for (i = 0; i < w->numColumns; i++) { for (i = 0; i < w->numColumns; i++) {
args.text = String_FromReadonly(w->columns[i].name); args.text = String_FromReadonly(w->columns[i].name);
Drawer2D_DrawClippedText(&framebuffer, &args, Drawer2D_DrawClippedText(&LBackend_FB, &args,
x + cellXOffset, y + hdrYOffset, x + cellXOffset, y + hdrYOffset,
w->columns[i].width - cellXPadding); w->columns[i].width - cellXPadding);
@ -1081,10 +1082,10 @@ static void LTable_DrawRows(struct LTable* w) {
for (i = 0; i < w->numColumns; i++) { for (i = 0; i < w->numColumns; i++) {
args.text = str; cell.x = x; cell.y = y; args.text = str; cell.x = x; cell.y = y;
cell.width = w->columns[i].width; cell.width = w->columns[i].width;
w->columns[i].DrawRow(entry, &args, &cell, &framebuffer); w->columns[i].DrawRow(entry, &args, &cell, &LBackend_FB);
if (args.text.length) { if (args.text.length) {
Drawer2D_DrawClippedText(&framebuffer, &args, Drawer2D_DrawClippedText(&LBackend_FB, &args,
x + cellXOffset, y + rowYOffset, x + cellXOffset, y + rowYOffset,
cell.width - cellXPadding); cell.width - cellXPadding);
} }
@ -1106,9 +1107,9 @@ static void LTable_DrawScrollbar(struct LTable* w) {
x = w->x + w->width - scrollbarWidth; x = w->x + w->width - scrollbarWidth;
LTable_GetScrollbarCoords(w, &y, &height); LTable_GetScrollbarCoords(w, &y, &height);
Context2D_Clear(&framebuffer, backCol, Context2D_Clear(&LBackend_FB, backCol,
x, w->y, scrollbarWidth, w->height); x, w->y, scrollbarWidth, w->height);
Context2D_Clear(&framebuffer, scrollCol, Context2D_Clear(&LBackend_FB, scrollCol,
x, w->y + y, scrollbarWidth, height); x, w->y + y, scrollbarWidth, height);
} }

View File

@ -19,7 +19,8 @@ struct LSlider;
struct LTable; struct LTable;
struct Flag; struct Flag;
typedef void (*LBackend_DrawHook)(struct Context2D* ctx); typedef void (*LBackend_DrawHook)(void);
extern struct Context2D LBackend_FB;
extern LBackend_DrawHook LBackend_Hooks[4]; extern LBackend_DrawHook LBackend_Hooks[4];
void LBackend_Init(void); void LBackend_Init(void);

View File

@ -20,9 +20,9 @@ static void VirtualCursor_Draw(struct Context2D* ctx, int x, int y) {
x - CURSOR_SIZE, y - CURSOR_EXTENT, CURSOR_SIZE * 3, CURSOR_EXTENT * 2); x - CURSOR_SIZE, y - CURSOR_EXTENT, CURSOR_SIZE * 3, CURSOR_EXTENT * 2);
} }
static void VirtualCursor_Display2D(struct Context2D* ctx) { static void VirtualCursor_Display2D(void) {
LBackend_MarkAllDirty(); LBackend_MarkAllDirty();
VirtualCursor_Draw(ctx, Pointers[0].x, Pointers[0].y); VirtualCursor_Draw(&LBackend_FB, Pointers[0].x, Pointers[0].y);
} }
static void VirtualCursor_MakeTexture(void) { static void VirtualCursor_MakeTexture(void) {

35
src/VirtualDialog.h Normal file
View File

@ -0,0 +1,35 @@
#include "Core.h"
#include "Funcs.h"
#include "Drawer2D.h"
#include "Utils.h"
#include "LBackend.h"
#include "Window.h"
static void VirtualDialog_Show(const char* title, const char* message) {
struct Bitmap bmp;
Platform_LogConst(title);
Platform_LogConst(message);
if (!LBackend_FB.bmp.scan0) {
Window_AllocFramebuffer(&bmp, Window_Main.Width, Window_Main.Height);
} else {
bmp = LBackend_FB.bmp;
}
struct Context2D ctx;
Context2D_Wrap(&ctx, &bmp);
Context2D_Clear(&ctx, BitmapCol_Make(200, 200, 200, 255),
0, 0, bmp.width, bmp.height);
for (int i = 0; i < 1000; i++) {
Rect2D rect = { 0, 0, bmp.width, bmp.height };
Window_DrawFramebuffer(rect, &bmp);
Thread_Sleep(50);
}
if (!LBackend_FB.bmp.scan0) {
Window_FreeFramebuffer(&bmp);
} else {
LBackend_Redraw();
}
}

View File

@ -348,16 +348,16 @@ static void VirtualKeyboard_MarkDirty2D(void) {
LBackend_MarkAllDirty(); LBackend_MarkAllDirty();
} }
static void VirtualKeyboard_Display2D(struct Context2D* real_ctx) { static void VirtualKeyboard_Display2D(void) {
struct Bitmap copy = LBackend_FB.bmp;
struct Context2D ctx; struct Context2D ctx;
struct Bitmap copy = real_ctx->bmp;
int x, y; int x, y;
if (!DisplayInfo.ShowingSoftKeyboard) return; if (!DisplayInfo.ShowingSoftKeyboard) return;
LBackend_MarkAllDirty(); LBackend_MarkAllDirty();
VirtualKeyboard_CalcPosition(&x, &y, copy.width, copy.height); VirtualKeyboard_CalcPosition(&x, &y, copy.width, copy.height);
copy.scan0 = Bitmap_GetRow(&real_ctx->bmp, y); copy.scan0 = Bitmap_GetRow(&copy, y);
copy.scan0 += x; copy.scan0 += x;
Context2D_Wrap(&ctx, &copy); Context2D_Wrap(&ctx, &copy);

View File

@ -9,6 +9,7 @@
#include "../Errors.h" #include "../Errors.h"
#include "../ExtMath.h" #include "../ExtMath.h"
#include "../Camera.h" #include "../Camera.h"
#include <nds.h> #include <nds.h>
#include <fat.h> #include <fat.h>
@ -127,9 +128,6 @@ static void Console_Init(cc_bool onSub) {
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------General data-------------------------------------------------------* *------------------------------------------------------General data-------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
static int bg_id;
static u16* bg_ptr;
struct _DisplayData DisplayInfo; struct _DisplayData DisplayInfo;
struct cc_window WindowInfo; struct cc_window WindowInfo;
@ -162,6 +160,7 @@ static void SetupVideo(cc_bool is3D) {
} }
void Window_PreInit(void) { void Window_PreInit(void) {
Window_Main.Is3D = 210; // So SetupVideo still runs
SetupVideo(false); SetupVideo(false);
setBrightness(2, 0); setBrightness(2, 0);
} }
@ -182,14 +181,13 @@ void Window_Init(void) {
Window_Main.SoftKeyboard = SOFT_KEYBOARD_RESIZE; Window_Main.SoftKeyboard = SOFT_KEYBOARD_RESIZE;
Input_SetTouchMode(true); Input_SetTouchMode(true);
Window_ShowDialog("AC", "DE");
} }
void Window_Free(void) { } void Window_Free(void) { }
void Window_Create2D(int width, int height) { void Window_Create2D(int width, int height) {
SetupVideo(false); SetupVideo(false);
bg_id = bgInitSub(2, BgType_Bmp16, BgSize_B16_256x256, 2, 0);
bg_ptr = bgGetGfxPtr(bg_id);
} }
void Window_Create3D(int width, int height) { void Window_Create3D(int width, int height) {
@ -300,10 +298,16 @@ void Gamepads_Process(float delta) {
/*########################################################################################################################* /*########################################################################################################################*
*------------------------------------------------------Framebuffer--------------------------------------------------------* *------------------------------------------------------Framebuffer--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
static int bg_id;
static u16* bg_ptr;
void Window_AllocFramebuffer(struct Bitmap* bmp, int width, int height) { void Window_AllocFramebuffer(struct Bitmap* bmp, int width, int height) {
bmp->scan0 = (BitmapCol*)Mem_Alloc(width * height, BITMAPCOLOR_SIZE, "window pixels"); bmp->scan0 = (BitmapCol*)Mem_Alloc(width * height, BITMAPCOLOR_SIZE, "window pixels");
bmp->width = width; bmp->width = width;
bmp->height = height; bmp->height = height;
bg_id = bgInitSub(2, BgType_Bmp16, BgSize_B16_256x256, 2, 0);
bg_ptr = bgGetGfxPtr(bg_id);
} }
void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) { void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) {
@ -381,9 +385,9 @@ void OnscreenKeyboard_Close(void) {
*-------------------------------------------------------Misc/Other--------------------------------------------------------* *-------------------------------------------------------Misc/Other--------------------------------------------------------*
*#########################################################################################################################*/ *#########################################################################################################################*/
void Window_ShowDialog(const char* title, const char* msg) { void Window_ShowDialog(const char* title, const char* msg) {
/* TODO implement */
Platform_LogConst(title); Platform_LogConst(title);
Platform_LogConst(msg); Platform_LogConst(message);
// TODO
} }
cc_result Window_OpenFileDialog(const struct OpenFileDialogArgs* args) { cc_result Window_OpenFileDialog(const struct OpenFileDialogArgs* args) {