diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-09-19 02:22:07 +0200 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-09-19 02:22:07 +0200 |
commit | 8d79355f2e72f5a4af66b0b97631e384926074ce (patch) | |
tree | e40bad7702e9063d57bb2f86af99faf17baa9f48 /src/libui_sdl/libui | |
parent | 5979ab2eb2a9a66ceb1d51c921691874f6372296 (diff) |
libui: add cairo bitmap code (preliminary). fix bug where putting a draw area directly in the window caused it to be tiny.
Diffstat (limited to 'src/libui_sdl/libui')
-rw-r--r-- | src/libui_sdl/libui/unix/draw.c | 73 | ||||
-rw-r--r-- | src/libui_sdl/libui/unix/draw.h | 2 | ||||
-rw-r--r-- | src/libui_sdl/libui/unix/window.c | 3 |
3 files changed, 43 insertions, 35 deletions
diff --git a/src/libui_sdl/libui/unix/draw.c b/src/libui_sdl/libui/unix/draw.c index 16ff986..acdd8ef 100644 --- a/src/libui_sdl/libui/unix/draw.c +++ b/src/libui_sdl/libui/unix/draw.c @@ -145,50 +145,57 @@ void uiDrawRestore(uiDrawContext *c) uiDrawBitmap* uiDrawNewBitmap(uiDrawContext* c, int width, int height) { - /*uiDrawBitmap* bmp; - HRESULT hr; - + uiDrawBitmap* bmp; + 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;*/ - return NULL; + + bmp->bmp = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); + if (cairo_surface_status(bmp->bmp) != CAIRO_STATUS_SUCCESS) + implbug("error creating bitmap: %s", + cairo_status_to_string(cairo_surface_status(bmp->bmp))); + + bmp->Width = width; + bmp->Height = height; + bmp->Stride = cairo_image_surface_get_stride(bmp->bmp); + + 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); + unsigned char* src = data; + unsigned char* dst = cairo_image_surface_get_data(bmp->bmp); + + if (bmp->Stride == bmp->Width*4) + { + // stride 'good', can just directly copy all the shit + memcpy(dst, src, bmp->Stride*bmp->Height); + } + else + { + int y; + for (y = 0; y < bmp->Height; y++) + { + memcpy(dst, src, bmp->Width*4); + src += bmp->Width*4; + dst += bmp->Stride; + } + } + + cairo_surface_mark_dirty(bmp->bmp); } void uiDrawBitmapDraw(uiDrawContext* c, uiDrawBitmap* bmp, uiRect* srcrect, uiRect* dstrect) { - /*D2D_RECT_F _srcrect = D2D1::RectF(srcrect->X, srcrect->Y, srcrect->X+srcrect->Width, srcrect->Y+srcrect->Height); - D2D_RECT_F _dstrect = D2D1::RectF(dstrect->X, dstrect->Y, dstrect->X+dstrect->Width, dstrect->Y+dstrect->Height); - - c->rt->DrawBitmap(bmp->bmp, &_dstrect, 1.0f, D2D1_BITMAP_INTERPOLATION_MODE_LINEAR, &_srcrect);*/ + // TODO: rect + + cairo_set_source_surface(c->cr, bmp->bmp, srcrect->X, srcrect->Y); + + cairo_paint(c->cr); } void uiDrawFreeBitmap(uiDrawBitmap* bmp) { - //bmp->bmp->Release(); - //uiFree(bmp); + cairo_surface_destroy(bmp->bmp); + uiFree(bmp); } diff --git a/src/libui_sdl/libui/unix/draw.h b/src/libui_sdl/libui/unix/draw.h index db4612c..869acd1 100644 --- a/src/libui_sdl/libui/unix/draw.h +++ b/src/libui_sdl/libui/unix/draw.h @@ -10,7 +10,7 @@ struct uiDrawBitmap { int Height; int Stride; - // add cairo shit here + cairo_surface_t* bmp; }; // drawpath.c diff --git a/src/libui_sdl/libui/unix/window.c b/src/libui_sdl/libui/unix/window.c index ea9ba37..46d38be 100644 --- a/src/libui_sdl/libui/unix/window.c +++ b/src/libui_sdl/libui/unix/window.c @@ -260,11 +260,12 @@ uiWindow *uiNewWindow(const char *title, int width, int height, int hasMenubar) gtk_widget_set_halign(w->childHolderWidget, GTK_ALIGN_FILL); gtk_widget_set_vexpand(w->childHolderWidget, TRUE); gtk_widget_set_valign(w->childHolderWidget, GTK_ALIGN_FILL); + gtk_box_set_homogeneous(GTK_BOX(w->childHolderWidget), TRUE); gtk_container_add(w->vboxContainer, w->childHolderWidget); // show everything in the vbox, but not the GtkWindow itself gtk_widget_show_all(w->vboxWidget); - +printf("wbox %p\n", w->childHolderWidget); // and connect our events g_signal_connect(w->widget, "delete-event", G_CALLBACK(onClosing), w); g_signal_connect(w->childHolderWidget, "size-allocate", G_CALLBACK(onSizeAllocate), w); |