From a55705ead446510672ab3879f840c34a637b46f7 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Sat, 19 Jul 2025 21:10:57 -0500 Subject: [PATCH] fix process and sdl2 --- src/runtime_methods/process.cpp | 2 +- src/runtime_methods/sdl2.cpp | 129 +++++++++++++++++++++++++++++++- 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/src/runtime_methods/process.cpp b/src/runtime_methods/process.cpp index 471dbec..7e2acc4 100644 --- a/src/runtime_methods/process.cpp +++ b/src/runtime_methods/process.cpp @@ -119,7 +119,7 @@ namespace Tesses::CrossLang { for(int64_t i = 0; i < arguments->Count(); i++) { - TObject argVal; + TObject argVal=arguments->Get(i); std::string argValStr; if(GetObject(argVal,argValStr)) this->process.args.push_back(argValStr); diff --git a/src/runtime_methods/sdl2.cpp b/src/runtime_methods/sdl2.cpp index 173afce..e6b525f 100644 --- a/src/runtime_methods/sdl2.cpp +++ b/src/runtime_methods/sdl2.cpp @@ -304,6 +304,7 @@ namespace Tesses::CrossLang } friend class SDL2_Renderer; friend class SDL2_FontCache; + friend class SDL2_Surface; }; class SDL2_Rectangle : public TNativeObject { @@ -399,6 +400,7 @@ namespace Tesses::CrossLang return "SDL2.Rectangle"; } friend class SDL2_Renderer; + friend class SDL2_Surface; }; class SDL2_Surface : public TNativeObject { TObject ToTexture(GCList& ls, std::vector args); @@ -437,6 +439,52 @@ namespace Tesses::CrossLang { return "SDL2.Surface"; } + if(key == "FillRect") + { + SDL2_Rectangle* rect; + SDL2_Color* color; + if(GetArgumentHeap(args,0,rect)) + { + SDL_FillRect(this->surface,&rect->rect, SDL_MapRGB(this->surface->format,color->color.r,color->color.g,color->color.b)); + } + + } + if(key == "SavePNG") + { + TVFSHeapObject* vfs; + Tesses::Framework::Filesystem::VFSPath path; + TStreamHeapObject* strm; + if(GetArgumentHeap(args,0,strm)) + { + auto strm2 = RwopsFromStream(strm->stream,false); + IMG_SavePNG_RW(this->surface,strm2,1); + } + else if(GetArgumentHeap(args,0,vfs) && GetArgumentAsPath(args,1,path)) + { + auto strm2 = vfs->vfs->OpenFile(path,"wb"); + if(strm2 == nullptr) return Undefined(); + auto strm3 = RwopsFromStream(strm2,true); + IMG_SavePNG_RW(this->surface,strm3,1); + } + } + if(key == "SaveJPG") + { + TVFSHeapObject* vfs; + Tesses::Framework::Filesystem::VFSPath path; + TStreamHeapObject* strm; + int64_t quality; + if(GetArgumentHeap(args,0,strm) && GetArgument(args,1,quality)) + { + auto strm2 = RwopsFromStream(strm->stream,false); + IMG_SaveJPG_RW(this->surface,strm2,1,(int)quality); + } else if(GetArgumentHeap(args,0,vfs) && GetArgumentAsPath(args,1,path) && GetArgument(args,1,quality)) + { + auto strm2 = vfs->vfs->OpenFile(path,"wb"); + if(strm2 == nullptr) return Undefined(); + auto strm3 = RwopsFromStream(strm2,true); + IMG_SaveJPG_RW(this->surface,strm3,1,(int)quality); + } + } return Undefined(); } friend class SDL2_Texture; @@ -549,6 +597,46 @@ namespace Tesses::CrossLang SDL_RenderCopy(this->renderer,tex->tex,src == nullptr ? (SDL_Rect*)nullptr : &src->rect,dest == nullptr ? (SDL_Rect*)nullptr : &dest->rect); } } + if(name == "DrawRect") + { + SDL2_Rectangle *rect=nullptr; + if(GetArgumentHeap(args,0,rect)) + { + SDL_RenderDrawRect(this->renderer,&rect->rect); + } + } + if(name == "FillRect") + { + SDL2_Rectangle *rect=nullptr; + if(GetArgumentHeap(args,0,rect)) + { + SDL_RenderFillRect(this->renderer,&rect->rect); + } + } + if(name == "DrawRect") + { + SDL2_Rectangle *rect=nullptr; + if(GetArgumentHeap(args,0,rect)) + { + SDL_RenderDrawRect(this->renderer,&rect->rect); + } + } + if(name == "DrawLine") + { + int64_t x1,y1,x2,y2; + if(GetArgument(args,0,x1) && GetArgument(args,1,y1) && GetArgument(args,2,x2) && GetArgument(args,3,y2)) + { + SDL_RenderDrawLine(this->renderer,(int)x1,(int)y1,(int)x2,(int)y2); + } + } + if(name == "DrawPoint") + { + int64_t x1,y1; + if(GetArgument(args,0,x1) && GetArgument(args,1,y1)) + { + SDL_RenderDrawPoint(this->renderer,(int)x1,(int)y1); + } + } if(name == "Present") { @@ -635,7 +723,34 @@ namespace Tesses::CrossLang { return (int64_t)this->cache->MaxHeight(); } - if(key == "ToStirng") + if(key == "Render") + { + SDL2_Renderer* renderer; + int64_t x; + int64_t y; + std::string text; + SDL2_Color* color; + int64_t begin = 0; + int64_t size = -1; + if(GetArgumentHeap(args,0,renderer) && GetArgument(args,1,x) && GetArgument(args,2,y) && GetArgument(args,3,text) && GetArgumentHeap(args,4,color)) + { + GetArgument(args,5, begin); + GetArgument(args,6,size); + this->cache->Render(renderer->renderer, (int)x,(int)y,text,color->color,(size_t)begin,size == -1 ? std::string::npos : (size_t)size); + } + } + if(key == "CalculateSize") + { + int w; + int h; + std::string text; + if(GetArgument(args,0,text)) + { + this->cache->CalculateSize(text,w,h); + return TList::Create(ls,{(int64_t)w,(int64_t)h}); + } + } + if(key == "ToString") { return "SDL2.FontCache"; } @@ -1092,6 +1207,17 @@ namespace Tesses::CrossLang } return nullptr; } + static TObject New_SDL2_Surface(GCList& ls, std::vector args) + { + int64_t w; + int64_t h; + if(GetArgument(args,0,w) && GetArgument(args,1,h)) + { + auto surf = SDL_CreateRGBSurfaceWithFormat(0, (int)w, (int)h, 24, SDL_PIXELFORMAT_RGB24); + return TNativeObject::Create(ls,surf); + } + return nullptr; + } static TObject SDL2_getEvents(GCList& ls, std::vector args) { return TDictionary::Create(ls,{ @@ -1135,6 +1261,7 @@ namespace Tesses::CrossLang TDItem("Window",TExternalMethod::Create(ls,"Create window for SDL2",{"title","x","y","w","h","flags"},New_SDL2_Window)), TDItem("Renderer",TExternalMethod::Create(ls,"Create renderer for SDL2",{"window","index","flags"},New_SDL2_Renderer)), TDItem("Rectangle",TExternalMethod::Create(ls,"Create rectangle for SDL2",{"$x","$y","$w","$h"},New_SDL2_Rectangle)), + TDItem("Surface", TExternalMethod::Create(ls,"Create sdl2 surface",{"w","h"},New_SDL2_Surface)), TDItem("Color",TExternalMethod::Create(ls,"Create color for SDL2",{"$r","$g","$b","$a"},New_SDL2_Color)) }); TDictionary* gui_new = TDictionary::Create(ls, {