diff --git a/include/renderd7/BitmapPrinter.hpp b/include/renderd7/BitmapPrinter.hpp index f4fe41f..247835d 100644 --- a/include/renderd7/BitmapPrinter.hpp +++ b/include/renderd7/BitmapPrinter.hpp @@ -12,6 +12,19 @@ namespace RenderD7 { + enum Encoder + { + BITMAP, ///< Encode Data to Bitmap + DIRECT, ///< Encode Direct to Framebuffer(No Decoder Required) + C3D ///< Encode Directly to C3D_Tex (Just an Idea) + }; + + enum Decoder + { + BITMAP2C3D, ///< Decode and Encode to C3D_Tex (Currently Fastest) (47,4ms) + BITMAP2PNG2C3D ///< Decode Bitmap end Convert to Png, then C3D (Very Slow) (201,4ms) + }; + class BitmapPrinter { public: @@ -19,7 +32,7 @@ namespace RenderD7 ~BitmapPrinter(); bool DecodeFile(std::string file); - bool DecodeMem(std::vector buffer); + void SetDecoder(Decoder deccc) { decc = deccc; } void DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a); void DrawRect(int x, int y, int w, int h, u8 line_w, u8 b, u8 g, u8 r, u8 a); void DrawRectFilled(int x, int y, int w, int h, u8 b, u8 g, u8 r, u8 a); @@ -49,6 +62,7 @@ namespace RenderD7 void DrawText(int x, int y, float t_size, u32 color, std::string text); private: //funcs + bool Decode(Decoder deccc); void DrawChar(u32 posX, u32 posY, u32 color, char character); //parameter int frame = 0; @@ -60,6 +74,7 @@ namespace RenderD7 /////////////////////////////////////////////////////////////////////////////////////////////////// //Benchmark Stuff; + int testfpsd; bool benchmark = false; bool setupbenchmark; float frametime = 0; @@ -81,6 +96,8 @@ namespace RenderD7 std::vector fpscountc; int renderedframes = 0; int testfps = 60; + Encoder encc = Encoder::BITMAP; + Decoder decc = Decoder::BITMAP2C3D; //////////////////////////////////////////////////////////////////////////////////////////////// }; } \ No newline at end of file diff --git a/include/renderd7/Color.hpp b/include/renderd7/Color.hpp index 13c9418..529086e 100644 --- a/include/renderd7/Color.hpp +++ b/include/renderd7/Color.hpp @@ -13,14 +13,6 @@ namespace RenderD7 { namespace Color { - enum ColorFmt - { - RGBA8, - RGB8, - RGB565, - BGRA8, - BGR8 - }; struct rgba { uint8_t r, g, b, a; @@ -34,6 +26,5 @@ namespace RenderD7 }; std::string RGB2Hex(int r, int g, int b); uint32_t Hex(const std::string color, uint8_t a = 255); - uint32_t Convert(uint32_t src, RenderD7::Color::ColorFmt srcFormat, RenderD7::Color::ColorFmt dstFormat); } } \ No newline at end of file diff --git a/source/BitmapPrinter.cpp b/source/BitmapPrinter.cpp index a6bd14f..be1b4a0 100644 --- a/source/BitmapPrinter.cpp +++ b/source/BitmapPrinter.cpp @@ -31,16 +31,6 @@ bool RenderD7::BitmapPrinter::DecodeFile(std::string file) return true; } -bool RenderD7::BitmapPrinter::DecodeMem(std::vector buffer) -{ - unsigned error = bitmap.read_mem(buffer); - if (error) - { - RenderD7::AddOvl(std::make_unique("BitmapPrinter", "Error Code: " + std::to_string(error))); - return false; - } - return true; -} void RenderD7::BitmapPrinter::DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a) { @@ -117,7 +107,7 @@ bool RenderD7::BitmapPrinter::DrawScreenDirectF(int framerate) if(frame == (60/framerate)){ RenderD7::OnScreen(targetr); if(renderframe.loadet) renderframe.Unload(); - renderframe.LoadFromBitmap(bitmap); + this->Decode(decc); frame = 0; updtt = true; } @@ -135,7 +125,7 @@ bool RenderD7::BitmapPrinter::DrawScreenDirect() { RenderD7::OnScreen(targetr); if(renderframe.loadet) renderframe.Unload(); - renderframe.LoadFromBitmap(bitmap); + this->Decode(decc); updtt = true; if(renderframe.loadet) renderframe.Draw(0, 0); } @@ -195,7 +185,8 @@ bool RenderD7::BitmapPrinter::UpdateScreenF(int framerate) { if(frame == (60/framerate)){ if(renderframe.loadet) renderframe.Unload(); - renderframe.LoadFromBitmap(bitmap); + //renderframe.LoadFromBitmap(bitmap); + this->Decode(decc); frame = 0; updtt = true; } @@ -209,7 +200,7 @@ bool RenderD7::BitmapPrinter::UpdateScreen() if (isscreen) { if(renderframe.loadet) renderframe.Unload(); - renderframe.LoadFromBitmap(bitmap); + this->Decode(decc); updtt = true; } return updtt; @@ -260,8 +251,9 @@ void RenderD7::BitmapPrinter::Benchmark() std::string avgcpu3 = std::to_string(((alldtt3/(float)hdttt3.size())*1000)); std::string avgfps = std::to_string((allfps/(int)fpscountc.size()-1)); - std::string resultt = "Frames Rendered: " + renderedf + "\nMax Cpu Time: " + avgdtt + "\nAvg Cpu Time: " + avgcpu + "\nAvg Fps: " + avgfps + "\nAvg RenderTime: " + avgcpu2 + "ms/f\nAvg ConvertTime: " + avgcpu3 + "ms\n"; + std::string resultt = "TestMode: " + std::to_string(testfpsd) + "fps" + "\nRendered Frames: " + renderedf + "\nMax Cpu Time: " + avgdtt + "\nAvg Cpu Time: " + avgcpu + "\nAvg Fps: " + avgfps + "\nAvg EncodeTime: " + avgcpu2 + "ms/f\nAvg DecodeTime: " + avgcpu3 + "ms\n"; this->ClearBlank(); + this->DrawRectFilled(0, 0, this->bitmap.bmp_info_header.width, this->bitmap.bmp_info_header.height, 0, 0, 0, 255); this->DrawText(0, 0, 0, RenderD7::Color::Hex("#ffffff"), resultt); std::string outname = csvpc + "/benchmark_" + RenderD7::GetTimeStr() + ".png"; this->SavePng(outname); @@ -285,10 +277,10 @@ void RenderD7::BitmapPrinter::Benchmark() this->DrawRect(5, 5, this->bitmap.bmp_info_header.width - 10, this->bitmap.bmp_info_header.height - 10, 5, 0, 0, 0, 0); //this->DrawText(20, 20, 0, RenderD7::Color::Hex("#ffffff"), "Fps: " + std::to_string(fps)); this->DrawText(0, 0, 0.5f, RenderD7::Color::Hex("#ff0000"), "Time: " + std::to_string(timer)); - this->DrawText(0, 20, 0.5f, RenderD7::Color::Hex("#ff0000"), "Fps: " + std::to_string(fps)); - this->DrawText(0, 40, 0.5f, RenderD7::Color::Hex("#ff0000"), "dt: " + std::to_string(dtt)); - this->DrawText(0, 60, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxRenderTime: " + std::to_string(mdtt2*1000) + "ms/f"); - this->DrawText(0, 80, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxConvertTime: " + std::to_string(mdtt3*1000) + "ms"); + this->DrawText(0, 10, 0.5f, RenderD7::Color::Hex("#ff0000"), "Fps: " + std::to_string(fps)); + this->DrawText(0, 20, 0.5f, RenderD7::Color::Hex("#ff0000"), "dt: " + std::to_string(dtt)); + this->DrawText(0, 30, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxEncodeTime: " + std::to_string(mdtt2*1000) + "ms/f"); + this->DrawText(0, 40, 0.5f, RenderD7::Color::Hex("#ff0000"), "MaxDecodeTime: " + std::to_string(mdtt3*1000) + "ms"); uint64_t currentTime2 = svcGetSystemTick(); dtt2 = ((float)(currentTime2 / (float)TICKS_PER_MSEC) - (float)(lastTime2 / (float)TICKS_PER_MSEC)) / 1000.f; hdttt2.push_back(dtt2); @@ -333,6 +325,7 @@ void RenderD7::BitmapPrinter::SetupBenchmark(int framerate) benchmark = true; setupbenchmark = true; this->testfps = framerate; + this->testfpsd = framerate; } #include @@ -383,4 +376,26 @@ void RenderD7::BitmapPrinter::DrawText(int x, int y, float t_size, u32 color, st break; } +} + +bool RenderD7::BitmapPrinter::Decode(Decoder deccc) +{ + bool res = false; + + switch (deccc) + { + case Decoder::BITMAP2PNG2C3D: + renderframe.LoadPFromBuffer(BitmapConverter::ConvertData(this->bitmap.DATA())); + res = true; + break; + case Decoder::BITMAP2C3D: + renderframe.LoadFromBitmap(this->bitmap); + res = true; + break; + + default: + res = false; + break; + } + return res; } \ No newline at end of file diff --git a/source/Color.cpp b/source/Color.cpp index 60e83d1..ac37908 100644 --- a/source/Color.cpp +++ b/source/Color.cpp @@ -19,74 +19,4 @@ std::string RenderD7::Color::RGB2Hex(int r, int g, int b) ss << "#"; ss << std::hex << (r << 16 | g << 8 | b ); return ss.str(); -} - -uint32_t RenderD7::Color::Convert(uint32_t src, RenderD7::Color::ColorFmt srcFormat, RenderD7::Color::ColorFmt dstFormat) -{ - uint32_t result = 0x00000000; - //uint8_t red, green, blue, alpha = 0x00; - /*switch(srcFormat) - { - case RGBA8: - { - red, green, blue, alpha = (UNPACK_RGBA(src)); - switch (dstFormat) - { - case RGBA8: - { - result = ((((red) & 0xFF) << 0) | (((green) & 0xFF) << 8) | (((blue) & 0xFF) << 16) | (((alpha) & 0xFF) << 24)); - break; - } - case RGB8: - { - result = ((((red) & 0xFF) << 0) | (((green) & 0xFF) << 8) | (((blue) & 0xFF) << 16)); - break; - } - case RGB565: - { - //NOTYET - break; - } - case BGRA8: - { - result = ((((blue) & 0xFF) << 16) | (((green) & 0xFF) << 8) | (((red) & 0xFF) << 0 | (((alpha) & 0xFF) << 24))); - break; - } - case BGR8: - { - result = ((((blue) & 0xFF) << 16) | (((green) & 0xFF) << 8) | (((red) & 0xFF) << 0)); - break; - } - - default: - break; - } - - break; - } - case RGB8: - { - result[2] = src[2]; - result[1] = src[1]; - result[0] = src[0]; - break; - } - case RGB565: - { - // thanks neobrain - uint16_t px = *(uint16_t *)src; - blue = px & 0x1F; - green = (px >> 5) & 0x3F; - red = (px >> 11) & 0x1F; - - result[0] = (blue << 3) | (blue >> 2); - result[1] = (green << 2) | (green >> 4); - result[2] = (red << 3) | (red >> 2); - - break; - } - - default: break; - }*/ - return result; } \ No newline at end of file diff --git a/source/Time.cpp b/source/Time.cpp index bd290b2..af78865 100644 --- a/source/Time.cpp +++ b/source/Time.cpp @@ -19,5 +19,5 @@ std::string RenderD7::GetTimeStr(void) { time_t unixTime = time(NULL); struct tm* timeStruct = gmtime((const time_t*)&unixTime); - return RenderD7::FormatString("%02i:%02i:%02i", timeStruct->tm_hour, timeStruct->tm_min, timeStruct->tm_sec); + return RenderD7::FormatString("%02i-%02i-%02i", timeStruct->tm_hour, timeStruct->tm_min, timeStruct->tm_sec); } diff --git a/source/Toast.cpp b/source/Toast.cpp index 15dbe25..ce733cf 100644 --- a/source/Toast.cpp +++ b/source/Toast.cpp @@ -10,7 +10,7 @@ RenderD7::Toast::Toast(std::string head, std::string msg) this->toast.DrawRectFilled(0, 0, 400, 25, 70, 70, 70, 255); this->toast.DrawText(4, 5, 0, RenderD7::Color::Hex("#ffffff"), this->head); this->toast.DrawText(4, 40, 0, RenderD7::Color::Hex("#ffffff"), this->msg); - this->toastrendered->LoadPFromBuffer(this->toast.GetBitmap().DATA()); + this->toastrendered->LoadPFromBuffer(BitmapConverter::ConvertData(toast.GetBitmap().DATA())); } void RenderD7::Toast::Draw(void) const @@ -20,7 +20,7 @@ void RenderD7::Toast::Draw(void) const RenderD7::DrawRect(0, msgposy, 400, 25, RenderD7::Color::Hex("#222222")); RenderD7::DrawText(2, msgposy+3, 0.7f, RenderD7::Color::Hex("#ffffff"), head); RenderD7::DrawText(2, msgposy+30, 0.6f, RenderD7::Color::Hex("#ffffff"), msg);*/ - toastrendered->Draw(0, 0); + toastrendered->Draw(0, msgposy); } void RenderD7::Toast::Logic()