4
4
#include <stdio.h>
5
5
#include <stdlib.h>
6
6
#include <SDL2/SDL.h>
7
+ #include <SDL2/SDL_image.h>
7
8
#include <SDL2/SDL_ttf.h>
8
9
9
10
#include "lvgl/lvgl.h"
@@ -18,6 +19,23 @@ ctr_object* packageObject;
18
19
ctr_object * CtrGUIAssetPackage ;
19
20
ctr_object * colorObject ;
20
21
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
+
21
39
lv_event_dsc_t * CtrEventHandler = NULL ;
22
40
23
41
struct CtrGUIGlyphCacheEntry {
@@ -195,6 +213,10 @@ GUIFNT* ctr_internal_get_font_from_object(ctr_object* object) {
195
213
return (GUIFNT * ) object -> value .rvalue -> ptr ;
196
214
}
197
215
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
+ }
198
220
199
221
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 ) {
200
222
CtrGUIGlyphCacheEntry * cache ;
@@ -422,8 +444,6 @@ ctr_object* ctr_gui_datastart(ctr_object* myself, ctr_argument* none) {
422
444
return myself ;
423
445
}
424
446
425
-
426
-
427
447
ctr_object * ctr_gui_include (ctr_object * myself , ctr_argument * argumentList ) {
428
448
ctr_object * pathStrObj = ctr_internal_cast2string (argumentList -> object );
429
449
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)
479
499
return myself ;
480
500
}
481
501
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
+
482
563
void begin () {
483
564
ctr_internal_gui_init ();
484
565
colorObject = ctr_color_new (CtrStdObject , NULL );
@@ -501,6 +582,12 @@ void begin() {
501
582
packageObject -> link = CtrStdObject ;
502
583
ctr_internal_create_func (packageObject , ctr_build_string_from_cstring ( CTR_DICT_NEW ), & ctr_package_new );
503
584
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 );
504
591
guiObject = NULL ;
505
592
guiObject = ctr_gui_new (CtrStdObject , NULL );
506
593
guiObject -> link = CtrStdObject ;
@@ -517,6 +604,7 @@ void begin() {
517
604
ctr_internal_object_add_property (CtrStdWorld , ctr_build_string_from_cstring ( CTR_DICT_GUI_PLUGIN_ID ), guiObject , CTR_CATEGORY_PUBLIC_PROPERTY );
518
605
ctr_internal_object_add_property (CtrStdWorld , ctr_build_string_from_cstring ( CTR_DICT_FONT_OBJECT ), fontObject , CTR_CATEGORY_PUBLIC_PROPERTY );
519
606
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 );
520
608
ctr_internal_object_add_property (CtrStdWorld , ctr_build_string_from_cstring ( "Gui" ), guiObject , CTR_CATEGORY_PUBLIC_PROPERTY );
521
609
}
522
610
0 commit comments