aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libui_sdl/libui/ui.h17
-rw-r--r--src/libui_sdl/libui/windows/draw.cpp54
-rw-r--r--src/libui_sdl/libui/windows/draw.hpp8
-rw-r--r--src/libui_sdl/main.cpp149
4 files changed, 183 insertions, 45 deletions
diff --git a/src/libui_sdl/libui/ui.h b/src/libui_sdl/libui/ui.h
index 27574a5..835b0c2 100644
--- a/src/libui_sdl/libui/ui.h
+++ b/src/libui_sdl/libui/ui.h
@@ -342,6 +342,8 @@ typedef struct uiDrawMatrix uiDrawMatrix;
typedef struct uiDrawBrushGradientStop uiDrawBrushGradientStop;
+typedef struct uiDrawBitmap uiDrawBitmap;
+
_UI_ENUM(uiDrawBrushType) {
uiDrawBrushTypeSolid,
uiDrawBrushTypeLinearGradient,
@@ -429,6 +431,15 @@ struct uiDrawStrokeParams {
double DashPhase;
};
+struct uiRect {
+ int X;
+ int Y;
+ int Width;
+ int Height;
+};
+
+typedef struct uiRect uiRect;
+
_UI_EXTERN uiDrawPath *uiDrawNewPath(uiDrawFillMode fillMode);
_UI_EXTERN void uiDrawFreePath(uiDrawPath *p);
@@ -475,6 +486,12 @@ _UI_EXTERN void uiDrawClip(uiDrawContext *c, uiDrawPath *path);
_UI_EXTERN void uiDrawSave(uiDrawContext *c);
_UI_EXTERN void uiDrawRestore(uiDrawContext *c);
+// bitmap API
+_UI_EXTERN uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height);
+_UI_EXTERN void uiDrawBitmapUpdate(uiDrawBitmap* bmp, const void* data);
+_UI_EXTERN void uiDrawBitmapDraw(uiDrawContext* c, uiDrawBitmap* bmp, uiRect* srcrect, uiRect* dstrect);
+_UI_EXTERN void uiDrawFreeBitmap(uiDrawBitmap* bmp);
+
// TODO manage the use of Text, Font, and TextFont, and of the uiDrawText prefix in general
///// TODO reconsider this
diff --git a/src/libui_sdl/libui/windows/draw.cpp b/src/libui_sdl/libui/windows/draw.cpp
index 5f4d29f..ad8ea96 100644
--- a/src/libui_sdl/libui/windows/draw.cpp
+++ b/src/libui_sdl/libui/windows/draw.cpp
@@ -38,7 +38,7 @@ ID2D1HwndRenderTarget *makeHWNDRenderTarget(HWND hwnd)
logLastError(L"error getting DC to find DPI");
ZeroMemory(&props, sizeof (D2D1_RENDER_TARGET_PROPERTIES));
- props.type = D2D1_RENDER_TARGET_TYPE_DEFAULT;
+ props.type = D2D1_RENDER_TARGET_TYPE_HARDWARE;//DEFAULT;
props.pixelFormat.format = DXGI_FORMAT_UNKNOWN;
props.pixelFormat.alphaMode = D2D1_ALPHA_MODE_UNKNOWN;
props.dpiX = GetDeviceCaps(dc, LOGPIXELSX);
@@ -509,3 +509,55 @@ void uiDrawRestore(uiDrawContext *c)
// no need to explicitly addref or release; just transfer the ref
c->currentClip = state.clip;
}
+
+
+// bitmap API
+
+uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height)
+{
+ uiDrawBitmap* bmp;
+ HRESULT hr;
+
+ bmp = uiNew(uiDrawBitmap);
+
+ D2D1_BITMAP_PROPERTIES bp2 = D2D1::BitmapProperties();
+ bp2.dpiX = 0;
+ bp2.dpiY = 0;
+ bp2.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_IGNORE);
+ //bp2.pixelFormat = D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE);
+ // TODO: fallback: convert to BGRA if needed (RGBA only works in hardware mode)
+
+ c->rt->BeginDraw();
+
+ hr = c->rt->CreateBitmap(D2D1::SizeU(width,height), NULL, 0, &bp2, &bmp->bmp);
+ if (hr != S_OK)
+ logHRESULT(L"error creating bitmap", hr);
+
+ c->rt->EndDraw();
+
+ bmp->Width = width;
+ bmp->Height = height;
+ bmp->Stride = width*4;
+
+ return bmp;
+}
+
+void uiDrawBitmapUpdate(uiDrawBitmap* bmp, const void* data)
+{
+ D2D1_RECT_U rekt = D2D1::RectU(0, 0, bmp->Width, bmp->Height);
+ bmp->bmp->CopyFromMemory(&rekt, data, bmp->Stride);
+}
+
+void uiDrawBitmapDraw(uiDrawContext* c, uiDrawBitmap* bmp, uiRect* srcrect, uiRect* dstrect)
+{
+ D2D_RECT_F _srcrect = D2D1::RectF(srcrect->X, srcrect->Y, srcrect->X+srcrect->Width-1, srcrect->Y+srcrect->Height-1);
+ D2D_RECT_F _dstrect = D2D1::RectF(dstrect->X, dstrect->Y, dstrect->X+dstrect->Width-1, dstrect->Y+dstrect->Height-1);
+
+ c->rt->DrawBitmap(bmp->bmp, &_dstrect, 1.0f, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, &_srcrect);
+}
+
+void uiDrawFreeBitmap(uiDrawBitmap* bmp)
+{
+ bmp->bmp->Release();
+ uiFree(bmp);
+}
diff --git a/src/libui_sdl/libui/windows/draw.hpp b/src/libui_sdl/libui/windows/draw.hpp
index b015791..992d050 100644
--- a/src/libui_sdl/libui/windows/draw.hpp
+++ b/src/libui_sdl/libui/windows/draw.hpp
@@ -9,6 +9,14 @@ struct uiDrawContext {
ID2D1PathGeometry *currentClip;
};
+struct uiDrawBitmap {
+ int Width;
+ int Height;
+ int Stride;
+
+ ID2D1Bitmap* bmp;
+};
+
// drawpath.cpp
extern ID2D1PathGeometry *pathGeometry(uiDrawPath *p);
diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp
index e67ba8a..b411186 100644
--- a/src/libui_sdl/main.cpp
+++ b/src/libui_sdl/main.cpp
@@ -27,11 +27,93 @@
#include "../version.h"
-SDL_Window* MainWindow;
-SDL_GLContext MainGL;
+uiWindow* MainWindow;
+uiArea* MainDrawArea;
-void RunMainWindow();
+SDL_Thread* EmuThread;
+int EmuRunning;
+u32 derpo[256*384];
+uiDrawBitmap* test = NULL;
+
+
+int EmuThreadFunc(void* burp)
+{
+ // init shit.
+
+ for (int i = 0; i < 256*384; i++)
+ {
+ if (i >= 256*192)
+ {
+ if (i&1) derpo[i] = 0xFF0000FF;
+ else derpo[i] = 0xFF00FF00;
+ }
+ else
+ {
+ if (i&1) derpo[i] = 0xFFFF0000;
+ else derpo[i] = 0xFFFFFF00;
+ }
+ }
+
+ while (EmuRunning != 0)
+ {
+ if (EmuRunning == 1)
+ {
+ // emulate
+ printf("dfdssdf\n");
+ }
+ else
+ {
+ // paused
+
+ uiAreaQueueRedrawAll(MainDrawArea);
+ SDL_Delay(50);
+ }
+ }
+
+ return 44203;
+}
+
+
+void OnAreaDraw(uiAreaHandler* handler, uiArea* area, uiAreaDrawParams* params)
+{
+ if (!test) test = uiDrawNewBitmap(params->Context, 256, 384);
+
+ uiRect dorp = {0, 0, 256, 384};
+
+ uiDrawBitmapUpdate(test, derpo);
+ uiDrawBitmapDraw(params->Context, test, &dorp, &dorp);
+ //printf("draw\n");
+}
+
+void OnAreaMouseEvent(uiAreaHandler* handler, uiArea* area, uiAreaMouseEvent* evt)
+{
+ //
+}
+
+void OnAreaMouseCrossed(uiAreaHandler* handler, uiArea* area, int left)
+{
+ //
+}
+
+void OnAreaDragBroken(uiAreaHandler* handler, uiArea* area)
+{
+ //
+}
+
+int OnAreaKeyEvent(uiAreaHandler* handler, uiArea* area, uiAreaKeyEvent* evt)
+{
+ printf("key event: %04X %02X\n", evt->ExtKey, evt->Key);
+ uiAreaQueueRedrawAll(MainDrawArea);
+ return 1;
+}
+
+
+int OnCloseWindow(uiWindow* window, void* blarg)
+{
+ uiQuit();
+ return 1;
+}
void OnOpenFile(uiMenuItem* item, uiWindow* window, void* blarg)
{
@@ -41,6 +123,7 @@ void OnOpenFile(uiMenuItem* item, uiWindow* window, void* blarg)
printf("file opened: %s\n", file);
}
+
int main(int argc, char** argv)
{
srand(time(NULL));
@@ -64,8 +147,6 @@ int main(int argc, char** argv)
return 1;
}
- //RunMainWindow();
-
uiMenu* menu;
uiMenuItem* menuitem;
@@ -77,10 +158,29 @@ int main(int argc, char** argv)
uiWindow* win;
win = uiNewWindow("melonDS " MELONDS_VERSION, 256, 384, 1);
+ uiWindowOnClosing(win, OnCloseWindow, NULL);
+
+ uiAreaHandler areahandler;
+
+ areahandler.Draw = OnAreaDraw;
+ areahandler.MouseEvent = OnAreaMouseEvent;
+ areahandler.MouseCrossed = OnAreaMouseCrossed;
+ areahandler.DragBroken = OnAreaDragBroken;
+ areahandler.KeyEvent = OnAreaKeyEvent;
+
+ MainDrawArea = uiNewArea(&areahandler);
+ uiWindowSetChild(win, uiControl(MainDrawArea));
+ //uiWindowSetChild(win, uiControl(uiNewButton("become a girl")));
+
+ EmuRunning = 2;
+ EmuThread = SDL_CreateThread(EmuThreadFunc, "melonDS magic", NULL);
uiControlShow(uiControl(win));
uiMain();
+ EmuRunning = 0;
+ SDL_WaitThread(EmuThread, NULL);
+
uiUninit();
SDL_Quit();
return 0;
@@ -122,42 +222,3 @@ int CALLBACK WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmdline, int cmdsho
}
#endif
-
-
-void RunMainWindow()
-{
- MainWindow = SDL_CreateWindow("melonDS " MELONDS_VERSION,
- SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
- 640, 480,
- SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
- //MainGL= SDL_GL_CreateContext(MainWindow);
-
- // event loop
- bool run = true;
- while (run)
- {
- SDL_Event evt;
- while (SDL_PollEvent(&evt))
- {
- switch (evt.type)
- {
- case SDL_WINDOWEVENT:
- if (evt.window.event == SDL_WINDOWEVENT_CLOSE)
- {
- run = false;
- break;
- }
- break;
- }
- }
-
- // do extra shit here
- /*glClearColor(1, 0, 1, 1);
- glClear(GL_COLOR_BUFFER_BIT);
- SDL_GL_SwapWindow(MainWindow);
- SDL_Delay(50);*/
- }
-
- //SDL_GL_DeleteContext(MainGL);
- SDL_DestroyWindow(MainWindow);
-}