Skip to content

Commit 7c71bb3

Browse files
committed
Add image registration to LVGL based GUI through SDL_Image.
1 parent ceecd60 commit 7c71bb3

File tree

3 files changed

+92
-4
lines changed

3 files changed

+92
-4
lines changed

plugins/gui/gui.c

+90-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <stdio.h>
55
#include <stdlib.h>
66
#include <SDL2/SDL.h>
7+
#include <SDL2/SDL_image.h>
78
#include <SDL2/SDL_ttf.h>
89

910
#include "lvgl/lvgl.h"
@@ -18,6 +19,23 @@ ctr_object* packageObject;
1819
ctr_object* CtrGUIAssetPackage;
1920
ctr_object* colorObject;
2021
ctr_object* fontObject;
22+
ctr_object* imageObject;
23+
24+
struct GUIIMG {
25+
ctr_object* ref;
26+
lv_image_dsc_t* image_descriptor;
27+
SDL_Surface* surface;
28+
char* path;
29+
char* name;
30+
int num;
31+
};
32+
33+
typedef struct GUIIMG GUIIMG;
34+
35+
GUIIMG guiIMGs[100];
36+
int MaxIMG = 100;
37+
int IMGCount = 0;
38+
2139
lv_event_dsc_t* CtrEventHandler = NULL;
2240

2341
struct CtrGUIGlyphCacheEntry {
@@ -195,6 +213,10 @@ GUIFNT* ctr_internal_get_font_from_object(ctr_object* object) {
195213
return (GUIFNT*) object->value.rvalue->ptr;
196214
}
197215

216+
GUIIMG* ctr_internal_get_image_from_object(ctr_object* object) {
217+
if (object->value.rvalue == NULL) return NULL;
218+
return (GUIIMG*) object->value.rvalue->ptr;
219+
}
198220

199221
bool ctr_internal_gui_describe_glyph(const lv_font_t * f, lv_font_glyph_dsc_t * glyph_dsc, uint32_t unicode, uint32_t unicode_letter_next) {
200222
CtrGUIGlyphCacheEntry* cache;
@@ -422,8 +444,6 @@ ctr_object* ctr_gui_datastart(ctr_object* myself, ctr_argument* none) {
422444
return myself;
423445
}
424446

425-
426-
427447
ctr_object* ctr_gui_include(ctr_object* myself, ctr_argument* argumentList) {
428448
ctr_object* pathStrObj = ctr_internal_cast2string(argumentList->object);
429449
char* pathString = ctr_heap_allocate_tracked(pathStrObj->value.svalue->vlen + 1);
@@ -479,6 +499,67 @@ ctr_object* ctr_gui_link_package(ctr_object* myself, ctr_argument* argumentList)
479499
return myself;
480500
}
481501

502+
void ctr_img_destructor(ctr_resource* rs) {
503+
}
504+
505+
ctr_object* ctr_img_new(ctr_object* myself, ctr_argument* argumentList) {
506+
ctr_object* instance = ctr_internal_create_object(CTR_OBJECT_TYPE_OTEX);
507+
instance->link = myself;
508+
GUIIMG* guiImage = &guiIMGs[IMGCount++];
509+
guiImage->ref = instance;
510+
ctr_resource* rs = ctr_heap_allocate( sizeof(ctr_resource) );
511+
guiImage->path = NULL;
512+
guiImage->surface = NULL;
513+
guiImage->name = ctr_heap_allocate(10);
514+
guiImage->num = IMGCount - 1;
515+
sprintf(guiImage->name, "img%d", IMGCount-1);
516+
rs->ptr = guiImage;
517+
rs->destructor = &ctr_img_destructor;
518+
instance->value.rvalue = rs;
519+
return instance;
520+
}
521+
522+
523+
ctr_object* ctr_img_img(ctr_object* myself, ctr_argument* argumentList) {
524+
GUIIMG* img = ctr_internal_get_image_from_object(myself);
525+
if (img == NULL) return myself;
526+
char* path = ctr_heap_allocate_cstring(ctr_internal_cast2string(argumentList->object));
527+
SDL_RWops* res = ctr_internal_gui_load_asset(path, 1);
528+
ctr_heap_free(path);
529+
if (res == NULL) {
530+
ctr_error("Unable to load image.", 0);
531+
return myself;
532+
}
533+
img->image_descriptor = ctr_heap_allocate(sizeof(lv_image_dsc_t));
534+
img->surface = (SDL_Surface*) IMG_Load_RW(res, 1);
535+
SDL_Surface *converted_surface = SDL_ConvertSurfaceFormat(img->surface, SDL_PIXELFORMAT_ARGB8888, 0);
536+
if (converted_surface == NULL) {
537+
ctr_error("Surface conversion failed.", 0);
538+
return myself;
539+
}
540+
img->surface = converted_surface;
541+
img->image_descriptor->data_size = img->surface->w * img->surface->h * 4;
542+
img->image_descriptor->data = img->surface->pixels;
543+
img->image_descriptor->header.magic = LV_IMAGE_HEADER_MAGIC;
544+
img->image_descriptor->header.cf = LV_COLOR_FORMAT_ARGB8888;
545+
img->image_descriptor->header.flags = NULL;
546+
img->image_descriptor->header.w = img->surface->w;
547+
img->image_descriptor->header.h = img->surface->h;
548+
img->image_descriptor->header.stride = img->surface->pitch;
549+
lv_xml_register_image(img->name, img->image_descriptor);
550+
return myself;
551+
}
552+
553+
ctr_object* ctr_img_new_set(ctr_object* myself, ctr_argument* argumentList) {
554+
return ctr_img_img(ctr_img_new(myself, argumentList), argumentList);
555+
}
556+
557+
ctr_object* ctr_img_name(ctr_object* myself, ctr_argument* argumentList) {
558+
GUIIMG* img = ctr_internal_get_image_from_object(myself);
559+
if (img == NULL) return myself;
560+
return ctr_build_string( img->name, strlen(img->name) );
561+
}
562+
482563
void begin() {
483564
ctr_internal_gui_init();
484565
colorObject = ctr_color_new(CtrStdObject, NULL);
@@ -501,6 +582,12 @@ void begin() {
501582
packageObject->link = CtrStdObject;
502583
ctr_internal_create_func(packageObject, ctr_build_string_from_cstring( CTR_DICT_NEW ), &ctr_package_new );
503584
ctr_internal_create_func(packageObject, ctr_build_string_from_cstring( CTR_DICT_NEW_SET ), &ctr_package_new_set );
585+
imageObject = ctr_img_new(CtrStdObject, NULL);
586+
imageObject->link = CtrStdObject;
587+
ctr_internal_create_func(imageObject, ctr_build_string_from_cstring( CTR_DICT_NEW ), &ctr_img_new );
588+
ctr_internal_create_func(imageObject, ctr_build_string_from_cstring( CTR_DICT_NEW_SET ), &ctr_img_new_set );
589+
ctr_internal_create_func(imageObject, ctr_build_string_from_cstring( CTR_DICT_SOURCE_SET ), &ctr_img_img );
590+
ctr_internal_create_func(imageObject, ctr_build_string_from_cstring( CTR_DICT_NAME ), &ctr_img_name );
504591
guiObject = NULL;
505592
guiObject = ctr_gui_new(CtrStdObject, NULL);
506593
guiObject->link = CtrStdObject;
@@ -517,6 +604,7 @@ void begin() {
517604
ctr_internal_object_add_property(CtrStdWorld, ctr_build_string_from_cstring( CTR_DICT_GUI_PLUGIN_ID ), guiObject, CTR_CATEGORY_PUBLIC_PROPERTY);
518605
ctr_internal_object_add_property(CtrStdWorld, ctr_build_string_from_cstring( CTR_DICT_FONT_OBJECT ), fontObject, CTR_CATEGORY_PUBLIC_PROPERTY);
519606
ctr_internal_object_add_property(CtrStdWorld, ctr_build_string_from_cstring( CTR_DICT_COLOR_OBJECT ), colorObject, CTR_CATEGORY_PUBLIC_PROPERTY);
607+
ctr_internal_object_add_property(CtrStdWorld, ctr_build_string_from_cstring( CTR_DICT_IMAGE_OBJECT ), imageObject, CTR_CATEGORY_PUBLIC_PROPERTY);
520608
ctr_internal_object_add_property(CtrStdWorld, ctr_build_string_from_cstring( "Gui" ), guiObject, CTR_CATEGORY_PUBLIC_PROPERTY);
521609
}
522610

plugins/gui/makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ CFLAGS += $(shell pkg-config --cflags freetype2)
1616

1717

1818
CXXFLAGS ?= -fPIC
19-
LDFLAGS = -lSDL2 -lSDL2_ttf -lm -shared
19+
LDFLAGS = -lSDL2 -lSDL2_ttf -lSDL2_image -lm -shared
2020
LDFLAGS += $(shell pkg-config --libs freetype2)
2121

2222
BIN = ../../../../mods/gui/libctrgui.so

plugins/gui/makefile.win64

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ WARNINGS ?= -Wall -Wshadow -Wundef -Wmissing-prototypes -Wno-discarded-qualifier
1111
-Wshift-negative-value -Wstack-usage=2048 -Wno-unused-value -std=gnu99
1212
CFLAGS ?= -D WIN -shared -O3 -g0 -I ./i18n/${ISO}/ -I ../../i18n/${ISO} -I ../media/i18n/${ISO} -I$(LVGL_DIR)/ $(WARNINGS) -fPIC
1313
CXXFLAGS ?= -fPIC
14-
LDFLAGS = -lfreetype -lSDL2 -lSDL2_ttf -lm -shared
14+
LDFLAGS = -lfreetype -lSDL2 -lSDL2_image -lSDL2_ttf -lm -shared
1515
BIN = ../../../../mods/gui/libctrgui.dll
1616
BUILD_DIR = ./build
1717
BUILD_OBJ_DIR = $(BUILD_DIR)/obj

0 commit comments

Comments
 (0)