From cb30b591d20046a6a71c06e3c86b95911d682273 Mon Sep 17 00:00:00 2001 From: George Sokianos Date: Mon, 7 Feb 2022 19:39:14 +0000 Subject: [PATCH] Some changes to make it work WIP --- Makefile.os4 | 6 +-- data/core/dirwatch.lua | 29 +++++++------- src/api/dirmonitor.c | 38 ++++++++++++++---- src/api/system.c | 2 + src/platform/amigaos4.c | 10 +++++ src/platform/amigaos4.h | 1 + src/renderer.c | 85 +++++++++++++++++++++++++++++++---------- 7 files changed, 127 insertions(+), 44 deletions(-) diff --git a/Makefile.os4 b/Makefile.os4 index f317bcdb..f38c54a8 100644 --- a/Makefile.os4 +++ b/Makefile.os4 @@ -5,7 +5,7 @@ # LiteXL_OBJ := \ - src/dirmonitor.o src/main.o src/rencache.o src/renderer.o \ + src/api/dirmonitor.o src/main.o src/rencache.o src/renderer.o \ src/renwindow.o src/api/api.o src/api/regex.o \ src/api/renderer.o src/api/system.o src/platform/amigaos4.o @@ -43,10 +43,10 @@ LiteXL: $(LiteXL_OBJ) @echo "Compiling $<" @$(compiler) -c $< -o $*.o $(CFLAGS) $(INCPATH) $(DFLAGS) -src/dirmonitor.o: src/dirmonitor.c src/platform/amigaos4.h +src/dirmonitor.o: src/api/dirmonitor.c src/main.o: src/main.c src/api/api.h src/rencache.h \ - src/renderer.h src/platform/amigaos4.h src/dirmonitor.h + src/renderer.h src/platform/amigaos4.h src/rencache.o: src/rencache.c diff --git a/data/core/dirwatch.lua b/data/core/dirwatch.lua index ed86ff81..706308ae 100644 --- a/data/core/dirwatch.lua +++ b/data/core/dirwatch.lua @@ -35,21 +35,23 @@ function dirwatch:watch(directory, bool) if not self.watched[directory] and not self.scanned[directory] then if PLATFORM == "Windows" then if not self.windows_watch_top or directory:find(self.windows_watch_top, 1, true) ~= 1 then - -- Get the highest level of directory that is common to this directory, and the original. - local target = directory - while self.windows_watch_top and self.windows_watch_top:find(target, 1, true) ~= 1 do - target = common.dirname(target) - end - if target ~= self.windows_watch_top then - local value = self.monitor:watch(target) - if value and value < 0 then - return self:scan(directory) - end - self.windows_watch_top = target - self.windows_watch_count = self.windows_watch_count + 1 - end + -- Get the highest level of directory that is common to this directory, and the original. + local target = directory + while self.windows_watch_top and self.windows_watch_top:find(target, 1, true) ~= 1 do + target = common.dirname(target) + end + if target ~= self.windows_watch_top then + local value = self.monitor:watch(target) + if value and value < 0 then + return self:scan(directory) + end + self.windows_watch_top = target + self.windows_watch_count = self.windows_watch_count + 1 + end end self.watched[directory] = true + elseif PLATFORM == "AmigaOS 4" then + return self:scan(directory) else local value = self.monitor:watch(directory) -- If for whatever reason, we can't watch this directory, revert back to scanning. @@ -107,3 +109,4 @@ function dirwatch:check(change_callback, scan_time, wait_time) end return dirwatch + diff --git a/src/api/dirmonitor.c b/src/api/dirmonitor.c index 7bb8bf1f..44a1e954 100644 --- a/src/api/dirmonitor.c +++ b/src/api/dirmonitor.c @@ -5,6 +5,8 @@ #elif __linux__ #include #include +#elif __amigaos4__ + #include "platform/amigaos4.h" #else #include #endif @@ -32,10 +34,13 @@ struct dirmonitor { }; struct dirmonitor* init_dirmonitor() { + printf("DBG: init_dirmonitor\n"); struct dirmonitor* monitor = calloc(sizeof(struct dirmonitor), 1); #ifndef _WIN32 #if __linux__ monitor->fd = inotify_init1(IN_NONBLOCK); + #elif __amigaos4__ + monitor->fd = notificationInit(); // TODO: This needs real implementation #else monitor->fd = kqueue(); #endif @@ -62,8 +67,11 @@ static void close_monitor_handle(struct dirmonitor* monitor) { #endif void deinit_dirmonitor(struct dirmonitor* monitor) { + printf("DBG: deinit_dirmonitor\n"); #if _WIN32 close_monitor_handle(monitor); + #elif __amigaos4__ + monitor->fd = 0; // TODO: This needs real implementation #else close(monitor->fd); #endif @@ -71,6 +79,7 @@ void deinit_dirmonitor(struct dirmonitor* monitor) { } int check_dirmonitor(struct dirmonitor* monitor, int (*change_callback)(int, const char*, void*), void* data) { + printf("DBG: check_dirmonitor\n"); #if _WIN32 if (!monitor->running) { if (ReadDirectoryChangesW(monitor->handle, monitor->buffer, sizeof(monitor->buffer), TRUE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME, NULL, &monitor->overlapped, NULL) == 0) @@ -101,6 +110,8 @@ int check_dirmonitor(struct dirmonitor* monitor, int (*change_callback)(int, con for (char *ptr = buf; ptr < buf + len; ptr += sizeof(struct inotify_event) + ((struct inotify_event*)ptr)->len) change_callback(((const struct inotify_event *) ptr)->wd, NULL, data); } + #elif __amigaos4__ + return 0; // TODO: This needs real implementation #else struct kevent event; while (1) { @@ -116,6 +127,7 @@ int check_dirmonitor(struct dirmonitor* monitor, int (*change_callback)(int, con } int add_dirmonitor(struct dirmonitor* monitor, const char* path) { + printf("DBG: add_dirmonitor\n"); #if _WIN32 close_monitor_handle(monitor); monitor->handle = CreateFileA(path, FILE_LIST_DIRECTORY, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL); @@ -125,6 +137,8 @@ int add_dirmonitor(struct dirmonitor* monitor, const char* path) { return -1; #elif __linux__ return inotify_add_watch(monitor->fd, path, IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO); + #elif __amigaos4__ + return -1; // TODO: This needs real implementation #else int fd = open(path, O_RDONLY); struct kevent change; @@ -135,16 +149,20 @@ int add_dirmonitor(struct dirmonitor* monitor, const char* path) { } void remove_dirmonitor(struct dirmonitor* monitor, int fd) { + printf("DBG: remove_dirmonitor\n"); #if _WIN32 close_monitor_handle(monitor); #elif __linux__ inotify_rm_watch(monitor->fd, fd); + #elif __amigaos4__ + fd = 0; // TODO: This needs real implementation #else close(fd); #endif } static int f_check_dir_callback(int watch_id, const char* path, void* L) { + printf("DBG: f_check_dir_callback\n"); #if _WIN32 char buffer[PATH_MAX*4]; int count = WideCharToMultiByte(CP_UTF8, 0, (WCHAR*)path, watch_id, buffer, PATH_MAX*4 - 1, NULL, NULL); @@ -159,29 +177,34 @@ static int f_check_dir_callback(int watch_id, const char* path, void* L) { } static int f_dirmonitor_new(lua_State* L) { - struct dirmonitor** monitor = lua_newuserdata(L, sizeof(struct dirmonitor**)); - *monitor = init_dirmonitor(); - luaL_setmetatable(L, API_TYPE_DIRMONITOR); + printf("DBG: f_dirmonitor_new\n"); + // struct dirmonitor** monitor = lua_newuserdata(L, sizeof(struct dirmonitor**)); + // *monitor = init_dirmonitor(); + // luaL_setmetatable(L, API_TYPE_DIRMONITOR); return 1; } static int f_dirmonitor_gc(lua_State* L) { - deinit_dirmonitor(*((struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR))); + printf("DBG: f_dirmonitor_gc\n"); + // deinit_dirmonitor(*((struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR))); return 0; } static int f_dirmonitor_watch(lua_State *L) { - lua_pushnumber(L, add_dirmonitor(*(struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR), luaL_checkstring(L, 2))); + printf("DBG: f_dirmonitor_watch\n"); + // lua_pushnumber(L, add_dirmonitor(*(struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR), luaL_checkstring(L, 2))); return 1; } static int f_dirmonitor_unwatch(lua_State *L) { - remove_dirmonitor(*(struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR), luaL_checknumber(L, 2)); + printf("DBG: f_dirmonitor_unwatch\n"); + // remove_dirmonitor(*(struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR), luaL_checknumber(L, 2)); return 0; } static int f_dirmonitor_check(lua_State* L) { - lua_pushnumber(L, check_dirmonitor(*(struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR), f_check_dir_callback, L)); + printf("DBG: f_dirmonitor_check\n"); + // lua_pushnumber(L, check_dirmonitor(*(struct dirmonitor**)luaL_checkudata(L, 1, API_TYPE_DIRMONITOR), f_check_dir_callback, L)); return 1; } static const luaL_Reg dirmonitor_lib[] = { @@ -200,3 +223,4 @@ int luaopen_dirmonitor(lua_State* L) { lua_setfield(L, -2, "__index"); return 1; } + diff --git a/src/api/system.c b/src/api/system.c index 6bd46314..013e4148 100644 --- a/src/api/system.c +++ b/src/api/system.c @@ -11,6 +11,8 @@ #include #include #include +#elif __amigaos4__ + #include "platform/amigaos4.h" #elif __linux__ #include #endif diff --git a/src/platform/amigaos4.c b/src/platform/amigaos4.c index fd53bd2f..f759ea60 100644 --- a/src/platform/amigaos4.c +++ b/src/platform/amigaos4.c @@ -59,3 +59,13 @@ char *_fullpath(const char *path) strcpy(result, getFullPath(path)); return result; } + +int notificationInit(void) { + // struct NotifyRequest *notifyRequest; + + // if ((notifyrequest = AllocMem(sizeof(struct NotifyRequest), MEMF_CLEAR))) { + + // } + return 1; +} + diff --git a/src/platform/amigaos4.h b/src/platform/amigaos4.h index 8e2bc195..e7cc48e8 100644 --- a/src/platform/amigaos4.h +++ b/src/platform/amigaos4.h @@ -11,6 +11,7 @@ static CONST_STRPTR stack USED = "$STACK:102400"; static CONST_STRPTR version USED = VERSTAG; char *_fullpath(const char *); +int notificationInit(void); #endif diff --git a/src/renderer.c b/src/renderer.c index 43c94b28..96922ae3 100644 --- a/src/renderer.c +++ b/src/renderer.c @@ -246,6 +246,22 @@ float ren_font_group_get_width(RenFont **fonts, const char *text) { return width / surface_scale; } +uint32_t get_pixel(SDL_Surface *surface, uint32_t x, uint32_t y) +{ + uint32_t pixel = 0; + uint8_t *pointer = surface->pixels + y * surface->pitch; + pointer += x * surface->format->BytesPerPixel; + memcpy(&pixel, pointer, surface->format->BytesPerPixel); + return pixel; +} + +void set_pixel(SDL_Surface *surface, uint32_t x, uint32_t y, uint32_t color) +{ + uint8_t *pointer = surface->pixels + y * surface->pitch; + pointer += x * surface->format->BytesPerPixel; + memcpy(pointer, &color, surface->format->BytesPerPixel); +} + float ren_draw_text(RenFont **fonts, const char *text, float x, int y, RenColor color) { SDL_Surface *surface = renwin_get_surface(&window_renderer); const RenRect clip = window_renderer.clip; @@ -253,9 +269,9 @@ float ren_draw_text(RenFont **fonts, const char *text, float x, int y, RenColor const int surface_scale = renwin_surface_scale(&window_renderer); float pen_x = x * surface_scale; y *= surface_scale; - int bytes_per_pixel = surface->format->BytesPerPixel; + // int bytes_per_pixel = surface->format->BytesPerPixel; const char* end = text + strlen(text); - unsigned char* destination_pixels = surface->pixels; + // unsigned char* destination_pixels = surface->pixels; int clip_end_x = clip.x + clip.width, clip_end_y = clip.y + clip.height; while (text < end) { @@ -283,16 +299,36 @@ float ren_draw_text(RenFont **fonts, const char *text, float x, int y, RenColor start_x += offset; glyph_start += offset; } - unsigned int* destination_pixel = (unsigned int*)&destination_pixels[surface->pitch * target_y + start_x * bytes_per_pixel]; - unsigned char* source_pixel = &source_pixels[line * set->surface->pitch + glyph_start * (font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? 3 : 1)]; - for (int x = glyph_start; x < glyph_end; ++x) { - unsigned int destination_color = *destination_pixel; - SDL_Color dst = { (destination_color & surface->format->Rmask) >> surface->format->Rshift, (destination_color & surface->format->Gmask) >> surface->format->Gshift, (destination_color & surface->format->Bmask) >> surface->format->Bshift, (destination_color & surface->format->Amask) >> surface->format->Ashift }; - SDL_Color src = { *(font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? source_pixel++ : source_pixel), *(font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? source_pixel++ : source_pixel), *source_pixel++ }; + // unsigned int* destination_pixel = (unsigned int*)&destination_pixels[surface->pitch * target_y + start_x * bytes_per_pixel]; + // unsigned char* source_pixel = &source_pixels[line * set->surface->pitch + glyph_start * (font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? 3 : 1)]; + // for (int x = glyph_start; x < glyph_end; ++x) { + // unsigned int destination_color = *destination_pixel; + // SDL_Color dst = { (destination_color & surface->format->Rmask) >> surface->format->Rshift, (destination_color & surface->format->Gmask) >> surface->format->Gshift, (destination_color & surface->format->Bmask) >> surface->format->Bshift, (destination_color & surface->format->Amask) >> surface->format->Ashift }; + // SDL_Color src = { *(font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? source_pixel++ : source_pixel), *(font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? source_pixel++ : source_pixel), *source_pixel++ }; + int px = start_x; + uint8_t* source_pixel = &source_pixels[line * set->surface->pitch + glyph_start * (font->antialiasing == FONT_ANTIALIASING_SUBPIXEL ? 3 : 1)]; + for (int x = glyph_start; x < glyph_end; ++x, ++px) { + uint32_t destination_color = get_pixel(surface, px, target_y); + SDL_Color dst; + SDL_Color src; + SDL_GetRGBA(destination_color, surface->format, &dst.r, &dst.g, &dst.b, &dst.a); + + if (font->antialiasing == FONT_ANTIALIASING_SUBPIXEL) { + src.r = *(source_pixel++); + src.g = *(source_pixel++); + } + else { + src.r = *(source_pixel); + src.g = *(source_pixel); + } + + src.b = *(source_pixel++); + src.a = 0xFF; r = (color.r * src.r * color.a + dst.r * (65025 - src.r * color.a) + 32767) / 65025; g = (color.g * src.g * color.a + dst.g * (65025 - src.g * color.a) + 32767) / 65025; b = (color.b * src.b * color.a + dst.b * (65025 - src.b * color.a) + 32767) / 65025; - *destination_pixel++ = dst.a << surface->format->Ashift | r << surface->format->Rshift | g << surface->format->Gshift | b << surface->format->Bshift; + // *destination_pixel++ = dst.a << surface->format->Ashift | r << surface->format->Rshift | g << surface->format->Gshift | b << surface->format->Bshift; + set_pixel(surface, px, target_y, SDL_MapRGBA(surface->format, r, g, b, dst.a)); } } } @@ -332,15 +368,16 @@ void ren_draw_rect(RenRect rect, RenColor color) { y2 = y2 > clip.y + clip.height ? clip.y + clip.height : y2; SDL_Surface *surface = renwin_get_surface(&window_renderer); - uint32_t *d = surface->pixels; + // uint32_t *d = surface->pixels; + + // #ifdef __amigaos4__ + // d += x1 + y1 * surface->pitch/sizeof(uint32_t); + // int dr = surface->pitch/sizeof(uint32_t) - (x2 - x1); + // #else + // d += x1 + y1 * surface->w; + // int dr = surface->w - (x2 - x1); + // #endif - #ifdef __amigaos4__ - d += x1 + y1 * surface->pitch/sizeof(uint32_t); - int dr = surface->pitch/sizeof(uint32_t) - (x2 - x1); - #else - d += x1 + y1 * surface->w; - int dr = surface->w - (x2 - x1); - #endif if (color.a == 0xff) { uint32_t translated = SDL_MapRGB(surface->format, color.r, color.g, color.b); SDL_Rect rect = { x1, y1, x2 - x1, y2 - y1 }; @@ -348,13 +385,19 @@ void ren_draw_rect(RenRect rect, RenColor color) { } else { RenColor current_color; RenColor blended_color; + // printf("DBG: surface->w %d\tsurface->pitch %d\tsurface->pitch/4 %d\n", surface->w, surface->pitch, surface->pitch/4); + for (int j = y1; j < y2; j++) { - for (int i = x1; i < x2; i++, d++) { - SDL_GetRGB(*d, surface->format, ¤t_color.r, ¤t_color.g, ¤t_color.b); + // for (int i = x1; i < x2; i++, d++) { + for (int i = x1; i < x2; i++) { + // SDL_GetRGB(*d, surface->format, ¤t_color.r, ¤t_color.g, ¤t_color.b); + uint32_t p = get_pixel(surface, i, j); + SDL_GetRGB(p, surface->format, ¤t_color.r, ¤t_color.g, ¤t_color.b); blended_color = blend_pixel(current_color, color); - *d = SDL_MapRGB(surface->format, blended_color.r, blended_color.g, blended_color.b); + // *d = SDL_MapRGB(surface->format, blended_color.r, blended_color.g, blended_color.b); + set_pixel(surface, i, j, SDL_MapRGB(surface->format, blended_color.r, blended_color.g, blended_color.b)); } - d += dr; + // d += dr; } } }