RenderD7 0.9.4 (New Stuff, Lot Fixes, Envtools)
							
								
								
									
										2
									
								
								.vscode/c_cpp_properties.json
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -15,4 +15,4 @@
 | 
			
		||||
        }
 | 
			
		||||
    ],
 | 
			
		||||
    "version": 4
 | 
			
		||||
}
 | 
			
		||||
} 
 | 
			
		||||
@@ -1,4 +0,0 @@
 | 
			
		||||
export DEVKITARM=/opt/devkitpro/devkitARM/
 | 
			
		||||
export DEVKITPRO=/opt/devkitpro/
 | 
			
		||||
make -j12
 | 
			
		||||
make install
 | 
			
		||||
							
								
								
									
										68
									
								
								README.md
									
									
									
									
									
								
							
							
						
						@@ -1,42 +1,26 @@
 | 
			
		||||
# <img alt="LOGO" src="https://github.com/NPI-D7/RenderD7/blob/main/logo.png" height="90">
 | 
			
		||||
RenderD7 is now LibRenderD7.
 | 
			
		||||
### Installation
 | 
			
		||||
Download a Package From Releses Page
 | 
			
		||||
`https://github.com/NPI-D7/RenderD7/releases/download/v0.9.3/renderd7.tar.bz2 -o renderd7.tar.bz2`
 | 
			
		||||
Then Extract it to your Libraries Path
 | 
			
		||||
`bzip2 -cd renderd7.tar.bz2 | tar -xf - -C path_to_your_libs`
 | 
			
		||||
Finally put `-lrenderd7` to the First Place and add the path_to_your_libs
 | 
			
		||||
```
 | 
			
		||||
LIBS	:= -lrenderd7 -lcurl -lstdc++ -lm -lcitro2d -lcitro3d -lctru
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# list of directories containing libraries, this must be the top level containing
 | 
			
		||||
# include and lib
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
LIBDIRS	:= $(PORTLIBS) $(CTRULIB) ../path_to_your_libs
 | 
			
		||||
```
 | 
			
		||||
Make sure that `-lrenderd7` is before `-lcitro2d`, `-lcitro3d`, `-lctru`.
 | 
			
		||||
Here an example tree
 | 
			
		||||
```
 | 
			
		||||
Example-App
 | 
			
		||||
├── gfx
 | 
			
		||||
├── libs
 | 
			
		||||
│   ├── include
 | 
			
		||||
│   │   ├── rd7.hpp
 | 
			
		||||
│   │   └── renderd7
 | 
			
		||||
│   └── lib
 | 
			
		||||
│       ├── librenderd7.a
 | 
			
		||||
│       └── librenderd7d.a
 | 
			
		||||
├── Makefile
 | 
			
		||||
├── romfs
 | 
			
		||||
│   └── gfx
 | 
			
		||||
└── src
 | 
			
		||||
    └── main.cpp
 | 
			
		||||
```
 | 
			
		||||
# Credits
 | 
			
		||||
- NPI-D7
 | 
			
		||||
  - Tobi-D7 Main Dev
 | 
			
		||||
 | 
			
		||||
Some Icons are From
 | 
			
		||||
https://icons8.de/
 | 
			
		||||
See Subfolder Readmes
 | 
			
		||||
# RenderD7 Technologys // State: 0.9.4-pre1
 | 
			
		||||
|Name                                     |FullName                     |Version|Implemented                                  |Removed|Last Updated|Description                                                                           |
 | 
			
		||||
|-----------------------------------------|-----------------------------|------|---------------------------------------------|-------|------------|--------------------------------------------------------------------------------------|
 | 
			
		||||
|rd7sr                                    |RenderD7 Super Reselution    |r1    |0.7                                          |0.9.4  |0.7.3       |Feature to use 800px mode in RenderD7 Removed cause it caused to much problems        |
 | 
			
		||||
|rd7fc                                    |RenderD7 Frame Check         |r2    |0.7.2                                        |0.9.4  |0.7.3       |Feature that fixed the Crash on Second C3D_FrameEnd ... Replaced by rd7sm             |
 | 
			
		||||
|rd7fs                                    |RenderD7 Filesystem          |r1    |0.8.1                                        |---    |0.8.2       |C++ 17 <filesystem> based impl to scan Directorys instantly                           |
 | 
			
		||||
|rd7cr                                    |RenderD7 Core                |r32   |0.3                                          |---    |0.9.4       |RenderD7 Core Module wich Controls Everything                                         |
 | 
			
		||||
|rd7sm                                    |RenderD7 Security Manager    |r1    |0.9.4                                        |---    |0.9.4       |Security Controler to prevent RenderD7 from Crashing / for Debugging                  |
 | 
			
		||||
|rd7ds                                    |RenderD7 Directorysystem     |r12   |0.3                                          |0.9.4  |0.8         |The Old way of Directory Scanning using dirent.h (very slow and buggy)                |
 | 
			
		||||
|rd7bp                                    |RenderD7 Bitmap Printer      |r14   |0.8.0-pre2                                   |---    |0.9.1       |Cpu based System to Render Bitmap Images and Render them into a C3D Texture (slow)    |
 | 
			
		||||
|rd7nv                                    |RenderD7 NvidApi             |r3    |0.9.2                                        |---    |0.9.3       |Npi-Nvid-Api Based Video Renderer for RenderD7 (it like gifs for splashscreens)       |
 | 
			
		||||
|rd7hc                                    |RenderD7 Hex-Color           |r2    |0.3                                          |---    |0.9.1       |RenderD7 Hexadecimal Color Convertation (got very fast in 0.9.1)                      |
 | 
			
		||||
|rd7ls                                    |RenderD7 Languagesystem      |r1    |0.3                                          |---    |0.3         |Load Languages from romfs/<lang>/appJson.json                                         |
 | 
			
		||||
|rd7se                                    |RenderD7 Sound Efefcts       |r2    |0.3.0                                        |---    |0.6.0       |Simple way to play wav files as sfx                                                   |
 | 
			
		||||
|rd7sc                                    |RenderD7 Steal Console       |r2    |0.8.1                                        |---    |0.9         |This Simple Module Redirects the sdtout into a stringstream                           |
 | 
			
		||||
|rd7if                                    |RenderD7 Interface           |r17   |0.7                                          |---    |0.9.4       |Interface of RendreD7 Settings/Toasts                                                 |
 | 
			
		||||
|rd7mo                                    |RenderD7 Metrik Overlay      |r5    |0.7                                          |---    |0.9.4       |Simple Overlay that Displays System Metriks                                           |
 | 
			
		||||
|rd7or                                    |RenderD7 Over Render         |r2    |0.7.3                                        |---    |0.9.4       |Over Render is used for Overlays and Toasts                                           |
 | 
			
		||||
|rd7ta                                    |RenderD7 Toast Animation     |r1    |0.8.1                                        |---    |0.9.4       |Simple whay to push Toasts to Over Render                                             |
 | 
			
		||||
|rd7mc                                    |RenderD7 Metrik2Csv          |r1    |0.7.2                                        |0.7.3  |0.7.2       |System that Saves the Metriks to a Csv every second. removed cause slow sd write speed|
 | 
			
		||||
|rd7rd                                    |RenderD7 Result Decoder      |r1    |0.8.3                                        |---    |0.8.3       |Decode libctru Result Error Codes directly on the 3ds                                 |
 | 
			
		||||
|rd7ts                                    |RenderD7 Thread System       |r3    |0.6.01                                       |---    |0.6.1       |Create threads                                                                        |
 | 
			
		||||
|rd7st                                    |RenderD7 Secure Tasks        |r2    |0.8.4                                        |---    |0.9.3       |Create threads, which get 100%ly exitted by rd7sm                                     |
 | 
			
		||||
|rd7cm                                    |RenderD7 Scene Manager       |r2    |0.3                                          |---    |0.7         |Create Scenes that get stacked (can cause crashes without rd7sm)                      |
 | 
			
		||||
|rd72d                                    |RenderD7 2D Draw             |r22   |0.1                                          |---    |0.9.4       |Draw Texts / Sprites / Images / Animated Sprites                                      |
 | 
			
		||||
|rd7ft                                    |RenderD7 Function Trace      |r1    |0.9.4                                        |---    |0.9.4       |Trace the time of Functions / Trace the time between two points in code               |
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
find . -type f \( -name '*.h' -o -name '*.hpp' -o -name '*.hh' -o -name '*.ino' -o -name '*.cpp' -o -name '*.c' -o -name '*.cxx' -o -name '*.inl' \) -and -not -path './build/*' -not -path './base/external/*' -not -path './DPP/*' | while read file; do
 | 
			
		||||
  if [[ "$file" != *"json.hpp" ]]; then
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								envsetup.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#Build Tools
 | 
			
		||||
echo "Build Tools..."
 | 
			
		||||
cd tools
 | 
			
		||||
./build_tools.sh
 | 
			
		||||
cd ..
 | 
			
		||||
#Setup asset-arrays
 | 
			
		||||
echo "Generate Asset-Arrays..."
 | 
			
		||||
cd assets
 | 
			
		||||
./build_assets.sh
 | 
			
		||||
echo "Update Files in RenderD7..."
 | 
			
		||||
cp -rf code/*.cpp ../source/
 | 
			
		||||
cp -rf code/*.hpp ../include/renderd7/
 | 
			
		||||
echo "Clean Assets..."
 | 
			
		||||
./clear_assets.sh
 | 
			
		||||
cd ..
 | 
			
		||||
#Clear Tools
 | 
			
		||||
echo "Clean Tools..."
 | 
			
		||||
cd tools
 | 
			
		||||
./clear_tools.sh
 | 
			
		||||
cd ..
 | 
			
		||||
#Finished
 | 
			
		||||
echo "Done!"
 | 
			
		||||
							
								
								
									
										52
									
								
								include/renderd7/FunctionTrace.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,52 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
// Base includes
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
// 3ds does not support std::chrono
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
 | 
			
		||||
/// @brief 3ds System Ticks per milli second
 | 
			
		||||
#define TICKS_PER_MSEC 268111.856
 | 
			
		||||
 | 
			
		||||
#define f2s(x_) #x_
 | 
			
		||||
#define scomb(x1, x2) std::string(x1 + x2)
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Ftrace {
 | 
			
		||||
/// @brief Result of FTrace
 | 
			
		||||
struct FTRes {
 | 
			
		||||
  std::string group;     ///< Group of the Trace
 | 
			
		||||
  std::string func_name; ///< Function Name
 | 
			
		||||
 | 
			
		||||
  uint64_t time_start; ///< when started
 | 
			
		||||
  uint64_t time_end;   ///< when stopped
 | 
			
		||||
  float time_of;       ///< stop - start (how long)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief Map of Traces
 | 
			
		||||
extern std::map<std::string, RenderD7::Ftrace::FTRes> rd7_traces;
 | 
			
		||||
 | 
			
		||||
/// @brief Set a Start TracePoint
 | 
			
		||||
/// @param group Set a Group Name
 | 
			
		||||
/// @param func_name Set a Function Name
 | 
			
		||||
inline void Beg(std::string group, std::string func_name) {
 | 
			
		||||
  std::string trace_id = scomb(group, func_name);
 | 
			
		||||
  rd7_traces[trace_id].group = group;
 | 
			
		||||
  rd7_traces[trace_id].func_name = func_name;
 | 
			
		||||
  rd7_traces[trace_id].time_start = svcGetSystemTick();
 | 
			
		||||
}
 | 
			
		||||
/// @brief Set an End TracePoint
 | 
			
		||||
/// @param group Set a Group Name
 | 
			
		||||
/// @param func_name Set a Function Name
 | 
			
		||||
inline void End(std::string group, std::string func_name) {
 | 
			
		||||
  std::string trace_id = scomb(group, func_name);
 | 
			
		||||
  rd7_traces[trace_id].time_end = svcGetSystemTick();
 | 
			
		||||
  rd7_traces[trace_id].time_of = static_cast<float>(
 | 
			
		||||
      rd7_traces[trace_id].time_end / (float)TICKS_PER_MSEC -
 | 
			
		||||
      rd7_traces[trace_id].time_start / (float)TICKS_PER_MSEC);
 | 
			
		||||
}
 | 
			
		||||
} // namespace Ftrace
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										23
									
								
								include/renderd7/Hardware.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Hardware {
 | 
			
		||||
/// @brief Initialisize required Services
 | 
			
		||||
void Initialisize();
 | 
			
		||||
/// @brief Check if Headphones are Plugged in
 | 
			
		||||
/// @return true if headphones plugged in
 | 
			
		||||
bool IsHeadphones();
 | 
			
		||||
/// @brief Check if the 3ds Is Charging
 | 
			
		||||
/// @return true if System gets Charged
 | 
			
		||||
bool IsCharging();
 | 
			
		||||
/// @brief Check the Battery Percentage
 | 
			
		||||
/// @return Persentage as float
 | 
			
		||||
float GetBatteryPercentage();
 | 
			
		||||
/// @brief Get current State of 3d Slider
 | 
			
		||||
/// @return current 3dslider poition
 | 
			
		||||
float Get3dSliderLevel();
 | 
			
		||||
/// @brief Get Current state of Sound Slider
 | 
			
		||||
/// @return current SoundSlider state
 | 
			
		||||
float GetSoundSliderLevel();
 | 
			
		||||
} // namespace Hardware
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										25
									
								
								include/renderd7/Memory.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Memory {
 | 
			
		||||
/// @brief Metriks struct For the Internal Tracker
 | 
			
		||||
struct memory_metrics {
 | 
			
		||||
  uint32_t t_TotalAllocated = 0; ///< Total Allocated Memory
 | 
			
		||||
  uint32_t t_TotalFreed = 0;     ///< Total Deleted Memory
 | 
			
		||||
  /// @brief Gets the Currently Allocated Memory
 | 
			
		||||
  uint32_t t_CurrentlyAllocated() { return t_TotalAllocated - t_TotalFreed; }
 | 
			
		||||
};
 | 
			
		||||
/// @brief Get Total Allocated Memory
 | 
			
		||||
/// @return Total Allocated Memory
 | 
			
		||||
size_t GetTotalAllocated();
 | 
			
		||||
/// @brief Get Total Deleted Memory
 | 
			
		||||
/// @return Total Deleted Memory
 | 
			
		||||
size_t GetTotalFreed();
 | 
			
		||||
/// @brief Get Current Allocated Memory
 | 
			
		||||
/// @return Current Allocated Memory
 | 
			
		||||
size_t GetCurrent();
 | 
			
		||||
} // namespace Memory
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										64
									
								
								include/renderd7/Ovarlays.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,64 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Ovl.hpp>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
class Ovl_Ftrace : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  Ovl_Ftrace();
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
};
 | 
			
		||||
class Ovl_UiBattery : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param percentage Percentage
 | 
			
		||||
  Ovl_UiBattery(float *percentage);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  float *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
class Ovl_UiSound : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param percentage Percentage
 | 
			
		||||
  Ovl_UiSound(float *percentage);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  float *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
class Ovl_Ui3d : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param percentage Percentage
 | 
			
		||||
  Ovl_Ui3d(float *percentage);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  float *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
class Ovl_UiWifi : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param level strengh level
 | 
			
		||||
  Ovl_UiWifi(uint8_t *level);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  uint8_t *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
@@ -21,7 +21,10 @@ private:
 | 
			
		||||
  /// @param iskilled For IsKilled();
 | 
			
		||||
  bool iskilled = false;
 | 
			
		||||
};
 | 
			
		||||
/// @brief Add an Overlay to the stack
 | 
			
		||||
/// @param scene Overlay to push to Stack
 | 
			
		||||
/// @brief Add an Overlay to the Screen
 | 
			
		||||
/// @param scene Overlay to push to Screen
 | 
			
		||||
void AddOvl(std::unique_ptr<RenderD7::Ovl> scene);
 | 
			
		||||
/// @brief Add an Overlay to the Toast Stack
 | 
			
		||||
/// @param scene Overlay to push to Toast Stack
 | 
			
		||||
void AddToast(std::unique_ptr<RenderD7::Ovl> scene);
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										60
									
								
								include/renderd7/Security.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,60 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Init {
 | 
			
		||||
void Security();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Security {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Security Levels
 | 
			
		||||
  enum Level {
 | 
			
		||||
    NONE,     ///< Do Completly Nothing (excludes FrameEnd Security)
 | 
			
		||||
    FULL,     ///< Display Every Reports even Success
 | 
			
		||||
    ERRORS,   ///< Display Only Errors
 | 
			
		||||
    WARNINGS, ///< Display Errors and Warnings
 | 
			
		||||
    LOG,      ///< Log Every Error with Detailed Information
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  Security();
 | 
			
		||||
  ~Security();
 | 
			
		||||
  /// @brief Report an Output (For SafeTraceInit)
 | 
			
		||||
  /// @param addr Adress of Pointer
 | 
			
		||||
  /// @param result_ptr Pointer to the result
 | 
			
		||||
  void Report(uint32_t addr, void *result_ptr);
 | 
			
		||||
  /// @brief Set the Security Level
 | 
			
		||||
  /// @param level Level to use
 | 
			
		||||
  void SetLevel(Level level);
 | 
			
		||||
  /// @brief Get Current Security Level
 | 
			
		||||
  /// @return Security Level
 | 
			
		||||
  Level GetLevel();
 | 
			
		||||
  /// @brief Call a Function at Program Crash/Exit
 | 
			
		||||
  /// @param exit_func Function to Call
 | 
			
		||||
  void SafeExit(void (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(void (*init_func)(), void (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(Result (*init_func)(), void (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(void (*init_func)(), Result (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(Result (*init_func)(), Result (*exit_func)());
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
 | 
			
		||||
/// @brief RenderD7 Security Object
 | 
			
		||||
extern RenderD7::Security *rd7_security;
 | 
			
		||||
@@ -1,10 +1,8 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
/// c++ Includes
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
#include <codecvt>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
@@ -13,22 +11,30 @@
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <random>
 | 
			
		||||
#include <stack>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
/// c includes
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <codecvt>
 | 
			
		||||
 | 
			
		||||
/// 3ds Includes
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
/// RenderD7 Includes
 | 
			
		||||
#include <renderd7/BitmapPrinter.hpp>
 | 
			
		||||
#include <renderd7/Color.hpp>
 | 
			
		||||
#include <renderd7/Draw.hpp>
 | 
			
		||||
#include <renderd7/FunctionTrace.hpp>
 | 
			
		||||
#include <renderd7/Hardware.hpp>
 | 
			
		||||
#include <renderd7/Image.hpp>
 | 
			
		||||
#include <renderd7/Memory.hpp>
 | 
			
		||||
#include <renderd7/Ovl.hpp>
 | 
			
		||||
#include <renderd7/ResultDecoder.hpp>
 | 
			
		||||
#include <renderd7/Screen.hpp>
 | 
			
		||||
#include <renderd7/Security.hpp>
 | 
			
		||||
#include <renderd7/Sheet.hpp>
 | 
			
		||||
#include <renderd7/Sprite.hpp>
 | 
			
		||||
#include <renderd7/SpriteAnimation.hpp>
 | 
			
		||||
@@ -44,9 +50,14 @@
 | 
			
		||||
#include <renderd7/stringtool.hpp>
 | 
			
		||||
#include <renderd7/thread.hpp>
 | 
			
		||||
 | 
			
		||||
#define RENDERD7VSTRING "0.9.3"
 | 
			
		||||
#define RENDERD7VSTRING "0.9.4"
 | 
			
		||||
#define CHANGELOG                                                              \
 | 
			
		||||
  "0.9.3: Completly Documanted Everything\nFix typo in "                       \
 | 
			
		||||
  "0.9.4: Implement new Security System\n To prevent from crashes\nImplement " \
 | 
			
		||||
  "Functiontrace for better\nTiming Tests\nImplement MemAlloc Tracker (only "  \
 | 
			
		||||
  "size)\nAdd some new Overlays (not functional yet)\nComplete Rewrite of "    \
 | 
			
		||||
  "Overlay System\nFixed the FrameEnd Crash\nNew System to get Hardware "      \
 | 
			
		||||
  "Info\nRemoved RD7SR\n0.9.3: Completly Documanted Everything\nFix typo "     \
 | 
			
		||||
  "in "                                                                        \
 | 
			
		||||
  "Sprite::getHeight()\nRemove Deprecated/Useless Stuff\n0.9.2: Add "          \
 | 
			
		||||
  "NpiSplashVideo\nNvid Support(v0.0.1)\nAdd "                                 \
 | 
			
		||||
  "Basic RenderD7 "                                                            \
 | 
			
		||||
@@ -74,8 +85,11 @@
 | 
			
		||||
  "Filesystem and Bugs!\n0.3.0: Recreate D7-Core into RenderD7!\n0.2.0: "      \
 | 
			
		||||
  "Trying to create Animations of\nImages instead of Sheets!\n0.1.0: Initial " \
 | 
			
		||||
  "Release of\nD7-Core sprite animation plugin!"
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_CENTER 0.5f
 | 
			
		||||
 | 
			
		||||
#define RD7_DEPRECATED // __attribute__ ((deprecated))
 | 
			
		||||
 | 
			
		||||
/// @param d7_hDown Current Key Down
 | 
			
		||||
extern u32 d7_hDown;
 | 
			
		||||
/// @param d7_hHeld Current Key Held
 | 
			
		||||
@@ -90,6 +104,8 @@ extern std::string dspststus;
 | 
			
		||||
 | 
			
		||||
/// @param rd7_do_splash Config Value To Enable RenderD7 Splash
 | 
			
		||||
extern bool rd7_do_splash;
 | 
			
		||||
/// @param rd7_enable_memtrack Config Value to Track Mem Allocations
 | 
			
		||||
extern bool rd7_enable_memtrack;
 | 
			
		||||
 | 
			
		||||
/// RenderD7
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
@@ -112,8 +128,6 @@ struct TObject {
 | 
			
		||||
  int w;                 ///< Button Width
 | 
			
		||||
  int h;                 ///< Button Height
 | 
			
		||||
  std::string text = ""; ///< Text
 | 
			
		||||
  float correctx = 0;    ///< Correct X Position
 | 
			
		||||
  float correcty = 0;    ///< Correct Y Position
 | 
			
		||||
  float txtsize = 0.7f;  ///< Set Text Size
 | 
			
		||||
};
 | 
			
		||||
/// @brief Scene Class
 | 
			
		||||
@@ -157,7 +171,16 @@ private:
 | 
			
		||||
  void calculate_screens(const std::vector<std::string> &lines,
 | 
			
		||||
                         int &screen_index, int &screens);
 | 
			
		||||
  /// @brief State (Define for Menus)
 | 
			
		||||
  enum RState { RSETTINGS, RINFO, RSERVICES, RCLOG };
 | 
			
		||||
  enum RState {
 | 
			
		||||
    RSETTINGS,
 | 
			
		||||
    RINFO,
 | 
			
		||||
    RSERVICES,
 | 
			
		||||
    RCLOG,
 | 
			
		||||
    RMCONFIG,
 | 
			
		||||
    RFTRACE,
 | 
			
		||||
    RSECM,
 | 
			
		||||
    RCREDITS
 | 
			
		||||
  };
 | 
			
		||||
  /// @param m_state Current menu State (Default=MainMenu aka RSETTINGS)
 | 
			
		||||
  RenderD7::RSettings::RState m_state = RenderD7::RSettings::RState::RSETTINGS;
 | 
			
		||||
 | 
			
		||||
@@ -167,26 +190,20 @@ private:
 | 
			
		||||
  int screen_index = 0;
 | 
			
		||||
  /// @param lines Vector of Changelog-Lines
 | 
			
		||||
  std::vector<std::string> lines;
 | 
			
		||||
  /// @brief Position in FTrace Menu
 | 
			
		||||
  int ftrace_index = 0;
 | 
			
		||||
 | 
			
		||||
  /// @param rd7srstate State of RenderD7 Super Reselution
 | 
			
		||||
  std::string rd7srstate = "false";
 | 
			
		||||
  /// @param mtovlstate State of Metricks Overlay
 | 
			
		||||
  std::string mtovlstate = "false";
 | 
			
		||||
  /// @param fpsstate Value of Forced Framerate
 | 
			
		||||
  std::string fpsstate = "60";
 | 
			
		||||
  /// @param mtscreenstate Screen the Overlay is Set to
 | 
			
		||||
  std::string mtscreenstate = "Top";
 | 
			
		||||
 | 
			
		||||
  /// @param buttons Vector of Buttons
 | 
			
		||||
  std::vector<RenderD7::TObject> buttons = {
 | 
			
		||||
      {20, 35, 120, 35, "RD7SR", -8, 10},
 | 
			
		||||
      {20, 85, 120, 35, "Changelog", -24, 11},
 | 
			
		||||
      {20, 135, 120, 35, "Metrik-Ovl", -23, 10},
 | 
			
		||||
      {20, 185, 120, 35, "NOTYET", -13, 10},
 | 
			
		||||
      {180, 35, 120, 35, "MTSCREEN", -27, 10},
 | 
			
		||||
      {180, 85, 120, 35, "NOTYET", -13, 10},
 | 
			
		||||
      {180, 135, 120, 35, "INFO", 2, 10},
 | 
			
		||||
      {180, 185, 120, 35, "Services", -13, 10}};
 | 
			
		||||
      {20, 35, 120, 35, "NotYET"},      {20, 85, 120, 35, "Changelog"},
 | 
			
		||||
      {20, 135, 120, 35, "Metrik-Ovl"}, {20, 185, 120, 35, "Tasks"},
 | 
			
		||||
      {180, 35, 120, 35, "FTrace"},     {180, 85, 120, 35, "Credits"},
 | 
			
		||||
      {180, 135, 120, 35, "Info"},      {180, 185, 120, 35, "Security"}};
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
@@ -229,6 +246,14 @@ private:
 | 
			
		||||
/// @param e To
 | 
			
		||||
/// @return Random Int
 | 
			
		||||
int GetRandomInt(int b, int e);
 | 
			
		||||
/// @brief Short a String with (..,)
 | 
			
		||||
/// @param in Input string
 | 
			
		||||
/// @param size Size of Input Text
 | 
			
		||||
/// @param maxlen Max length of texr
 | 
			
		||||
/// @param font Custom Font for Correct Size Calculation
 | 
			
		||||
/// @return Shorted String
 | 
			
		||||
std::string ShortString(std::string in, float size, int maxlen,
 | 
			
		||||
                        C2D_Font font = nullptr);
 | 
			
		||||
/// @brief DrawMetrikOvl (YOUR OWN RISK)
 | 
			
		||||
void DrawMetrikOvl();
 | 
			
		||||
/// @brief Draw Image from RenderD7 Sheet
 | 
			
		||||
@@ -282,17 +307,6 @@ void Graphics();
 | 
			
		||||
void NdspFirm();
 | 
			
		||||
} // namespace Init
 | 
			
		||||
 | 
			
		||||
namespace Exit {
 | 
			
		||||
/// @brief Exit Default RenderD7
 | 
			
		||||
void Main();
 | 
			
		||||
/// @brief Exit Minimal RenderD7
 | 
			
		||||
void Minimal();
 | 
			
		||||
/// @brief Exit Ndsp
 | 
			
		||||
void NdspFirm();
 | 
			
		||||
/// @brief DEPRECATED Exit Graphics
 | 
			
		||||
void Graphics();
 | 
			
		||||
} // namespace Exit
 | 
			
		||||
 | 
			
		||||
namespace Msg {
 | 
			
		||||
/// @brief Display A Message
 | 
			
		||||
/// @param titletxt Header Text
 | 
			
		||||
@@ -325,13 +339,6 @@ inline int StringtoInt(std::string inp) { return std::atoi(inp.c_str()); }
 | 
			
		||||
inline bool FloatToBool(float inp) { return (inp == 1 ? true : false); }
 | 
			
		||||
} // namespace Convert
 | 
			
		||||
 | 
			
		||||
/// @brief DEPRECATED DirContent
 | 
			
		||||
struct DirContent {
 | 
			
		||||
  std::string name; ///< Content Name
 | 
			
		||||
  std::string path; ///< Content Path
 | 
			
		||||
  bool isDir;       ///< Is Directory
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
namespace FS {
 | 
			
		||||
/// @brief Check if File exists
 | 
			
		||||
/// @param path Path to the File
 | 
			
		||||
@@ -342,8 +349,6 @@ bool FileExist(const std::string &path);
 | 
			
		||||
/// @brief Check if Ndsp is Init
 | 
			
		||||
/// @return is or not
 | 
			
		||||
bool IsNdspInit();
 | 
			
		||||
/// @brief Setup RenderD7 Logs
 | 
			
		||||
void SetupLog(void);
 | 
			
		||||
/// @brief Get Current Framerate as String
 | 
			
		||||
/// @return Framerate String
 | 
			
		||||
std::string GetFramerate();
 | 
			
		||||
@@ -366,11 +371,6 @@ std::string Kbd(int lenght, SwkbdType tp);
 | 
			
		||||
/// @brief Draw Overlays And end the Frame. DO NEVER USE C3D_FRAMEEND cause it
 | 
			
		||||
/// breaks Overlay crash Security
 | 
			
		||||
void FrameEnd();
 | 
			
		||||
/// @brief Enable/Disable RenderD7 Super Reselution
 | 
			
		||||
void ToggleRD7SR();
 | 
			
		||||
/// @brief Check if RD7SR is Enabled
 | 
			
		||||
/// @return is or not
 | 
			
		||||
bool IsRD7SR();
 | 
			
		||||
 | 
			
		||||
/// @brief Textless Button
 | 
			
		||||
struct TLBtn {
 | 
			
		||||
@@ -417,14 +417,4 @@ void DrawTLBtns(std::vector<RenderD7::TLBtn> btns, u32 color,
 | 
			
		||||
                int selection = -1,
 | 
			
		||||
                u32 selbgcolor = RenderD7::Color::Hex("#2D98AF"),
 | 
			
		||||
                u32 selcolor = RenderD7::Color::Hex("#000000"));
 | 
			
		||||
 | 
			
		||||
/// @brief DEPRECATED USE RenderD7::FileSystem
 | 
			
		||||
/// @param dircontent Vector of Content output
 | 
			
		||||
/// @param extensions Extensions
 | 
			
		||||
void GetDirContentsExt(std::vector<RenderD7::DirContent> &dircontent,
 | 
			
		||||
                       const std::vector<std::string> &extensions);
 | 
			
		||||
/// @brief DEPRECATED USE RenderD7::FileSystem
 | 
			
		||||
/// @param dircontent Vector of Content output
 | 
			
		||||
void GetDirContents(std::vector<RenderD7::DirContent> &dircontent);
 | 
			
		||||
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <iomanip>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
@@ -27,6 +28,41 @@ inline bool NameIsEndingWith(const std::string &name,
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
/// @brief Format Milliseconds to clean string (Stolen from one of my Mc
 | 
			
		||||
/// Plugins)
 | 
			
		||||
/// @param t_time Time in ms
 | 
			
		||||
/// @return String
 | 
			
		||||
inline std::string MsTimeFmt(float t_time) {
 | 
			
		||||
  std::ostringstream oss;
 | 
			
		||||
 | 
			
		||||
  if (t_time < 0.001f) {
 | 
			
		||||
    oss << std::fixed << std::setprecision(2) << t_time * 1000.0f << "ns";
 | 
			
		||||
  } else if (t_time < 1.0f) {
 | 
			
		||||
    oss << std::fixed << std::setprecision(2) << t_time << "ms";
 | 
			
		||||
  } else if (t_time < 60000.0f) {
 | 
			
		||||
    int seconds = static_cast<int>(t_time / 1000.0f);
 | 
			
		||||
    float milliseconds = t_time - (seconds * 1000.0f);
 | 
			
		||||
 | 
			
		||||
    if (seconds > 0) {
 | 
			
		||||
      oss << seconds << "s ";
 | 
			
		||||
    }
 | 
			
		||||
    oss << std::fixed << std::setprecision(2) << milliseconds << "ms";
 | 
			
		||||
  } else {
 | 
			
		||||
    int minutes = static_cast<int>(t_time / 60000.0f);
 | 
			
		||||
    int seconds = static_cast<int>((t_time - (minutes * 60000.0f)) / 1000.0f);
 | 
			
		||||
    float milliseconds = t_time - (minutes * 60000.0f) - (seconds * 1000.0f);
 | 
			
		||||
 | 
			
		||||
    oss << minutes << "m ";
 | 
			
		||||
    if (seconds > 0 || milliseconds > 0.0f) {
 | 
			
		||||
      oss << seconds << "s ";
 | 
			
		||||
    }
 | 
			
		||||
    if (milliseconds > 0.0f) {
 | 
			
		||||
      oss << std::fixed << std::setprecision(2) << milliseconds << "ms";
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return oss.str();
 | 
			
		||||
}
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
 | 
			
		||||
template <class T> T GetFileName(T const &path, T const &delims = "/\\") {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										295
									
								
								rd7tf/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,295 @@
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
.SUFFIXES:
 | 
			
		||||
#nicetest
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(DEVKITARM)),)
 | 
			
		||||
$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
TOPDIR ?= $(CURDIR)
 | 
			
		||||
include $(DEVKITARM)/3ds_rules
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# TARGET is the name of the output
 | 
			
		||||
# BUILD is the directory where object files & intermediate files will be placed
 | 
			
		||||
# SOURCES is a list of directories containing source code
 | 
			
		||||
# DATA is a list of directories containing data files
 | 
			
		||||
# INCLUDES is a list of directories containing header files
 | 
			
		||||
# GRAPHICS is a list of directories containing graphics files
 | 
			
		||||
# GFXBUILD is the directory where converted graphics files will be placed
 | 
			
		||||
#   If set to $(BUILD), it will statically link in the converted
 | 
			
		||||
#   files as if they were data files.
 | 
			
		||||
#
 | 
			
		||||
# NO_SMDH: if set to anything, no SMDH file is generated.
 | 
			
		||||
# ROMFS is the directory which contains the RomFS, relative to the Makefile (Optional)
 | 
			
		||||
# APP_TITLE is the name of the app stored in the SMDH file (Optional)
 | 
			
		||||
# APP_DESCRIPTION is the description of the app stored in the SMDH file (Optional)
 | 
			
		||||
# APP_AUTHOR is the author of the app stored in the SMDH file (Optional)
 | 
			
		||||
# ICON is the filename of the icon (.png), relative to the project folder.
 | 
			
		||||
#   If not set, it attempts to use one of the following (in this order):
 | 
			
		||||
#     - <Project name>.png
 | 
			
		||||
#     - icon.png
 | 
			
		||||
#     - <libctru folder>/default_icon.png
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# External tools
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
ifeq ($(OS),Windows_NT)
 | 
			
		||||
MAKEROM 	?= C:/devkitpro/tools/bin/makerom.exe
 | 
			
		||||
BANNERTOOL 	?= C:/devkitpro/tools/bin/bannertool.exe
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
MAKEROM 	?= makerom
 | 
			
		||||
BANNERTOOL 	?= bannertool
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
# If on a tagged commit, use the tag instead of the commit
 | 
			
		||||
ifneq ($(shell echo $(shell git tag -l --points-at HEAD) | head -c 1),)
 | 
			
		||||
GIT_VER := $(shell git tag -l --points-at HEAD)
 | 
			
		||||
else
 | 
			
		||||
GIT_VER := $(shell git rev-parse --short HEAD)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
TIME_TIME := $(shell date --iso=seconds)
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# Version number
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
VERSION_MAJOR := 1
 | 
			
		||||
 | 
			
		||||
VERSION_MINOR := 0
 | 
			
		||||
 | 
			
		||||
VERSION_MICRO := 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
TARGET		:=	rd7tf
 | 
			
		||||
BUILD		:=	build
 | 
			
		||||
SOURCES		:=	source 
 | 
			
		||||
DATA		:=	data
 | 
			
		||||
INCLUDES	:=	source 
 | 
			
		||||
GRAPHICS	:=	gfx
 | 
			
		||||
#GFXBUILD	:=	$(BUILD)
 | 
			
		||||
ROMFS		:=	romfs
 | 
			
		||||
GFXBUILD	:=	$(ROMFS)/gfx
 | 
			
		||||
APP_AUTHOR	:=	NPI-D7
 | 
			
		||||
APP_DESCRIPTION := RenderD7 Test Framework
 | 
			
		||||
ICON		:=	app/icon.png
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# options for code generation
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
ARCH	:=	-march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft
 | 
			
		||||
 | 
			
		||||
CFLAGS	:=	-g -Wall -Wno-psabi -O2 -mword-relocations \
 | 
			
		||||
			-DV_STRING=\"$(GIT_VER)\" \
 | 
			
		||||
			-DV_TIME=\"$(TIME_TIME)\" \
 | 
			
		||||
			-fomit-frame-pointer -ffunction-sections \
 | 
			
		||||
			$(ARCH)
 | 
			
		||||
 | 
			
		||||
CFLAGS	+=	$(INCLUDE) -D__3DS__ -D_GNU_SOURCE=1
 | 
			
		||||
 | 
			
		||||
CXXFLAGS	:= $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++20 
 | 
			
		||||
 | 
			
		||||
ASFLAGS	:=	-g $(ARCH)
 | 
			
		||||
LDFLAGS	=	-specs=3dsx.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
 | 
			
		||||
 | 
			
		||||
LIBS	:= -lrenderd7d -lcurl -lstdc++ -lm -lz -lcitro2d -lcitro3d -lctru -ljpeg 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# list of directories containing libraries, this must be the top level containing
 | 
			
		||||
# include and lib
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
LIBDIRS	:= $(PORTLIBS) $(CTRULIB) ../libs
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# no real need to edit anything past this point unless you need to add additional
 | 
			
		||||
# rules for different file extensions
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
ifneq ($(BUILD),$(notdir $(CURDIR)))
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export OUTPUT	:=	$(CURDIR)/$(TARGET)
 | 
			
		||||
export TOPDIR	:=	$(CURDIR)
 | 
			
		||||
 | 
			
		||||
export VPATH	:=	$(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
 | 
			
		||||
			$(foreach dir,$(GRAPHICS),$(CURDIR)/$(dir)) \
 | 
			
		||||
			$(foreach dir,$(DATA),$(CURDIR)/$(dir))
 | 
			
		||||
 | 
			
		||||
export DEPSDIR	:=	$(CURDIR)/$(BUILD)
 | 
			
		||||
 | 
			
		||||
CFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
 | 
			
		||||
CPPFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
 | 
			
		||||
SFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
 | 
			
		||||
PICAFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.v.pica)))
 | 
			
		||||
SHLISTFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.shlist)))
 | 
			
		||||
GFXFILES	:=	$(foreach dir,$(GRAPHICS),$(notdir $(wildcard $(dir)/*.t3s)))
 | 
			
		||||
BINFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# use CXX for linking C++ projects, CC for standard C
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
ifeq ($(strip $(CPPFILES)),)
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
	export LD	:=	$(CC)
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
else
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
	export LD	:=	$(CXX)
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
endif
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
ifeq ($(GFXBUILD),$(BUILD))
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
export T3XFILES :=  $(GFXFILES:.t3s=.t3x)
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
else
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
export ROMFS_T3XFILES	:=	$(patsubst %.t3s, $(GFXBUILD)/%.t3x, $(GFXFILES))
 | 
			
		||||
export T3XHFILES		:=	$(patsubst %.t3s, $(BUILD)/%.h, $(GFXFILES))
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
endif
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
export OFILES_SOURCES 	:=	$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
 | 
			
		||||
 | 
			
		||||
export OFILES_BIN	:=	$(addsuffix .o,$(BINFILES)) \
 | 
			
		||||
			$(PICAFILES:.v.pica=.shbin.o) $(SHLISTFILES:.shlist=.shbin.o)
 | 
			
		||||
 | 
			
		||||
export OFILES := $(OFILES_BIN) $(OFILES_SOURCES)
 | 
			
		||||
 | 
			
		||||
export HFILES	:=	$(PICAFILES:.v.pica=_shbin.h) $(SHLISTFILES:.shlist=_shbin.h) \
 | 
			
		||||
			$(addsuffix .h,$(subst .,_,$(BINFILES)))
 | 
			
		||||
 | 
			
		||||
export INCLUDE	:=	$(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
 | 
			
		||||
			$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
 | 
			
		||||
			-I$(CURDIR)/$(BUILD)
 | 
			
		||||
 | 
			
		||||
export LIBPATHS	:=	$(foreach dir,$(LIBDIRS),-L$(dir)/lib)
 | 
			
		||||
 | 
			
		||||
export _3DSXDEPS	:=	$(if $(NO_SMDH),,$(OUTPUT).smdh)
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(ICON)),)
 | 
			
		||||
	icons := $(wildcard *.png)
 | 
			
		||||
	ifneq (,$(findstring $(TARGET).png,$(icons)))
 | 
			
		||||
		export APP_ICON := $(TOPDIR)/$(TARGET).png
 | 
			
		||||
	else
 | 
			
		||||
		ifneq (,$(findstring icon.png,$(icons)))
 | 
			
		||||
			export APP_ICON := $(TOPDIR)/icon.png
 | 
			
		||||
		endif
 | 
			
		||||
	endif
 | 
			
		||||
else
 | 
			
		||||
	export APP_ICON := $(TOPDIR)/$(ICON)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(strip $(NO_SMDH)),)
 | 
			
		||||
	export _3DSXFLAGS += --smdh=$(CURDIR)/$(TARGET).smdh
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifneq ($(ROMFS),)
 | 
			
		||||
	export _3DSXFLAGS += --romfs=$(CURDIR)/$(ROMFS)
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
.PHONY: all clean
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
all: $(BUILD) $(GFXBUILD) $(DEPSDIR) $(ROMFS_T3XFILES) $(T3XHFILES)
 | 
			
		||||
	@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
 | 
			
		||||
 | 
			
		||||
#------------------------------------------------------------------------------
 | 
			
		||||
clean:
 | 
			
		||||
	@echo clean ...
 | 
			
		||||
	@rm -fr $(BUILD) $(TARGET).elf $(TARGET).3dsx $(TARGET).cia $(TARGET).smdh app/*.bin 
 | 
			
		||||
	@rm -fr $(OUTDIR)
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
send:
 | 
			
		||||
	@3dslink -a $(IP) $(TARGET).3dsx
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
run:
 | 
			
		||||
	@flatpak run org.citra_emu.citra $(TARGET).3dsx
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
3dsx: $(BUILD)
 | 
			
		||||
	@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile 3dsx
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
$(GFXBUILD)/%.t3x	$(BUILD)/%.h	:	%.t3s
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
	@echo $(notdir $<)
 | 
			
		||||
	$(DEVKITPRO)/tools/bin/tex3ds -i $< -H $(BUILD)/$*.h -d $(DEPSDIR)/$*.d -o $(GFXBUILD)/$*.t3x
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
$(BUILD):
 | 
			
		||||
	@[ -d $@ ] || mkdir -p $@
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
else
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# main targets
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
all: $(OUTPUT).elf $(OUTPUT).3dsx
 | 
			
		||||
 | 
			
		||||
$(OUTPUT).elf	:	$(OFILES)
 | 
			
		||||
$(OUTPUT).3dsx	:   $(_3DSXDEPS)
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# you need a rule like this for each extension you use as binary data
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
%.bin.o	%_bin.h :	%.bin
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
	@echo $(notdir $<)
 | 
			
		||||
	@$(bin2o)
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
.PRECIOUS	:	%.t3x
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
%.t3x.o	%_t3x.h :	%.t3x
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
	@echo $(notdir $<)
 | 
			
		||||
	@$(bin2o)
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
# rules for assembling GPU shaders
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
define shader-as
 | 
			
		||||
	$(eval CURBIN := $*.shbin)
 | 
			
		||||
	$(eval DEPSFILE := $(DEPSDIR)/$*.shbin.d)
 | 
			
		||||
	echo "$(CURBIN).o: $< $1" > $(DEPSFILE)
 | 
			
		||||
	echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(CURBIN) | tr . _)`.h
 | 
			
		||||
	echo "extern const u8" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(CURBIN) | tr . _)`.h
 | 
			
		||||
	echo "extern const u32" `(echo $(CURBIN) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(CURBIN) | tr . _)`.h
 | 
			
		||||
	picasso -o $(CURBIN) $1
 | 
			
		||||
	bin2s $(CURBIN) | $(AS) -o $*.shbin.o
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
%.shbin.o %_shbin.h : %.v.pica %.g.pica
 | 
			
		||||
	@echo $(notdir $^)
 | 
			
		||||
	@$(call shader-as,$^)
 | 
			
		||||
 | 
			
		||||
%.shbin.o %_shbin.h : %.v.pica
 | 
			
		||||
	@echo $(notdir $<)
 | 
			
		||||
	@$(call shader-as,$<)
 | 
			
		||||
 | 
			
		||||
%.shbin.o %_shbin.h : %.shlist
 | 
			
		||||
	@echo $(notdir $<)
 | 
			
		||||
	@$(call shader-as,$(foreach file,$(shell cat $<),$(dir $<)$(file)))
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
%.t3x	%.h	:	%.t3s
 | 
			
		||||
#---------------------------------------------------------------------------------
 | 
			
		||||
	@echo $(notdir $<)
 | 
			
		||||
	@tex3ds -i $< -H $*.h -d $*.d -o $*.t3x
 | 
			
		||||
 | 
			
		||||
-include $(DEPSDIR)/*.d
 | 
			
		||||
 | 
			
		||||
#---------------------------------------------------------------------------------------
 | 
			
		||||
endif
 | 
			
		||||
#---------------------------------------------------------------------------------------
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								rd7tf/app/icon.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 844 B  | 
							
								
								
									
										
											BIN
										
									
								
								rd7tf/gfx/default_icon.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 949 B  | 
							
								
								
									
										
											BIN
										
									
								
								rd7tf/gfx/folder.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 5.6 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								rd7tf/gfx/renderd7.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										6
									
								
								rd7tf/gfx/sprites.t3s
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,6 @@
 | 
			
		||||
--atlas -f rgba -z auto
 | 
			
		||||
 | 
			
		||||
renderd7.png
 | 
			
		||||
folder.png
 | 
			
		||||
default_icon.png
 | 
			
		||||
unk_icon.png
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								rd7tf/gfx/unk_icon.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 1.3 KiB  | 
							
								
								
									
										5
									
								
								rd7tf/libs/include/rd7.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <renderd7/StealConsole.hpp>
 | 
			
		||||
#include <renderd7/bmp.hpp>
 | 
			
		||||
#include <renderd7/renderd7.hpp>
 | 
			
		||||
							
								
								
									
										219
									
								
								rd7tf/libs/include/renderd7/BitmapPrinter.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,219 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/bmp.hpp>
 | 
			
		||||
#include <renderd7/bmpconverter.hpp>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Image.hpp>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Screen.hpp>
 | 
			
		||||
#include <renderd7/Time.hpp>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Fonts/NFontApi.hpp>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Encoder
 | 
			
		||||
enum Encoder {
 | 
			
		||||
  BITMAP, ///< Encode Data to Bitmap
 | 
			
		||||
  DIRECT, ///< Encode Direct to Framebuffer(No Decoder Required)
 | 
			
		||||
  C3D     ///< Encode Directly to C3D_Tex (Just an Idea)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief Decoder
 | 
			
		||||
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)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief BitmapPrinetr Class
 | 
			
		||||
class BitmapPrinter {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param w Widrth
 | 
			
		||||
  /// @param h Height
 | 
			
		||||
  BitmapPrinter(int w, int h);
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~BitmapPrinter();
 | 
			
		||||
  /// @brief Dexode Bitmap File
 | 
			
		||||
  /// @param file path to File
 | 
			
		||||
  /// @return success ?
 | 
			
		||||
  bool DecodeFile(std::string file);
 | 
			
		||||
 | 
			
		||||
  /// @brief Set the Decoder
 | 
			
		||||
  /// @param deccc Decoder
 | 
			
		||||
  void SetDecoder(Decoder deccc) { decc = deccc; }
 | 
			
		||||
  /// @brief Draw a Pixel
 | 
			
		||||
  /// @param x pos x
 | 
			
		||||
  /// @param y pos y
 | 
			
		||||
  /// @param b color blue
 | 
			
		||||
  /// @param g color green
 | 
			
		||||
  /// @param r color red
 | 
			
		||||
  /// @param a color alpha
 | 
			
		||||
  void DrawPixel(int x, int y, u8 b, u8 g, u8 r, u8 a);
 | 
			
		||||
  /// @brief Draw Rectangle
 | 
			
		||||
  /// @param x pos x
 | 
			
		||||
  /// @param y pos y
 | 
			
		||||
  /// @param w width
 | 
			
		||||
  /// @param h height
 | 
			
		||||
  /// @param line_w line width
 | 
			
		||||
  /// @param b color blue
 | 
			
		||||
  /// @param g color green
 | 
			
		||||
  /// @param r color red
 | 
			
		||||
  /// @param a colr alpha
 | 
			
		||||
  void DrawRect(int x, int y, int w, int h, u8 line_w, u8 b, u8 g, u8 r, u8 a);
 | 
			
		||||
  /// @brief Draw a Fillif Rectangle
 | 
			
		||||
  /// @param x pos x
 | 
			
		||||
  /// @param y pos y
 | 
			
		||||
  /// @param w width
 | 
			
		||||
  /// @param h height
 | 
			
		||||
  /// @param b color blue
 | 
			
		||||
  /// @param g color green
 | 
			
		||||
  /// @param r color red
 | 
			
		||||
  /// @param a color alpha
 | 
			
		||||
  void DrawRectFilled(int x, int y, int w, int h, u8 b, u8 g, u8 r, u8 a);
 | 
			
		||||
  /// @brief Draw Bitmap
 | 
			
		||||
  /// @param x pos x
 | 
			
		||||
  /// @param y pos y
 | 
			
		||||
  /// @param map Bitmap to Print
 | 
			
		||||
  void DrawBitmap(int x, int y, BMP map);
 | 
			
		||||
  /// @brief Use Prebuild Bitmap
 | 
			
		||||
  /// @param map bitmap
 | 
			
		||||
  void UsePreMap(BMP map);
 | 
			
		||||
  /// @brief Use Prebuild Printer Setup
 | 
			
		||||
  /// @param printmap Printer
 | 
			
		||||
  void UsePrePrintMap(BitmapPrinter printmap);
 | 
			
		||||
  /// @brief Get Bitmap
 | 
			
		||||
  /// @return Bitmap
 | 
			
		||||
  BMP GetBitmap() { return bitmap; }
 | 
			
		||||
  /// @brief Save to File
 | 
			
		||||
  /// @param name Name/Path
 | 
			
		||||
  void SaveBmp(std::string name);
 | 
			
		||||
  /// @brief Save as Png
 | 
			
		||||
  /// @param name Name/Path
 | 
			
		||||
  void SavePng(std::string name);
 | 
			
		||||
 | 
			
		||||
  /// @brief Setup Screen
 | 
			
		||||
  /// @param target Screen
 | 
			
		||||
  void CreateScreen(C3D_RenderTarget *target);
 | 
			
		||||
  /// @brief Draw Directly to Screen With Framerate
 | 
			
		||||
  /// @param framerate Framerate
 | 
			
		||||
  /// @return
 | 
			
		||||
  bool DrawScreenDirectF(int framerate);
 | 
			
		||||
  /// @brief Draw Directly to Screen
 | 
			
		||||
  /// @return
 | 
			
		||||
  bool DrawScreenDirect();
 | 
			
		||||
  /// @brief Render on Screen by Framerate
 | 
			
		||||
  /// @param framerate Framerate
 | 
			
		||||
  void DrawScreenF(int framerate);
 | 
			
		||||
  /// @brief Draw to Screen
 | 
			
		||||
  void DrawScreen();
 | 
			
		||||
  /// @brief Update Image by Framerate
 | 
			
		||||
  /// @param framerate Framerate
 | 
			
		||||
  /// @return
 | 
			
		||||
  bool UpdateScreenF(int framerate);
 | 
			
		||||
  /// @brief Update Image
 | 
			
		||||
  /// @return
 | 
			
		||||
  bool UpdateScreen();
 | 
			
		||||
  /// @brief Clear by Color
 | 
			
		||||
  /// @param b color blue
 | 
			
		||||
  /// @param g color green
 | 
			
		||||
  /// @param r color red
 | 
			
		||||
  /// @param a color alpha
 | 
			
		||||
  void Clear(u8 b = 0, u8 g = 0, u8 r = 0, u8 a = 255);
 | 
			
		||||
  /// @brief Clear Completly Blank
 | 
			
		||||
  void ClearBlank();
 | 
			
		||||
  /// @brief Get Rendered Image
 | 
			
		||||
  /// @return Image
 | 
			
		||||
  RenderD7::Image GetImage();
 | 
			
		||||
  /// Test to Find out The Best Settings for BitmapPrinter
 | 
			
		||||
  void Benchmark();
 | 
			
		||||
  /// @brief Setup the Benchmark
 | 
			
		||||
  /// \param framerate The Fps of the ScreenUpdates
 | 
			
		||||
  void SetupBenchmark(int framerate);
 | 
			
		||||
  /// @brief Check if Benchmark is Running
 | 
			
		||||
  /// @return is running or not
 | 
			
		||||
  bool IsBenchmarkRunning() { return this->benchmark; }
 | 
			
		||||
 | 
			
		||||
  /// @brief Draw a Dubug Text
 | 
			
		||||
  /// @param x pos x
 | 
			
		||||
  /// @param y pos y
 | 
			
		||||
  /// @param t_size Size of the Text
 | 
			
		||||
  /// @param color Color of the Text
 | 
			
		||||
  /// @param text String of the Text
 | 
			
		||||
  void DrawDebugText(int x, int y, int t_size, u32 color, std::string text);
 | 
			
		||||
  /// @brief Draw a Text width NFontApi (TTF)
 | 
			
		||||
  /// @param x pos x
 | 
			
		||||
  /// @param y pos y
 | 
			
		||||
  /// @param t_size size of the Text
 | 
			
		||||
  /// @param color Color of The Text
 | 
			
		||||
  /// @param text String of The Text
 | 
			
		||||
  /// @param font TTF Font
 | 
			
		||||
  void DrawText(int x, int y, float t_size, u32 color, std::string text,
 | 
			
		||||
                RenderD7::NFontApi font);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  // funcs
 | 
			
		||||
 | 
			
		||||
  /// @brief Decode 2 RenderD7::Image
 | 
			
		||||
  /// @param deccc Decoder
 | 
			
		||||
  /// @return
 | 
			
		||||
  bool Decode(Decoder deccc);
 | 
			
		||||
  /// @brief Draw Char Func
 | 
			
		||||
  /// @param posX pos x
 | 
			
		||||
  /// @param posY pos y
 | 
			
		||||
  /// @param t_size size
 | 
			
		||||
  /// @param color color
 | 
			
		||||
  /// @param character char
 | 
			
		||||
  void DrawDebugChar(u32 posX, u32 posY, int t_size, u32 color, char character);
 | 
			
		||||
  /// @brief NFont Draw Char
 | 
			
		||||
  /// @param posX pos x
 | 
			
		||||
  /// @param posY pos y
 | 
			
		||||
  /// @param t_size size
 | 
			
		||||
  /// @param color color
 | 
			
		||||
  /// @param character char
 | 
			
		||||
  /// @param font ttf
 | 
			
		||||
  void DrawChar(int posX, int posY, float t_size, u32 color, char character,
 | 
			
		||||
                RenderD7::NFontApi font);
 | 
			
		||||
  // parameter
 | 
			
		||||
  int frame = 0;
 | 
			
		||||
  RenderD7::Image renderframe;
 | 
			
		||||
  bool isscreen = false;
 | 
			
		||||
  C3D_RenderTarget *targetr;
 | 
			
		||||
  BMP bitmap = BMP(
 | 
			
		||||
      20, 20,
 | 
			
		||||
      true); // Need to Set e Predefined Bitmap. If not the System will Crash.
 | 
			
		||||
  BMP blank = BMP(
 | 
			
		||||
      20, 20,
 | 
			
		||||
      true); // Need to Set e Predefined Bitmap. If not the System will Crash.
 | 
			
		||||
 | 
			
		||||
  ///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
  // Benchmark Stuff;
 | 
			
		||||
  int testfpsd;
 | 
			
		||||
  bool benchmark = false;
 | 
			
		||||
  bool setupbenchmark;
 | 
			
		||||
  float frametime = 0;
 | 
			
		||||
  uint64_t lastTime = 0;
 | 
			
		||||
  float dtt = 0.f;
 | 
			
		||||
  float dtt2 = 0.f;
 | 
			
		||||
  float dtt3 = 0.f;
 | 
			
		||||
  float timer = 0;
 | 
			
		||||
  float mhdtt = 0;
 | 
			
		||||
  float mdtt2;
 | 
			
		||||
  float mdtt3;
 | 
			
		||||
 | 
			
		||||
  float fpsClock = 0.f;
 | 
			
		||||
  int frameCounter = 0, fps = 0;
 | 
			
		||||
 | 
			
		||||
  std::vector<float> hdttt;
 | 
			
		||||
  std::vector<float> hdttt2;
 | 
			
		||||
  std::vector<float> hdttt3;
 | 
			
		||||
  std::vector<int> fpscountc;
 | 
			
		||||
  int renderedframes = 0;
 | 
			
		||||
  int testfps = 60;
 | 
			
		||||
  Encoder encc = Encoder::BITMAP;
 | 
			
		||||
  Decoder decc = Decoder::BITMAP2C3D;
 | 
			
		||||
  ////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										50
									
								
								rd7tf/libs/include/renderd7/Color.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,50 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <regex>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
#define UNPACK_RGBA(col) (uint8_t)(col >> 24), (col >> 16), (col >> 8), (col)
 | 
			
		||||
#define UNPACK_BGRA(col) (uint8_t)(col >> 8), (col >> 16), (col >> 24), (col)
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Color {
 | 
			
		||||
/// @brief RGBA Struct
 | 
			
		||||
struct rgba {
 | 
			
		||||
  /// @brief rgba Colors
 | 
			
		||||
  uint8_t r, g, b, a;
 | 
			
		||||
};
 | 
			
		||||
/// @brief RGBA Class
 | 
			
		||||
class RGBA {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Construct
 | 
			
		||||
  /// @param r
 | 
			
		||||
  /// @param g
 | 
			
		||||
  /// @param b
 | 
			
		||||
  /// @param a
 | 
			
		||||
  RGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
 | 
			
		||||
      : m_r(r), m_g(g), m_b(b), m_a(a) {}
 | 
			
		||||
  /// @brief Get as Uint32
 | 
			
		||||
  /// @return color
 | 
			
		||||
  uint32_t toRGBA() const {
 | 
			
		||||
    return (m_r << 24) | (m_g << 16) | (m_b << 8) | m_a;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  uint8_t m_r, m_g, m_b, m_a;
 | 
			
		||||
};
 | 
			
		||||
/// @brief Convert RGB to Hex
 | 
			
		||||
/// @param r
 | 
			
		||||
/// @param g
 | 
			
		||||
/// @param b
 | 
			
		||||
/// @return Hex-String
 | 
			
		||||
std::string RGB2Hex(int r, int g, int b);
 | 
			
		||||
/// @brief Hex to U32
 | 
			
		||||
/// @param color
 | 
			
		||||
/// @param a
 | 
			
		||||
/// @return Color32
 | 
			
		||||
uint32_t Hex(const std::string &color, uint8_t a = 255);
 | 
			
		||||
} // namespace Color
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										111
									
								
								rd7tf/libs/include/renderd7/Draw.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,111 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Draw {
 | 
			
		||||
/// @brief Draw Rectangle
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param w Width
 | 
			
		||||
/// @param h Height
 | 
			
		||||
/// @param color Color
 | 
			
		||||
/// @return success ?
 | 
			
		||||
bool Rect(float x, float y, float w, float h, u32 color);
 | 
			
		||||
/// @brief Draw a not filled Rectangle
 | 
			
		||||
/// @param p1x Pos X
 | 
			
		||||
/// @param p1y Pos Y
 | 
			
		||||
/// @param w Width
 | 
			
		||||
/// @param h Height
 | 
			
		||||
/// @param color Color
 | 
			
		||||
/// @param scale Scale
 | 
			
		||||
/// @return success ?
 | 
			
		||||
bool NFRect(float p1x, float p1y, float w, float h, u32 color, float scale = 1);
 | 
			
		||||
/// @brief Draw A Pixel
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param color Color
 | 
			
		||||
/// @return success ?
 | 
			
		||||
bool Px(float x, float y, u32 color);
 | 
			
		||||
/// @brief Draw a Centered Text
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param size Scale of the Text
 | 
			
		||||
/// @param color Color of The Text
 | 
			
		||||
/// @param Text Striing to Display
 | 
			
		||||
/// @param maxWidth Width to Calculate Centered Pos
 | 
			
		||||
/// @param maxHeight Height to Calculate Centered Pos
 | 
			
		||||
/// @param fnt Custom Font
 | 
			
		||||
void TextCentered(float x, float y, float size, u32 color, std::string Text,
 | 
			
		||||
                  int maxWidth = 0, int maxHeight = 0, C2D_Font fnt = nullptr);
 | 
			
		||||
/// @brief Draw a Text
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param size Scale of the Text
 | 
			
		||||
/// @param color Color of The Text
 | 
			
		||||
/// @param Text Striing to Display
 | 
			
		||||
/// @param maxWidth Width to Calculate Centered Pos
 | 
			
		||||
/// @param maxHeight Height to Calculate Centered Pos
 | 
			
		||||
/// @param fnt Custom Font
 | 
			
		||||
void Text(float x, float y, float size, u32 color, std::string Text,
 | 
			
		||||
          int maxWidth = 0, int maxHeight = 0, C2D_Font fnt = nullptr);
 | 
			
		||||
/// @brief Draw a Text Set to the Right
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param size Scale of the Text
 | 
			
		||||
/// @param color Color of The Text
 | 
			
		||||
/// @param Text Striing to Display
 | 
			
		||||
/// @param maxWidth Width to Calculate Centered Pos
 | 
			
		||||
/// @param maxHeight Height to Calculate Centered Pos
 | 
			
		||||
/// @param fnt Custom Font
 | 
			
		||||
void TextRight(float x, float y, float size, u32 color, std::string Text,
 | 
			
		||||
               int maxWidth = 0, int maxHeight = 0, C2D_Font fnt = nullptr);
 | 
			
		||||
/// @brief Get Width of Text
 | 
			
		||||
/// @param size Size of the Text
 | 
			
		||||
/// @param Text String of The text
 | 
			
		||||
/// @param fnt Custom Font
 | 
			
		||||
/// @return The Size
 | 
			
		||||
float GetTextWidth(float size, std::string Text, C2D_Font fnt = nullptr);
 | 
			
		||||
/// @brief Get Text Size
 | 
			
		||||
/// @param size Size of The Text
 | 
			
		||||
/// @param width Width of the Text
 | 
			
		||||
/// @param height Height of The Text
 | 
			
		||||
/// @param Text String of Text
 | 
			
		||||
/// @param fnt Custom Font
 | 
			
		||||
void GetTextSize(float size, float *width, float *height, std::string Text,
 | 
			
		||||
                 C2D_Font fnt = nullptr);
 | 
			
		||||
/// @brief Get Height of the Text
 | 
			
		||||
/// @param size Size of the Text
 | 
			
		||||
/// @param Text String of the Text
 | 
			
		||||
/// @param fnt Custom Font
 | 
			
		||||
/// @return The Height
 | 
			
		||||
float GetTextHeight(float size, std::string Text, C2D_Font fnt = nullptr);
 | 
			
		||||
/// @brief Load A .bcfnt
 | 
			
		||||
/// @param fnt Output Font
 | 
			
		||||
/// @param Path path of The File
 | 
			
		||||
/// @return Result Code
 | 
			
		||||
Result LoadFont(C2D_Font &fnt, const char *Path = "");
 | 
			
		||||
/// @brief Unload a Font
 | 
			
		||||
/// @param fnt Font to Unload
 | 
			
		||||
/// @return Result Code
 | 
			
		||||
Result UnloadFont(C2D_Font &fnt);
 | 
			
		||||
/// @brief Draw a Circle
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param radius Radius of the Circle
 | 
			
		||||
/// @param color Color of the circle
 | 
			
		||||
/// @return success ?
 | 
			
		||||
bool Circle(float x, float y, float radius, u32 color);
 | 
			
		||||
/// @brief Draw A Citro2D Image
 | 
			
		||||
/// @param img Image to Draw
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param scaleX Scale of X-Axis
 | 
			
		||||
/// @param scaleY Scale of Y-Axis
 | 
			
		||||
/// @return success ?
 | 
			
		||||
bool Image(C2D_Image img, float x, float y, float scaleX = 1.0f,
 | 
			
		||||
           float scaleY = 1.0f);
 | 
			
		||||
} // namespace Draw
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										23
									
								
								rd7tf/libs/include/renderd7/FileSystem.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
// FileSystem based on libphyfs based on
 | 
			
		||||
// https://github.com/TurtleP/3ds-examples/blob/fs/physfs/fs/physfs/include/filesystem.h
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace FileSystem {
 | 
			
		||||
/// @brief A Directory Entry
 | 
			
		||||
struct Entry {
 | 
			
		||||
  /// @brief Patf of The Entry
 | 
			
		||||
  std::string path;
 | 
			
		||||
  /// @brief Name of The Entry
 | 
			
		||||
  std::string name;
 | 
			
		||||
  /// @brief Directory or File
 | 
			
		||||
  bool dir = false;
 | 
			
		||||
};
 | 
			
		||||
/// @brief Gets All Entrys of A Directory into a Vector
 | 
			
		||||
/// @param path The Path of the Directory
 | 
			
		||||
/// @return The Vector of found Entrys
 | 
			
		||||
std::vector<RenderD7::FileSystem::Entry> GetDirContent(std::string path);
 | 
			
		||||
} // namespace FileSystem
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										142
									
								
								rd7tf/libs/include/renderd7/Fonts/NFontApi.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,142 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <bitset>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/external/stb_truetype.h>
 | 
			
		||||
 | 
			
		||||
#define MAXUNICODE 0x10FFFF
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
inline int utf8_decode(const char *o) {
 | 
			
		||||
  static const unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF};
 | 
			
		||||
  const unsigned char *s = (const unsigned char *)o;
 | 
			
		||||
  unsigned int c = s[0];
 | 
			
		||||
  unsigned int res = 0; /* final result */
 | 
			
		||||
  if (c < 0x80)         /* ascii? */
 | 
			
		||||
    res = c;
 | 
			
		||||
  else {
 | 
			
		||||
    int count = 0;             /* to count number of continuation bytes */
 | 
			
		||||
    while (c & 0x40) {         /* still have continuation bytes? */
 | 
			
		||||
      int cc = s[++count];     /* read next byte */
 | 
			
		||||
      if ((cc & 0xC0) != 0x80) /* not a continuation byte? */
 | 
			
		||||
        return -1;             /* invalid byte sequence */
 | 
			
		||||
      res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */
 | 
			
		||||
      c <<= 1;                        /* to test next bit */
 | 
			
		||||
    }
 | 
			
		||||
    res |= ((c & 0x7F) << (count * 5)); /* add first byte */
 | 
			
		||||
    if (count > 3 || res > MAXUNICODE || res <= limits[count])
 | 
			
		||||
      return -1; /* invalid byte sequence */
 | 
			
		||||
    s += count;  /* skip continuation bytes read */
 | 
			
		||||
  }
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::string IntToUtf8(int convertval) {
 | 
			
		||||
 | 
			
		||||
  // We only care about plane 1 right now,
 | 
			
		||||
  // but know that we have other options (0x10FFFF)
 | 
			
		||||
  // Technically UTF-8 is "limited" to 4 bytes, so it's not
 | 
			
		||||
  // Like it matters much anyways these days
 | 
			
		||||
 | 
			
		||||
  if (convertval == 0)
 | 
			
		||||
    return " ";
 | 
			
		||||
  if ((convertval <= 0x7F) && (convertval > 0x00)) {
 | 
			
		||||
 | 
			
		||||
    std::string out(".");
 | 
			
		||||
 | 
			
		||||
    std::bitset<8> x(convertval);
 | 
			
		||||
 | 
			
		||||
    unsigned long l = x.to_ulong();
 | 
			
		||||
    unsigned char c = static_cast<unsigned char>(l);
 | 
			
		||||
    out[0] = c;
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
 | 
			
		||||
  } else if ((convertval >= 0x80) && (convertval <= 0x07FF)) {
 | 
			
		||||
 | 
			
		||||
    std::string out("..");
 | 
			
		||||
 | 
			
		||||
    int firstShift = (convertval >> 0x06) ^ 0xC0;
 | 
			
		||||
    int secondShift = ((convertval ^ 0xFFC0) | 0x80) & ~0x40;
 | 
			
		||||
 | 
			
		||||
    std::bitset<8> first(firstShift);
 | 
			
		||||
    std::bitset<8> last(secondShift);
 | 
			
		||||
 | 
			
		||||
    unsigned long l = first.to_ulong();
 | 
			
		||||
    unsigned char c = static_cast<unsigned char>(l);
 | 
			
		||||
    out[0] = c;
 | 
			
		||||
 | 
			
		||||
    unsigned long ltwo = last.to_ulong();
 | 
			
		||||
    unsigned char ctwo = static_cast<unsigned char>(ltwo);
 | 
			
		||||
    out[1] = ctwo;
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
 | 
			
		||||
  } else if ((convertval >= 0x0800) && (convertval <= 0xFFFF)) {
 | 
			
		||||
 | 
			
		||||
    std::string out("...");
 | 
			
		||||
 | 
			
		||||
    int firstShift = ((convertval ^ 0xFC0FFF) >> 0x0C) | 0xE0;
 | 
			
		||||
    int secondShift = (((convertval ^ 0xFFF03F) >> 0x06) | 0x80) & ~0x40;
 | 
			
		||||
    int thirdShift = ((convertval ^ 0xFFFC0) | 0x80) & ~0x40;
 | 
			
		||||
 | 
			
		||||
    std::bitset<8> first(firstShift);
 | 
			
		||||
    std::bitset<8> second(secondShift);
 | 
			
		||||
    std::bitset<8> third(thirdShift);
 | 
			
		||||
 | 
			
		||||
    unsigned long lone = first.to_ulong();
 | 
			
		||||
    unsigned char cone = static_cast<unsigned char>(lone);
 | 
			
		||||
    out[0] = cone;
 | 
			
		||||
 | 
			
		||||
    unsigned long ltwo = second.to_ulong();
 | 
			
		||||
    unsigned char ctwo = static_cast<unsigned char>(ltwo);
 | 
			
		||||
    out[1] = ctwo;
 | 
			
		||||
 | 
			
		||||
    unsigned long lthree = third.to_ulong();
 | 
			
		||||
    unsigned char cthree = static_cast<unsigned char>(lthree);
 | 
			
		||||
    out[2] = cthree;
 | 
			
		||||
 | 
			
		||||
    return out;
 | 
			
		||||
 | 
			
		||||
  } else {
 | 
			
		||||
    return " ";
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
#define I2U82I(val) RenderD7::utf8_decode(RenderD7::IntToUtf8(val).c_str())
 | 
			
		||||
 | 
			
		||||
class NFontApi {
 | 
			
		||||
public:
 | 
			
		||||
  NFontApi();
 | 
			
		||||
  ~NFontApi();
 | 
			
		||||
  void LoadTTF(std::string path);
 | 
			
		||||
  unsigned char *GetGlyphBitmap(char glyph);
 | 
			
		||||
  std::string GetStatus() { return status; }
 | 
			
		||||
  float GetScale() { return scale; }
 | 
			
		||||
  int GetGlyphWidth(char glyph);
 | 
			
		||||
  int GetGlyphHeight(char glyph);
 | 
			
		||||
  int GetLineHeight() { return l_h; }
 | 
			
		||||
  int GetBaseHeight() { return height; }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  std::string status;
 | 
			
		||||
 | 
			
		||||
  int height;
 | 
			
		||||
 | 
			
		||||
  float scale;
 | 
			
		||||
  int b_w;
 | 
			
		||||
  int b_h;
 | 
			
		||||
  int l_h;
 | 
			
		||||
 | 
			
		||||
  int w;
 | 
			
		||||
  int h;
 | 
			
		||||
 | 
			
		||||
  int x0, y0, x1, y1;
 | 
			
		||||
  int ascent, baseline, decent, linegap;
 | 
			
		||||
 | 
			
		||||
  int linespace;
 | 
			
		||||
 | 
			
		||||
  stbtt_fontinfo font;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										52
									
								
								rd7tf/libs/include/renderd7/FunctionTrace.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,52 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
// Base includes
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
// 3ds does not support std::chrono
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
 | 
			
		||||
/// @brief 3ds System Ticks per milli second
 | 
			
		||||
#define TICKS_PER_MSEC 268111.856
 | 
			
		||||
 | 
			
		||||
#define f2s(x_) #x_
 | 
			
		||||
#define scomb(x1, x2) std::string(x1 + x2)
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Ftrace {
 | 
			
		||||
/// @brief Result of FTrace
 | 
			
		||||
struct FTRes {
 | 
			
		||||
  std::string group;     ///< Group of the Trace
 | 
			
		||||
  std::string func_name; ///< Function Name
 | 
			
		||||
 | 
			
		||||
  uint64_t time_start; ///< when started
 | 
			
		||||
  uint64_t time_end;   ///< when stopped
 | 
			
		||||
  float time_of;       ///< stop - start (how long)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief Map of Traces
 | 
			
		||||
extern std::map<std::string, RenderD7::Ftrace::FTRes> rd7_traces;
 | 
			
		||||
 | 
			
		||||
/// @brief Set a Start TracePoint
 | 
			
		||||
/// @param group Set a Group Name
 | 
			
		||||
/// @param func_name Set a Function Name
 | 
			
		||||
inline void Beg(std::string group, std::string func_name) {
 | 
			
		||||
  std::string trace_id = scomb(group, func_name);
 | 
			
		||||
  rd7_traces[trace_id].group = group;
 | 
			
		||||
  rd7_traces[trace_id].func_name = func_name;
 | 
			
		||||
  rd7_traces[trace_id].time_start = svcGetSystemTick();
 | 
			
		||||
}
 | 
			
		||||
/// @brief Set an End TracePoint
 | 
			
		||||
/// @param group Set a Group Name
 | 
			
		||||
/// @param func_name Set a Function Name
 | 
			
		||||
inline void End(std::string group, std::string func_name) {
 | 
			
		||||
  std::string trace_id = scomb(group, func_name);
 | 
			
		||||
  rd7_traces[trace_id].time_end = svcGetSystemTick();
 | 
			
		||||
  rd7_traces[trace_id].time_of = static_cast<float>(
 | 
			
		||||
      rd7_traces[trace_id].time_end / (float)TICKS_PER_MSEC -
 | 
			
		||||
      rd7_traces[trace_id].time_start / (float)TICKS_PER_MSEC);
 | 
			
		||||
}
 | 
			
		||||
} // namespace Ftrace
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										23
									
								
								rd7tf/libs/include/renderd7/Hardware.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,23 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Hardware {
 | 
			
		||||
/// @brief Initialisize required Services
 | 
			
		||||
void Initialisize();
 | 
			
		||||
/// @brief Check if Headphones are Plugged in
 | 
			
		||||
/// @return true if headphones plugged in
 | 
			
		||||
bool IsHeadphones();
 | 
			
		||||
/// @brief Check if the 3ds Is Charging
 | 
			
		||||
/// @return true if System gets Charged
 | 
			
		||||
bool IsCharging();
 | 
			
		||||
/// @brief Check the Battery Percentage
 | 
			
		||||
/// @return Persentage as float
 | 
			
		||||
float GetBatteryPercentage();
 | 
			
		||||
/// @brief Get current State of 3d Slider
 | 
			
		||||
/// @return current 3dslider poition
 | 
			
		||||
float Get3dSliderLevel();
 | 
			
		||||
/// @brief Get Current state of Sound Slider
 | 
			
		||||
/// @return current SoundSlider state
 | 
			
		||||
float GetSoundSliderLevel();
 | 
			
		||||
} // namespace Hardware
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										50
									
								
								rd7tf/libs/include/renderd7/Image.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,50 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Sheet.hpp>
 | 
			
		||||
#include <renderd7/bmp.hpp>
 | 
			
		||||
#include <renderd7/bmpconverter.hpp>
 | 
			
		||||
 | 
			
		||||
#include <cassert>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <renderd7/Color.hpp>
 | 
			
		||||
#include <renderd7/external/lodepng.h>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// Image Class
 | 
			
		||||
class Image {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  Image() {}
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~Image();
 | 
			
		||||
  /// @brief Unload The Image
 | 
			
		||||
  void Unload();
 | 
			
		||||
  /// Load Image from Png
 | 
			
		||||
  /// \param path path to png file
 | 
			
		||||
  void LoadPng(const std::string path);
 | 
			
		||||
  /// Load the Image from buffer
 | 
			
		||||
  /// \param buffer the frame buffer
 | 
			
		||||
  void LoadPFromBuffer(const std::vector<u8> &buffer);
 | 
			
		||||
  void LoadFromBitmap(BMP bitmap);
 | 
			
		||||
  void LoadJpg(std::string path);
 | 
			
		||||
  void LoadPixels(int w, int h, int bpp, void *buffer);
 | 
			
		||||
  /// Draw the Image directly
 | 
			
		||||
  /// \param x The x position
 | 
			
		||||
  /// \param y the y position
 | 
			
		||||
  /// \param scaleX x scale from 0.0 to 1.0
 | 
			
		||||
  /// \param scaleY y scale from 0.0 to 1.0
 | 
			
		||||
  bool Draw(float x, float y, float scaleX = 1.0f, float scaleY = 1.0f);
 | 
			
		||||
  /// \brief Get The Image
 | 
			
		||||
  /// \return C2D_Image
 | 
			
		||||
  C2D_Image Get() { return this->img; }
 | 
			
		||||
 | 
			
		||||
  void FromSheet(RenderD7::Sheet sheet, size_t index);
 | 
			
		||||
  /// \param img this is the C2D_Image
 | 
			
		||||
  C2D_Image img;
 | 
			
		||||
  /// \param loadet whether the image is loadet or not
 | 
			
		||||
  bool loadet = false;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										25
									
								
								rd7tf/libs/include/renderd7/Memory.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,25 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Memory {
 | 
			
		||||
/// @brief Metriks struct For the Internal Tracker
 | 
			
		||||
struct memory_metrics {
 | 
			
		||||
  uint32_t t_TotalAllocated = 0; ///< Total Allocated Memory
 | 
			
		||||
  uint32_t t_TotalFreed = 0;     ///< Total Deleted Memory
 | 
			
		||||
  /// @brief Gets the Currently Allocated Memory
 | 
			
		||||
  uint32_t t_CurrentlyAllocated() { return t_TotalAllocated - t_TotalFreed; }
 | 
			
		||||
};
 | 
			
		||||
/// @brief Get Total Allocated Memory
 | 
			
		||||
/// @return Total Allocated Memory
 | 
			
		||||
size_t GetTotalAllocated();
 | 
			
		||||
/// @brief Get Total Deleted Memory
 | 
			
		||||
/// @return Total Deleted Memory
 | 
			
		||||
size_t GetTotalFreed();
 | 
			
		||||
/// @brief Get Current Allocated Memory
 | 
			
		||||
/// @return Current Allocated Memory
 | 
			
		||||
size_t GetCurrent();
 | 
			
		||||
} // namespace Memory
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										64
									
								
								rd7tf/libs/include/renderd7/Ovarlays.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,64 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Ovl.hpp>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
class Ovl_Ftrace : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  Ovl_Ftrace();
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
};
 | 
			
		||||
class Ovl_UiBattery : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param percentage Percentage
 | 
			
		||||
  Ovl_UiBattery(float *percentage);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  float *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
class Ovl_UiSound : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param percentage Percentage
 | 
			
		||||
  Ovl_UiSound(float *percentage);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  float *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
class Ovl_Ui3d : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param percentage Percentage
 | 
			
		||||
  Ovl_Ui3d(float *percentage);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  float *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
class Ovl_UiWifi : public RenderD7::Ovl {
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param level strengh level
 | 
			
		||||
  Ovl_UiWifi(uint8_t *level);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  uint8_t *_pct_addr = 0;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										30
									
								
								rd7tf/libs/include/renderd7/Ovl.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <memory>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief The Overlay Class (Used for Toasts for example)
 | 
			
		||||
class Ovl {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  virtual ~Ovl() {}
 | 
			
		||||
  /// @brief Function Called to Draw this
 | 
			
		||||
  virtual void Draw() const = 0;
 | 
			
		||||
  /// @brief Logic of the Overlay
 | 
			
		||||
  virtual void Logic() = 0;
 | 
			
		||||
  /// @brief Should the overlay be killed
 | 
			
		||||
  /// @return Killed or Not
 | 
			
		||||
  inline bool IsKilled() { return this->iskilled; }
 | 
			
		||||
  /// @brief Kill The Overlay
 | 
			
		||||
  inline void Kill() { iskilled = true; }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param iskilled For IsKilled();
 | 
			
		||||
  bool iskilled = false;
 | 
			
		||||
};
 | 
			
		||||
/// @brief Add an Overlay to the Screen
 | 
			
		||||
/// @param scene Overlay to push to Screen
 | 
			
		||||
void AddOvl(std::unique_ptr<RenderD7::Ovl> scene);
 | 
			
		||||
/// @brief Add an Overlay to the Toast Stack
 | 
			
		||||
/// @param scene Overlay to push to Toast Stack
 | 
			
		||||
void AddToast(std::unique_ptr<RenderD7::Ovl> scene);
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										51
									
								
								rd7tf/libs/include/renderd7/ResultDecoder.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,51 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Decoder for 3ds Result Codes
 | 
			
		||||
class ResultDecoder {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  ResultDecoder() {}
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~ResultDecoder() {}
 | 
			
		||||
  /// @brief Load a Result into Decoder
 | 
			
		||||
  /// @param rescode Result Code
 | 
			
		||||
  void Load(Result rescode);
 | 
			
		||||
  /// @brief Load A Hex Converted Code into Decoder
 | 
			
		||||
  /// @param rescode Result-Hex Code
 | 
			
		||||
  void Load(std::string rescode);
 | 
			
		||||
  /// @brief Get Hex Code
 | 
			
		||||
  /// @return Hex-Code
 | 
			
		||||
  std::string GetCode();
 | 
			
		||||
  /// @brief Get Level Name
 | 
			
		||||
  /// @return Level Name
 | 
			
		||||
  std::string GetLevel();
 | 
			
		||||
  /// @brief Get Level Value
 | 
			
		||||
  /// @return Level Value
 | 
			
		||||
  int GetLevelInt();
 | 
			
		||||
  /// @brief Get The Mosule Name
 | 
			
		||||
  /// @return Module Name
 | 
			
		||||
  std::string GetModule();
 | 
			
		||||
  /// @brief Get The Module Value
 | 
			
		||||
  /// @return Module Value
 | 
			
		||||
  int GetModuleInt();
 | 
			
		||||
  /// @brief Get The Description
 | 
			
		||||
  /// @return Description
 | 
			
		||||
  std::string GetDescription();
 | 
			
		||||
  /// @brief Get The Description Valur
 | 
			
		||||
  /// @return Description Value
 | 
			
		||||
  int GetDescriptionInt();
 | 
			
		||||
  /// @brief Get the Summary
 | 
			
		||||
  /// @return Summary
 | 
			
		||||
  std::string GetSummary();
 | 
			
		||||
  /// @brief Get the Summary Value
 | 
			
		||||
  /// @return Summary Value
 | 
			
		||||
  int GetSummaryInt();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param m_rescode Result code
 | 
			
		||||
  Result m_rescode;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										16
									
								
								rd7tf/libs/include/renderd7/Screen.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,16 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
 | 
			
		||||
/// \param Top Tob-Screen Target
 | 
			
		||||
extern C3D_RenderTarget *Top;
 | 
			
		||||
/// \param TopRight Top-Right-Screen Target (Never atually used)
 | 
			
		||||
extern C3D_RenderTarget *TopRight;
 | 
			
		||||
/// \param Bottom Bottom-Screen Target
 | 
			
		||||
extern C3D_RenderTarget *Bottom;
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Begin Drawing On Specific Screen
 | 
			
		||||
/// @param target The Screen Target (Top, Bottom or TopTight)
 | 
			
		||||
void OnScreen(C3D_RenderTarget *target);
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										60
									
								
								rd7tf/libs/include/renderd7/Security.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,60 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Init {
 | 
			
		||||
void Security();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Security {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Security Levels
 | 
			
		||||
  enum Level {
 | 
			
		||||
    NONE,     ///< Do Completly Nothing (excludes FrameEnd Security)
 | 
			
		||||
    FULL,     ///< Display Every Reports even Success
 | 
			
		||||
    ERRORS,   ///< Display Only Errors
 | 
			
		||||
    WARNINGS, ///< Display Errors and Warnings
 | 
			
		||||
    LOG,      ///< Log Every Error with Detailed Information
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  Security();
 | 
			
		||||
  ~Security();
 | 
			
		||||
  /// @brief Report an Output (For SafeTraceInit)
 | 
			
		||||
  /// @param addr Adress of Pointer
 | 
			
		||||
  /// @param result_ptr Pointer to the result
 | 
			
		||||
  void Report(uint32_t addr, void *result_ptr);
 | 
			
		||||
  /// @brief Set the Security Level
 | 
			
		||||
  /// @param level Level to use
 | 
			
		||||
  void SetLevel(Level level);
 | 
			
		||||
  /// @brief Get Current Security Level
 | 
			
		||||
  /// @return Security Level
 | 
			
		||||
  Level GetLevel();
 | 
			
		||||
  /// @brief Call a Function at Program Crash/Exit
 | 
			
		||||
  /// @param exit_func Function to Call
 | 
			
		||||
  void SafeExit(void (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(void (*init_func)(), void (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(Result (*init_func)(), void (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(void (*init_func)(), Result (*exit_func)());
 | 
			
		||||
  /// @brief SaveInit a Function and define a Exit Func
 | 
			
		||||
  /// @param init_func Init Function
 | 
			
		||||
  /// @param exit_func Exit Function
 | 
			
		||||
  void SafeInit(Result (*init_func)(), Result (*exit_func)());
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
 | 
			
		||||
/// @brief RenderD7 Security Object
 | 
			
		||||
extern RenderD7::Security *rd7_security;
 | 
			
		||||
							
								
								
									
										22
									
								
								rd7tf/libs/include/renderd7/Sheet.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief SpriteSheet Class
 | 
			
		||||
class Sheet {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  Sheet();
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~Sheet();
 | 
			
		||||
  /// @brief Load A Spritesheet File
 | 
			
		||||
  /// @param path Path to the t3x
 | 
			
		||||
  /// @return Result Code
 | 
			
		||||
  Result Load(const char *path);
 | 
			
		||||
  /// @brief Unload the Sheet
 | 
			
		||||
  void Free();
 | 
			
		||||
  /// \param spritesheet The Sheet
 | 
			
		||||
  C2D_SpriteSheet spritesheet;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										64
									
								
								rd7tf/libs/include/renderd7/Sprite.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,64 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Image.hpp>
 | 
			
		||||
#include <renderd7/Sheet.hpp>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Sprite Class
 | 
			
		||||
class Sprite {
 | 
			
		||||
public:
 | 
			
		||||
  /// \brief Construct Sprite
 | 
			
		||||
  Sprite();
 | 
			
		||||
  /// \brief Deconstruct Sprite
 | 
			
		||||
  ~Sprite();
 | 
			
		||||
  /// \brief Load a Sprite From SpriteSheet
 | 
			
		||||
  /// \param sheet the Sheet to load from.(RenderD7::Sheet)
 | 
			
		||||
  /// \param index the number of the Sprite in the Sheet
 | 
			
		||||
  void FromSheet(RenderD7::Sheet *sheet, size_t index);
 | 
			
		||||
  /// \brief Load a Sprite From SpriteSheet
 | 
			
		||||
  /// \param img the Image to load from.(RenderD7::Image)
 | 
			
		||||
  void FromImage(RenderD7::Image *img);
 | 
			
		||||
  /// @brief Draw the Sprite
 | 
			
		||||
  /// @return success ?
 | 
			
		||||
  bool Draw();
 | 
			
		||||
  /// @brief Set the Center Position
 | 
			
		||||
  /// @param x X Pos
 | 
			
		||||
  /// @param y Y Pos
 | 
			
		||||
  void SetCenter(float x, float y);
 | 
			
		||||
  /// @brief Set the Sprite's Position
 | 
			
		||||
  /// @param x X Pos
 | 
			
		||||
  /// @param y Y Pos
 | 
			
		||||
  void SetPos(float x, float y);
 | 
			
		||||
  /// @brief Set The Sprite's Scale
 | 
			
		||||
  /// @param x Scale on X-Axis
 | 
			
		||||
  /// @param y Scale on Y-Axis
 | 
			
		||||
  void SetScale(float x, float y);
 | 
			
		||||
  /// @brief Set the Sprite's Rotation
 | 
			
		||||
  /// @param rotation ratation
 | 
			
		||||
  void SetRotation(float rotation);
 | 
			
		||||
  /// @brief Rotate the Sprite
 | 
			
		||||
  /// @param speed Speed to Rotate
 | 
			
		||||
  void Rotate(float speed);
 | 
			
		||||
  /// @brief Get Tje Sprite's Width
 | 
			
		||||
  /// @return Width
 | 
			
		||||
  float getWidth();
 | 
			
		||||
  /// @brief Get the Sprite's Height
 | 
			
		||||
  /// @return Height
 | 
			
		||||
  float getHeight();
 | 
			
		||||
  /// @brief Get The Sprite's X Position
 | 
			
		||||
  /// @return X Position
 | 
			
		||||
  float getPosX();
 | 
			
		||||
  /// @brief Get the Sprite's Y Position
 | 
			
		||||
  /// @return Y Position
 | 
			
		||||
  float getPosY();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param tint ImageTint (unused)
 | 
			
		||||
  C2D_ImageTint tint;
 | 
			
		||||
  /// @param sprite The Sprite
 | 
			
		||||
  C2D_Sprite sprite;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										41
									
								
								rd7tf/libs/include/renderd7/SpriteAnimation.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,41 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <renderd7/Sheet.hpp>
 | 
			
		||||
#include <renderd7/Sprite.hpp>
 | 
			
		||||
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief SpriteSheetAnimation Class
 | 
			
		||||
class SpriteSheetAnimation : public RenderD7::Sprite {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  SpriteSheetAnimation();
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~SpriteSheetAnimation();
 | 
			
		||||
  /// @brief Setup an Animation
 | 
			
		||||
  /// @param sheet Input Spritesheet
 | 
			
		||||
  /// @param imagecount Count of Images
 | 
			
		||||
  /// @param startimage Where to Start the Loop
 | 
			
		||||
  /// @param frame_begin Current Time (Should be 0)
 | 
			
		||||
  /// @param frame_finish Time Length
 | 
			
		||||
  void Setup(RenderD7::Sheet *sheet, size_t imagecount, size_t startimage,
 | 
			
		||||
             float frame_begin, float frame_finish);
 | 
			
		||||
  /// @brief Play the Animation
 | 
			
		||||
  /// @param timespeed Speed of the animation
 | 
			
		||||
  void Play(float timespeed);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param images Count of Images
 | 
			
		||||
  size_t images;
 | 
			
		||||
  /// @param imgs Another Count of images ???
 | 
			
		||||
  size_t imgs = 0;
 | 
			
		||||
  /// @param D_totaltime Current Time
 | 
			
		||||
  float D_totaltime;
 | 
			
		||||
  /// @param sheet The Sheet of Images
 | 
			
		||||
  RenderD7::Sheet *sheet;
 | 
			
		||||
  /// @param time Total Time from frame_finish
 | 
			
		||||
  float time;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										21
									
								
								rd7tf/libs/include/renderd7/StealConsole.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief StealConsole Class
 | 
			
		||||
class StealConsole {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  StealConsole();
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~StealConsole();
 | 
			
		||||
  /// @brief The Stolen Stdout
 | 
			
		||||
  /// @return Stdout as string
 | 
			
		||||
  std::string GetStdout();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param stolen_stdout Stolen Stdout
 | 
			
		||||
  std::stringstream stolen_stdout;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										13
									
								
								rd7tf/libs/include/renderd7/Tasks.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,13 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Tasks {
 | 
			
		||||
/// @brief Push A Task
 | 
			
		||||
/// @param entrypoint Function of Your Task
 | 
			
		||||
void create(ThreadFunc entrypoint);
 | 
			
		||||
/// @brief Destroy all Tasks
 | 
			
		||||
void destroy(void);
 | 
			
		||||
} // namespace Tasks
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										13
									
								
								rd7tf/libs/include/renderd7/Time.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,13 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Format a String
 | 
			
		||||
/// @param fmt_str Format To
 | 
			
		||||
/// @param ... Additional Args
 | 
			
		||||
/// @return Formatted String
 | 
			
		||||
std::string FormatString(std::string fmt_str, ...);
 | 
			
		||||
/// @brief Get Current Time as String
 | 
			
		||||
/// @return Time-String
 | 
			
		||||
std::string GetTimeStr(void);
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										30
									
								
								rd7tf/libs/include/renderd7/Toast.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <renderd7/BitmapPrinter.hpp>
 | 
			
		||||
#include <renderd7/Color.hpp>
 | 
			
		||||
#include <renderd7/Image.hpp>
 | 
			
		||||
#include <renderd7/Ovl.hpp>
 | 
			
		||||
#include <renderd7/Screen.hpp>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Toast Class
 | 
			
		||||
class Toast : public RenderD7::Ovl {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  /// @param head Displayed String in Head
 | 
			
		||||
  /// @param msg Displayed String in Message Box
 | 
			
		||||
  Toast(std::string head, std::string msg);
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param head The Header Text
 | 
			
		||||
  /// @param nsg The Message-Box Text
 | 
			
		||||
  std::string head, msg;
 | 
			
		||||
  /// @param msgposy Position Y of The Toast
 | 
			
		||||
  int msgposy = 240;
 | 
			
		||||
  /// @param delay Delay of the Toast
 | 
			
		||||
  int delay = 0;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										5
									
								
								rd7tf/libs/include/renderd7/battery_icons.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
extern unsigned char battery_icons[];
 | 
			
		||||
extern size_t battery_icons_size;
 | 
			
		||||
							
								
								
									
										707
									
								
								rd7tf/libs/include/renderd7/bmp.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,707 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <stdexcept>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
#pragma pack(push, 1)
 | 
			
		||||
 | 
			
		||||
struct BMPFileHeader {
 | 
			
		||||
  uint16_t file_type{0x4D42}; // File type always BM which is 0x4D42 (stored as
 | 
			
		||||
                              // hex uint16_t in little endian)
 | 
			
		||||
  uint32_t file_size{0};      // Size of the file (in bytes)
 | 
			
		||||
  uint16_t reserved1{0};      // Reserved, always 0
 | 
			
		||||
  uint16_t reserved2{0};      // Reserved, always 0
 | 
			
		||||
  uint32_t offset_data{
 | 
			
		||||
      0}; // Start position of pixel data (bytes from the beginning of the file)
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct BMPInfoHeader {
 | 
			
		||||
  uint32_t size{0}; // Size of this header (in bytes)
 | 
			
		||||
  int32_t width{0}; // width of bitmap in pixels
 | 
			
		||||
  int32_t height{
 | 
			
		||||
      0}; // height of bitmap in pixels
 | 
			
		||||
          //       (if positive, bottom-up, with origin in lower left corner)
 | 
			
		||||
          //       (if negative, top-down, with origin in upper left corner)
 | 
			
		||||
  uint16_t planes{1}; // No. of planes for the target device, this is always 1
 | 
			
		||||
  uint16_t bit_count{0};   // No. of bits per pixel
 | 
			
		||||
  uint32_t compression{0}; // 0 or 3 - uncompressed. THIS PROGRAM CONSIDERS ONLY
 | 
			
		||||
                           // UNCOMPRESSED BMP images
 | 
			
		||||
  uint32_t size_image{0};  // 0 - for uncompressed images
 | 
			
		||||
  int32_t x_pixels_per_meter{0};
 | 
			
		||||
  int32_t y_pixels_per_meter{0};
 | 
			
		||||
  uint32_t colors_used{0}; // No. color indexes in the color table. Use 0 for
 | 
			
		||||
                           // the max number of colors allowed by bit_count
 | 
			
		||||
  uint32_t colors_important{0}; // No. of colors used for displaying the bitmap.
 | 
			
		||||
                                // If 0 all colors are required
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct BMPColorHeader {
 | 
			
		||||
  uint32_t red_mask{0x00ff0000};         // Bit mask for the red channel
 | 
			
		||||
  uint32_t green_mask{0x0000ff00};       // Bit mask for the green channel
 | 
			
		||||
  uint32_t blue_mask{0x000000ff};        // Bit mask for the blue channel
 | 
			
		||||
  uint32_t alpha_mask{0xff000000};       // Bit mask for the alpha channel
 | 
			
		||||
  uint32_t color_space_type{0x73524742}; // Default "sRGB" (0x73524742)
 | 
			
		||||
  uint32_t unused[16]{0};                // Unused data for sRGB color space
 | 
			
		||||
};
 | 
			
		||||
#pragma pack(pop)
 | 
			
		||||
 | 
			
		||||
class BMP {
 | 
			
		||||
public:
 | 
			
		||||
  BMPFileHeader file_header;
 | 
			
		||||
  BMPInfoHeader bmp_info_header;
 | 
			
		||||
  BMPColorHeader bmp_color_header;
 | 
			
		||||
  std::vector<uint8_t> data;
 | 
			
		||||
 | 
			
		||||
  BMP(const char *fname) { read(fname); }
 | 
			
		||||
 | 
			
		||||
  int read(const char *fname) {
 | 
			
		||||
    std::ifstream inp{fname, std::ios_base::binary};
 | 
			
		||||
    if (inp) {
 | 
			
		||||
      inp.read((char *)&file_header, sizeof(file_header));
 | 
			
		||||
      if (file_header.file_type != 0x4D42) {
 | 
			
		||||
 | 
			
		||||
        return 50;
 | 
			
		||||
        // throw std::runtime_error("Error! Unrecognized file format.");
 | 
			
		||||
      }
 | 
			
		||||
      inp.read((char *)&bmp_info_header, sizeof(bmp_info_header));
 | 
			
		||||
 | 
			
		||||
      // The BMPColorHeader is used only for transparent images
 | 
			
		||||
      if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
        // Check if the file has bit mask color information
 | 
			
		||||
        if (bmp_info_header.size >=
 | 
			
		||||
            (sizeof(BMPInfoHeader) + sizeof(BMPColorHeader))) {
 | 
			
		||||
          inp.read((char *)&bmp_color_header, sizeof(bmp_color_header));
 | 
			
		||||
          // Check if the pixel data is stored as BGRA and if the color space
 | 
			
		||||
          // type is sRGB
 | 
			
		||||
          check_color_header(bmp_color_header);
 | 
			
		||||
        } else {
 | 
			
		||||
          // std::cerr << "Error! The file \"" << fname << "\" does not seem to
 | 
			
		||||
          // contain bit mask information\n"; return 51;//throw
 | 
			
		||||
          // std::runtime_error("Error! Unrecognized file format.");
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Jump to the pixel data location
 | 
			
		||||
      inp.seekg(file_header.offset_data, inp.beg);
 | 
			
		||||
 | 
			
		||||
      // Adjust the header fields for output.
 | 
			
		||||
      // Some editors will put extra info in the image file, we only save the
 | 
			
		||||
      // headers and the data.
 | 
			
		||||
      if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
        bmp_info_header.size = sizeof(BMPInfoHeader) + sizeof(BMPColorHeader);
 | 
			
		||||
        file_header.offset_data = sizeof(BMPFileHeader) +
 | 
			
		||||
                                  sizeof(BMPInfoHeader) +
 | 
			
		||||
                                  sizeof(BMPColorHeader);
 | 
			
		||||
      } else {
 | 
			
		||||
        bmp_info_header.size = sizeof(BMPInfoHeader);
 | 
			
		||||
        file_header.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader);
 | 
			
		||||
      }
 | 
			
		||||
      file_header.file_size = file_header.offset_data;
 | 
			
		||||
 | 
			
		||||
      if (bmp_info_header.height < 0) {
 | 
			
		||||
        return 52; // throw std::runtime_error("The program can treat only BMP
 | 
			
		||||
                   // images with the origin in the bottom left corner!");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      data.resize(bmp_info_header.width * bmp_info_header.height *
 | 
			
		||||
                  bmp_info_header.bit_count / 8);
 | 
			
		||||
 | 
			
		||||
      // Here we check if we need to take into account row padding
 | 
			
		||||
      if (bmp_info_header.width % 4 == 0) {
 | 
			
		||||
        inp.read((char *)data.data(), data.size());
 | 
			
		||||
        file_header.file_size += static_cast<uint32_t>(data.size());
 | 
			
		||||
      } else {
 | 
			
		||||
        row_stride = bmp_info_header.width * bmp_info_header.bit_count / 8;
 | 
			
		||||
        uint32_t new_stride = make_stride_aligned(4);
 | 
			
		||||
        std::vector<uint8_t> padding_row(new_stride - row_stride);
 | 
			
		||||
 | 
			
		||||
        for (int y = 0; y < bmp_info_header.height; ++y) {
 | 
			
		||||
          inp.read((char *)(data.data() + row_stride * y), row_stride);
 | 
			
		||||
          inp.read((char *)padding_row.data(), padding_row.size());
 | 
			
		||||
        }
 | 
			
		||||
        file_header.file_size +=
 | 
			
		||||
            static_cast<uint32_t>(data.size()) +
 | 
			
		||||
            bmp_info_header.height * static_cast<uint32_t>(padding_row.size());
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      return 53; // throw std::runtime_error("Unable to open the input image
 | 
			
		||||
                 // file   "+std::string(fname));
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  int read_mem(std::vector<unsigned char> buffer) {
 | 
			
		||||
    std::stringstream inp;
 | 
			
		||||
    std::copy(buffer.begin(), buffer.end(),
 | 
			
		||||
              std::ostream_iterator<unsigned char>(inp, "\n"));
 | 
			
		||||
    std::cout << buffer.size() << std::endl;
 | 
			
		||||
    if (inp) {
 | 
			
		||||
      inp.read((char *)&file_header, sizeof(file_header));
 | 
			
		||||
      if (file_header.file_type != 0x4D42) {
 | 
			
		||||
 | 
			
		||||
        return 50;
 | 
			
		||||
        // throw std::runtime_error("Error! Unrecognized file format. Header " +
 | 
			
		||||
        //                          std::to_string(file_header.file_type));
 | 
			
		||||
      }
 | 
			
		||||
      inp.read((char *)&bmp_info_header, sizeof(bmp_info_header));
 | 
			
		||||
 | 
			
		||||
      // The BMPColorHeader is used only for transparent images
 | 
			
		||||
      if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
        // Check if the file has bit mask color information
 | 
			
		||||
        if (bmp_info_header.size >=
 | 
			
		||||
            (sizeof(BMPInfoHeader) + sizeof(BMPColorHeader))) {
 | 
			
		||||
          inp.read((char *)&bmp_color_header, sizeof(bmp_color_header));
 | 
			
		||||
          // Check if the pixel data is stored as BGRA and if the color space
 | 
			
		||||
          // type is sRGB
 | 
			
		||||
          check_color_header(bmp_color_header);
 | 
			
		||||
        } else {
 | 
			
		||||
          // std::cerr << "Error! The file \"" << fname << "\" does not seem to
 | 
			
		||||
          // contain bit mask information\n";
 | 
			
		||||
          return 51;
 | 
			
		||||
          // throw std::runtime_error("Error! Unrecognized file format. Size");
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // Jump to the pixel data location
 | 
			
		||||
      inp.seekg(file_header.offset_data, inp.beg);
 | 
			
		||||
 | 
			
		||||
      // Adjust the header fields for output.
 | 
			
		||||
      // Some editors will put extra info in the image file, we only save the
 | 
			
		||||
      // headers and the data.
 | 
			
		||||
      if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
        bmp_info_header.size = sizeof(BMPInfoHeader) + sizeof(BMPColorHeader);
 | 
			
		||||
        file_header.offset_data = sizeof(BMPFileHeader) +
 | 
			
		||||
                                  sizeof(BMPInfoHeader) +
 | 
			
		||||
                                  sizeof(BMPColorHeader);
 | 
			
		||||
      } else {
 | 
			
		||||
        bmp_info_header.size = sizeof(BMPInfoHeader);
 | 
			
		||||
        file_header.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader);
 | 
			
		||||
      }
 | 
			
		||||
      file_header.file_size = file_header.offset_data;
 | 
			
		||||
 | 
			
		||||
      if (bmp_info_header.height < 0) {
 | 
			
		||||
        return 52;
 | 
			
		||||
        // throw std::runtime_error("The program can treat only BMP images with
 | 
			
		||||
        // "
 | 
			
		||||
        //                          "the origin in the bottom left corner!");
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      data.resize(bmp_info_header.width * bmp_info_header.height *
 | 
			
		||||
                  bmp_info_header.bit_count / 8);
 | 
			
		||||
 | 
			
		||||
      // Here we check if we need to take into account row padding
 | 
			
		||||
      if (bmp_info_header.width % 4 == 0) {
 | 
			
		||||
        inp.read((char *)data.data(), data.size());
 | 
			
		||||
        file_header.file_size += static_cast<uint32_t>(data.size());
 | 
			
		||||
      } else {
 | 
			
		||||
        row_stride = bmp_info_header.width * bmp_info_header.bit_count / 8;
 | 
			
		||||
        uint32_t new_stride = make_stride_aligned(4);
 | 
			
		||||
        std::vector<uint8_t> padding_row(new_stride - row_stride);
 | 
			
		||||
 | 
			
		||||
        for (int y = 0; y < bmp_info_header.height; ++y) {
 | 
			
		||||
          inp.read((char *)(data.data() + row_stride * y), row_stride);
 | 
			
		||||
          inp.read((char *)padding_row.data(), padding_row.size());
 | 
			
		||||
        }
 | 
			
		||||
        file_header.file_size +=
 | 
			
		||||
            static_cast<uint32_t>(data.size()) +
 | 
			
		||||
            bmp_info_header.height * static_cast<uint32_t>(padding_row.size());
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      return 53;
 | 
			
		||||
      // throw std::runtime_error("Unable to open the input image buffer");
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  BMP(int32_t width, int32_t height, bool has_alpha = true) {
 | 
			
		||||
    if (width <= 0 || height <= 0) {
 | 
			
		||||
      width = 1;
 | 
			
		||||
      height = 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    bmp_info_header.width = width;
 | 
			
		||||
    bmp_info_header.height = height;
 | 
			
		||||
    if (has_alpha) {
 | 
			
		||||
      bmp_info_header.size = sizeof(BMPInfoHeader) + sizeof(BMPColorHeader);
 | 
			
		||||
      file_header.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader) +
 | 
			
		||||
                                sizeof(BMPColorHeader);
 | 
			
		||||
 | 
			
		||||
      bmp_info_header.bit_count = 32;
 | 
			
		||||
      bmp_info_header.compression = 3;
 | 
			
		||||
      row_stride = width * 4;
 | 
			
		||||
      data.resize(row_stride * height);
 | 
			
		||||
      file_header.file_size = file_header.offset_data + data.size();
 | 
			
		||||
    } else {
 | 
			
		||||
      bmp_info_header.size = sizeof(BMPInfoHeader);
 | 
			
		||||
      file_header.offset_data = sizeof(BMPFileHeader) + sizeof(BMPInfoHeader);
 | 
			
		||||
 | 
			
		||||
      bmp_info_header.bit_count = 24;
 | 
			
		||||
      bmp_info_header.compression = 0;
 | 
			
		||||
      row_stride = width * 3;
 | 
			
		||||
      data.resize(row_stride * height);
 | 
			
		||||
 | 
			
		||||
      uint32_t new_stride = make_stride_aligned(4);
 | 
			
		||||
      file_header.file_size =
 | 
			
		||||
          file_header.offset_data + static_cast<uint32_t>(data.size()) +
 | 
			
		||||
          bmp_info_header.height * (new_stride - row_stride);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  unsigned write(const char *fname) {
 | 
			
		||||
    std::ofstream of{fname, std::ios_base::binary};
 | 
			
		||||
    if (of) {
 | 
			
		||||
      if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
        write_headers_and_data(of);
 | 
			
		||||
      } else if (bmp_info_header.bit_count == 24) {
 | 
			
		||||
        if (bmp_info_header.width % 4 == 0) {
 | 
			
		||||
          write_headers_and_data(of);
 | 
			
		||||
        } else {
 | 
			
		||||
          uint32_t new_stride = make_stride_aligned(4);
 | 
			
		||||
          std::vector<uint8_t> padding_row(new_stride - row_stride);
 | 
			
		||||
 | 
			
		||||
          write_headers(of);
 | 
			
		||||
 | 
			
		||||
          for (int y = 0; y < bmp_info_header.height; ++y) {
 | 
			
		||||
            of.write((const char *)(data.data() + row_stride * y), row_stride);
 | 
			
		||||
            of.write((const char *)padding_row.data(), padding_row.size());
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        return 54; // throw std::runtime_error("The program can treat only 24 or
 | 
			
		||||
                   // 32 bits per pixel BMP files");
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      return 55; // throw std::runtime_error("Unable to open the output image
 | 
			
		||||
                 // file.");
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  std::vector<unsigned char> DATA() {
 | 
			
		||||
    std::stringstream ss;
 | 
			
		||||
    if (ss) {
 | 
			
		||||
      if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
        write_headers_and_datass(ss);
 | 
			
		||||
      } else if (bmp_info_header.bit_count == 24) {
 | 
			
		||||
        if (bmp_info_header.width % 4 == 0) {
 | 
			
		||||
          write_headers_and_datass(ss);
 | 
			
		||||
        } else {
 | 
			
		||||
          uint32_t new_stride = make_stride_aligned(4);
 | 
			
		||||
          std::vector<uint8_t> padding_row(new_stride - row_stride);
 | 
			
		||||
 | 
			
		||||
          write_headersss(ss);
 | 
			
		||||
 | 
			
		||||
          for (int y = 0; y < bmp_info_header.height; ++y) {
 | 
			
		||||
            ss.write((const char *)(data.data() + row_stride * y), row_stride);
 | 
			
		||||
            ss.write((const char *)padding_row.data(), padding_row.size());
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
    }
 | 
			
		||||
    std::string test11 = ss.str();
 | 
			
		||||
    std::vector<unsigned char> test12(test11.begin(), test11.end());
 | 
			
		||||
    return test12;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  unsigned fill_region(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h,
 | 
			
		||||
                       uint8_t B, uint8_t G, uint8_t R, uint8_t A) {
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
      for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
        /*if (x + w > (uint32_t)bmp_info_header.width || y + h >
 | 
			
		||||
        (uint32_t)bmp_info_header.height) {
 | 
			
		||||
            //
 | 
			
		||||
        }*/
 | 
			
		||||
        // else{
 | 
			
		||||
        data[channels * (y * bmp_info_header.width + x) + 0] = B;
 | 
			
		||||
        data[channels * (y * bmp_info_header.width + x) + 1] = G;
 | 
			
		||||
        data[channels * (y * bmp_info_header.width + x) + 2] = R;
 | 
			
		||||
        if (channels == 4) {
 | 
			
		||||
          data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
        }
 | 
			
		||||
        //}
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void fill_region_df(uint32_t x1, uint32_t y1, uint32_t w, uint32_t h,
 | 
			
		||||
                      uint8_t B, uint8_t G, uint8_t R, uint8_t A) {
 | 
			
		||||
 | 
			
		||||
    int x0 = x1;
 | 
			
		||||
    int y0 = this->bmp_info_header.height - y1 - h;
 | 
			
		||||
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
      for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
        if ((x + w < (uint32_t)bmp_info_header.width) ||
 | 
			
		||||
            this->bmp_info_header.height - y - h > 0) {
 | 
			
		||||
 | 
			
		||||
          data[channels * (y * bmp_info_header.width + x) + 0] = B;
 | 
			
		||||
          data[channels * (y * bmp_info_header.width + x) + 1] = G;
 | 
			
		||||
          data[channels * (y * bmp_info_header.width + x) + 2] = R;
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void manipulate_region(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h,
 | 
			
		||||
                         uint8_t A) {
 | 
			
		||||
    int choice, choice2, intensity;
 | 
			
		||||
    cout << "What color do you want to change? " << endl;
 | 
			
		||||
    cout << "Enter 1 for Blue, 2 for Green, 3 for Red " << endl;
 | 
			
		||||
    cin >> choice;
 | 
			
		||||
    cout << "To what color do you want to change it too?" << endl;
 | 
			
		||||
    cout << "Enter 1 for Blue, 2 for Green, 3 for Red " << endl;
 | 
			
		||||
    cin >> choice2;
 | 
			
		||||
    cout << "Enter the intensity of the color. (From 0 to 255) " << endl;
 | 
			
		||||
    cin >> intensity;
 | 
			
		||||
    if (x0 + w > (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y0 + h > (uint32_t)bmp_info_header.height) {
 | 
			
		||||
      return; // throw std::runtime_error("The region does not fit in the
 | 
			
		||||
              // image!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    if (choice == 1 && choice2 == 1) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make blue thing blue
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 0] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 0] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = intensity;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = 0;
 | 
			
		||||
          }
 | 
			
		||||
          // data[channels * (y * bmp_info_header.width + x) + 0] = B;
 | 
			
		||||
          // data[channels * (y * bmp_info_header.width + x) + 1] = G;
 | 
			
		||||
          // data[channels * (y * bmp_info_header.width + x) + 2] = R;
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 1 && choice2 == 2) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make blue thing green
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 0] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 0] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = intensity;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = 0;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 1 && choice2 == 3) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make blue thing red
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 0] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 0] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = intensity;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 2 && choice2 == 1) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make green thing blue
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 1] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 1] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = intensity;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = 0;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 2 && choice2 == 2) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make green thing green
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 1] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 1] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = intensity;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = 0;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 2 && choice2 == 3) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make green thing red
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 1] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 1] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = intensity;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 3 && choice2 == 1) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make red thing blue
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 2] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 2] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = intensity;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = 0;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 3 && choice2 == 2) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make red thing green
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 2] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 2] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = intensity;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = 0;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (choice == 3 && choice2 == 3) {
 | 
			
		||||
      for (uint32_t y = y0; y < y0 + h; ++y) {
 | 
			
		||||
        for (uint32_t x = x0; x < x0 + w; ++x) {
 | 
			
		||||
          cout << channels * (y * bmp_info_header.width + x) << endl;
 | 
			
		||||
          // Make red thing blue
 | 
			
		||||
          if (data[channels * (y * bmp_info_header.width + x) + 2] > 80 &&
 | 
			
		||||
              data[channels * (y * bmp_info_header.width + x) + 2] < 255) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 0] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 1] = 0;
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 2] = intensity;
 | 
			
		||||
          }
 | 
			
		||||
          if (channels == 4) {
 | 
			
		||||
            data[channels * (y * bmp_info_header.width + x) + 3] = A;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  unsigned set_pixel(uint32_t x0, uint32_t y0, uint8_t B, uint8_t G, uint8_t R,
 | 
			
		||||
                     uint8_t A) {
 | 
			
		||||
    if (x0 >= (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y0 >= (uint32_t)bmp_info_header.height || x0 < 0 || y0 < 0) {
 | 
			
		||||
      return 59;
 | 
			
		||||
      // std::string errr = "The point is outside the image boundaries! -> " +
 | 
			
		||||
      // std::to_string(x0) + "," + std::to_string(y0); throw
 | 
			
		||||
      // std::runtime_error(errr);
 | 
			
		||||
    }
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    data[channels * (y0 * bmp_info_header.width + x0) + 0] = B;
 | 
			
		||||
    data[channels * (y0 * bmp_info_header.width + x0) + 1] = G;
 | 
			
		||||
    data[channels * (y0 * bmp_info_header.width + x0) + 2] = R;
 | 
			
		||||
    if (channels == 4) {
 | 
			
		||||
      data[channels * (y0 * bmp_info_header.width + x0) + 3] = A;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void set_pixel_df(uint32_t x0, uint32_t y0, uint8_t B, uint8_t G, uint8_t R,
 | 
			
		||||
                    uint8_t A) {
 | 
			
		||||
    uint32_t y1 = this->bmp_info_header.height - y0;
 | 
			
		||||
    if (x0 >= (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y1 <= (uint32_t)bmp_info_header.width || x0 < 0 || y0 > 0) {
 | 
			
		||||
      return;
 | 
			
		||||
      // throw std::runtime_error("The point is outside the image boundaries! ->
 | 
			
		||||
      // " + std::to_string(x0) + "," + std::to_string(y1));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    data[channels * (y0 * bmp_info_header.width + x0) + 0] = B;
 | 
			
		||||
    data[channels * (y0 * bmp_info_header.width + x0) + 1] = G;
 | 
			
		||||
    data[channels * (y0 * bmp_info_header.width + x0) + 2] = R;
 | 
			
		||||
    if (channels == 4) {
 | 
			
		||||
      data[channels * (y0 * bmp_info_header.width + x0) + 3] = A;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  uint32_t get_pixel(uint32_t x0, uint32_t y0) {
 | 
			
		||||
    if (x0 >= (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y0 >= (uint32_t)bmp_info_header.height || x0 < 0 || y0 < 0) {
 | 
			
		||||
      return 59; // throw std::runtime_error("The point is outside the image
 | 
			
		||||
                 // boundaries!");
 | 
			
		||||
    }
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    uint32_t outcol = 0;
 | 
			
		||||
    uint8_t red = 0;
 | 
			
		||||
    uint8_t green = 0;
 | 
			
		||||
    uint8_t blue = 0;
 | 
			
		||||
    uint8_t alpha = 255;
 | 
			
		||||
    blue = data[channels * (y0 * bmp_info_header.width + x0) + 0];
 | 
			
		||||
    green = data[channels * (y0 * bmp_info_header.width + x0) + 1];
 | 
			
		||||
    red = data[channels * (y0 * bmp_info_header.width + x0) + 2];
 | 
			
		||||
    if (channels == 4) {
 | 
			
		||||
      alpha = data[channels * (y0 * bmp_info_header.width + x0) + 3];
 | 
			
		||||
    }
 | 
			
		||||
    outcol = ((red << 24) | (green << 16) | (blue << 8) | alpha);
 | 
			
		||||
    return outcol;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  uint32_t get_pixel_df(uint32_t x0, uint32_t y0) {
 | 
			
		||||
    uint32_t y1 = this->bmp_info_header.height - y0;
 | 
			
		||||
    if (x0 >= (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y1 <= (uint32_t)bmp_info_header.width || x0 < 0 || y0 > 0) {
 | 
			
		||||
      return 0; // throw std::runtime_error("The point is outside the image
 | 
			
		||||
                // boundaries!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    uint32_t channels = bmp_info_header.bit_count / 8;
 | 
			
		||||
    uint32_t outcol = 0;
 | 
			
		||||
    uint8_t red = 0;
 | 
			
		||||
    uint8_t green = 0;
 | 
			
		||||
    uint8_t blue = 0;
 | 
			
		||||
    uint8_t alpha = 255;
 | 
			
		||||
    blue = data[channels * (y0 * bmp_info_header.width + x0) + 0];
 | 
			
		||||
    green = data[channels * (y0 * bmp_info_header.width + x0) + 1];
 | 
			
		||||
    red = data[channels * (y0 * bmp_info_header.width + x0) + 2];
 | 
			
		||||
    if (channels == 4) {
 | 
			
		||||
      alpha = data[channels * (y0 * bmp_info_header.width + x0) + 3];
 | 
			
		||||
    }
 | 
			
		||||
    outcol = ((red << 24) | (green << 16) | (blue << 8) | alpha);
 | 
			
		||||
    return outcol;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  unsigned draw_rectangle(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h,
 | 
			
		||||
                          uint8_t B, uint8_t G, uint8_t R, uint8_t A,
 | 
			
		||||
                          uint8_t line_w) {
 | 
			
		||||
    if (x0 + w > (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y0 + h > (uint32_t)bmp_info_header.height) {
 | 
			
		||||
      return 59; // throw std::runtime_error("The rectangle does not fit in the
 | 
			
		||||
                 // image!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fill_region(x0, y0, w, line_w, B, G, R, A);                // top line
 | 
			
		||||
    fill_region(x0, (y0 + h - line_w), w, line_w, B, G, R, A); // bottom line
 | 
			
		||||
    fill_region((x0 + w - line_w), (y0 + line_w), line_w, (h - (2 * line_w)), B,
 | 
			
		||||
                G, R, A); // right line
 | 
			
		||||
    fill_region(x0, (y0 + line_w), line_w, (h - (2 * line_w)), B, G, R,
 | 
			
		||||
                A); // left line
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void draw_rectangle_df(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h,
 | 
			
		||||
                         uint8_t B, uint8_t G, uint8_t R, uint8_t A,
 | 
			
		||||
                         uint8_t line_w) {
 | 
			
		||||
    if (x0 + w > (uint32_t)bmp_info_header.width ||
 | 
			
		||||
        y0 + h > (uint32_t)bmp_info_header.height) {
 | 
			
		||||
      return; // throw std::runtime_error("The rectangle does not fit in the
 | 
			
		||||
              // image!");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fill_region_df(x0, y0, w, line_w, B, G, R, A);                // top line
 | 
			
		||||
    fill_region_df(x0, (y0 + h - line_w), w, line_w, B, G, R, A); // bottom line
 | 
			
		||||
    fill_region_df((x0 + w - line_w), (y0 + line_w), line_w, (h - (2 * line_w)),
 | 
			
		||||
                   B, G, R, A); // right line
 | 
			
		||||
    fill_region_df(x0, (y0 + line_w), line_w, (h - (2 * line_w)), B, G, R,
 | 
			
		||||
                   A); // left line
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  uint32_t row_stride{0};
 | 
			
		||||
 | 
			
		||||
  void write_headers(std::ofstream &of) {
 | 
			
		||||
    of.write((const char *)&file_header, sizeof(file_header));
 | 
			
		||||
    of.write((const char *)&bmp_info_header, sizeof(bmp_info_header));
 | 
			
		||||
    if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
      of.write((const char *)&bmp_color_header, sizeof(bmp_color_header));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void write_headers_and_data(std::ofstream &of) {
 | 
			
		||||
    write_headers(of);
 | 
			
		||||
    of.write((const char *)data.data(), data.size());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void write_headersss(std::stringstream &of) {
 | 
			
		||||
    of.write((const char *)&file_header, sizeof(file_header));
 | 
			
		||||
    of.write((const char *)&bmp_info_header, sizeof(bmp_info_header));
 | 
			
		||||
    if (bmp_info_header.bit_count == 32) {
 | 
			
		||||
      of.write((const char *)&bmp_color_header, sizeof(bmp_color_header));
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void write_headers_and_datass(std::stringstream &of) {
 | 
			
		||||
    write_headersss(of);
 | 
			
		||||
    of.write((const char *)data.data(), data.size());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Add 1 to the row_stride until it is divisible with align_stride
 | 
			
		||||
  uint32_t make_stride_aligned(uint32_t align_stride) {
 | 
			
		||||
    uint32_t new_stride = row_stride;
 | 
			
		||||
    while (new_stride % align_stride != 0) {
 | 
			
		||||
      new_stride++;
 | 
			
		||||
    }
 | 
			
		||||
    return new_stride;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Check if the pixel data is stored as BGRA and if the color space type is
 | 
			
		||||
  // sRGB
 | 
			
		||||
  void check_color_header(BMPColorHeader &bmp_color_header) {
 | 
			
		||||
    BMPColorHeader expected_color_header;
 | 
			
		||||
    if (expected_color_header.red_mask != bmp_color_header.red_mask ||
 | 
			
		||||
        expected_color_header.blue_mask != bmp_color_header.blue_mask ||
 | 
			
		||||
        expected_color_header.green_mask != bmp_color_header.green_mask ||
 | 
			
		||||
        expected_color_header.alpha_mask != bmp_color_header.alpha_mask) {
 | 
			
		||||
      return; // throw std::runtime_error("Unexpected color mask format! The
 | 
			
		||||
              // program expects the pixel data to be in the BGRA format");
 | 
			
		||||
    }
 | 
			
		||||
    if (expected_color_header.color_space_type !=
 | 
			
		||||
        bmp_color_header.color_space_type) {
 | 
			
		||||
      return; // throw std::runtime_error("Unexpected color space type! The
 | 
			
		||||
              // program expects sRGB values");
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										21
									
								
								rd7tf/libs/include/renderd7/bmpconverter.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <renderd7/external/lodepng.h>
 | 
			
		||||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
namespace BitmapConverter {
 | 
			
		||||
/// returns 0 if all went ok, non-0 if error
 | 
			
		||||
/// output image is always given in RGBA (with alpha channel), even if it's a
 | 
			
		||||
/// BMP without alpha channel
 | 
			
		||||
unsigned decodeBMP(std::vector<unsigned char> &image, unsigned &w, unsigned &h,
 | 
			
		||||
                   const std::vector<unsigned char> &bmp);
 | 
			
		||||
 | 
			
		||||
/// @brief Convert A File
 | 
			
		||||
/// @param filename
 | 
			
		||||
/// @return data
 | 
			
		||||
std::vector<unsigned char> ConvertFile(std::string filename);
 | 
			
		||||
/// @brief Convert data
 | 
			
		||||
/// @param data
 | 
			
		||||
/// @return data
 | 
			
		||||
std::vector<unsigned char> ConvertData(std::vector<unsigned char> data);
 | 
			
		||||
} // namespace BitmapConverter
 | 
			
		||||
							
								
								
									
										187
									
								
								rd7tf/libs/include/renderd7/debugfont.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,187 @@
 | 
			
		||||
/*
 | 
			
		||||
  This file was autogenerated by raw2c.
 | 
			
		||||
Visit http://www.devkitpro.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
//---------------------------------------------------------------------------------
 | 
			
		||||
#ifndef _debugfont_h_
 | 
			
		||||
#define _debugfont_h_
 | 
			
		||||
//---------------------------------------------------------------------------------
 | 
			
		||||
static const unsigned char debugfont[] = {
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x81, 0xa5, 0x81,
 | 
			
		||||
    0xbd, 0x99, 0x81, 0x7e, 0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e,
 | 
			
		||||
    0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00, 0x10, 0x38, 0x7c, 0xfe,
 | 
			
		||||
    0x7c, 0x38, 0x10, 0x00, 0x3c, 0x3c, 0x18, 0xff, 0xe7, 0x18, 0x3c, 0x00,
 | 
			
		||||
    0x10, 0x38, 0x7c, 0xfe, 0xee, 0x10, 0x38, 0x00, 0x00, 0x00, 0x18, 0x3c,
 | 
			
		||||
    0x3c, 0x18, 0x00, 0x00, 0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff,
 | 
			
		||||
    0x00, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x00, 0xff, 0xc3, 0x99, 0xbd,
 | 
			
		||||
    0xbd, 0x99, 0xc3, 0xff, 0x0f, 0x07, 0x0f, 0x7d, 0xcc, 0xcc, 0xcc, 0x78,
 | 
			
		||||
    0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18, 0x08, 0x0c, 0x0a, 0x0a,
 | 
			
		||||
    0x08, 0x78, 0xf0, 0x00, 0x18, 0x14, 0x1a, 0x16, 0x72, 0xe2, 0x0e, 0x1c,
 | 
			
		||||
    0x10, 0x54, 0x38, 0xee, 0x38, 0x54, 0x10, 0x00, 0x80, 0xe0, 0xf8, 0xfe,
 | 
			
		||||
    0xf8, 0xe0, 0x80, 0x00, 0x02, 0x0e, 0x3e, 0xfe, 0x3e, 0x0e, 0x02, 0x00,
 | 
			
		||||
    0x18, 0x3c, 0x5a, 0x18, 0x5a, 0x3c, 0x18, 0x00, 0x66, 0x66, 0x66, 0x66,
 | 
			
		||||
    0x66, 0x00, 0x66, 0x00, 0x7f, 0xdb, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x00,
 | 
			
		||||
    0x1c, 0x22, 0x38, 0x44, 0x44, 0x38, 0x88, 0x70, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x7e, 0x7e, 0x7e, 0x00, 0x18, 0x3c, 0x5a, 0x18, 0x5a, 0x3c, 0x18, 0x7e,
 | 
			
		||||
    0x18, 0x3c, 0x5a, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x5a, 0x3c, 0x18, 0x00, 0x00, 0x18, 0x0c, 0xfe, 0x0c, 0x18, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
 | 
			
		||||
    0xc0, 0xfe, 0x00, 0x00, 0x00, 0x24, 0x42, 0xff, 0x42, 0x24, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x00, 0x00, 0x00, 0xfe, 0xfe, 0x7c,
 | 
			
		||||
    0x38, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x18, 0x3c, 0x3c, 0x18, 0x18, 0x00, 0x18, 0x00, 0x6c, 0x24, 0x24, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00,
 | 
			
		||||
    0x10, 0x7c, 0xd0, 0x7c, 0x16, 0xfc, 0x10, 0x00, 0x00, 0x66, 0xac, 0xd8,
 | 
			
		||||
    0x36, 0x6a, 0xcc, 0x00, 0x38, 0x4c, 0x38, 0x78, 0xce, 0xcc, 0x7a, 0x00,
 | 
			
		||||
    0x30, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x30, 0x60, 0x60,
 | 
			
		||||
    0x60, 0x30, 0x18, 0x00, 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
 | 
			
		||||
    0x00, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x00, 0x00, 0x00, 0x30, 0x30, 0xfc,
 | 
			
		||||
    0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x20,
 | 
			
		||||
    0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x30, 0x00, 0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x00,
 | 
			
		||||
    0x7c, 0xce, 0xde, 0xf6, 0xe6, 0xe6, 0x7c, 0x00, 0x18, 0x38, 0x78, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x7e, 0x00, 0x7c, 0xc6, 0x06, 0x1c, 0x70, 0xc6, 0xfe, 0x00,
 | 
			
		||||
    0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c, 0x00, 0x1c, 0x3c, 0x6c, 0xcc,
 | 
			
		||||
    0xfe, 0x0c, 0x1e, 0x00, 0xfe, 0xc0, 0xfc, 0x06, 0x06, 0xc6, 0x7c, 0x00,
 | 
			
		||||
    0x7c, 0xc6, 0xc0, 0xfc, 0xc6, 0xc6, 0x7c, 0x00, 0xfe, 0xc6, 0x0c, 0x18,
 | 
			
		||||
    0x30, 0x30, 0x30, 0x00, 0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0x00,
 | 
			
		||||
    0x7c, 0xc6, 0xc6, 0x7e, 0x06, 0xc6, 0x7c, 0x00, 0x00, 0x30, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x10, 0x20,
 | 
			
		||||
    0x0c, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x7e, 0x00,
 | 
			
		||||
    0x00, 0x7e, 0x00, 0x00, 0x60, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x60, 0x00,
 | 
			
		||||
    0x78, 0xcc, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00, 0x7c, 0x82, 0x9e, 0xa6,
 | 
			
		||||
    0x9e, 0x80, 0x7c, 0x00, 0x7c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00,
 | 
			
		||||
    0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x00, 0x7c, 0xc6, 0xc0, 0xc0,
 | 
			
		||||
    0xc0, 0xc6, 0x7c, 0x00, 0xfc, 0x66, 0x66, 0x66, 0x66, 0x66, 0xfc, 0x00,
 | 
			
		||||
    0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x00, 0xfe, 0x62, 0x68, 0x78,
 | 
			
		||||
    0x68, 0x60, 0xf0, 0x00, 0x7c, 0xc6, 0xc6, 0xc0, 0xce, 0xc6, 0x7e, 0x00,
 | 
			
		||||
    0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00, 0x3c, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x3c, 0x00, 0x1e, 0x0c, 0x0c, 0x0c, 0xcc, 0xcc, 0x78, 0x00,
 | 
			
		||||
    0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x00, 0xf0, 0x60, 0x60, 0x60,
 | 
			
		||||
    0x62, 0x66, 0xfe, 0x00, 0x82, 0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0x00,
 | 
			
		||||
    0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00, 0x7c, 0xc6, 0xc6, 0xc6,
 | 
			
		||||
    0xc6, 0xc6, 0x7c, 0x00, 0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x00,
 | 
			
		||||
    0x7c, 0xc6, 0xc6, 0xc6, 0xd6, 0xde, 0x7c, 0x06, 0xfc, 0x66, 0x66, 0x7c,
 | 
			
		||||
    0x66, 0x66, 0xe6, 0x00, 0x7c, 0xc6, 0xc0, 0x7c, 0x06, 0xc6, 0x7c, 0x00,
 | 
			
		||||
    0x7e, 0x5a, 0x5a, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6,
 | 
			
		||||
    0xc6, 0xc6, 0x7c, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x10, 0x00,
 | 
			
		||||
    0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x82, 0x00, 0xc6, 0x6c, 0x38, 0x38,
 | 
			
		||||
    0x38, 0x6c, 0xc6, 0x00, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x18, 0x3c, 0x00,
 | 
			
		||||
    0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x00, 0x78, 0x60, 0x60, 0x60,
 | 
			
		||||
    0x60, 0x60, 0x78, 0x00, 0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x02, 0x00,
 | 
			
		||||
    0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, 0x10, 0x38, 0x6c, 0xc6,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
 | 
			
		||||
    0x30, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0c,
 | 
			
		||||
    0x7c, 0xcc, 0x76, 0x00, 0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0x7c, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc6, 0x7c, 0x00, 0x1c, 0x0c, 0x0c, 0x7c,
 | 
			
		||||
    0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00,
 | 
			
		||||
    0x1c, 0x36, 0x30, 0x78, 0x30, 0x30, 0x78, 0x00, 0x00, 0x00, 0x76, 0xcc,
 | 
			
		||||
    0xcc, 0x7c, 0x0c, 0x78, 0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x00,
 | 
			
		||||
    0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x0c, 0x00, 0x1c,
 | 
			
		||||
    0x0c, 0x0c, 0xcc, 0x78, 0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x00,
 | 
			
		||||
    0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00, 0x00, 0x00, 0xcc, 0xfe,
 | 
			
		||||
    0xd6, 0xd6, 0xd6, 0x00, 0x00, 0x00, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0xdc, 0x66,
 | 
			
		||||
    0x66, 0x7c, 0x60, 0xf0, 0x00, 0x00, 0x7c, 0xcc, 0xcc, 0x7c, 0x0c, 0x1e,
 | 
			
		||||
    0x00, 0x00, 0xde, 0x76, 0x60, 0x60, 0xf0, 0x00, 0x00, 0x00, 0x7c, 0xc0,
 | 
			
		||||
    0x7c, 0x06, 0x7c, 0x00, 0x10, 0x30, 0xfc, 0x30, 0x30, 0x34, 0x18, 0x00,
 | 
			
		||||
    0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x00, 0x00, 0xc6, 0xc6,
 | 
			
		||||
    0x6c, 0x38, 0x10, 0x00, 0x00, 0x00, 0xc6, 0xd6, 0xd6, 0xfe, 0x6c, 0x00,
 | 
			
		||||
    0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0xcc, 0xcc,
 | 
			
		||||
    0xcc, 0x7c, 0x0c, 0xf8, 0x00, 0x00, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x00,
 | 
			
		||||
    0x0e, 0x18, 0x18, 0x30, 0x18, 0x18, 0x0e, 0x00, 0x18, 0x18, 0x18, 0x00,
 | 
			
		||||
    0x18, 0x18, 0x18, 0x00, 0xe0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xe0, 0x00,
 | 
			
		||||
    0x76, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x6c,
 | 
			
		||||
    0xc6, 0xc6, 0xfe, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x18, 0x70,
 | 
			
		||||
    0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0x0e, 0x10, 0x7c, 0xc6,
 | 
			
		||||
    0xfe, 0xc0, 0x7c, 0x00, 0x7c, 0x82, 0x38, 0x0c, 0x7c, 0xcc, 0x76, 0x00,
 | 
			
		||||
    0xcc, 0x00, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00, 0xe0, 0x10, 0x78, 0x0c,
 | 
			
		||||
    0x7c, 0xcc, 0x76, 0x00, 0x30, 0x30, 0x78, 0x0c, 0x7c, 0xcc, 0x76, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x7c, 0xc0, 0xc0, 0x7c, 0x18, 0x70, 0x7c, 0x82, 0x7c, 0xc6,
 | 
			
		||||
    0xfe, 0xc0, 0x7c, 0x00, 0xc6, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00,
 | 
			
		||||
    0xe0, 0x10, 0x7c, 0xc6, 0xfe, 0xc0, 0x7c, 0x00, 0x66, 0x00, 0x38, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x3c, 0x00, 0x7c, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00,
 | 
			
		||||
    0xe0, 0x10, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00, 0xc6, 0x00, 0x7c, 0xc6,
 | 
			
		||||
    0xfe, 0xc6, 0xc6, 0x00, 0x38, 0x38, 0x7c, 0xc6, 0xfe, 0xc6, 0xc6, 0x00,
 | 
			
		||||
    0x0e, 0x10, 0xfe, 0x60, 0x78, 0x60, 0xfe, 0x00, 0x00, 0x00, 0x7c, 0x12,
 | 
			
		||||
    0x7e, 0xd0, 0x7e, 0x00, 0x7e, 0xc8, 0xc8, 0xfe, 0xc8, 0xc8, 0xce, 0x00,
 | 
			
		||||
    0x7c, 0x82, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0xc6, 0x00, 0x7c, 0xc6,
 | 
			
		||||
    0xc6, 0xc6, 0x7c, 0x00, 0xe0, 0x10, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00,
 | 
			
		||||
    0x7c, 0x82, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x00, 0xe0, 0x10, 0xcc, 0xcc,
 | 
			
		||||
    0xcc, 0xcc, 0x76, 0x00, 0xcc, 0x00, 0xcc, 0xcc, 0xcc, 0x7c, 0x0c, 0xf8,
 | 
			
		||||
    0xc6, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0xc6, 0x00, 0xc6, 0xc6,
 | 
			
		||||
    0xc6, 0xc6, 0x7c, 0x00, 0x18, 0x7c, 0xd6, 0xd0, 0xd6, 0x7c, 0x18, 0x00,
 | 
			
		||||
    0x38, 0x6c, 0x60, 0xf0, 0x60, 0xf2, 0xdc, 0x00, 0x66, 0x3c, 0x18, 0x7e,
 | 
			
		||||
    0x18, 0x7e, 0x18, 0x00, 0xf8, 0xcc, 0xf8, 0xc4, 0xcc, 0xde, 0xcc, 0x06,
 | 
			
		||||
    0x0e, 0x1b, 0x18, 0x3c, 0x18, 0x18, 0xd8, 0x70, 0x0e, 0x10, 0x78, 0x0c,
 | 
			
		||||
    0x7c, 0xcc, 0x76, 0x00, 0x0e, 0x10, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00,
 | 
			
		||||
    0x0e, 0x10, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00, 0x0e, 0x10, 0xcc, 0xcc,
 | 
			
		||||
    0xcc, 0xcc, 0x76, 0x00, 0x66, 0x98, 0xdc, 0x66, 0x66, 0x66, 0x66, 0x00,
 | 
			
		||||
    0x66, 0x98, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0x00, 0x38, 0x0c, 0x3c, 0x34,
 | 
			
		||||
    0x00, 0x7e, 0x00, 0x00, 0x38, 0x6c, 0x6c, 0x38, 0x00, 0x7c, 0x00, 0x00,
 | 
			
		||||
    0x30, 0x00, 0x30, 0x60, 0xc6, 0xc6, 0x7c, 0x00, 0x00, 0x00, 0x00, 0xfc,
 | 
			
		||||
    0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x0c, 0x0c, 0x00, 0x00,
 | 
			
		||||
    0xc0, 0xc8, 0xd0, 0xfe, 0x46, 0x8c, 0x1e, 0x00, 0xc0, 0xc8, 0xd0, 0xec,
 | 
			
		||||
    0x5c, 0xbe, 0x0c, 0x00, 0x18, 0x00, 0x18, 0x18, 0x3c, 0x3c, 0x18, 0x00,
 | 
			
		||||
    0x00, 0x36, 0x6c, 0xd8, 0x6c, 0x36, 0x00, 0x00, 0x00, 0xd8, 0x6c, 0x36,
 | 
			
		||||
    0x6c, 0xd8, 0x00, 0x00, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
 | 
			
		||||
    0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0xdb, 0x77, 0xdb, 0xee,
 | 
			
		||||
    0xdb, 0x77, 0xdb, 0xee, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x18, 0x18, 0xf8, 0x18, 0x18, 0x18, 0x18, 0x18, 0xf8, 0x18,
 | 
			
		||||
    0xf8, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0xfe, 0x36, 0x36, 0x36, 0x00, 0x00, 0xf8, 0x18,
 | 
			
		||||
    0xf8, 0x18, 0x18, 0x18, 0x36, 0x36, 0xf6, 0x06, 0xf6, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0xfe, 0x06,
 | 
			
		||||
    0xf6, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf6, 0x06, 0xfe, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x36, 0x36, 0x36, 0x36, 0xfe, 0x00, 0x00, 0x00, 0x18, 0x18, 0xf8, 0x18,
 | 
			
		||||
    0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x18, 0x18, 0x1f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18,
 | 
			
		||||
    0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x18, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0xff, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0xff, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x36, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0x37, 0x30, 0x3f, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x3f, 0x30, 0x37, 0x36, 0x36, 0x36, 0x36, 0x36, 0xf7, 0x00,
 | 
			
		||||
    0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf7, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36, 0x00, 0x00, 0xff, 0x00,
 | 
			
		||||
    0xff, 0x00, 0x00, 0x00, 0x36, 0x36, 0xf7, 0x00, 0xf7, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x18, 0x18, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x36, 0x36, 0x36, 0x36,
 | 
			
		||||
    0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0x18, 0x18, 0x18,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0xff, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x3f, 0x00, 0x00, 0x00, 0x18, 0x18, 0x1f, 0x18, 0x1f, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x1f, 0x18, 0x1f, 0x18, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x3f, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0xff, 0x36, 0x36, 0x36,
 | 
			
		||||
    0x18, 0x18, 0xff, 0x18, 0xff, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
 | 
			
		||||
    0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x18, 0x18, 0x18,
 | 
			
		||||
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
 | 
			
		||||
    0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xcc, 0xc8, 0xdc, 0x76, 0x00,
 | 
			
		||||
    0x78, 0xcc, 0xd8, 0xcc, 0xc6, 0xc6, 0xdc, 0x40, 0xfe, 0x62, 0x60, 0x60,
 | 
			
		||||
    0x60, 0x60, 0xf0, 0x00, 0x00, 0x02, 0x7e, 0xec, 0x6c, 0x6c, 0x48, 0x00,
 | 
			
		||||
    0xfe, 0x62, 0x30, 0x18, 0x30, 0x62, 0xfe, 0x00, 0x00, 0x00, 0x7e, 0xd0,
 | 
			
		||||
    0xc8, 0xc8, 0x70, 0x00, 0x00, 0x00, 0xcc, 0xcc, 0xcc, 0xcc, 0xf8, 0x80,
 | 
			
		||||
    0x00, 0x00, 0x7e, 0xd8, 0x18, 0x18, 0x10, 0x00, 0x38, 0x10, 0x7c, 0xd6,
 | 
			
		||||
    0xd6, 0x7c, 0x10, 0x38, 0x7c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x7c, 0x00,
 | 
			
		||||
    0x7c, 0xc6, 0xc6, 0xc6, 0x6c, 0x28, 0xee, 0x00, 0x3c, 0x22, 0x18, 0x7c,
 | 
			
		||||
    0xcc, 0xcc, 0x78, 0x00, 0x00, 0x00, 0x66, 0x99, 0x99, 0x66, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x06, 0x7c, 0x9e, 0xf2, 0x7c, 0xc0, 0x00, 0x00, 0x00, 0x7c, 0xc0,
 | 
			
		||||
    0xf8, 0xc0, 0x7c, 0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x00,
 | 
			
		||||
    0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0x00, 0x18, 0x18, 0x7e, 0x18,
 | 
			
		||||
    0x18, 0x00, 0x7e, 0x00, 0x30, 0x18, 0x0c, 0x18, 0x30, 0x00, 0x7c, 0x00,
 | 
			
		||||
    0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0x7c, 0x00, 0x0e, 0x1b, 0x1b, 0x18,
 | 
			
		||||
    0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xd8, 0xd8, 0x70,
 | 
			
		||||
    0x00, 0x18, 0x00, 0x7e, 0x00, 0x18, 0x00, 0x00, 0x00, 0x76, 0xdc, 0x00,
 | 
			
		||||
    0x76, 0xdc, 0x00, 0x00, 0x38, 0x6c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 | 
			
		||||
    0x18, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0c, 0x0c, 0xec, 0x6c, 0x3c, 0x00,
 | 
			
		||||
    0xd8, 0x6c, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x30, 0xc0, 0xf0,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x3c, 0x3c, 0x3c, 0x00, 0x00,
 | 
			
		||||
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
 | 
			
		||||
 | 
			
		||||
};
 | 
			
		||||
const int debugfont_size = sizeof(debugfont);
 | 
			
		||||
//---------------------------------------------------------------------------------
 | 
			
		||||
#endif //_font_h_
 | 
			
		||||
//---------------------------------------------------------------------------------
 | 
			
		||||
							
								
								
									
										422
									
								
								rd7tf/libs/include/renderd7/external/jpgd.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,422 @@
 | 
			
		||||
// jpgd.h - C++ class for JPEG decompression.
 | 
			
		||||
// Richard Geldreich <richgel99@gmail.com>
 | 
			
		||||
// See jpgd.cpp for license (Public Domain or Apache 2.0).
 | 
			
		||||
#ifndef JPEG_DECODER_H
 | 
			
		||||
#define JPEG_DECODER_H
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <cinttypes>
 | 
			
		||||
#include <setjmp.h>
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#define JPGD_NORETURN __declspec(noreturn)
 | 
			
		||||
#elif defined(__GNUC__)
 | 
			
		||||
#define JPGD_NORETURN __attribute__((noreturn))
 | 
			
		||||
#else
 | 
			
		||||
#define JPGD_NORETURN
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define JPGD_HUFF_TREE_MAX_LENGTH 512
 | 
			
		||||
#define JPGD_HUFF_CODE_SIZE_MAX_LENGTH 256
 | 
			
		||||
 | 
			
		||||
namespace jpgd {
 | 
			
		||||
typedef unsigned char uint8;
 | 
			
		||||
typedef signed short int16;
 | 
			
		||||
typedef unsigned short uint16;
 | 
			
		||||
typedef unsigned int uint;
 | 
			
		||||
typedef signed int int32;
 | 
			
		||||
 | 
			
		||||
// Loads a JPEG image from a memory buffer or a file.
 | 
			
		||||
// req_comps can be 1 (grayscale), 3 (RGB), or 4 (RGBA).
 | 
			
		||||
// On return, width/height will be set to the image's dimensions, and
 | 
			
		||||
// actual_comps will be set to the either 1 (grayscale) or 3 (RGB). Notes: For
 | 
			
		||||
// more control over where and how the source data is read, see the
 | 
			
		||||
// decompress_jpeg_image_from_stream() function below, or call the jpeg_decoder
 | 
			
		||||
// class directly. Requesting a 8 or 32bpp image is currently a little faster
 | 
			
		||||
// than 24bpp because the jpeg_decoder class itself currently always unpacks to
 | 
			
		||||
// either 8 or 32bpp.
 | 
			
		||||
unsigned char *decompress_jpeg_image_from_memory(const unsigned char *pSrc_data,
 | 
			
		||||
                                                 int src_data_size, int *width,
 | 
			
		||||
                                                 int *height, int *actual_comps,
 | 
			
		||||
                                                 int req_comps,
 | 
			
		||||
                                                 uint32_t flags = 0);
 | 
			
		||||
unsigned char *decompress_jpeg_image_from_file(const char *pSrc_filename,
 | 
			
		||||
                                               int *width, int *height,
 | 
			
		||||
                                               int *actual_comps, int req_comps,
 | 
			
		||||
                                               uint32_t flags = 0);
 | 
			
		||||
 | 
			
		||||
// Success/failure error codes.
 | 
			
		||||
enum jpgd_status {
 | 
			
		||||
  JPGD_SUCCESS = 0,
 | 
			
		||||
  JPGD_FAILED = -1,
 | 
			
		||||
  JPGD_DONE = 1,
 | 
			
		||||
  JPGD_BAD_DHT_COUNTS = -256,
 | 
			
		||||
  JPGD_BAD_DHT_INDEX,
 | 
			
		||||
  JPGD_BAD_DHT_MARKER,
 | 
			
		||||
  JPGD_BAD_DQT_MARKER,
 | 
			
		||||
  JPGD_BAD_DQT_TABLE,
 | 
			
		||||
  JPGD_BAD_PRECISION,
 | 
			
		||||
  JPGD_BAD_HEIGHT,
 | 
			
		||||
  JPGD_BAD_WIDTH,
 | 
			
		||||
  JPGD_TOO_MANY_COMPONENTS,
 | 
			
		||||
  JPGD_BAD_SOF_LENGTH,
 | 
			
		||||
  JPGD_BAD_VARIABLE_MARKER,
 | 
			
		||||
  JPGD_BAD_DRI_LENGTH,
 | 
			
		||||
  JPGD_BAD_SOS_LENGTH,
 | 
			
		||||
  JPGD_BAD_SOS_COMP_ID,
 | 
			
		||||
  JPGD_W_EXTRA_BYTES_BEFORE_MARKER,
 | 
			
		||||
  JPGD_NO_ARITHMITIC_SUPPORT,
 | 
			
		||||
  JPGD_UNEXPECTED_MARKER,
 | 
			
		||||
  JPGD_NOT_JPEG,
 | 
			
		||||
  JPGD_UNSUPPORTED_MARKER,
 | 
			
		||||
  JPGD_BAD_DQT_LENGTH,
 | 
			
		||||
  JPGD_TOO_MANY_BLOCKS,
 | 
			
		||||
  JPGD_UNDEFINED_QUANT_TABLE,
 | 
			
		||||
  JPGD_UNDEFINED_HUFF_TABLE,
 | 
			
		||||
  JPGD_NOT_SINGLE_SCAN,
 | 
			
		||||
  JPGD_UNSUPPORTED_COLORSPACE,
 | 
			
		||||
  JPGD_UNSUPPORTED_SAMP_FACTORS,
 | 
			
		||||
  JPGD_DECODE_ERROR,
 | 
			
		||||
  JPGD_BAD_RESTART_MARKER,
 | 
			
		||||
  JPGD_BAD_SOS_SPECTRAL,
 | 
			
		||||
  JPGD_BAD_SOS_SUCCESSIVE,
 | 
			
		||||
  JPGD_STREAM_READ,
 | 
			
		||||
  JPGD_NOTENOUGHMEM,
 | 
			
		||||
  JPGD_TOO_MANY_SCANS
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Input stream interface.
 | 
			
		||||
// Derive from this class to read input data from sources other than files or
 | 
			
		||||
// memory. Set m_eof_flag to true when no more data is available. The decoder is
 | 
			
		||||
// rather greedy: it will keep on calling this method until its internal input
 | 
			
		||||
// buffer is full, or until the EOF flag is set. It the input stream contains
 | 
			
		||||
// data after the JPEG stream's EOI (end of image) marker it will probably be
 | 
			
		||||
// pulled into the internal buffer. Call the get_total_bytes_read() method to
 | 
			
		||||
// determine the actual size of the JPEG stream after successful decoding.
 | 
			
		||||
class jpeg_decoder_stream {
 | 
			
		||||
public:
 | 
			
		||||
  jpeg_decoder_stream() {}
 | 
			
		||||
  virtual ~jpeg_decoder_stream() {}
 | 
			
		||||
 | 
			
		||||
  // The read() method is called when the internal input buffer is empty.
 | 
			
		||||
  // Parameters:
 | 
			
		||||
  // pBuf - input buffer
 | 
			
		||||
  // max_bytes_to_read - maximum bytes that can be written to pBuf
 | 
			
		||||
  // pEOF_flag - set this to true if at end of stream (no more bytes remaining)
 | 
			
		||||
  // Returns -1 on error, otherwise return the number of bytes actually written
 | 
			
		||||
  // to the buffer (which may be 0). Notes: This method will be called in a loop
 | 
			
		||||
  // until you set *pEOF_flag to true or the internal buffer is full.
 | 
			
		||||
  virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag) = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// stdio FILE stream class.
 | 
			
		||||
class jpeg_decoder_file_stream : public jpeg_decoder_stream {
 | 
			
		||||
  jpeg_decoder_file_stream(const jpeg_decoder_file_stream &);
 | 
			
		||||
  jpeg_decoder_file_stream &operator=(const jpeg_decoder_file_stream &);
 | 
			
		||||
 | 
			
		||||
  FILE *m_pFile;
 | 
			
		||||
  bool m_eof_flag, m_error_flag;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  jpeg_decoder_file_stream();
 | 
			
		||||
  virtual ~jpeg_decoder_file_stream();
 | 
			
		||||
 | 
			
		||||
  bool open(const char *Pfilename);
 | 
			
		||||
  void close();
 | 
			
		||||
 | 
			
		||||
  virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Memory stream class.
 | 
			
		||||
class jpeg_decoder_mem_stream : public jpeg_decoder_stream {
 | 
			
		||||
  const uint8 *m_pSrc_data;
 | 
			
		||||
  uint m_ofs, m_size;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  jpeg_decoder_mem_stream() : m_pSrc_data(NULL), m_ofs(0), m_size(0) {}
 | 
			
		||||
  jpeg_decoder_mem_stream(const uint8 *pSrc_data, uint size)
 | 
			
		||||
      : m_pSrc_data(pSrc_data), m_ofs(0), m_size(size) {}
 | 
			
		||||
 | 
			
		||||
  virtual ~jpeg_decoder_mem_stream() {}
 | 
			
		||||
 | 
			
		||||
  bool open(const uint8 *pSrc_data, uint size);
 | 
			
		||||
  void close() {
 | 
			
		||||
    m_pSrc_data = NULL;
 | 
			
		||||
    m_ofs = 0;
 | 
			
		||||
    m_size = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  virtual int read(uint8 *pBuf, int max_bytes_to_read, bool *pEOF_flag);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Loads JPEG file from a jpeg_decoder_stream.
 | 
			
		||||
unsigned char *decompress_jpeg_image_from_stream(jpeg_decoder_stream *pStream,
 | 
			
		||||
                                                 int *width, int *height,
 | 
			
		||||
                                                 int *actual_comps,
 | 
			
		||||
                                                 int req_comps,
 | 
			
		||||
                                                 uint32_t flags = 0);
 | 
			
		||||
 | 
			
		||||
enum {
 | 
			
		||||
  JPGD_IN_BUF_SIZE = 8192,
 | 
			
		||||
  JPGD_MAX_BLOCKS_PER_MCU = 10,
 | 
			
		||||
  JPGD_MAX_HUFF_TABLES = 8,
 | 
			
		||||
  JPGD_MAX_QUANT_TABLES = 4,
 | 
			
		||||
  JPGD_MAX_COMPONENTS = 4,
 | 
			
		||||
  JPGD_MAX_COMPS_IN_SCAN = 4,
 | 
			
		||||
  JPGD_MAX_BLOCKS_PER_ROW = 16384,
 | 
			
		||||
  JPGD_MAX_HEIGHT = 32768,
 | 
			
		||||
  JPGD_MAX_WIDTH = 32768
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef int16 jpgd_quant_t;
 | 
			
		||||
typedef int16 jpgd_block_coeff_t;
 | 
			
		||||
 | 
			
		||||
class jpeg_decoder {
 | 
			
		||||
public:
 | 
			
		||||
  enum { cFlagBoxChromaFiltering = 1, cFlagDisableSIMD = 2 };
 | 
			
		||||
 | 
			
		||||
  // Call get_error_code() after constructing to determine if the stream is
 | 
			
		||||
  // valid or not. You may call the get_width(), get_height(), etc. methods
 | 
			
		||||
  // after the constructor is called. You may then either destruct the object,
 | 
			
		||||
  // or begin decoding the image by calling begin_decoding(), then decode() on
 | 
			
		||||
  // each scanline.
 | 
			
		||||
  jpeg_decoder(jpeg_decoder_stream *pStream, uint32_t flags = 0);
 | 
			
		||||
 | 
			
		||||
  ~jpeg_decoder();
 | 
			
		||||
 | 
			
		||||
  // Call this method after constructing the object to begin decompression.
 | 
			
		||||
  // If JPGD_SUCCESS is returned you may then call decode() on each scanline.
 | 
			
		||||
 | 
			
		||||
  int begin_decoding();
 | 
			
		||||
 | 
			
		||||
  // Returns the next scan line.
 | 
			
		||||
  // For grayscale images, pScan_line will point to a buffer containing 8-bit
 | 
			
		||||
  // pixels (get_bytes_per_pixel() will return 1). Otherwise, it will always
 | 
			
		||||
  // point to a buffer containing 32-bit RGBA pixels (A will always be 255, and
 | 
			
		||||
  // get_bytes_per_pixel() will return 4). Returns JPGD_SUCCESS if a scan line
 | 
			
		||||
  // has been returned. Returns JPGD_DONE if all scan lines have been returned.
 | 
			
		||||
  // Returns JPGD_FAILED if an error occurred. Call get_error_code() for a more
 | 
			
		||||
  // info.
 | 
			
		||||
  int decode(const void **pScan_line, uint *pScan_line_len);
 | 
			
		||||
 | 
			
		||||
  inline jpgd_status get_error_code() const { return m_error_code; }
 | 
			
		||||
 | 
			
		||||
  inline int get_width() const { return m_image_x_size; }
 | 
			
		||||
  inline int get_height() const { return m_image_y_size; }
 | 
			
		||||
 | 
			
		||||
  inline int get_num_components() const { return m_comps_in_frame; }
 | 
			
		||||
 | 
			
		||||
  inline int get_bytes_per_pixel() const { return m_dest_bytes_per_pixel; }
 | 
			
		||||
  inline int get_bytes_per_scan_line() const {
 | 
			
		||||
    return m_image_x_size * get_bytes_per_pixel();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Returns the total number of bytes actually consumed by the decoder (which
 | 
			
		||||
  // should equal the actual size of the JPEG file).
 | 
			
		||||
  inline int get_total_bytes_read() const { return m_total_bytes_read; }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  jpeg_decoder(const jpeg_decoder &);
 | 
			
		||||
  jpeg_decoder &operator=(const jpeg_decoder &);
 | 
			
		||||
 | 
			
		||||
  typedef void (*pDecode_block_func)(jpeg_decoder *, int, int, int);
 | 
			
		||||
 | 
			
		||||
  struct huff_tables {
 | 
			
		||||
    bool ac_table;
 | 
			
		||||
    uint look_up[256];
 | 
			
		||||
    uint look_up2[256];
 | 
			
		||||
    uint8 code_size[JPGD_HUFF_CODE_SIZE_MAX_LENGTH];
 | 
			
		||||
    uint tree[JPGD_HUFF_TREE_MAX_LENGTH];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  struct coeff_buf {
 | 
			
		||||
    uint8 *pData;
 | 
			
		||||
    int block_num_x, block_num_y;
 | 
			
		||||
    int block_len_x, block_len_y;
 | 
			
		||||
    int block_size;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  struct mem_block {
 | 
			
		||||
    mem_block *m_pNext;
 | 
			
		||||
    size_t m_used_count;
 | 
			
		||||
    size_t m_size;
 | 
			
		||||
    char m_data[1];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  jmp_buf m_jmp_state;
 | 
			
		||||
  uint32_t m_flags;
 | 
			
		||||
  mem_block *m_pMem_blocks;
 | 
			
		||||
  int m_image_x_size;
 | 
			
		||||
  int m_image_y_size;
 | 
			
		||||
  jpeg_decoder_stream *m_pStream;
 | 
			
		||||
 | 
			
		||||
  int m_progressive_flag;
 | 
			
		||||
 | 
			
		||||
  uint8 m_huff_ac[JPGD_MAX_HUFF_TABLES];
 | 
			
		||||
  uint8 *m_huff_num[JPGD_MAX_HUFF_TABLES]; // pointer to number of Huffman codes
 | 
			
		||||
                                           // per bit size
 | 
			
		||||
  uint8 *
 | 
			
		||||
      m_huff_val[JPGD_MAX_HUFF_TABLES]; // pointer to Huffman codes per bit size
 | 
			
		||||
  jpgd_quant_t
 | 
			
		||||
      *m_quant[JPGD_MAX_QUANT_TABLES]; // pointer to quantization tables
 | 
			
		||||
  int m_scan_type; // Gray, Yh1v1, Yh1v2, Yh2v1, Yh2v2 (CMYK111, CMYK4114 no
 | 
			
		||||
                   // longer supported)
 | 
			
		||||
  int m_comps_in_frame;                   // # of components in frame
 | 
			
		||||
  int m_comp_h_samp[JPGD_MAX_COMPONENTS]; // component's horizontal sampling
 | 
			
		||||
                                          // factor
 | 
			
		||||
  int m_comp_v_samp[JPGD_MAX_COMPONENTS]; // component's vertical sampling
 | 
			
		||||
                                          // factor
 | 
			
		||||
  int m_comp_quant[JPGD_MAX_COMPONENTS];  // component's quantization table
 | 
			
		||||
                                          // selector
 | 
			
		||||
  int m_comp_ident[JPGD_MAX_COMPONENTS];  // component's ID
 | 
			
		||||
  int m_comp_h_blocks[JPGD_MAX_COMPONENTS];
 | 
			
		||||
  int m_comp_v_blocks[JPGD_MAX_COMPONENTS];
 | 
			
		||||
  int m_comps_in_scan;                     // # of components in scan
 | 
			
		||||
  int m_comp_list[JPGD_MAX_COMPS_IN_SCAN]; // components in this scan
 | 
			
		||||
  int m_comp_dc_tab[JPGD_MAX_COMPONENTS]; // component's DC Huffman coding table
 | 
			
		||||
                                          // selector
 | 
			
		||||
  int m_comp_ac_tab[JPGD_MAX_COMPONENTS]; // component's AC Huffman coding table
 | 
			
		||||
                                          // selector
 | 
			
		||||
  int m_spectral_start;                   // spectral selection start
 | 
			
		||||
  int m_spectral_end;                     // spectral selection end
 | 
			
		||||
  int m_successive_low;                   // successive approximation low
 | 
			
		||||
  int m_successive_high;                  // successive approximation high
 | 
			
		||||
  int m_max_mcu_x_size;                   // MCU's max. X size in pixels
 | 
			
		||||
  int m_max_mcu_y_size;                   // MCU's max. Y size in pixels
 | 
			
		||||
  int m_blocks_per_mcu;
 | 
			
		||||
  int m_max_blocks_per_row;
 | 
			
		||||
  int m_mcus_per_row, m_mcus_per_col;
 | 
			
		||||
  int m_mcu_org[JPGD_MAX_BLOCKS_PER_MCU];
 | 
			
		||||
  int m_total_lines_left; // total # lines left in image
 | 
			
		||||
  int m_mcu_lines_left;   // total # lines left in this MCU
 | 
			
		||||
  int m_num_buffered_scanlines;
 | 
			
		||||
  int m_real_dest_bytes_per_scan_line;
 | 
			
		||||
  int m_dest_bytes_per_scan_line; // rounded up
 | 
			
		||||
  int m_dest_bytes_per_pixel;     // 4 (RGB) or 1 (Y)
 | 
			
		||||
  huff_tables *m_pHuff_tabs[JPGD_MAX_HUFF_TABLES];
 | 
			
		||||
  coeff_buf *m_dc_coeffs[JPGD_MAX_COMPONENTS];
 | 
			
		||||
  coeff_buf *m_ac_coeffs[JPGD_MAX_COMPONENTS];
 | 
			
		||||
  int m_eob_run;
 | 
			
		||||
  int m_block_y_mcu[JPGD_MAX_COMPONENTS];
 | 
			
		||||
  uint8 *m_pIn_buf_ofs;
 | 
			
		||||
  int m_in_buf_left;
 | 
			
		||||
  int m_tem_flag;
 | 
			
		||||
 | 
			
		||||
  uint8 m_in_buf_pad_start[64];
 | 
			
		||||
  uint8 m_in_buf[JPGD_IN_BUF_SIZE + 128];
 | 
			
		||||
  uint8 m_in_buf_pad_end[64];
 | 
			
		||||
 | 
			
		||||
  int m_bits_left;
 | 
			
		||||
  uint m_bit_buf;
 | 
			
		||||
  int m_restart_interval;
 | 
			
		||||
  int m_restarts_left;
 | 
			
		||||
  int m_next_restart_num;
 | 
			
		||||
  int m_max_mcus_per_row;
 | 
			
		||||
  int m_max_blocks_per_mcu;
 | 
			
		||||
 | 
			
		||||
  int m_max_mcus_per_col;
 | 
			
		||||
  uint m_last_dc_val[JPGD_MAX_COMPONENTS];
 | 
			
		||||
  jpgd_block_coeff_t *m_pMCU_coefficients;
 | 
			
		||||
  int m_mcu_block_max_zag[JPGD_MAX_BLOCKS_PER_MCU];
 | 
			
		||||
  uint8 *m_pSample_buf;
 | 
			
		||||
  uint8 *m_pSample_buf_prev;
 | 
			
		||||
  int m_crr[256];
 | 
			
		||||
  int m_cbb[256];
 | 
			
		||||
  int m_crg[256];
 | 
			
		||||
  int m_cbg[256];
 | 
			
		||||
  uint8 *m_pScan_line_0;
 | 
			
		||||
  uint8 *m_pScan_line_1;
 | 
			
		||||
  jpgd_status m_error_code;
 | 
			
		||||
  int m_total_bytes_read;
 | 
			
		||||
 | 
			
		||||
  bool m_ready_flag;
 | 
			
		||||
  bool m_eof_flag;
 | 
			
		||||
  bool m_sample_buf_prev_valid;
 | 
			
		||||
  bool m_has_sse2;
 | 
			
		||||
 | 
			
		||||
  inline int check_sample_buf_ofs(int ofs) const {
 | 
			
		||||
    assert(ofs >= 0);
 | 
			
		||||
    assert(ofs < m_max_blocks_per_row * 64);
 | 
			
		||||
    return ofs;
 | 
			
		||||
  }
 | 
			
		||||
  void free_all_blocks();
 | 
			
		||||
  JPGD_NORETURN void stop_decoding(jpgd_status status);
 | 
			
		||||
  void *alloc(size_t n, bool zero = false);
 | 
			
		||||
  void *alloc_aligned(size_t nSize, uint32_t align = 16, bool zero = false);
 | 
			
		||||
  void word_clear(void *p, uint16 c, uint n);
 | 
			
		||||
  void prep_in_buffer();
 | 
			
		||||
  void read_dht_marker();
 | 
			
		||||
  void read_dqt_marker();
 | 
			
		||||
  void read_sof_marker();
 | 
			
		||||
  void skip_variable_marker();
 | 
			
		||||
  void read_dri_marker();
 | 
			
		||||
  void read_sos_marker();
 | 
			
		||||
  int next_marker();
 | 
			
		||||
  int process_markers();
 | 
			
		||||
  void locate_soi_marker();
 | 
			
		||||
  void locate_sof_marker();
 | 
			
		||||
  int locate_sos_marker();
 | 
			
		||||
  void init(jpeg_decoder_stream *pStream, uint32_t flags);
 | 
			
		||||
  void create_look_ups();
 | 
			
		||||
  void fix_in_buffer();
 | 
			
		||||
  void transform_mcu(int mcu_row);
 | 
			
		||||
  coeff_buf *coeff_buf_open(int block_num_x, int block_num_y, int block_len_x,
 | 
			
		||||
                            int block_len_y);
 | 
			
		||||
  inline jpgd_block_coeff_t *coeff_buf_getp(coeff_buf *cb, int block_x,
 | 
			
		||||
                                            int block_y);
 | 
			
		||||
  void load_next_row();
 | 
			
		||||
  void decode_next_row();
 | 
			
		||||
  void make_huff_table(int index, huff_tables *pH);
 | 
			
		||||
  void check_quant_tables();
 | 
			
		||||
  void check_huff_tables();
 | 
			
		||||
  bool calc_mcu_block_order();
 | 
			
		||||
  int init_scan();
 | 
			
		||||
  void init_frame();
 | 
			
		||||
  void process_restart();
 | 
			
		||||
  void decode_scan(pDecode_block_func decode_block_func);
 | 
			
		||||
  void init_progressive();
 | 
			
		||||
  void init_sequential();
 | 
			
		||||
  void decode_start();
 | 
			
		||||
  void decode_init(jpeg_decoder_stream *pStream, uint32_t flags);
 | 
			
		||||
  void H2V2Convert();
 | 
			
		||||
  uint32_t H2V2ConvertFiltered();
 | 
			
		||||
  void H2V1Convert();
 | 
			
		||||
  void H2V1ConvertFiltered();
 | 
			
		||||
  void H1V2Convert();
 | 
			
		||||
  void H1V2ConvertFiltered();
 | 
			
		||||
  void H1V1Convert();
 | 
			
		||||
  void gray_convert();
 | 
			
		||||
  void find_eoi();
 | 
			
		||||
  inline uint get_char();
 | 
			
		||||
  inline uint get_char(bool *pPadding_flag);
 | 
			
		||||
  inline void stuff_char(uint8 q);
 | 
			
		||||
  inline uint8 get_octet();
 | 
			
		||||
  inline uint get_bits(int num_bits);
 | 
			
		||||
  inline uint get_bits_no_markers(int numbits);
 | 
			
		||||
  inline int huff_decode(huff_tables *pH);
 | 
			
		||||
  inline int huff_decode(huff_tables *pH, int &extrabits);
 | 
			
		||||
 | 
			
		||||
  // Clamps a value between 0-255.
 | 
			
		||||
  static inline uint8 clamp(int i) {
 | 
			
		||||
    if (static_cast<uint>(i) > 255)
 | 
			
		||||
      i = (((~i) >> 31) & 0xFF);
 | 
			
		||||
    return static_cast<uint8>(i);
 | 
			
		||||
  }
 | 
			
		||||
  int decode_next_mcu_row();
 | 
			
		||||
 | 
			
		||||
  static void decode_block_dc_first(jpeg_decoder *pD, int component_id,
 | 
			
		||||
                                    int block_x, int block_y);
 | 
			
		||||
  static void decode_block_dc_refine(jpeg_decoder *pD, int component_id,
 | 
			
		||||
                                     int block_x, int block_y);
 | 
			
		||||
  static void decode_block_ac_first(jpeg_decoder *pD, int component_id,
 | 
			
		||||
                                    int block_x, int block_y);
 | 
			
		||||
  static void decode_block_ac_refine(jpeg_decoder *pD, int component_id,
 | 
			
		||||
                                     int block_x, int block_y);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace jpgd
 | 
			
		||||
 | 
			
		||||
#endif // JPEG_DECODER_H
 | 
			
		||||
							
								
								
									
										478
									
								
								rd7tf/libs/include/renderd7/external/jpgd_idct.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,478 @@
 | 
			
		||||
// Copyright 2009 Intel Corporation
 | 
			
		||||
// All Rights Reserved
 | 
			
		||||
//
 | 
			
		||||
// Permission is granted to use, copy, distribute and prepare derivative works
 | 
			
		||||
// of this software for any purpose and without fee, provided, that the above
 | 
			
		||||
// copyright notice and this statement appear in all copies.  Intel makes no
 | 
			
		||||
// representations about the suitability of this software for any purpose.  THIS
 | 
			
		||||
// SOFTWARE IS PROVIDED "AS IS." INTEL SPECIFICALLY DISCLAIMS ALL WARRANTIES,
 | 
			
		||||
// EXPRESS OR IMPLIED, AND ALL LIABILITY, INCLUDING CONSEQUENTIAL AND OTHER
 | 
			
		||||
// INDIRECT DAMAGES, FOR THE USE OF THIS SOFTWARE, INCLUDING LIABILITY FOR
 | 
			
		||||
// INFRINGEMENT OF ANY PROPRIETARY RIGHTS, AND INCLUDING THE WARRANTIES OF
 | 
			
		||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  Intel does not assume
 | 
			
		||||
// any responsibility for any errors which may appear in this software nor any
 | 
			
		||||
// responsibility to update it.
 | 
			
		||||
//
 | 
			
		||||
// From:
 | 
			
		||||
// https://software.intel.com/sites/default/files/m/d/4/1/d/8/UsingIntelAVXToImplementIDCT-r1_5.pdf
 | 
			
		||||
// https://software.intel.com/file/29048
 | 
			
		||||
//
 | 
			
		||||
// Requires SSE
 | 
			
		||||
//
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#include <intrin.h>
 | 
			
		||||
#endif
 | 
			
		||||
#include <immintrin.h>
 | 
			
		||||
 | 
			
		||||
#ifdef _MSC_VER
 | 
			
		||||
#define JPGD_SIMD_ALIGN(type, name) __declspec(align(16)) type name
 | 
			
		||||
#else
 | 
			
		||||
#define JPGD_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <cinttypes>
 | 
			
		||||
 | 
			
		||||
#define BITS_INV_ACC 4
 | 
			
		||||
#define SHIFT_INV_ROW 16 - BITS_INV_ACC
 | 
			
		||||
#define SHIFT_INV_COL 1 + BITS_INV_ACC
 | 
			
		||||
const short IRND_INV_ROW = 1024 * (6 - BITS_INV_ACC); // 1 << (SHIFT_INV_ROW-1)
 | 
			
		||||
const short IRND_INV_COL = 16 * (BITS_INV_ACC - 3);   // 1 << (SHIFT_INV_COL-1)
 | 
			
		||||
const short IRND_INV_CORR = IRND_INV_COL - 1; // correction -1.0 and round
 | 
			
		||||
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_one_corr[8]) = {1, 1, 1, 1, 1, 1, 1, 1};
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_round_inv_row[8]) = {
 | 
			
		||||
    IRND_INV_ROW, 0, IRND_INV_ROW, 0, IRND_INV_ROW, 0, IRND_INV_ROW, 0};
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_round_inv_col[8]) = {
 | 
			
		||||
    IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL,
 | 
			
		||||
    IRND_INV_COL, IRND_INV_COL, IRND_INV_COL, IRND_INV_COL};
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_round_inv_corr[8]) = {
 | 
			
		||||
    IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR,
 | 
			
		||||
    IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR, IRND_INV_CORR};
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tg_1_16[8]) = {
 | 
			
		||||
    13036, 13036, 13036, 13036,
 | 
			
		||||
    13036, 13036, 13036, 13036}; // tg * (2<<16) + 0.5
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tg_2_16[8]) = {
 | 
			
		||||
    27146, 27146, 27146, 27146,
 | 
			
		||||
    27146, 27146, 27146, 27146}; // tg * (2<<16) + 0.5
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tg_3_16[8]) = {
 | 
			
		||||
    -21746, -21746, -21746, -21746,
 | 
			
		||||
    -21746, -21746, -21746, -21746}; // tg * (2<<16) + 0.5
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_cos_4_16[8]) = {
 | 
			
		||||
    -19195, -19195, -19195, -19195,
 | 
			
		||||
    -19195, -19195, -19195, -19195}; // cos * (2<<16) + 0.5
 | 
			
		||||
 | 
			
		||||
//-----------------------------------------------------------------------------
 | 
			
		||||
// Table for rows 0,4 - constants are multiplied on cos_4_16
 | 
			
		||||
// w15 w14 w11 w10 w07 w06 w03 w02
 | 
			
		||||
// w29 w28 w25 w24 w21 w20 w17 w16
 | 
			
		||||
// w31 w30 w27 w26 w23 w22 w19 w18
 | 
			
		||||
// movq -> w05 w04 w01 w00
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tab_i_04[]) = {
 | 
			
		||||
    16384,  21407,  16384,  8867,
 | 
			
		||||
    16384,  -8867,  16384,  -21407,  // w13 w12 w09 w08
 | 
			
		||||
    16384,  8867,   -16384, -21407,  // w07 w06 w03 w02
 | 
			
		||||
    -16384, 21407,  16384,  -8867,   // w15 w14 w11 w10
 | 
			
		||||
    22725,  19266,  19266,  -4520,   // w21 w20 w17 w16
 | 
			
		||||
    12873,  -22725, 4520,   -12873,  // w29 w28 w25 w24
 | 
			
		||||
    12873,  4520,   -22725, -12873,  // w23 w22 w19 w18
 | 
			
		||||
    4520,   19266,  19266,  -22725}; // w31 w30 w27 w26
 | 
			
		||||
 | 
			
		||||
// Table for rows 1,7 - constants are multiplied on cos_1_16
 | 
			
		||||
// movq -> w05 w04 w01 w00
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tab_i_17[]) = {
 | 
			
		||||
    22725,  29692,  22725,  12299,
 | 
			
		||||
    22725,  -12299, 22725,  -29692,  // w13 w12 w09 w08
 | 
			
		||||
    22725,  12299,  -22725, -29692,  // w07 w06 w03 w02
 | 
			
		||||
    -22725, 29692,  22725,  -12299,  // w15 w14 w11 w10
 | 
			
		||||
    31521,  26722,  26722,  -6270,   // w21 w20 w17 w16
 | 
			
		||||
    17855,  -31521, 6270,   -17855,  // w29 w28 w25 w24
 | 
			
		||||
    17855,  6270,   -31521, -17855,  // w23 w22 w19 w18
 | 
			
		||||
    6270,   26722,  26722,  -31521}; // w31 w30 w27 w26
 | 
			
		||||
 | 
			
		||||
// Table for rows 2,6 - constants are multiplied on cos_2_16
 | 
			
		||||
// movq -> w05 w04 w01 w00
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tab_i_26[]) = {
 | 
			
		||||
    21407,  27969,  21407,  11585,
 | 
			
		||||
    21407,  -11585, 21407,  -27969,  // w13 w12 w09 w08
 | 
			
		||||
    21407,  11585,  -21407, -27969,  // w07 w06 w03 w02
 | 
			
		||||
    -21407, 27969,  21407,  -11585,  // w15 w14 w11 w10
 | 
			
		||||
    29692,  25172,  25172,  -5906,   // w21 w20 w17 w16
 | 
			
		||||
    16819,  -29692, 5906,   -16819,  // w29 w28 w25 w24
 | 
			
		||||
    16819,  5906,   -29692, -16819,  // w23 w22 w19 w18
 | 
			
		||||
    5906,   25172,  25172,  -29692}; // w31 w30 w27 w26
 | 
			
		||||
// Table for rows 3,5 - constants are multiplied on cos_3_16
 | 
			
		||||
// movq -> w05 w04 w01 w00
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_tab_i_35[]) = {
 | 
			
		||||
    19266,  25172,  19266,  10426,
 | 
			
		||||
    19266,  -10426, 19266,  -25172,  // w13 w12 w09 w08
 | 
			
		||||
    19266,  10426,  -19266, -25172,  // w07 w06 w03 w02
 | 
			
		||||
    -19266, 25172,  19266,  -10426,  // w15 w14 w11 w10
 | 
			
		||||
    26722,  22654,  22654,  -5315,   // w21 w20 w17 w16
 | 
			
		||||
    15137,  -26722, 5315,   -15137,  // w29 w28 w25 w24
 | 
			
		||||
    15137,  5315,   -26722, -15137,  // w23 w22 w19 w18
 | 
			
		||||
    5315,   22654,  22654,  -26722}; // w31 w30 w27 w26
 | 
			
		||||
 | 
			
		||||
JPGD_SIMD_ALIGN(short, shortM128_128[8]) = {128, 128, 128, 128,
 | 
			
		||||
                                            128, 128, 128, 128};
 | 
			
		||||
 | 
			
		||||
void idctSSEShortU8(const short *pInput, uint8_t *pOutputUB) {
 | 
			
		||||
  __m128i r_xmm0, r_xmm4;
 | 
			
		||||
  __m128i r_xmm1, r_xmm2, r_xmm3, r_xmm5, r_xmm6, r_xmm7;
 | 
			
		||||
  __m128i row0, row1, row2, row3, row4, row5, row6, row7;
 | 
			
		||||
  short *pTab_i_04 = shortM128_tab_i_04;
 | 
			
		||||
  short *pTab_i_26 = shortM128_tab_i_26;
 | 
			
		||||
 | 
			
		||||
  // Get pointers for this input and output
 | 
			
		||||
  pTab_i_04 = shortM128_tab_i_04;
 | 
			
		||||
  pTab_i_26 = shortM128_tab_i_26;
 | 
			
		||||
 | 
			
		||||
  // Row 1 and Row 3
 | 
			
		||||
  r_xmm0 = _mm_load_si128((__m128i *)pInput);
 | 
			
		||||
  r_xmm4 = _mm_load_si128((__m128i *)(&pInput[2 * 8]));
 | 
			
		||||
 | 
			
		||||
  // *** Work on the data in xmm0
 | 
			
		||||
  // low shuffle mask = 0xd8 = 11 01 10 00
 | 
			
		||||
  // get short 2 and short 0 into ls 32-bits
 | 
			
		||||
  r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8);
 | 
			
		||||
 | 
			
		||||
  // copy short 2 and short 0 to all locations
 | 
			
		||||
  r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0);
 | 
			
		||||
 | 
			
		||||
  // add to those copies
 | 
			
		||||
  r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *)pTab_i_04));
 | 
			
		||||
 | 
			
		||||
  // shuffle mask = 0x55 = 01 01 01 01
 | 
			
		||||
  // copy short 3 and short 1 to all locations
 | 
			
		||||
  r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55);
 | 
			
		||||
 | 
			
		||||
  // high shuffle mask = 0xd8 = 11 01 10 00
 | 
			
		||||
  // get short 6 and short 4 into bit positions 64-95
 | 
			
		||||
  // get short 7 and short 5 into bit positions 96-127
 | 
			
		||||
  r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8);
 | 
			
		||||
 | 
			
		||||
  // add to short 3 and short 1
 | 
			
		||||
  r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *)&pTab_i_04[16]));
 | 
			
		||||
 | 
			
		||||
  // shuffle mask = 0xaa = 10 10 10 10
 | 
			
		||||
  // copy short 6 and short 4 to all locations
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa);
 | 
			
		||||
 | 
			
		||||
  // shuffle mask = 0xaa = 11 11 11 11
 | 
			
		||||
  // copy short 7 and short 5 to all locations
 | 
			
		||||
  r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff);
 | 
			
		||||
 | 
			
		||||
  // add to short 6 and short 4
 | 
			
		||||
  r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *)&pTab_i_04[8]));
 | 
			
		||||
 | 
			
		||||
  // *** Work on the data in xmm4
 | 
			
		||||
  // high shuffle mask = 0xd8 11 01 10 00
 | 
			
		||||
  // get short 6 and short 4 into bit positions 64-95
 | 
			
		||||
  // get short 7 and short 5 into bit positions 96-127
 | 
			
		||||
  r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8);
 | 
			
		||||
 | 
			
		||||
  // (xmm0 short 2 and short 0 plus pSi) + some constants
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *)&pTab_i_04[24]));
 | 
			
		||||
  r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa);
 | 
			
		||||
  r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *)&shortM128_tab_i_26[0]));
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2);
 | 
			
		||||
  r_xmm2 = r_xmm1;
 | 
			
		||||
  r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55);
 | 
			
		||||
  r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *)&shortM128_tab_i_26[8]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3);
 | 
			
		||||
  r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0);
 | 
			
		||||
  r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *)&shortM128_tab_i_26[16]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1);
 | 
			
		||||
  r_xmm2 = _mm_srai_epi32(r_xmm2, 12);
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *)&shortM128_tab_i_26[24]));
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6);
 | 
			
		||||
  r_xmm6 = r_xmm5;
 | 
			
		||||
  r_xmm0 = _mm_srai_epi32(r_xmm0, 12);
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b);
 | 
			
		||||
  row0 = _mm_packs_epi32(r_xmm0, r_xmm2);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7);
 | 
			
		||||
  r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5);
 | 
			
		||||
  r_xmm6 = _mm_srai_epi32(r_xmm6, 12);
 | 
			
		||||
  r_xmm4 = _mm_srai_epi32(r_xmm4, 12);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b);
 | 
			
		||||
  row2 = _mm_packs_epi32(r_xmm4, r_xmm6);
 | 
			
		||||
 | 
			
		||||
  // Row 5 and row 7
 | 
			
		||||
  r_xmm0 = _mm_load_si128((__m128i *)(&pInput[4 * 8]));
 | 
			
		||||
  r_xmm4 = _mm_load_si128((__m128i *)(&pInput[6 * 8]));
 | 
			
		||||
 | 
			
		||||
  r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8);
 | 
			
		||||
  r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0);
 | 
			
		||||
  r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *)pTab_i_04));
 | 
			
		||||
  r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55);
 | 
			
		||||
  r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8);
 | 
			
		||||
  r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *)&pTab_i_04[16]));
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa);
 | 
			
		||||
  r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *)&pTab_i_04[8]));
 | 
			
		||||
  r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *)&pTab_i_04[24]));
 | 
			
		||||
  r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa);
 | 
			
		||||
  r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *)&shortM128_tab_i_26[0]));
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2);
 | 
			
		||||
  r_xmm2 = r_xmm1;
 | 
			
		||||
  r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55);
 | 
			
		||||
  r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *)&shortM128_tab_i_26[8]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3);
 | 
			
		||||
  r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0);
 | 
			
		||||
  r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *)&shortM128_tab_i_26[16]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1);
 | 
			
		||||
  r_xmm2 = _mm_srai_epi32(r_xmm2, 12);
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *)&shortM128_tab_i_26[24]));
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6);
 | 
			
		||||
  r_xmm6 = r_xmm5;
 | 
			
		||||
  r_xmm0 = _mm_srai_epi32(r_xmm0, 12);
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b);
 | 
			
		||||
  row4 = _mm_packs_epi32(r_xmm0, r_xmm2);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7);
 | 
			
		||||
  r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5);
 | 
			
		||||
  r_xmm6 = _mm_srai_epi32(r_xmm6, 12);
 | 
			
		||||
  r_xmm4 = _mm_srai_epi32(r_xmm4, 12);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b);
 | 
			
		||||
  row6 = _mm_packs_epi32(r_xmm4, r_xmm6);
 | 
			
		||||
 | 
			
		||||
  // Row 4 and row 2
 | 
			
		||||
  pTab_i_04 = shortM128_tab_i_35;
 | 
			
		||||
  pTab_i_26 = shortM128_tab_i_17;
 | 
			
		||||
  r_xmm0 = _mm_load_si128((__m128i *)(&pInput[3 * 8]));
 | 
			
		||||
  r_xmm4 = _mm_load_si128((__m128i *)(&pInput[1 * 8]));
 | 
			
		||||
 | 
			
		||||
  r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8);
 | 
			
		||||
  r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0);
 | 
			
		||||
  r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *)pTab_i_04));
 | 
			
		||||
  r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55);
 | 
			
		||||
  r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8);
 | 
			
		||||
  r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *)&pTab_i_04[16]));
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa);
 | 
			
		||||
  r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *)&pTab_i_04[8]));
 | 
			
		||||
  r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *)&pTab_i_04[24]));
 | 
			
		||||
  r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa);
 | 
			
		||||
  r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *)&pTab_i_26[0]));
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2);
 | 
			
		||||
  r_xmm2 = r_xmm1;
 | 
			
		||||
  r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55);
 | 
			
		||||
  r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *)&pTab_i_26[8]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3);
 | 
			
		||||
  r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0);
 | 
			
		||||
  r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *)&pTab_i_26[16]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1);
 | 
			
		||||
  r_xmm2 = _mm_srai_epi32(r_xmm2, 12);
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *)&pTab_i_26[24]));
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6);
 | 
			
		||||
  r_xmm6 = r_xmm5;
 | 
			
		||||
  r_xmm0 = _mm_srai_epi32(r_xmm0, 12);
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b);
 | 
			
		||||
  row3 = _mm_packs_epi32(r_xmm0, r_xmm2);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7);
 | 
			
		||||
  r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5);
 | 
			
		||||
  r_xmm6 = _mm_srai_epi32(r_xmm6, 12);
 | 
			
		||||
  r_xmm4 = _mm_srai_epi32(r_xmm4, 12);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b);
 | 
			
		||||
  row1 = _mm_packs_epi32(r_xmm4, r_xmm6);
 | 
			
		||||
 | 
			
		||||
  // Row 6 and row 8
 | 
			
		||||
  r_xmm0 = _mm_load_si128((__m128i *)(&pInput[5 * 8]));
 | 
			
		||||
  r_xmm4 = _mm_load_si128((__m128i *)(&pInput[7 * 8]));
 | 
			
		||||
 | 
			
		||||
  r_xmm0 = _mm_shufflelo_epi16(r_xmm0, 0xd8);
 | 
			
		||||
  r_xmm1 = _mm_shuffle_epi32(r_xmm0, 0);
 | 
			
		||||
  r_xmm1 = _mm_madd_epi16(r_xmm1, *((__m128i *)pTab_i_04));
 | 
			
		||||
  r_xmm3 = _mm_shuffle_epi32(r_xmm0, 0x55);
 | 
			
		||||
  r_xmm0 = _mm_shufflehi_epi16(r_xmm0, 0xd8);
 | 
			
		||||
  r_xmm3 = _mm_madd_epi16(r_xmm3, *((__m128i *)&pTab_i_04[16]));
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm0, 0xaa);
 | 
			
		||||
  r_xmm0 = _mm_shuffle_epi32(r_xmm0, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_madd_epi16(r_xmm2, *((__m128i *)&pTab_i_04[8]));
 | 
			
		||||
  r_xmm4 = _mm_shufflehi_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_shufflelo_epi16(r_xmm4, 0xd8);
 | 
			
		||||
  r_xmm0 = _mm_madd_epi16(r_xmm0, *((__m128i *)&pTab_i_04[24]));
 | 
			
		||||
  r_xmm5 = _mm_shuffle_epi32(r_xmm4, 0);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm4, 0xaa);
 | 
			
		||||
  r_xmm5 = _mm_madd_epi16(r_xmm5, *((__m128i *)&pTab_i_26[0]));
 | 
			
		||||
  r_xmm1 = _mm_add_epi32(r_xmm1, r_xmm2);
 | 
			
		||||
  r_xmm2 = r_xmm1;
 | 
			
		||||
  r_xmm7 = _mm_shuffle_epi32(r_xmm4, 0x55);
 | 
			
		||||
  r_xmm6 = _mm_madd_epi16(r_xmm6, *((__m128i *)&pTab_i_26[8]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm3);
 | 
			
		||||
  r_xmm4 = _mm_shuffle_epi32(r_xmm4, 0xff);
 | 
			
		||||
  r_xmm2 = _mm_sub_epi32(r_xmm2, r_xmm0);
 | 
			
		||||
  r_xmm7 = _mm_madd_epi16(r_xmm7, *((__m128i *)&pTab_i_26[16]));
 | 
			
		||||
  r_xmm0 = _mm_add_epi32(r_xmm0, r_xmm1);
 | 
			
		||||
  r_xmm2 = _mm_srai_epi32(r_xmm2, 12);
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, *((__m128i *)shortM128_round_inv_row));
 | 
			
		||||
  r_xmm4 = _mm_madd_epi16(r_xmm4, *((__m128i *)&pTab_i_26[24]));
 | 
			
		||||
  r_xmm5 = _mm_add_epi32(r_xmm5, r_xmm6);
 | 
			
		||||
  r_xmm6 = r_xmm5;
 | 
			
		||||
  r_xmm0 = _mm_srai_epi32(r_xmm0, 12);
 | 
			
		||||
  r_xmm2 = _mm_shuffle_epi32(r_xmm2, 0x1b);
 | 
			
		||||
  row5 = _mm_packs_epi32(r_xmm0, r_xmm2);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm7);
 | 
			
		||||
  r_xmm6 = _mm_sub_epi32(r_xmm6, r_xmm4);
 | 
			
		||||
  r_xmm4 = _mm_add_epi32(r_xmm4, r_xmm5);
 | 
			
		||||
  r_xmm6 = _mm_srai_epi32(r_xmm6, 12);
 | 
			
		||||
  r_xmm4 = _mm_srai_epi32(r_xmm4, 12);
 | 
			
		||||
  r_xmm6 = _mm_shuffle_epi32(r_xmm6, 0x1b);
 | 
			
		||||
  row7 = _mm_packs_epi32(r_xmm4, r_xmm6);
 | 
			
		||||
 | 
			
		||||
  r_xmm1 = _mm_load_si128((__m128i *)shortM128_tg_3_16);
 | 
			
		||||
  r_xmm2 = row5;
 | 
			
		||||
  r_xmm3 = row3;
 | 
			
		||||
  r_xmm0 = _mm_mulhi_epi16(row5, r_xmm1);
 | 
			
		||||
 | 
			
		||||
  r_xmm1 = _mm_mulhi_epi16(r_xmm1, r_xmm3);
 | 
			
		||||
  r_xmm5 = _mm_load_si128((__m128i *)shortM128_tg_1_16);
 | 
			
		||||
  r_xmm6 = row7;
 | 
			
		||||
  r_xmm4 = _mm_mulhi_epi16(row7, r_xmm5);
 | 
			
		||||
 | 
			
		||||
  r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm2);
 | 
			
		||||
  r_xmm5 = _mm_mulhi_epi16(r_xmm5, row1);
 | 
			
		||||
  r_xmm1 = _mm_adds_epi16(r_xmm1, r_xmm3);
 | 
			
		||||
  r_xmm7 = row6;
 | 
			
		||||
 | 
			
		||||
  r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm3);
 | 
			
		||||
  r_xmm3 = _mm_load_si128((__m128i *)shortM128_tg_2_16);
 | 
			
		||||
  r_xmm2 = _mm_subs_epi16(r_xmm2, r_xmm1);
 | 
			
		||||
  r_xmm7 = _mm_mulhi_epi16(r_xmm7, r_xmm3);
 | 
			
		||||
  r_xmm1 = r_xmm0;
 | 
			
		||||
  r_xmm3 = _mm_mulhi_epi16(r_xmm3, row2);
 | 
			
		||||
  r_xmm5 = _mm_subs_epi16(r_xmm5, r_xmm6);
 | 
			
		||||
  r_xmm4 = _mm_adds_epi16(r_xmm4, row1);
 | 
			
		||||
  r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm4);
 | 
			
		||||
  r_xmm0 = _mm_adds_epi16(r_xmm0, *((__m128i *)shortM128_one_corr));
 | 
			
		||||
  r_xmm4 = _mm_subs_epi16(r_xmm4, r_xmm1);
 | 
			
		||||
  r_xmm6 = r_xmm5;
 | 
			
		||||
  r_xmm5 = _mm_subs_epi16(r_xmm5, r_xmm2);
 | 
			
		||||
  r_xmm5 = _mm_adds_epi16(r_xmm5, *((__m128i *)shortM128_one_corr));
 | 
			
		||||
  r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm2);
 | 
			
		||||
 | 
			
		||||
  // Intermediate results, needed later
 | 
			
		||||
  __m128i temp3, temp7;
 | 
			
		||||
  temp7 = r_xmm0;
 | 
			
		||||
 | 
			
		||||
  r_xmm1 = r_xmm4;
 | 
			
		||||
  r_xmm0 = _mm_load_si128((__m128i *)shortM128_cos_4_16);
 | 
			
		||||
  r_xmm4 = _mm_adds_epi16(r_xmm4, r_xmm5);
 | 
			
		||||
  r_xmm2 = _mm_load_si128((__m128i *)shortM128_cos_4_16);
 | 
			
		||||
  r_xmm2 = _mm_mulhi_epi16(r_xmm2, r_xmm4);
 | 
			
		||||
 | 
			
		||||
  // Intermediate results, needed later
 | 
			
		||||
  temp3 = r_xmm6;
 | 
			
		||||
 | 
			
		||||
  r_xmm1 = _mm_subs_epi16(r_xmm1, r_xmm5);
 | 
			
		||||
  r_xmm7 = _mm_adds_epi16(r_xmm7, row2);
 | 
			
		||||
  r_xmm3 = _mm_subs_epi16(r_xmm3, row6);
 | 
			
		||||
  r_xmm6 = row0;
 | 
			
		||||
  r_xmm0 = _mm_mulhi_epi16(r_xmm0, r_xmm1);
 | 
			
		||||
  r_xmm5 = row4;
 | 
			
		||||
  r_xmm5 = _mm_adds_epi16(r_xmm5, r_xmm6);
 | 
			
		||||
  r_xmm6 = _mm_subs_epi16(r_xmm6, row4);
 | 
			
		||||
  r_xmm4 = _mm_adds_epi16(r_xmm4, r_xmm2);
 | 
			
		||||
 | 
			
		||||
  r_xmm4 = _mm_or_si128(r_xmm4, *((__m128i *)shortM128_one_corr));
 | 
			
		||||
  r_xmm0 = _mm_adds_epi16(r_xmm0, r_xmm1);
 | 
			
		||||
  r_xmm0 = _mm_or_si128(r_xmm0, *((__m128i *)shortM128_one_corr));
 | 
			
		||||
 | 
			
		||||
  r_xmm2 = r_xmm5;
 | 
			
		||||
  r_xmm5 = _mm_adds_epi16(r_xmm5, r_xmm7);
 | 
			
		||||
  r_xmm1 = r_xmm6;
 | 
			
		||||
  r_xmm5 = _mm_adds_epi16(r_xmm5, *((__m128i *)shortM128_round_inv_col));
 | 
			
		||||
  r_xmm2 = _mm_subs_epi16(r_xmm2, r_xmm7);
 | 
			
		||||
  r_xmm7 = temp7;
 | 
			
		||||
  r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm3);
 | 
			
		||||
  r_xmm6 = _mm_adds_epi16(r_xmm6, *((__m128i *)shortM128_round_inv_col));
 | 
			
		||||
  r_xmm7 = _mm_adds_epi16(r_xmm7, r_xmm5);
 | 
			
		||||
  r_xmm7 = _mm_srai_epi16(r_xmm7, SHIFT_INV_COL);
 | 
			
		||||
  r_xmm1 = _mm_subs_epi16(r_xmm1, r_xmm3);
 | 
			
		||||
  r_xmm1 = _mm_adds_epi16(r_xmm1, *((__m128i *)shortM128_round_inv_corr));
 | 
			
		||||
  r_xmm3 = r_xmm6;
 | 
			
		||||
  r_xmm2 = _mm_adds_epi16(r_xmm2, *((__m128i *)shortM128_round_inv_corr));
 | 
			
		||||
  r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm4);
 | 
			
		||||
 | 
			
		||||
  // Store results for row 0
 | 
			
		||||
  //_mm_store_si128((__m128i *) pOutput, r_xmm7);
 | 
			
		||||
  __m128i r0 = r_xmm7;
 | 
			
		||||
 | 
			
		||||
  r_xmm6 = _mm_srai_epi16(r_xmm6, SHIFT_INV_COL);
 | 
			
		||||
  r_xmm7 = r_xmm1;
 | 
			
		||||
  r_xmm1 = _mm_adds_epi16(r_xmm1, r_xmm0);
 | 
			
		||||
 | 
			
		||||
  // Store results for row 1
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[1*8]), r_xmm6);
 | 
			
		||||
  __m128i r1 = r_xmm6;
 | 
			
		||||
 | 
			
		||||
  r_xmm1 = _mm_srai_epi16(r_xmm1, SHIFT_INV_COL);
 | 
			
		||||
  r_xmm6 = temp3;
 | 
			
		||||
  r_xmm7 = _mm_subs_epi16(r_xmm7, r_xmm0);
 | 
			
		||||
  r_xmm7 = _mm_srai_epi16(r_xmm7, SHIFT_INV_COL);
 | 
			
		||||
 | 
			
		||||
  // Store results for row 2
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[2*8]), r_xmm1);
 | 
			
		||||
  __m128i r2 = r_xmm1;
 | 
			
		||||
 | 
			
		||||
  r_xmm5 = _mm_subs_epi16(r_xmm5, temp7);
 | 
			
		||||
  r_xmm5 = _mm_srai_epi16(r_xmm5, SHIFT_INV_COL);
 | 
			
		||||
 | 
			
		||||
  // Store results for row 7
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[7*8]), r_xmm5);
 | 
			
		||||
  __m128i r7 = r_xmm5;
 | 
			
		||||
 | 
			
		||||
  r_xmm3 = _mm_subs_epi16(r_xmm3, r_xmm4);
 | 
			
		||||
  r_xmm6 = _mm_adds_epi16(r_xmm6, r_xmm2);
 | 
			
		||||
  r_xmm2 = _mm_subs_epi16(r_xmm2, temp3);
 | 
			
		||||
  r_xmm6 = _mm_srai_epi16(r_xmm6, SHIFT_INV_COL);
 | 
			
		||||
  r_xmm2 = _mm_srai_epi16(r_xmm2, SHIFT_INV_COL);
 | 
			
		||||
 | 
			
		||||
  // Store results for row 3
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[3*8]), r_xmm6);
 | 
			
		||||
  __m128i r3 = r_xmm6;
 | 
			
		||||
 | 
			
		||||
  r_xmm3 = _mm_srai_epi16(r_xmm3, SHIFT_INV_COL);
 | 
			
		||||
 | 
			
		||||
  // Store results for rows 4, 5, and 6
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[4*8]), r_xmm2);
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[5*8]), r_xmm7);
 | 
			
		||||
  //_mm_store_si128((__m128i *) (&pOutput[6*8]), r_xmm3);
 | 
			
		||||
 | 
			
		||||
  __m128i r4 = r_xmm2;
 | 
			
		||||
  __m128i r5 = r_xmm7;
 | 
			
		||||
  __m128i r6 = r_xmm3;
 | 
			
		||||
 | 
			
		||||
  r0 = _mm_add_epi16(*(const __m128i *)shortM128_128, r0);
 | 
			
		||||
  r1 = _mm_add_epi16(*(const __m128i *)shortM128_128, r1);
 | 
			
		||||
  r2 = _mm_add_epi16(*(const __m128i *)shortM128_128, r2);
 | 
			
		||||
  r3 = _mm_add_epi16(*(const __m128i *)shortM128_128, r3);
 | 
			
		||||
  r4 = _mm_add_epi16(*(const __m128i *)shortM128_128, r4);
 | 
			
		||||
  r5 = _mm_add_epi16(*(const __m128i *)shortM128_128, r5);
 | 
			
		||||
  r6 = _mm_add_epi16(*(const __m128i *)shortM128_128, r6);
 | 
			
		||||
  r7 = _mm_add_epi16(*(const __m128i *)shortM128_128, r7);
 | 
			
		||||
 | 
			
		||||
  ((__m128i *)pOutputUB)[0] = _mm_packus_epi16(r0, r1);
 | 
			
		||||
  ((__m128i *)pOutputUB)[1] = _mm_packus_epi16(r2, r3);
 | 
			
		||||
  ((__m128i *)pOutputUB)[2] = _mm_packus_epi16(r4, r5);
 | 
			
		||||
  ((__m128i *)pOutputUB)[3] = _mm_packus_epi16(r6, r7);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										186
									
								
								rd7tf/libs/include/renderd7/external/jpge.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,186 @@
 | 
			
		||||
// jpge.h - C++ class for JPEG compression.
 | 
			
		||||
// Public Domain or Apache 2.0, Richard Geldreich <richgel99@gmail.com>
 | 
			
		||||
// Alex Evans: Added RGBA support, linear memory allocator.
 | 
			
		||||
#ifndef JPEG_ENCODER_H
 | 
			
		||||
#define JPEG_ENCODER_H
 | 
			
		||||
 | 
			
		||||
namespace jpge {
 | 
			
		||||
typedef unsigned char uint8;
 | 
			
		||||
typedef signed short int16;
 | 
			
		||||
typedef signed int int32;
 | 
			
		||||
typedef unsigned short uint16;
 | 
			
		||||
typedef unsigned int uint32;
 | 
			
		||||
typedef unsigned int uint;
 | 
			
		||||
 | 
			
		||||
// JPEG chroma subsampling factors. Y_ONLY (grayscale images) and H2V2 (color
 | 
			
		||||
// images) are the most common.
 | 
			
		||||
enum subsampling_t { Y_ONLY = 0, H1V1 = 1, H2V1 = 2, H2V2 = 3 };
 | 
			
		||||
 | 
			
		||||
// JPEG compression parameters structure.
 | 
			
		||||
struct params {
 | 
			
		||||
  inline params()
 | 
			
		||||
      : m_quality(85), m_subsampling(H2V2), m_no_chroma_discrim_flag(false),
 | 
			
		||||
        m_two_pass_flag(false), m_use_std_tables(false) {}
 | 
			
		||||
 | 
			
		||||
  inline bool check() const {
 | 
			
		||||
    if ((m_quality < 1) || (m_quality > 100))
 | 
			
		||||
      return false;
 | 
			
		||||
    if ((uint)m_subsampling > (uint)H2V2)
 | 
			
		||||
      return false;
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Quality: 1-100, higher is better. Typical values are around 50-95.
 | 
			
		||||
  int m_quality;
 | 
			
		||||
 | 
			
		||||
  // m_subsampling:
 | 
			
		||||
  // 0 = Y (grayscale) only
 | 
			
		||||
  // 1 = YCbCr, no subsampling (H1V1, YCbCr 1x1x1, 3 blocks per MCU)
 | 
			
		||||
  // 2 = YCbCr, H2V1 subsampling (YCbCr 2x1x1, 4 blocks per MCU)
 | 
			
		||||
  // 3 = YCbCr, H2V2 subsampling (YCbCr 4x1x1, 6 blocks per MCU-- very common)
 | 
			
		||||
  subsampling_t m_subsampling;
 | 
			
		||||
 | 
			
		||||
  // Disables CbCr discrimination - only intended for testing.
 | 
			
		||||
  // If true, the Y quantization table is also used for the CbCr channels.
 | 
			
		||||
  bool m_no_chroma_discrim_flag;
 | 
			
		||||
 | 
			
		||||
  bool m_two_pass_flag;
 | 
			
		||||
 | 
			
		||||
  // By default we use the same quantization tables as mozjpeg's default.
 | 
			
		||||
  // Set to true to use the traditional tables from JPEG Annex K.
 | 
			
		||||
  bool m_use_std_tables;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Writes JPEG image to a file.
 | 
			
		||||
// num_channels must be 1 (Y) or 3 (RGB), image pitch must be
 | 
			
		||||
// width*num_channels.
 | 
			
		||||
bool compress_image_to_jpeg_file(const char *pFilename, int width, int height,
 | 
			
		||||
                                 int num_channels, const uint8 *pImage_data,
 | 
			
		||||
                                 const params &comp_params = params());
 | 
			
		||||
 | 
			
		||||
// Writes JPEG image to memory buffer.
 | 
			
		||||
// On entry, buf_size is the size of the output buffer pointed at by pBuf, which
 | 
			
		||||
// should be at least ~1024 bytes. If return value is true, buf_size will be set
 | 
			
		||||
// to the size of the compressed data.
 | 
			
		||||
bool compress_image_to_jpeg_file_in_memory(
 | 
			
		||||
    void *pBuf, int &buf_size, int width, int height, int num_channels,
 | 
			
		||||
    const uint8 *pImage_data, const params &comp_params = params());
 | 
			
		||||
 | 
			
		||||
// Output stream abstract class - used by the jpeg_encoder class to write to the
 | 
			
		||||
// output stream. put_buf() is generally called with len==JPGE_OUT_BUF_SIZE
 | 
			
		||||
// bytes, but for headers it'll be called with smaller amounts.
 | 
			
		||||
class output_stream {
 | 
			
		||||
public:
 | 
			
		||||
  virtual ~output_stream(){};
 | 
			
		||||
  virtual bool put_buf(const void *Pbuf, int len) = 0;
 | 
			
		||||
  template <class T> inline bool put_obj(const T &obj) {
 | 
			
		||||
    return put_buf(&obj, sizeof(T));
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Lower level jpeg_encoder class - useful if more control is needed than the
 | 
			
		||||
// above helper functions.
 | 
			
		||||
class jpeg_encoder {
 | 
			
		||||
public:
 | 
			
		||||
  jpeg_encoder();
 | 
			
		||||
  ~jpeg_encoder();
 | 
			
		||||
 | 
			
		||||
  // Initializes the compressor.
 | 
			
		||||
  // pStream: The stream object to use for writing compressed data.
 | 
			
		||||
  // params - Compression parameters structure, defined above.
 | 
			
		||||
  // width, height  - Image dimensions.
 | 
			
		||||
  // channels - May be 1, or 3. 1 indicates grayscale, 3 indicates RGB source
 | 
			
		||||
  // data. Returns false on out of memory or if a stream write fails.
 | 
			
		||||
  bool init(output_stream *pStream, int width, int height, int src_channels,
 | 
			
		||||
            const params &comp_params = params());
 | 
			
		||||
 | 
			
		||||
  const params &get_params() const { return m_params; }
 | 
			
		||||
 | 
			
		||||
  // Deinitializes the compressor, freeing any allocated memory. May be called
 | 
			
		||||
  // at any time.
 | 
			
		||||
  void deinit();
 | 
			
		||||
 | 
			
		||||
  uint get_total_passes() const { return m_params.m_two_pass_flag ? 2 : 1; }
 | 
			
		||||
  inline uint get_cur_pass() { return m_pass_num; }
 | 
			
		||||
 | 
			
		||||
  // Call this method with each source scanline.
 | 
			
		||||
  // width * src_channels bytes per scanline is expected (RGB or Y format).
 | 
			
		||||
  // You must call with NULL after all scanlines are processed to finish
 | 
			
		||||
  // compression. Returns false on out of memory or if a stream write fails.
 | 
			
		||||
  bool process_scanline(const void *pScanline);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  jpeg_encoder(const jpeg_encoder &);
 | 
			
		||||
  jpeg_encoder &operator=(const jpeg_encoder &);
 | 
			
		||||
 | 
			
		||||
  typedef int32 sample_array_t;
 | 
			
		||||
 | 
			
		||||
  output_stream *m_pStream;
 | 
			
		||||
  params m_params;
 | 
			
		||||
  uint8 m_num_components;
 | 
			
		||||
  uint8 m_comp_h_samp[3], m_comp_v_samp[3];
 | 
			
		||||
  int m_image_x, m_image_y, m_image_bpp, m_image_bpl;
 | 
			
		||||
  int m_image_x_mcu, m_image_y_mcu;
 | 
			
		||||
  int m_image_bpl_xlt, m_image_bpl_mcu;
 | 
			
		||||
  int m_mcus_per_row;
 | 
			
		||||
  int m_mcu_x, m_mcu_y;
 | 
			
		||||
  uint8 *m_mcu_lines[16];
 | 
			
		||||
  uint8 m_mcu_y_ofs;
 | 
			
		||||
  sample_array_t m_sample_array[64];
 | 
			
		||||
  int16 m_coefficient_array[64];
 | 
			
		||||
  int32 m_quantization_tables[2][64];
 | 
			
		||||
  uint m_huff_codes[4][256];
 | 
			
		||||
  uint8 m_huff_code_sizes[4][256];
 | 
			
		||||
  uint8 m_huff_bits[4][17];
 | 
			
		||||
  uint8 m_huff_val[4][256];
 | 
			
		||||
  uint32 m_huff_count[4][256];
 | 
			
		||||
  int m_last_dc_val[3];
 | 
			
		||||
  enum { JPGE_OUT_BUF_SIZE = 2048 };
 | 
			
		||||
  uint8 m_out_buf[JPGE_OUT_BUF_SIZE];
 | 
			
		||||
  uint8 *m_pOut_buf;
 | 
			
		||||
  uint m_out_buf_left;
 | 
			
		||||
  uint32 m_bit_buffer;
 | 
			
		||||
  uint m_bits_in;
 | 
			
		||||
  uint8 m_pass_num;
 | 
			
		||||
  bool m_all_stream_writes_succeeded;
 | 
			
		||||
 | 
			
		||||
  void optimize_huffman_table(int table_num, int table_len);
 | 
			
		||||
  void emit_byte(uint8 i);
 | 
			
		||||
  void emit_word(uint i);
 | 
			
		||||
  void emit_marker(int marker);
 | 
			
		||||
  void emit_jfif_app0();
 | 
			
		||||
  void emit_dqt();
 | 
			
		||||
  void emit_sof();
 | 
			
		||||
  void emit_dht(uint8 *bits, uint8 *val, int index, bool ac_flag);
 | 
			
		||||
  void emit_dhts();
 | 
			
		||||
  void emit_sos();
 | 
			
		||||
  void emit_markers();
 | 
			
		||||
  void compute_huffman_table(uint *codes, uint8 *code_sizes, uint8 *bits,
 | 
			
		||||
                             uint8 *val);
 | 
			
		||||
  void compute_quant_table(int32 *dst, int16 *src);
 | 
			
		||||
  void adjust_quant_table(int32 *dst, int32 *src);
 | 
			
		||||
  void first_pass_init();
 | 
			
		||||
  bool second_pass_init();
 | 
			
		||||
  bool jpg_open(int p_x_res, int p_y_res, int src_channels);
 | 
			
		||||
  void load_block_8_8_grey(int x);
 | 
			
		||||
  void load_block_8_8(int x, int y, int c);
 | 
			
		||||
  void load_block_16_8(int x, int c);
 | 
			
		||||
  void load_block_16_8_8(int x, int c);
 | 
			
		||||
  void load_quantized_coefficients(int component_num);
 | 
			
		||||
  void flush_output_buffer();
 | 
			
		||||
  void put_bits(uint bits, uint len);
 | 
			
		||||
  void code_coefficients_pass_one(int component_num);
 | 
			
		||||
  void code_coefficients_pass_two(int component_num);
 | 
			
		||||
  void code_block(int component_num);
 | 
			
		||||
  void process_mcu_row();
 | 
			
		||||
  bool terminate_pass_one();
 | 
			
		||||
  bool terminate_pass_two();
 | 
			
		||||
  bool process_end_of_image();
 | 
			
		||||
  void load_mcu(const void *src);
 | 
			
		||||
  void clear();
 | 
			
		||||
  void init();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace jpge
 | 
			
		||||
 | 
			
		||||
#endif // JPEG_ENCODER
 | 
			
		||||
							
								
								
									
										25447
									
								
								rd7tf/libs/include/renderd7/external/json.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2114
									
								
								rd7tf/libs/include/renderd7/external/lodepng.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										222
									
								
								rd7tf/libs/include/renderd7/external/nvid.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,222 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstdint>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <memory.h>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <renderd7/external/jpgd.h>
 | 
			
		||||
#include <renderd7/external/jpge.h>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
struct NVID_Header {
 | 
			
		||||
  char magic[4];       // Magic
 | 
			
		||||
  int framerate;       // Only Up to 60
 | 
			
		||||
  int width;           // Width
 | 
			
		||||
  int height;          // Height
 | 
			
		||||
  uint32_t framecount; // Count of Frames
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct NVID_Frame {
 | 
			
		||||
  char magic[4];      // Magic
 | 
			
		||||
  uint32_t framesize; // Size of Frame
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct NVID_Image {
 | 
			
		||||
  int framenum; // Register of Frame
 | 
			
		||||
  int w;        // Width of Frame
 | 
			
		||||
  int h;        // Height of Frame
 | 
			
		||||
  int bpp;      // bpp of Frame
 | 
			
		||||
  void *pBuf;   // Buffer
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline void CreateHeader(NVID_Header &header) {
 | 
			
		||||
  header.magic[0] = 'N';
 | 
			
		||||
  header.magic[1] = 'V';
 | 
			
		||||
  header.magic[2] = 'I';
 | 
			
		||||
  header.magic[3] = 'D';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline void CreateFrame(NVID_Frame &frame) {
 | 
			
		||||
  frame.magic[0] = 'N';
 | 
			
		||||
  frame.magic[1] = 'F';
 | 
			
		||||
  frame.magic[2] = 'R';
 | 
			
		||||
  frame.magic[3] = 'M';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool CheckHeader(NVID_Header &header) {
 | 
			
		||||
  if (header.magic[0] == 'N' && header.magic[1] == 'V' &&
 | 
			
		||||
      header.magic[2] == 'I' && header.magic[3] == 'D')
 | 
			
		||||
    return true;
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline bool CheckFrame(NVID_Frame &frame) {
 | 
			
		||||
  if (frame.magic[0] == 'N' && frame.magic[1] == 'F' && frame.magic[2] == 'R' &&
 | 
			
		||||
      frame.magic[3] == 'M')
 | 
			
		||||
    return true;
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::vector<std::unique_ptr<NVID_Image>>
 | 
			
		||||
LoadNVID(const std::string &path) {
 | 
			
		||||
  std::vector<std::unique_ptr<NVID_Image>> res;
 | 
			
		||||
  std::ifstream nvid_file(path, std::ios::binary | std::ios::in);
 | 
			
		||||
  if (!nvid_file) {
 | 
			
		||||
    std::cerr << "Failed to open NVID file: " << path << std::endl;
 | 
			
		||||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  NVID_Header header;
 | 
			
		||||
  nvid_file.read(reinterpret_cast<char *>(&header), sizeof(header));
 | 
			
		||||
  if (!CheckHeader(header)) {
 | 
			
		||||
    std::cerr << "Invalid NVID header" << std::endl;
 | 
			
		||||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (int i = 0; i < (int)header.framecount; i++) {
 | 
			
		||||
    NVID_Frame frame;
 | 
			
		||||
    nvid_file.read(reinterpret_cast<char *>(&frame), sizeof(frame));
 | 
			
		||||
    if (!CheckFrame(frame)) {
 | 
			
		||||
      std::cerr << "Invalid NVID frame" << std::endl;
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<uint8_t> compressed_data(frame.framesize);
 | 
			
		||||
    nvid_file.read(reinterpret_cast<char *>(compressed_data.data()),
 | 
			
		||||
                   compressed_data.size());
 | 
			
		||||
 | 
			
		||||
    int width, height, components;
 | 
			
		||||
    unsigned char *decompressed_data = jpgd::decompress_jpeg_image_from_memory(
 | 
			
		||||
        compressed_data.data(), compressed_data.size(), &width, &height,
 | 
			
		||||
        &components, 3);
 | 
			
		||||
    if (!decompressed_data) {
 | 
			
		||||
      std::cerr << "Failed to decompress JPEG data" << std::endl;
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    auto image = std::make_unique<NVID_Image>();
 | 
			
		||||
    image->bpp = components;
 | 
			
		||||
    image->w = width;
 | 
			
		||||
    image->h = height;
 | 
			
		||||
    image->framenum = i;
 | 
			
		||||
    image->pBuf = decompressed_data;
 | 
			
		||||
 | 
			
		||||
    res.push_back(std::move(image));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline std::vector<std::unique_ptr<NVID_Image>> LoadMemNVID(const void *data,
 | 
			
		||||
                                                            size_t size) {
 | 
			
		||||
  std::vector<std::unique_ptr<NVID_Image>> res;
 | 
			
		||||
  std::istringstream nvid_stream(
 | 
			
		||||
      std::string(reinterpret_cast<const char *>(data), size));
 | 
			
		||||
  NVID_Header header;
 | 
			
		||||
  nvid_stream.read(reinterpret_cast<char *>(&header), sizeof(header));
 | 
			
		||||
  if (!CheckHeader(header)) {
 | 
			
		||||
    std::cerr << "Invalid NVID header" << std::endl;
 | 
			
		||||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
  for (int i = 0; i < (int)header.framecount; i++) {
 | 
			
		||||
    NVID_Frame frame;
 | 
			
		||||
    nvid_stream.read(reinterpret_cast<char *>(&frame), sizeof(frame));
 | 
			
		||||
    if (!CheckFrame(frame)) {
 | 
			
		||||
      std::cerr << "Invalid NVID frame" << std::endl;
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
    std::vector<uint8_t> compressed_data(frame.framesize);
 | 
			
		||||
    nvid_stream.read(reinterpret_cast<char *>(compressed_data.data()),
 | 
			
		||||
                     compressed_data.size());
 | 
			
		||||
    int width, height, components;
 | 
			
		||||
    unsigned char *decompressed_data = jpgd::decompress_jpeg_image_from_memory(
 | 
			
		||||
        compressed_data.data(), compressed_data.size(), &width, &height,
 | 
			
		||||
        &components, 3);
 | 
			
		||||
    if (!decompressed_data) {
 | 
			
		||||
      std::cerr << "Failed to decompress JPEG data" << std::endl;
 | 
			
		||||
      return res;
 | 
			
		||||
    }
 | 
			
		||||
    auto image = std::make_unique<NVID_Image>();
 | 
			
		||||
    image->bpp = components;
 | 
			
		||||
    image->w = width;
 | 
			
		||||
    image->h = height;
 | 
			
		||||
    image->framenum = i;
 | 
			
		||||
    image->pBuf = decompressed_data;
 | 
			
		||||
    res.push_back(std::move(image));
 | 
			
		||||
  }
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class NVID_Stream {
 | 
			
		||||
public:
 | 
			
		||||
  NVID_Stream(const std::string &path)
 | 
			
		||||
      : file_(path, std::ios::binary | std::ios::in) {
 | 
			
		||||
    if (!file_) {
 | 
			
		||||
      std::cout << "Failed to open NVID file: " << path << std::endl;
 | 
			
		||||
      return;
 | 
			
		||||
    } else {
 | 
			
		||||
      file_.read(reinterpret_cast<char *>(&header_), sizeof(header_));
 | 
			
		||||
      if (!CheckHeader(header_)) {
 | 
			
		||||
        std::cout << "Invalid NVID header" << std::endl;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  NVID_Stream(const void *data, std::size_t size) {
 | 
			
		||||
    if (!data || size < sizeof(header_)) {
 | 
			
		||||
      std::cout << "Invalid NVID data" << std::endl;
 | 
			
		||||
      return;
 | 
			
		||||
    } else {
 | 
			
		||||
      memcpy(&header_, data, sizeof(header_));
 | 
			
		||||
      if (!CheckHeader(header_)) {
 | 
			
		||||
        std::cout << "Invalid NVID header" << std::endl;
 | 
			
		||||
        return;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ~NVID_Stream() { file_.close(); }
 | 
			
		||||
 | 
			
		||||
  bool ReadNext(NVID_Image &image) {
 | 
			
		||||
    if (!file_) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    NVID_Frame frame;
 | 
			
		||||
    file_.read(reinterpret_cast<char *>(&frame), sizeof(frame));
 | 
			
		||||
    if (!CheckFrame(frame)) {
 | 
			
		||||
      std::cout << "Invalid NVID frame" << std::endl;
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    std::vector<uint8_t> compressed_data(frame.framesize);
 | 
			
		||||
    file_.read(reinterpret_cast<char *>(compressed_data.data()),
 | 
			
		||||
               compressed_data.size());
 | 
			
		||||
 | 
			
		||||
    int width, height, components;
 | 
			
		||||
    unsigned char *decompressed_data = jpgd::decompress_jpeg_image_from_memory(
 | 
			
		||||
        compressed_data.data(), compressed_data.size(), &width, &height,
 | 
			
		||||
        &components, 3);
 | 
			
		||||
    if (!decompressed_data) {
 | 
			
		||||
      std::cout << "Failed to decompress JPEG data" << std::endl;
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    image.bpp = components;
 | 
			
		||||
    image.w = width;
 | 
			
		||||
    image.h = height;
 | 
			
		||||
    image.framenum = current_frame_++;
 | 
			
		||||
    image.pBuf = decompressed_data;
 | 
			
		||||
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  std::ifstream file_;
 | 
			
		||||
  NVID_Header header_;
 | 
			
		||||
  int current_frame_ = 0;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										8681
									
								
								rd7tf/libs/include/renderd7/external/stb_image.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2054
									
								
								rd7tf/libs/include/renderd7/external/stb_image_write.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										5636
									
								
								rd7tf/libs/include/renderd7/external/stb_truetype.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										545
									
								
								rd7tf/libs/include/renderd7/ini.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,545 @@
 | 
			
		||||
#ifndef INI_INI_H_
 | 
			
		||||
#define INI_INI_H_
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <cctype>
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
namespace INI {
 | 
			
		||||
namespace INIStringUtil {
 | 
			
		||||
const char *const whitespaceDelimiters = " \t\n\r\f\v";
 | 
			
		||||
inline void trim(std::string &str) {
 | 
			
		||||
  str.erase(str.find_last_not_of(whitespaceDelimiters) + 1);
 | 
			
		||||
  str.erase(0, str.find_first_not_of(whitespaceDelimiters));
 | 
			
		||||
}
 | 
			
		||||
#ifndef INI_CASE_SENSITIVE
 | 
			
		||||
inline void toLower(std::string &str) {
 | 
			
		||||
  std::transform(str.begin(), str.end(), str.begin(), [](const char c) {
 | 
			
		||||
    return static_cast<const char>(std::tolower(c));
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
inline void replace(std::string &str, std::string const &a,
 | 
			
		||||
                    std::string const &b) {
 | 
			
		||||
  if (!a.empty()) {
 | 
			
		||||
    std::size_t pos = 0;
 | 
			
		||||
    while ((pos = str.find(a, pos)) != std::string::npos) {
 | 
			
		||||
      str.replace(pos, a.size(), b);
 | 
			
		||||
      pos += b.size();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
#ifdef _WIN32
 | 
			
		||||
const char *const endl = "\r\n";
 | 
			
		||||
#else
 | 
			
		||||
const char *const endl = "\n";
 | 
			
		||||
#endif
 | 
			
		||||
}; // namespace INIStringUtil
 | 
			
		||||
 | 
			
		||||
template <typename T> class INIMap {
 | 
			
		||||
private:
 | 
			
		||||
  using T_DataIndexMap = std::unordered_map<std::string, std::size_t>;
 | 
			
		||||
  using T_DataItem = std::pair<std::string, T>;
 | 
			
		||||
  using T_DataContainer = std::vector<T_DataItem>;
 | 
			
		||||
  using T_MultiArgs = typename std::vector<std::pair<std::string, T>>;
 | 
			
		||||
 | 
			
		||||
  T_DataIndexMap dataIndexMap;
 | 
			
		||||
  T_DataContainer data;
 | 
			
		||||
 | 
			
		||||
  inline std::size_t setEmpty(std::string &key) {
 | 
			
		||||
    std::size_t index = data.size();
 | 
			
		||||
    dataIndexMap[key] = index;
 | 
			
		||||
    data.emplace_back(key, T());
 | 
			
		||||
    return index;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  using const_iterator = typename T_DataContainer::const_iterator;
 | 
			
		||||
 | 
			
		||||
  INIMap() {}
 | 
			
		||||
 | 
			
		||||
  INIMap(INIMap const &other) {
 | 
			
		||||
    std::size_t data_size = other.data.size();
 | 
			
		||||
    for (std::size_t i = 0; i < data_size; ++i) {
 | 
			
		||||
      auto const &key = other.data[i].first;
 | 
			
		||||
      auto const &obj = other.data[i].second;
 | 
			
		||||
      data.emplace_back(key, obj);
 | 
			
		||||
    }
 | 
			
		||||
    dataIndexMap = T_DataIndexMap(other.dataIndexMap);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  T &operator[](std::string key) {
 | 
			
		||||
    INIStringUtil::trim(key);
 | 
			
		||||
#ifndef INI_CASE_SENSITIVE
 | 
			
		||||
    INIStringUtil::toLower(key);
 | 
			
		||||
#endif
 | 
			
		||||
    auto it = dataIndexMap.find(key);
 | 
			
		||||
    bool hasIt = (it != dataIndexMap.end());
 | 
			
		||||
    std::size_t index = (hasIt) ? it->second : setEmpty(key);
 | 
			
		||||
    return data[index].second;
 | 
			
		||||
  }
 | 
			
		||||
  T get(std::string key) const {
 | 
			
		||||
    INIStringUtil::trim(key);
 | 
			
		||||
#ifndef INI_CASE_SENSITIVE
 | 
			
		||||
    INIStringUtil::toLower(key);
 | 
			
		||||
#endif
 | 
			
		||||
    auto it = dataIndexMap.find(key);
 | 
			
		||||
    if (it == dataIndexMap.end()) {
 | 
			
		||||
      return T();
 | 
			
		||||
    }
 | 
			
		||||
    return T(data[it->second].second);
 | 
			
		||||
  }
 | 
			
		||||
  bool has(std::string key) const {
 | 
			
		||||
    INIStringUtil::trim(key);
 | 
			
		||||
#ifndef INI_CASE_SENSITIVE
 | 
			
		||||
    INIStringUtil::toLower(key);
 | 
			
		||||
#endif
 | 
			
		||||
    return (dataIndexMap.count(key) == 1);
 | 
			
		||||
  }
 | 
			
		||||
  void set(std::string key, T obj) {
 | 
			
		||||
    INIStringUtil::trim(key);
 | 
			
		||||
#ifndef INI_CASE_SENSITIVE
 | 
			
		||||
    INIStringUtil::toLower(key);
 | 
			
		||||
#endif
 | 
			
		||||
    auto it = dataIndexMap.find(key);
 | 
			
		||||
    if (it != dataIndexMap.end()) {
 | 
			
		||||
      data[it->second].second = obj;
 | 
			
		||||
    } else {
 | 
			
		||||
      dataIndexMap[key] = data.size();
 | 
			
		||||
      data.emplace_back(key, obj);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  void set(T_MultiArgs const &multiArgs) {
 | 
			
		||||
    for (auto const &it : multiArgs) {
 | 
			
		||||
      auto const &key = it.first;
 | 
			
		||||
      auto const &obj = it.second;
 | 
			
		||||
      set(key, obj);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  bool remove(std::string key) {
 | 
			
		||||
    INIStringUtil::trim(key);
 | 
			
		||||
#ifndef INI_CASE_SENSITIVE
 | 
			
		||||
    INIStringUtil::toLower(key);
 | 
			
		||||
#endif
 | 
			
		||||
    auto it = dataIndexMap.find(key);
 | 
			
		||||
    if (it != dataIndexMap.end()) {
 | 
			
		||||
      std::size_t index = it->second;
 | 
			
		||||
      data.erase(data.begin() + index);
 | 
			
		||||
      dataIndexMap.erase(it);
 | 
			
		||||
      for (auto &it2 : dataIndexMap) {
 | 
			
		||||
        auto &vi = it2.second;
 | 
			
		||||
        if (vi > index) {
 | 
			
		||||
          vi--;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  void clear() {
 | 
			
		||||
    data.clear();
 | 
			
		||||
    dataIndexMap.clear();
 | 
			
		||||
  }
 | 
			
		||||
  std::size_t size() const { return data.size(); }
 | 
			
		||||
  const_iterator begin() const { return data.begin(); }
 | 
			
		||||
  const_iterator end() const { return data.end(); }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
using INIStructure = INIMap<INIMap<std::string>>;
 | 
			
		||||
 | 
			
		||||
namespace INIParser {
 | 
			
		||||
using T_ParseValues = std::pair<std::string, std::string>;
 | 
			
		||||
 | 
			
		||||
enum class PDataType : char {
 | 
			
		||||
  PDATA_NONE,
 | 
			
		||||
  PDATA_COMMENT,
 | 
			
		||||
  PDATA_SECTION,
 | 
			
		||||
  PDATA_KEYVALUE,
 | 
			
		||||
  PDATA_UNKNOWN
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
inline PDataType parseLine(std::string line, T_ParseValues &parseData) {
 | 
			
		||||
  parseData.first.clear();
 | 
			
		||||
  parseData.second.clear();
 | 
			
		||||
  INIStringUtil::trim(line);
 | 
			
		||||
  if (line.empty()) {
 | 
			
		||||
    return PDataType::PDATA_NONE;
 | 
			
		||||
  }
 | 
			
		||||
  char firstCharacter = line[0];
 | 
			
		||||
  if (firstCharacter == ';') {
 | 
			
		||||
    return PDataType::PDATA_COMMENT;
 | 
			
		||||
  }
 | 
			
		||||
  if (firstCharacter == '[') {
 | 
			
		||||
    auto commentAt = line.find_first_of(';');
 | 
			
		||||
    if (commentAt != std::string::npos) {
 | 
			
		||||
      line = line.substr(0, commentAt);
 | 
			
		||||
    }
 | 
			
		||||
    auto closingBracketAt = line.find_last_of(']');
 | 
			
		||||
    if (closingBracketAt != std::string::npos) {
 | 
			
		||||
      auto section = line.substr(1, closingBracketAt - 1);
 | 
			
		||||
      INIStringUtil::trim(section);
 | 
			
		||||
      parseData.first = section;
 | 
			
		||||
      return PDataType::PDATA_SECTION;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  auto lineNorm = line;
 | 
			
		||||
  INIStringUtil::replace(lineNorm, "\\=", "  ");
 | 
			
		||||
  auto equalsAt = lineNorm.find_first_of('=');
 | 
			
		||||
  if (equalsAt != std::string::npos) {
 | 
			
		||||
    auto key = line.substr(0, equalsAt);
 | 
			
		||||
    INIStringUtil::trim(key);
 | 
			
		||||
    INIStringUtil::replace(key, "\\=", "=");
 | 
			
		||||
    auto value = line.substr(equalsAt + 1);
 | 
			
		||||
    INIStringUtil::trim(value);
 | 
			
		||||
    parseData.first = key;
 | 
			
		||||
    parseData.second = value;
 | 
			
		||||
    return PDataType::PDATA_KEYVALUE;
 | 
			
		||||
  }
 | 
			
		||||
  return PDataType::PDATA_UNKNOWN;
 | 
			
		||||
}
 | 
			
		||||
}; // namespace INIParser
 | 
			
		||||
 | 
			
		||||
class INIReader {
 | 
			
		||||
public:
 | 
			
		||||
  using T_LineData = std::vector<std::string>;
 | 
			
		||||
  using T_LineDataPtr = std::shared_ptr<T_LineData>;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  std::ifstream fileReadStream;
 | 
			
		||||
  T_LineDataPtr lineData;
 | 
			
		||||
 | 
			
		||||
  T_LineData readFile() {
 | 
			
		||||
    std::string fileContents;
 | 
			
		||||
    fileReadStream.seekg(0, std::ios::end);
 | 
			
		||||
    fileContents.resize(fileReadStream.tellg());
 | 
			
		||||
    fileReadStream.seekg(0, std::ios::beg);
 | 
			
		||||
    std::size_t fileSize = fileContents.size();
 | 
			
		||||
    fileReadStream.read(&fileContents[0], fileSize);
 | 
			
		||||
    fileReadStream.close();
 | 
			
		||||
    T_LineData output;
 | 
			
		||||
    if (fileSize == 0) {
 | 
			
		||||
      return output;
 | 
			
		||||
    }
 | 
			
		||||
    std::string buffer;
 | 
			
		||||
    buffer.reserve(50);
 | 
			
		||||
    for (std::size_t i = 0; i < fileSize; ++i) {
 | 
			
		||||
      char &c = fileContents[i];
 | 
			
		||||
      if (c == '\n') {
 | 
			
		||||
        output.emplace_back(buffer);
 | 
			
		||||
        buffer.clear();
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      if (c != '\0' && c != '\r') {
 | 
			
		||||
        buffer += c;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    output.emplace_back(buffer);
 | 
			
		||||
    return output;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  INIReader(std::string const &filename, bool keepLineData = false) {
 | 
			
		||||
    fileReadStream.open(filename, std::ios::in | std::ios::binary);
 | 
			
		||||
    if (keepLineData) {
 | 
			
		||||
      lineData = std::make_shared<T_LineData>();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  ~INIReader() {}
 | 
			
		||||
 | 
			
		||||
  bool operator>>(INIStructure &data) {
 | 
			
		||||
    if (!fileReadStream.is_open()) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    T_LineData fileLines = readFile();
 | 
			
		||||
    std::string section;
 | 
			
		||||
    bool inSection = false;
 | 
			
		||||
    INIParser::T_ParseValues parseData;
 | 
			
		||||
    for (auto const &line : fileLines) {
 | 
			
		||||
      auto parseResult = INIParser::parseLine(line, parseData);
 | 
			
		||||
      if (parseResult == INIParser::PDataType::PDATA_SECTION) {
 | 
			
		||||
        inSection = true;
 | 
			
		||||
        data[section = parseData.first];
 | 
			
		||||
      } else if (inSection &&
 | 
			
		||||
                 parseResult == INIParser::PDataType::PDATA_KEYVALUE) {
 | 
			
		||||
        auto const &key = parseData.first;
 | 
			
		||||
        auto const &value = parseData.second;
 | 
			
		||||
        data[section][key] = value;
 | 
			
		||||
      }
 | 
			
		||||
      if (lineData && parseResult != INIParser::PDataType::PDATA_UNKNOWN) {
 | 
			
		||||
        if (parseResult == INIParser::PDataType::PDATA_KEYVALUE && !inSection) {
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
        lineData->emplace_back(line);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
  T_LineDataPtr getLines() { return lineData; }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class INIGenerator {
 | 
			
		||||
private:
 | 
			
		||||
  std::ofstream fileWriteStream;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  bool prettyPrint = false;
 | 
			
		||||
 | 
			
		||||
  INIGenerator(std::string const &filename) {
 | 
			
		||||
    fileWriteStream.open(filename, std::ios::out | std::ios::binary);
 | 
			
		||||
  }
 | 
			
		||||
  ~INIGenerator() {}
 | 
			
		||||
 | 
			
		||||
  bool operator<<(INIStructure const &data) {
 | 
			
		||||
    if (!fileWriteStream.is_open()) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    if (!data.size()) {
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    auto it = data.begin();
 | 
			
		||||
    for (;;) {
 | 
			
		||||
      auto const §ion = it->first;
 | 
			
		||||
      auto const &collection = it->second;
 | 
			
		||||
      fileWriteStream << "[" << section << "]";
 | 
			
		||||
      if (collection.size()) {
 | 
			
		||||
        fileWriteStream << INIStringUtil::endl;
 | 
			
		||||
        auto it2 = collection.begin();
 | 
			
		||||
        for (;;) {
 | 
			
		||||
          auto key = it2->first;
 | 
			
		||||
          INIStringUtil::replace(key, "=", "\\=");
 | 
			
		||||
          auto value = it2->second;
 | 
			
		||||
          INIStringUtil::trim(value);
 | 
			
		||||
          fileWriteStream << key << ((prettyPrint) ? " = " : "=") << value;
 | 
			
		||||
          if (++it2 == collection.end()) {
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          fileWriteStream << INIStringUtil::endl;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (++it == data.end()) {
 | 
			
		||||
        break;
 | 
			
		||||
      }
 | 
			
		||||
      fileWriteStream << INIStringUtil::endl;
 | 
			
		||||
      if (prettyPrint) {
 | 
			
		||||
        fileWriteStream << INIStringUtil::endl;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return true;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class INIWriter {
 | 
			
		||||
private:
 | 
			
		||||
  using T_LineData = std::vector<std::string>;
 | 
			
		||||
  using T_LineDataPtr = std::shared_ptr<T_LineData>;
 | 
			
		||||
 | 
			
		||||
  std::string filename;
 | 
			
		||||
 | 
			
		||||
  T_LineData getLazyOutput(T_LineDataPtr const &lineData, INIStructure &data,
 | 
			
		||||
                           INIStructure &original) {
 | 
			
		||||
    T_LineData output;
 | 
			
		||||
    INIParser::T_ParseValues parseData;
 | 
			
		||||
    std::string sectionCurrent;
 | 
			
		||||
    bool parsingSection = false;
 | 
			
		||||
    bool continueToNextSection = false;
 | 
			
		||||
    bool discardNextEmpty = false;
 | 
			
		||||
    bool writeNewKeys = false;
 | 
			
		||||
    std::size_t lastKeyLine = 0;
 | 
			
		||||
    for (auto line = lineData->begin(); line != lineData->end(); ++line) {
 | 
			
		||||
      if (!writeNewKeys) {
 | 
			
		||||
        auto parseResult = INIParser::parseLine(*line, parseData);
 | 
			
		||||
        if (parseResult == INIParser::PDataType::PDATA_SECTION) {
 | 
			
		||||
          if (parsingSection) {
 | 
			
		||||
            writeNewKeys = true;
 | 
			
		||||
            parsingSection = false;
 | 
			
		||||
            --line;
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
          sectionCurrent = parseData.first;
 | 
			
		||||
          if (data.has(sectionCurrent)) {
 | 
			
		||||
            parsingSection = true;
 | 
			
		||||
            continueToNextSection = false;
 | 
			
		||||
            discardNextEmpty = false;
 | 
			
		||||
            output.emplace_back(*line);
 | 
			
		||||
            lastKeyLine = output.size();
 | 
			
		||||
          } else {
 | 
			
		||||
            continueToNextSection = true;
 | 
			
		||||
            discardNextEmpty = true;
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
        } else if (parseResult == INIParser::PDataType::PDATA_KEYVALUE) {
 | 
			
		||||
          if (continueToNextSection) {
 | 
			
		||||
            continue;
 | 
			
		||||
          }
 | 
			
		||||
          if (data.has(sectionCurrent)) {
 | 
			
		||||
            auto &collection = data[sectionCurrent];
 | 
			
		||||
            auto const &key = parseData.first;
 | 
			
		||||
            auto const &value = parseData.second;
 | 
			
		||||
            if (collection.has(key)) {
 | 
			
		||||
              auto outputValue = collection[key];
 | 
			
		||||
              if (value == outputValue) {
 | 
			
		||||
                output.emplace_back(*line);
 | 
			
		||||
              } else {
 | 
			
		||||
                INIStringUtil::trim(outputValue);
 | 
			
		||||
                auto lineNorm = *line;
 | 
			
		||||
                INIStringUtil::replace(lineNorm, "\\=", "  ");
 | 
			
		||||
                auto equalsAt = lineNorm.find_first_of('=');
 | 
			
		||||
                auto valueAt = lineNorm.find_first_not_of(
 | 
			
		||||
                    INIStringUtil::whitespaceDelimiters, equalsAt + 1);
 | 
			
		||||
                std::string outputLine = line->substr(0, valueAt);
 | 
			
		||||
                if (prettyPrint && equalsAt + 1 == valueAt) {
 | 
			
		||||
                  outputLine += " ";
 | 
			
		||||
                }
 | 
			
		||||
                outputLine += outputValue;
 | 
			
		||||
                output.emplace_back(outputLine);
 | 
			
		||||
              }
 | 
			
		||||
              lastKeyLine = output.size();
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          if (discardNextEmpty && line->empty()) {
 | 
			
		||||
            discardNextEmpty = false;
 | 
			
		||||
          } else if (parseResult != INIParser::PDataType::PDATA_UNKNOWN) {
 | 
			
		||||
            output.emplace_back(*line);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (writeNewKeys || std::next(line) == lineData->end()) {
 | 
			
		||||
        T_LineData linesToAdd;
 | 
			
		||||
        if (data.has(sectionCurrent) && original.has(sectionCurrent)) {
 | 
			
		||||
          auto const &collection = data[sectionCurrent];
 | 
			
		||||
          auto const &collectionOriginal = original[sectionCurrent];
 | 
			
		||||
          for (auto const &it : collection) {
 | 
			
		||||
            auto key = it.first;
 | 
			
		||||
            if (collectionOriginal.has(key)) {
 | 
			
		||||
              continue;
 | 
			
		||||
            }
 | 
			
		||||
            auto value = it.second;
 | 
			
		||||
            INIStringUtil::replace(key, "=", "\\=");
 | 
			
		||||
            INIStringUtil::trim(value);
 | 
			
		||||
            linesToAdd.emplace_back(key + ((prettyPrint) ? " = " : "=") +
 | 
			
		||||
                                    value);
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        if (!linesToAdd.empty()) {
 | 
			
		||||
          output.insert(output.begin() + lastKeyLine, linesToAdd.begin(),
 | 
			
		||||
                        linesToAdd.end());
 | 
			
		||||
        }
 | 
			
		||||
        if (writeNewKeys) {
 | 
			
		||||
          writeNewKeys = false;
 | 
			
		||||
          --line;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for (auto const &it : data) {
 | 
			
		||||
      auto const §ion = it.first;
 | 
			
		||||
      if (original.has(section)) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
      if (prettyPrint && output.size() > 0 && !output.back().empty()) {
 | 
			
		||||
        output.emplace_back();
 | 
			
		||||
      }
 | 
			
		||||
      output.emplace_back("[" + section + "]");
 | 
			
		||||
      auto const &collection = it.second;
 | 
			
		||||
      for (auto const &it2 : collection) {
 | 
			
		||||
        auto key = it2.first;
 | 
			
		||||
        auto value = it2.second;
 | 
			
		||||
        INIStringUtil::replace(key, "=", "\\=");
 | 
			
		||||
        INIStringUtil::trim(value);
 | 
			
		||||
        output.emplace_back(key + ((prettyPrint) ? " = " : "=") + value);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return output;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  bool prettyPrint = false;
 | 
			
		||||
 | 
			
		||||
  INIWriter(std::string const &filename) : filename(filename) {}
 | 
			
		||||
  ~INIWriter() {}
 | 
			
		||||
 | 
			
		||||
  bool operator<<(INIStructure &data) {
 | 
			
		||||
    struct stat buf;
 | 
			
		||||
    bool fileExists = (stat(filename.c_str(), &buf) == 0);
 | 
			
		||||
    if (!fileExists) {
 | 
			
		||||
      INIGenerator generator(filename);
 | 
			
		||||
      generator.prettyPrint = prettyPrint;
 | 
			
		||||
      return generator << data;
 | 
			
		||||
    }
 | 
			
		||||
    INIStructure originalData;
 | 
			
		||||
    T_LineDataPtr lineData;
 | 
			
		||||
    bool readSuccess = false;
 | 
			
		||||
    {
 | 
			
		||||
      INIReader reader(filename, true);
 | 
			
		||||
      if ((readSuccess = reader >> originalData)) {
 | 
			
		||||
        lineData = reader.getLines();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    if (!readSuccess) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    T_LineData output = getLazyOutput(lineData, data, originalData);
 | 
			
		||||
    std::ofstream fileWriteStream(filename, std::ios::out | std::ios::binary);
 | 
			
		||||
    if (fileWriteStream.is_open()) {
 | 
			
		||||
      if (output.size()) {
 | 
			
		||||
        auto line = output.begin();
 | 
			
		||||
        for (;;) {
 | 
			
		||||
          fileWriteStream << *line;
 | 
			
		||||
          if (++line == output.end()) {
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          fileWriteStream << INIStringUtil::endl;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class INIFile {
 | 
			
		||||
private:
 | 
			
		||||
  std::string filename;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  INIFile(std::string const &filename) : filename(filename) {}
 | 
			
		||||
 | 
			
		||||
  ~INIFile() {}
 | 
			
		||||
 | 
			
		||||
  bool read(INIStructure &data) const {
 | 
			
		||||
    if (data.size()) {
 | 
			
		||||
      data.clear();
 | 
			
		||||
    }
 | 
			
		||||
    if (filename.empty()) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    INIReader reader(filename);
 | 
			
		||||
    return reader >> data;
 | 
			
		||||
  }
 | 
			
		||||
  bool generate(INIStructure const &data, bool pretty = false) const {
 | 
			
		||||
    if (filename.empty()) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    INIGenerator generator(filename);
 | 
			
		||||
    generator.prettyPrint = pretty;
 | 
			
		||||
    return generator << data;
 | 
			
		||||
  }
 | 
			
		||||
  bool write(INIStructure &data, bool pretty = false) const {
 | 
			
		||||
    if (filename.empty()) {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
    INIWriter writer(filename);
 | 
			
		||||
    writer.prettyPrint = pretty;
 | 
			
		||||
    return writer << data;
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
} // namespace INI
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										18
									
								
								rd7tf/libs/include/renderd7/lang.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,18 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <renderd7/external/json.hpp>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Lang {
 | 
			
		||||
/// @brief Get 3ds System lang! [en] by default
 | 
			
		||||
/// @return Sytemlang as string
 | 
			
		||||
std::string getSys();
 | 
			
		||||
/// @brief Get The Translation String
 | 
			
		||||
/// @param key Key of Translation
 | 
			
		||||
/// @return The Translated String
 | 
			
		||||
std::string get(const std::string &key);
 | 
			
		||||
/// @brief Load A Language json
 | 
			
		||||
/// @param lang The Language Key [en], [de], etc, or getSys()
 | 
			
		||||
void load(const std::string &lang);
 | 
			
		||||
} // namespace Lang
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										33
									
								
								rd7tf/libs/include/renderd7/log.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,33 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
 | 
			
		||||
/// @brief Log Class
 | 
			
		||||
class Log {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  Log();
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~Log();
 | 
			
		||||
  /// @brief Init the Logger
 | 
			
		||||
  /// @param filename Filename[_data_time.log]
 | 
			
		||||
  void Init(const char *filename);
 | 
			
		||||
  /// @brief Write a String to the File
 | 
			
		||||
  /// @param debug_text string
 | 
			
		||||
  void Write(std::string debug_text);
 | 
			
		||||
  /// @brief Get the Date
 | 
			
		||||
  /// @return Date as string fmt[data_time]
 | 
			
		||||
  std::string logDate(void);
 | 
			
		||||
  /// @brief Format a string like sprintf
 | 
			
		||||
  /// @param fmt_str the string wich defines the fmt
 | 
			
		||||
  /// @param ... Additional Data
 | 
			
		||||
  /// @return Formatted String
 | 
			
		||||
  std::string format(const std::string &fmt_str, ...);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// \param filename the name of the logfile
 | 
			
		||||
  std::string filename;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										5
									
								
								rd7tf/libs/include/renderd7/npi_intro.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
extern unsigned char npi_intro[];
 | 
			
		||||
extern size_t npi_intro_size;
 | 
			
		||||
							
								
								
									
										118
									
								
								rd7tf/libs/include/renderd7/parameter.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,118 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <tuple>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
class Parameter {
 | 
			
		||||
private:
 | 
			
		||||
  using id = size_t;
 | 
			
		||||
 | 
			
		||||
  template <typename T> struct type {
 | 
			
		||||
    static void id() {}
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template <typename T> static id type_id() {
 | 
			
		||||
    return reinterpret_cast<id>(&type<T>::id);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <typename T> using decay = typename std::decay<T>::type;
 | 
			
		||||
 | 
			
		||||
  template <typename T>
 | 
			
		||||
  using none =
 | 
			
		||||
      typename std::enable_if<!std::is_same<Parameter, T>::value>::type;
 | 
			
		||||
 | 
			
		||||
  struct base {
 | 
			
		||||
    virtual ~base() {}
 | 
			
		||||
    virtual bool is(id) const = 0;
 | 
			
		||||
    virtual base *copy() const = 0;
 | 
			
		||||
  } *p = nullptr;
 | 
			
		||||
 | 
			
		||||
  template <typename T> struct data : base, std::tuple<T> {
 | 
			
		||||
    using std::tuple<T>::tuple;
 | 
			
		||||
 | 
			
		||||
    T &get() & { return std::get<0>(*this); }
 | 
			
		||||
    T const &get() const & { return std::get<0>(*this); }
 | 
			
		||||
 | 
			
		||||
    bool is(id i) const override { return i == type_id<T>(); }
 | 
			
		||||
    base *copy() const override { return new data{get()}; }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  template <typename T> T &stat() { return static_cast<data<T> &>(*p).get(); }
 | 
			
		||||
 | 
			
		||||
  template <typename T> T const &stat() const {
 | 
			
		||||
    return static_cast<data<T> const &>(*p).get();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  template <typename T> T &dyn() { return dynamic_cast<data<T> &>(*p).get(); }
 | 
			
		||||
 | 
			
		||||
  template <typename T> T const &dyn() const {
 | 
			
		||||
    return dynamic_cast<data<T> const &>(*p).get();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Default constructor
 | 
			
		||||
   */
 | 
			
		||||
  Parameter() {}
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Destructs the Parameter
 | 
			
		||||
   */
 | 
			
		||||
  ~Parameter() { delete p; }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Copy constructor
 | 
			
		||||
   * @param s The Parameter to copy
 | 
			
		||||
   */
 | 
			
		||||
  Parameter(Parameter &&s) : p{s.p} { s.p = nullptr; }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Const copy constructor
 | 
			
		||||
   * @param s The Parameter to copy
 | 
			
		||||
   */
 | 
			
		||||
  Parameter(Parameter const &s) : p{s.p->copy()} {}
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Initializes the Parameter with the given value
 | 
			
		||||
   * @param x The value to initialize the Parameter with
 | 
			
		||||
   */
 | 
			
		||||
  template <typename T, typename U = decay<T>, typename = none<U>>
 | 
			
		||||
  Parameter(T &&x) : p{new data<U>{std::forward<T>(x)}} {}
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Overloads the assignment operator
 | 
			
		||||
   * @param s The value to set the Parameter to
 | 
			
		||||
   */
 | 
			
		||||
  Parameter &operator=(Parameter s) {
 | 
			
		||||
    swap(*this, s);
 | 
			
		||||
    return *this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  friend void swap(Parameter &s, Parameter &r) { std::swap(s.p, r.p); }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Clears the Parameter
 | 
			
		||||
   */
 | 
			
		||||
  void clear() {
 | 
			
		||||
    delete p;
 | 
			
		||||
    p = nullptr;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Checks whether the Parameter is the given type
 | 
			
		||||
   * @tparam T The type to check
 | 
			
		||||
   * @return   Whether the Parameter has the given type or not
 | 
			
		||||
   */
 | 
			
		||||
  template <typename T> bool is() const {
 | 
			
		||||
    return p ? p->is(type_id<T>()) : false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Returns the value of the Parameter
 | 
			
		||||
   * @tparam T The type of the Parameter
 | 
			
		||||
   * @return The value of the Parameter
 | 
			
		||||
   * @warning If the type of the Parameter doesn't match the type of it's stored
 | 
			
		||||
   * value, it will result in undefined behaviour.
 | 
			
		||||
   */
 | 
			
		||||
  template <typename T> T &get() & { return stat<T>(); }
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										420
									
								
								rd7tf/libs/include/renderd7/renderd7.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,420 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
/// c++ Includes
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <codecvt>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <filesystem>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <locale>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <memory>
 | 
			
		||||
#include <random>
 | 
			
		||||
#include <stack>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <vector>
 | 
			
		||||
/// c includes
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <time.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
/// 3ds Includes
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <citro2d.h>
 | 
			
		||||
#include <citro3d.h>
 | 
			
		||||
/// RenderD7 Includes
 | 
			
		||||
#include <renderd7/BitmapPrinter.hpp>
 | 
			
		||||
#include <renderd7/Color.hpp>
 | 
			
		||||
#include <renderd7/Draw.hpp>
 | 
			
		||||
#include <renderd7/FunctionTrace.hpp>
 | 
			
		||||
#include <renderd7/Hardware.hpp>
 | 
			
		||||
#include <renderd7/Image.hpp>
 | 
			
		||||
#include <renderd7/Memory.hpp>
 | 
			
		||||
#include <renderd7/Ovl.hpp>
 | 
			
		||||
#include <renderd7/ResultDecoder.hpp>
 | 
			
		||||
#include <renderd7/Screen.hpp>
 | 
			
		||||
#include <renderd7/Security.hpp>
 | 
			
		||||
#include <renderd7/Sheet.hpp>
 | 
			
		||||
#include <renderd7/Sprite.hpp>
 | 
			
		||||
#include <renderd7/SpriteAnimation.hpp>
 | 
			
		||||
#include <renderd7/Tasks.hpp>
 | 
			
		||||
#include <renderd7/Time.hpp>
 | 
			
		||||
#include <renderd7/Toast.hpp>
 | 
			
		||||
#include <renderd7/bmp.hpp>
 | 
			
		||||
#include <renderd7/bmpconverter.hpp>
 | 
			
		||||
#include <renderd7/external/lodepng.h>
 | 
			
		||||
#include <renderd7/ini.hpp>
 | 
			
		||||
#include <renderd7/lang.hpp>
 | 
			
		||||
#include <renderd7/parameter.hpp>
 | 
			
		||||
#include <renderd7/stringtool.hpp>
 | 
			
		||||
#include <renderd7/thread.hpp>
 | 
			
		||||
 | 
			
		||||
#define RENDERD7VSTRING "0.9.4"
 | 
			
		||||
#define CHANGELOG                                                              \
 | 
			
		||||
  "0.9.4: Implement new Security System\n To prevent from crashes\nImplement " \
 | 
			
		||||
  "Functiontrace for better\nTiming Tests\nImplement MemAlloc Tracker (only "  \
 | 
			
		||||
  "size)\nAdd some new Overlays (not functional yet)\nComplete Rewrite of "    \
 | 
			
		||||
  "Overlay System\nFixed the FrameEnd Crash\nNew System to get Hardware "      \
 | 
			
		||||
  "Info\nRemoved RD7SR\n0.9.3: Completly Documanted Everything\nFix typo "     \
 | 
			
		||||
  "in "                                                                        \
 | 
			
		||||
  "Sprite::getHeight()\nRemove Deprecated/Useless Stuff\n0.9.2: Add "          \
 | 
			
		||||
  "NpiSplashVideo\nNvid Support(v0.0.1)\nAdd "                                 \
 | 
			
		||||
  "Basic RenderD7 "                                                            \
 | 
			
		||||
  "Splash\nFaster Graphics Init\nFade Effects\nFix Screen for this "           \
 | 
			
		||||
  "Changelog\n0.9.1: Fix Critical bug in\nSpritesheet animations\nFix "        \
 | 
			
		||||
  "Color "                                                                     \
 | 
			
		||||
  "Conver(Hex)\n0.9.0: Remove Stupid try of Console\nAdd Services list and "   \
 | 
			
		||||
  "Clean up "                                                                  \
 | 
			
		||||
  "Code.\nAlso added Minimal Init for hax2.x\n0.8.5: Fix Deltatime \n0.8.4: "  \
 | 
			
		||||
  "A lot of Fixes and new\nFeatures for BitmapPrinter! \n0.8.3: Addet "        \
 | 
			
		||||
  "Overlaycount to Info\nand Addet ResultDecoder for errors.\n0.8.2: Fix a "   \
 | 
			
		||||
  "lot of Stuff and\nadd c++17 based filesystem class.\n0.8.1: Add abillity "  \
 | 
			
		||||
  "to Get Stdout as string\nto render it to the screen.\n0.8.0: Implement "    \
 | 
			
		||||
  "BitmapPrinter\n0.7.3: Implement Over\nRender Overlay Framework\n0.7.2: "    \
 | 
			
		||||
  "Implement MT to csv file\nsaving.(removed) Add RGB2HEX.\n0.7.1: Add the "   \
 | 
			
		||||
  "New Overlay Handler. Its\nJust in code and does nothing yet.\n0.7.0: Made " \
 | 
			
		||||
  "Big Progress In the MT\nOvl but it still crashes On\na Scnd "               \
 | 
			
		||||
  "C3D_FrameEnd()."                                                            \
 | 
			
		||||
  "\nImplement 800px but\ndoesn't work that good. \n0.6.2: Fix Crash when "    \
 | 
			
		||||
  "exiting\ntrouth Home Menu.\n0.6.10: rewrite Threadsystem,\nImprove "        \
 | 
			
		||||
  "framerate\n0.6.02: Fix Code in lang.hpp\nadd Draw Text Left "               \
 | 
			
		||||
  "Function\n(Right since 0.7.0).\nadd changelog\n0.6.01: add Threading "      \
 | 
			
		||||
  "system.\n0.6.0: Better "                                                    \
 | 
			
		||||
  "Scene Management\n0.5.0: Fixed some Bugs!\n0.4.0: Trying to fix "           \
 | 
			
		||||
  "Filesystem and Bugs!\n0.3.0: Recreate D7-Core into RenderD7!\n0.2.0: "      \
 | 
			
		||||
  "Trying to create Animations of\nImages instead of Sheets!\n0.1.0: Initial " \
 | 
			
		||||
  "Release of\nD7-Core sprite animation plugin!"
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_CENTER 0.5f
 | 
			
		||||
 | 
			
		||||
#define RD7_DEPRECATED // __attribute__ ((deprecated))
 | 
			
		||||
 | 
			
		||||
/// @param d7_hDown Current Key Down
 | 
			
		||||
extern u32 d7_hDown;
 | 
			
		||||
/// @param d7_hHeld Current Key Held
 | 
			
		||||
extern u32 d7_hHeld;
 | 
			
		||||
/// @param d7_hUp Current Key Up
 | 
			
		||||
extern u32 d7_hUp;
 | 
			
		||||
/// @param d7_touch Current Touch Position
 | 
			
		||||
extern touchPosition d7_touch;
 | 
			
		||||
 | 
			
		||||
/// @param dspststus Dsp Status String
 | 
			
		||||
extern std::string dspststus;
 | 
			
		||||
 | 
			
		||||
/// @param rd7_do_splash Config Value To Enable RenderD7 Splash
 | 
			
		||||
extern bool rd7_do_splash;
 | 
			
		||||
/// @param rd7_enable_memtrack Config Value to Track Mem Allocations
 | 
			
		||||
extern bool rd7_enable_memtrack;
 | 
			
		||||
 | 
			
		||||
/// RenderD7
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Get Deltatime
 | 
			
		||||
/// @return Deltatime
 | 
			
		||||
float GetDeltaTime();
 | 
			
		||||
/// @brief Keyboard
 | 
			
		||||
enum kbd {
 | 
			
		||||
  /// @brief libctru Keyboard
 | 
			
		||||
  SWKBD,
 | 
			
		||||
  /// @brief Unk (Not Usable)
 | 
			
		||||
  BKBD
 | 
			
		||||
};
 | 
			
		||||
/// @brief Keyboar Type
 | 
			
		||||
enum kbd_type { NUMPAD, STANDARD };
 | 
			
		||||
/// @brief A Button
 | 
			
		||||
struct TObject {
 | 
			
		||||
  int x;                 ///< Position X
 | 
			
		||||
  int y;                 ///< Position Y
 | 
			
		||||
  int w;                 ///< Button Width
 | 
			
		||||
  int h;                 ///< Button Height
 | 
			
		||||
  std::string text = ""; ///< Text
 | 
			
		||||
  float txtsize = 0.7f;  ///< Set Text Size
 | 
			
		||||
};
 | 
			
		||||
/// @brief Scene Class
 | 
			
		||||
class Scene {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Stack of the Scenes
 | 
			
		||||
  static std::stack<std::unique_ptr<Scene>> scenes;
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  virtual ~Scene() {}
 | 
			
		||||
  /// @brief Logic To Overide
 | 
			
		||||
  /// @param hDown Key Down
 | 
			
		||||
  /// @param hHeld Key Held
 | 
			
		||||
  /// @param hUp Key Up
 | 
			
		||||
  /// @param touch Touch Position
 | 
			
		||||
  virtual void Logic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch) = 0;
 | 
			
		||||
  /// @brief Draw Func to Override
 | 
			
		||||
  virtual void Draw() const = 0;
 | 
			
		||||
  /// @brief Push a Scene to Stack
 | 
			
		||||
  /// @param scene Scene to Push
 | 
			
		||||
  /// @param fade FadeEffect (Not Correctly Implementet yet)
 | 
			
		||||
  static void Load(std::unique_ptr<Scene> scene, bool fade = false);
 | 
			
		||||
  /// @brief Go Back a Scene
 | 
			
		||||
  static void Back();
 | 
			
		||||
  /// @brief do the Draw (Called in RenderD7::MainLoop())
 | 
			
		||||
  static void doDraw();
 | 
			
		||||
  /// @brief do the Logic (Called in RenderD7::MainLoop())
 | 
			
		||||
  /// @param hDown Key Down
 | 
			
		||||
  /// @param hHeld Key Held
 | 
			
		||||
  /// @param hUp Key Up
 | 
			
		||||
  /// @param touch Touch Positon
 | 
			
		||||
  static void doLogic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief Integrated Setting Menu of RenderD7
 | 
			
		||||
class RSettings : public RenderD7::Scene {
 | 
			
		||||
private:
 | 
			
		||||
  /// @brief Calculate the Changelog Screen Stuff
 | 
			
		||||
  /// @param lines vector of Lines
 | 
			
		||||
  /// @param screen_index Current Screen
 | 
			
		||||
  /// @param screens Count of Possible Screens
 | 
			
		||||
  void calculate_screens(const std::vector<std::string> &lines,
 | 
			
		||||
                         int &screen_index, int &screens);
 | 
			
		||||
  /// @brief State (Define for Menus)
 | 
			
		||||
  enum RState {
 | 
			
		||||
    RSETTINGS,
 | 
			
		||||
    RINFO,
 | 
			
		||||
    RSERVICES,
 | 
			
		||||
    RCLOG,
 | 
			
		||||
    RMCONFIG,
 | 
			
		||||
    RFTRACE,
 | 
			
		||||
    RSECM,
 | 
			
		||||
    RCREDITS
 | 
			
		||||
  };
 | 
			
		||||
  /// @param m_state Current menu State (Default=MainMenu aka RSETTINGS)
 | 
			
		||||
  RenderD7::RSettings::RState m_state = RenderD7::RSettings::RState::RSETTINGS;
 | 
			
		||||
 | 
			
		||||
  /// @param screens Count of Changelog Screens
 | 
			
		||||
  int screens = 0;
 | 
			
		||||
  /// @param screen_index Current Changelog Screen
 | 
			
		||||
  int screen_index = 0;
 | 
			
		||||
  /// @param lines Vector of Changelog-Lines
 | 
			
		||||
  std::vector<std::string> lines;
 | 
			
		||||
  /// @brief Position in FTrace Menu
 | 
			
		||||
  int ftrace_index = 0;
 | 
			
		||||
 | 
			
		||||
  /// @param mtovlstate State of Metricks Overlay
 | 
			
		||||
  std::string mtovlstate = "false";
 | 
			
		||||
  /// @param mtscreenstate Screen the Overlay is Set to
 | 
			
		||||
  std::string mtscreenstate = "Top";
 | 
			
		||||
 | 
			
		||||
  /// @param buttons Vector of Buttons
 | 
			
		||||
  std::vector<RenderD7::TObject> buttons = {
 | 
			
		||||
      {20, 35, 120, 35, "NotYET"},      {20, 85, 120, 35, "Changelog"},
 | 
			
		||||
      {20, 135, 120, 35, "Metrik-Ovl"}, {20, 185, 120, 35, "Tasks"},
 | 
			
		||||
      {180, 35, 120, 35, "FTrace"},     {180, 85, 120, 35, "Credits"},
 | 
			
		||||
      {180, 135, 120, 35, "Info"},      {180, 185, 120, 35, "Security"}};
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  RSettings();
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  /// @param
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~RSettings();
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  /// @param hDown Key Down
 | 
			
		||||
  /// @param hHeld Key Held
 | 
			
		||||
  /// @param hUp Key Up
 | 
			
		||||
  /// @param touch Touch Position
 | 
			
		||||
  void Logic(u32 hDown, u32 hHeld, u32 hUp, touchPosition touch) override;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief Show Up the RenderD7-Settings Menu
 | 
			
		||||
void LoadSettings();
 | 
			
		||||
 | 
			
		||||
/// @brief DspNotFound Error Toast (Deprectated)
 | 
			
		||||
class DSP_NF : public RenderD7::Ovl {
 | 
			
		||||
public:
 | 
			
		||||
  /// @brief Constructor
 | 
			
		||||
  DSP_NF();
 | 
			
		||||
  /// @brief Override for Draw
 | 
			
		||||
  void Draw(void) const override;
 | 
			
		||||
  /// @brief Override for Logic
 | 
			
		||||
  void Logic() override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// @param msgposy Y Position of Toast
 | 
			
		||||
  int msgposy = 240;
 | 
			
		||||
  /// @param delay Delay of Toast
 | 
			
		||||
  int delay = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/// @brief Get A Rendom Int
 | 
			
		||||
/// @param b From
 | 
			
		||||
/// @param e To
 | 
			
		||||
/// @return Random Int
 | 
			
		||||
int GetRandomInt(int b, int e);
 | 
			
		||||
/// @brief Short a String with (..,)
 | 
			
		||||
/// @param in Input string
 | 
			
		||||
/// @param size Size of Input Text
 | 
			
		||||
/// @param maxlen Max length of texr
 | 
			
		||||
/// @param font Custom Font for Correct Size Calculation
 | 
			
		||||
/// @return Shorted String
 | 
			
		||||
std::string ShortString(std::string in, float size, int maxlen,
 | 
			
		||||
                        C2D_Font font = nullptr);
 | 
			
		||||
/// @brief DrawMetrikOvl (YOUR OWN RISK)
 | 
			
		||||
void DrawMetrikOvl();
 | 
			
		||||
/// @brief Draw Image from RenderD7 Sheet
 | 
			
		||||
/// @param sheet Spritesheet
 | 
			
		||||
/// @param index Image index Value
 | 
			
		||||
/// @param x Pos X
 | 
			
		||||
/// @param y Pos Y
 | 
			
		||||
/// @param scaleX Scale on X-Axis
 | 
			
		||||
/// @param scaleY Scale on Y-Axis
 | 
			
		||||
/// @return success ?
 | 
			
		||||
bool DrawImageFromSheet(RenderD7::Sheet *sheet, size_t index, float x, float y,
 | 
			
		||||
                        float scaleX = 1.0, float scaleY = 1.0);
 | 
			
		||||
/// @brief Display the Npi-D7 Video Intro (NVID)
 | 
			
		||||
void DoNpiIntro();
 | 
			
		||||
/// @brief Fade In
 | 
			
		||||
/// @param duration Duration in Frames
 | 
			
		||||
void FadeIn();
 | 
			
		||||
/// @brief Fade Out
 | 
			
		||||
/// @param duration Duration in Frames
 | 
			
		||||
void FadeOut();
 | 
			
		||||
/// @brief Display Fade Effects
 | 
			
		||||
void FadeDisplay();
 | 
			
		||||
 | 
			
		||||
namespace Error {
 | 
			
		||||
/// @brief DEPRECATED Display Error for n Seconds
 | 
			
		||||
/// @param toptext Head Text
 | 
			
		||||
/// @param errortext Error Text
 | 
			
		||||
/// @param timesec Time n to Display in Seconds
 | 
			
		||||
void DisplayError(std::string toptext, std::string errortext, int timesec = 3);
 | 
			
		||||
/// @brief Display A Fatal Error
 | 
			
		||||
/// @param toptext Head Text
 | 
			
		||||
/// @param errortext Error Text
 | 
			
		||||
void DisplayFatalError(std::string toptext, std::string errortext);
 | 
			
		||||
} // namespace Error
 | 
			
		||||
 | 
			
		||||
namespace Init {
 | 
			
		||||
/// @brief Init Default RenderD7
 | 
			
		||||
/// @param app_name Name of Your App
 | 
			
		||||
/// @return ResCode
 | 
			
		||||
Result Main(std::string app_name = "RD7Game");
 | 
			
		||||
/// @brief Init Minimal RenderD7 (For better Hax2.x support)
 | 
			
		||||
/// @param app_name Name of Your App
 | 
			
		||||
/// @return ResCode
 | 
			
		||||
Result Minimal(std::string app_name = "RD7Game");
 | 
			
		||||
/// @brief Reload the Graphics Engine
 | 
			
		||||
/// @return ResCode
 | 
			
		||||
Result Reload();
 | 
			
		||||
/// @brief Init Graphics Only (NOT SUPPORTET use Reload)
 | 
			
		||||
void Graphics();
 | 
			
		||||
/// @brief Init Ndsp for Sounds
 | 
			
		||||
void NdspFirm();
 | 
			
		||||
} // namespace Init
 | 
			
		||||
 | 
			
		||||
namespace Msg {
 | 
			
		||||
/// @brief Display A Message
 | 
			
		||||
/// @param titletxt Header Text
 | 
			
		||||
/// @param subtext Message Text
 | 
			
		||||
/// @param target Screen
 | 
			
		||||
void Display(std::string titletxt, std::string subtext,
 | 
			
		||||
             C3D_RenderTarget *target);
 | 
			
		||||
/// @brief Display A Message Wit Progress
 | 
			
		||||
/// @param titletext Header Text
 | 
			
		||||
/// @param subtext Message Text
 | 
			
		||||
/// @param current Current Progress
 | 
			
		||||
/// @param total Total Progress
 | 
			
		||||
/// @param prgbarcolor Color of Progressbar
 | 
			
		||||
void DisplayWithProgress(std::string titletext, std::string subtext,
 | 
			
		||||
                         float current, float total, u32 prgbarcolor);
 | 
			
		||||
} // namespace Msg
 | 
			
		||||
 | 
			
		||||
namespace Convert {
 | 
			
		||||
/// @brief Convert a String to Flaot
 | 
			
		||||
/// @param inp Input String
 | 
			
		||||
/// @return Float
 | 
			
		||||
inline float StringtoFloat(std::string inp) { return std::atof(inp.c_str()); }
 | 
			
		||||
/// @brief Convert String to Int
 | 
			
		||||
/// @param inp Input String
 | 
			
		||||
/// @return Int
 | 
			
		||||
inline int StringtoInt(std::string inp) { return std::atoi(inp.c_str()); }
 | 
			
		||||
/// @brief Convert a Float to Bool
 | 
			
		||||
/// @param inp Input Float
 | 
			
		||||
/// @return Bool
 | 
			
		||||
inline bool FloatToBool(float inp) { return (inp == 1 ? true : false); }
 | 
			
		||||
} // namespace Convert
 | 
			
		||||
 | 
			
		||||
namespace FS {
 | 
			
		||||
/// @brief Check if File exists
 | 
			
		||||
/// @param path Path to the File
 | 
			
		||||
/// @return exists or not
 | 
			
		||||
bool FileExist(const std::string &path);
 | 
			
		||||
} // namespace FS
 | 
			
		||||
 | 
			
		||||
/// @brief Check if Ndsp is Init
 | 
			
		||||
/// @return is or not
 | 
			
		||||
bool IsNdspInit();
 | 
			
		||||
/// @brief Get Current Framerate as String
 | 
			
		||||
/// @return Framerate String
 | 
			
		||||
std::string GetFramerate();
 | 
			
		||||
/// @brief MainLoop of RenderD7s
 | 
			
		||||
/// @return Is Still Running or not
 | 
			
		||||
bool MainLoop();
 | 
			
		||||
/// @brief Exit App (brak the MainLoop)
 | 
			
		||||
void ExitApp();
 | 
			
		||||
 | 
			
		||||
/// @brief Clear the Citro2D TextBuffers
 | 
			
		||||
/// @param
 | 
			
		||||
void ClearTextBufs(void);
 | 
			
		||||
 | 
			
		||||
/// @brief Open A Keyboard (SWKBD)
 | 
			
		||||
/// @param lenght Length of the string
 | 
			
		||||
/// @param tp Type of The Keyboard
 | 
			
		||||
/// @return the string if pressed Ok
 | 
			
		||||
std::string Kbd(int lenght, SwkbdType tp);
 | 
			
		||||
 | 
			
		||||
/// @brief Draw Overlays And end the Frame. DO NEVER USE C3D_FRAMEEND cause it
 | 
			
		||||
/// breaks Overlay crash Security
 | 
			
		||||
void FrameEnd();
 | 
			
		||||
 | 
			
		||||
/// @brief Textless Button
 | 
			
		||||
struct TLBtn {
 | 
			
		||||
  int x; ///< Position X
 | 
			
		||||
  int y; ///< Position Y
 | 
			
		||||
  int w; ///< Button Width
 | 
			
		||||
  int h; ///< Button Height
 | 
			
		||||
};
 | 
			
		||||
/// @brief Draw Buttons
 | 
			
		||||
/// @param tobjects Vector of Buttons
 | 
			
		||||
/// @param color Color of the Buttons
 | 
			
		||||
/// @param txtcolor Color of The Text
 | 
			
		||||
/// @param selection Positon of Selection
 | 
			
		||||
/// @param selbgcolor Selection BackgroundColor
 | 
			
		||||
/// @param selcolor Selection Color
 | 
			
		||||
void DrawTObjects(std::vector<RenderD7::TObject> tobjects, u32 color,
 | 
			
		||||
                  u32 txtcolor, int selection = -1,
 | 
			
		||||
                  u32 selbgcolor = RenderD7::Color::Hex("#2D98AF"),
 | 
			
		||||
                  u32 selcolor = RenderD7::Color::Hex("#000000"));
 | 
			
		||||
/// @brief Draw A Single Button
 | 
			
		||||
/// @param tobject Button
 | 
			
		||||
/// @param tobjectindex Button Index
 | 
			
		||||
/// @param color Color of the Button
 | 
			
		||||
/// @param txtcolor Color of The Text
 | 
			
		||||
void DrawSTObject(std::vector<RenderD7::TObject> tobject, int tobjectindex,
 | 
			
		||||
                  u32 color, u32 txtcolor);
 | 
			
		||||
/// @brief Touched A Button
 | 
			
		||||
/// @param touch Touch Position
 | 
			
		||||
/// @param button Button
 | 
			
		||||
/// @return is touched or not
 | 
			
		||||
bool touchTObj(touchPosition touch, RenderD7::TObject button);
 | 
			
		||||
/// @brief Touched A Textless Button
 | 
			
		||||
/// @param touch Touch Position
 | 
			
		||||
/// @param button Button
 | 
			
		||||
/// @return is touched or not
 | 
			
		||||
bool touchTLBtn(touchPosition touch, RenderD7::TLBtn button);
 | 
			
		||||
/// @brief Draw Textless Buttons
 | 
			
		||||
/// @param tobjects Vector of Buttons
 | 
			
		||||
/// @param color Color of the Buttons
 | 
			
		||||
/// @param selection Positon of Selection
 | 
			
		||||
/// @param selbgcolor Selection BackgroundColor
 | 
			
		||||
/// @param selcolor Selection Color
 | 
			
		||||
void DrawTLBtns(std::vector<RenderD7::TLBtn> btns, u32 color,
 | 
			
		||||
                int selection = -1,
 | 
			
		||||
                u32 selbgcolor = RenderD7::Color::Hex("#2D98AF"),
 | 
			
		||||
                u32 selcolor = RenderD7::Color::Hex("#000000"));
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										5
									
								
								rd7tf/libs/include/renderd7/renderd7_logo.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
extern unsigned char renderd7_logo[];
 | 
			
		||||
extern size_t renderd7_logo_size;
 | 
			
		||||
							
								
								
									
										30
									
								
								rd7tf/libs/include/renderd7/sound.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,30 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
/** Sound Class */
 | 
			
		||||
class sound {
 | 
			
		||||
public:
 | 
			
		||||
  /// \brief Construct new Soundeffect
 | 
			
		||||
  /// \param path Path to the .wav file
 | 
			
		||||
  /// \param channel the channel 1-23
 | 
			
		||||
  /// \param toloop true:loop the sound, false: don't loop
 | 
			
		||||
  sound(const std::string &path, int channel = 1, bool toloop = false);
 | 
			
		||||
  /// @brief Deconstructor
 | 
			
		||||
  ~sound();
 | 
			
		||||
  /// @brief Play the sound
 | 
			
		||||
  void play();
 | 
			
		||||
  /// @brief Stop the sound
 | 
			
		||||
  void stop();
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  /// \param dataSize Size of the filedata
 | 
			
		||||
  u32 dataSize;
 | 
			
		||||
  /// \param waveBuf For ndsp
 | 
			
		||||
  ndspWaveBuf waveBuf;
 | 
			
		||||
  /// \param data Memmory data of the sound
 | 
			
		||||
  uint8_t *data = NULL;
 | 
			
		||||
  /// \param chnl Channel of the sound
 | 
			
		||||
  int chnl;
 | 
			
		||||
};
 | 
			
		||||
							
								
								
									
										81
									
								
								rd7tf/libs/include/renderd7/stringtool.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,81 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <iomanip>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
/// @brief Check if A String ends with
 | 
			
		||||
/// @param name Input String
 | 
			
		||||
/// @param extensions Extensions to Check for
 | 
			
		||||
/// @return Ends with or not
 | 
			
		||||
inline bool NameIsEndingWith(const std::string &name,
 | 
			
		||||
                             const std::vector<std::string> &extensions) {
 | 
			
		||||
  if (name.substr(0, 2) == "._")
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
  if (name.size() == 0)
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
  if (extensions.size() == 0)
 | 
			
		||||
    return true;
 | 
			
		||||
 | 
			
		||||
  for (int i = 0; i < (int)extensions.size(); i++) {
 | 
			
		||||
    const std::string ext = extensions.at(i);
 | 
			
		||||
    if (strcasecmp(name.c_str() + name.size() - ext.size(), ext.c_str()) == 0)
 | 
			
		||||
      return true;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return false;
 | 
			
		||||
}
 | 
			
		||||
/// @brief Format Milliseconds to clean string (Stolen from one of my Mc
 | 
			
		||||
/// Plugins)
 | 
			
		||||
/// @param t_time Time in ms
 | 
			
		||||
/// @return String
 | 
			
		||||
inline std::string MsTimeFmt(float t_time) {
 | 
			
		||||
  std::ostringstream oss;
 | 
			
		||||
 | 
			
		||||
  if (t_time < 0.001f) {
 | 
			
		||||
    oss << std::fixed << std::setprecision(2) << t_time * 1000.0f << "ns";
 | 
			
		||||
  } else if (t_time < 1.0f) {
 | 
			
		||||
    oss << std::fixed << std::setprecision(2) << t_time << "ms";
 | 
			
		||||
  } else if (t_time < 60000.0f) {
 | 
			
		||||
    int seconds = static_cast<int>(t_time / 1000.0f);
 | 
			
		||||
    float milliseconds = t_time - (seconds * 1000.0f);
 | 
			
		||||
 | 
			
		||||
    if (seconds > 0) {
 | 
			
		||||
      oss << seconds << "s ";
 | 
			
		||||
    }
 | 
			
		||||
    oss << std::fixed << std::setprecision(2) << milliseconds << "ms";
 | 
			
		||||
  } else {
 | 
			
		||||
    int minutes = static_cast<int>(t_time / 60000.0f);
 | 
			
		||||
    int seconds = static_cast<int>((t_time - (minutes * 60000.0f)) / 1000.0f);
 | 
			
		||||
    float milliseconds = t_time - (minutes * 60000.0f) - (seconds * 1000.0f);
 | 
			
		||||
 | 
			
		||||
    oss << minutes << "m ";
 | 
			
		||||
    if (seconds > 0 || milliseconds > 0.0f) {
 | 
			
		||||
      oss << seconds << "s ";
 | 
			
		||||
    }
 | 
			
		||||
    if (milliseconds > 0.0f) {
 | 
			
		||||
      oss << std::fixed << std::setprecision(2) << milliseconds << "ms";
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return oss.str();
 | 
			
		||||
}
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
 | 
			
		||||
template <class T> T GetFileName(T const &path, T const &delims = "/\\") {
 | 
			
		||||
  return path.substr(path.find_last_of(delims) + 1);
 | 
			
		||||
}
 | 
			
		||||
template <class T> T remove_ext(T const &filename) {
 | 
			
		||||
  typename T::size_type const p(filename.find_last_of('.'));
 | 
			
		||||
  return p > 0 && p != T::npos ? filename.substr(0, p) : filename;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
template <typename T> std::string Int_To_Hex(T i) {
 | 
			
		||||
  std::stringstream stream;
 | 
			
		||||
  stream << "0x" << std::setfill('0') << std::setw(sizeof(T) * 2) << std::hex
 | 
			
		||||
         << i;
 | 
			
		||||
  return stream.str();
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										122
									
								
								rd7tf/libs/include/renderd7/thread.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,122 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <atomic>
 | 
			
		||||
#include <functional>
 | 
			
		||||
#include <renderd7/parameter.hpp>
 | 
			
		||||
#include <string>
 | 
			
		||||
 | 
			
		||||
using CTRU_Thread = Thread;
 | 
			
		||||
 | 
			
		||||
#define THREAD_STACK_SIZE 0x1000
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
class Thread {
 | 
			
		||||
public:
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Default constructor
 | 
			
		||||
   * @note This should only be called when calling m3d::Thread::initialize()
 | 
			
		||||
   * before calling m3d::Thread::start()
 | 
			
		||||
   */
 | 
			
		||||
  Thread();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Constructs the thread
 | 
			
		||||
   * @param t_function  The thread function
 | 
			
		||||
   * @param t_parameter The parameter to pass to the function
 | 
			
		||||
   * @param t_autostart Whether the thread should start instantly
 | 
			
		||||
   * @param t_detached  Whether the thread starts detached or not
 | 
			
		||||
   * @param t_stackSize The stacksize allocated for the thread in bytes (rounded
 | 
			
		||||
   * to multiples of 8 bytes)
 | 
			
		||||
   * @note t_function needs to be of type `void` and take one (and only one)
 | 
			
		||||
   * parameter of type m3d::Parameter
 | 
			
		||||
   * @warning If the thread priority is lower than the priority of the calling
 | 
			
		||||
   * thread, the thread will never get executed. Use
 | 
			
		||||
   * m3d::Thread::getCurrentPriority() to get the priority of the current thread
 | 
			
		||||
   */
 | 
			
		||||
  Thread(std::function<void(RenderD7::Parameter)> t_function,
 | 
			
		||||
         RenderD7::Parameter t_parameter = nullptr, bool t_autostart = false,
 | 
			
		||||
         bool t_detached = false,
 | 
			
		||||
         unsigned long long int t_stackSize = 4 * 1024);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Destructs the thread
 | 
			
		||||
   */
 | 
			
		||||
  virtual ~Thread();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Initializes the thread
 | 
			
		||||
   * @param t_function  The thread function
 | 
			
		||||
   * @param t_parameter The parameter to pass to the function
 | 
			
		||||
   * @param t_autostart Whether the thread should start instantly
 | 
			
		||||
   * @param t_detached  Whether the thread starts detached or not
 | 
			
		||||
   * @param t_stackSize The stacksize allocated for the thread in bytes (rounded
 | 
			
		||||
   * to multiples of 8 bytes)
 | 
			
		||||
   * @note t_function needs to be of type `void` and take one (and only one)
 | 
			
		||||
   * parameter of type m3d::Parameter
 | 
			
		||||
   * @warning If the thread priority is lower than the priority of the calling
 | 
			
		||||
   * thread, the thread will never get executed. Use
 | 
			
		||||
   * m3d::Thread::getCurrentPriority() to get the priority of the current thread
 | 
			
		||||
   */
 | 
			
		||||
  void initialize(std::function<void(RenderD7::Parameter)> t_function,
 | 
			
		||||
                  RenderD7::Parameter t_parameter = nullptr,
 | 
			
		||||
                  bool t_autostart = false, bool t_detached = false,
 | 
			
		||||
                  unsigned long long int t_stackSize = 4 * 1024);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Sets the size of the stack that gets allocated for the next thread
 | 
			
		||||
   * that get's started
 | 
			
		||||
   * @param t_stackSize The allocated space in bytes (rounded to multiples of 8
 | 
			
		||||
   * bytes)
 | 
			
		||||
   */
 | 
			
		||||
  void setStackSize(unsigned long long int t_stackSize);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Starts the thread. To restart it, call Thread::join() before
 | 
			
		||||
   * @param t_detached Whether the thread should start detached or not
 | 
			
		||||
   */
 | 
			
		||||
  void start(bool t_detached = false);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Detaches the thread
 | 
			
		||||
   */
 | 
			
		||||
  void kill();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Waits for the thread to finish
 | 
			
		||||
   * @param t_timeout The timeout in nanoseconds. Leave it for no timeout
 | 
			
		||||
   */
 | 
			
		||||
  void join(long long unsigned int t_timeout = U64_MAX);
 | 
			
		||||
 | 
			
		||||
  bool isRunning();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Puts the thread to sleep
 | 
			
		||||
   *
 | 
			
		||||
   * This is needed if you have multiple threads running at the same time. It
 | 
			
		||||
   * doesn't affect the execution-time of the thread, it just makes it possible
 | 
			
		||||
   * for the other threads to get their chance to shine.
 | 
			
		||||
   */
 | 
			
		||||
  static void sleep();
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * @brief Sleeps for the given time
 | 
			
		||||
   * @param t_milliseconds The time to sleep in milliseconds
 | 
			
		||||
   */
 | 
			
		||||
  static void sleep(int t_milliseconds);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
  struct ThreadData {
 | 
			
		||||
    RenderD7::Parameter m_parameter;
 | 
			
		||||
    std::function<void(RenderD7::Parameter)> m_function;
 | 
			
		||||
    std::atomic<bool> *m_running;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  static void threadFunction(void *t_arg);
 | 
			
		||||
  /* data */
 | 
			
		||||
  int m_priority, m_stackSize;
 | 
			
		||||
  bool m_started;
 | 
			
		||||
  std::atomic<bool> m_running;
 | 
			
		||||
  RenderD7::Thread::ThreadData m_data;
 | 
			
		||||
  CTRU_Thread m_thread;
 | 
			
		||||
};
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										5
									
								
								rd7tf/libs/include/renderd7/ui_elements.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
 | 
			
		||||
extern unsigned char ui_elements[];
 | 
			
		||||
extern size_t ui_elements_size;
 | 
			
		||||
							
								
								
									
										1
									
								
								rd7tf/romfs/gfx/Leere Datei
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1 @@
 | 
			
		||||
vcx
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								rd7tf/romfs/gfx/bg.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 149 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								rd7tf/romfs/gfx/renderd7.png
									
									
									
									
									
										Executable file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 13 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								rd7tf/romfs/gfx/sprites.t3x
									
									
									
									
									
										Executable file
									
								
							
							
						
						
							
								
								
									
										5
									
								
								rd7tf/romfs/lang/de/app.json
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
    "LOADINGFILES": "Lade Dateien ...",
 | 
			
		||||
    "MENU": "Menü",
 | 
			
		||||
    "LOADING": "Lade ..."
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								rd7tf/romfs/lang/en/app.json
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
    "LOADINGFILES": "Loading Files ...",
 | 
			
		||||
    "MENU": "Menu",
 | 
			
		||||
    "LOADING": "Loading ..."
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								rd7tf/source/main.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,21 @@
 | 
			
		||||
#include <rd7.hpp>
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
  rd7_do_splash = true;
 | 
			
		||||
  RenderD7::Ftrace::Beg("app", "app_init");
 | 
			
		||||
  RenderD7::Init::Main("rd7tf");
 | 
			
		||||
  RenderD7::Init::NdspFirm();
 | 
			
		||||
  RenderD7::Ftrace::Beg("app", f2s(RenderD7::LoadSettings));
 | 
			
		||||
  RenderD7::LoadSettings();
 | 
			
		||||
  RenderD7::Ftrace::End("app", f2s(RenderD7::LoadSettings));
 | 
			
		||||
  RenderD7::Ftrace::End("app", "app_init");
 | 
			
		||||
  while (RenderD7::MainLoop()) {
 | 
			
		||||
    RenderD7::Ftrace::Beg("app", "app_mainloop");
 | 
			
		||||
    if (d7_hDown & KEY_START)
 | 
			
		||||
      RenderD7::ExitApp();
 | 
			
		||||
    RenderD7::FrameEnd();
 | 
			
		||||
    RenderD7::Ftrace::End("app", "app_mainloop");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										22
									
								
								rd7tf/update.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						@@ -0,0 +1,22 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
#Clean old build
 | 
			
		||||
echo "Cleaning..."
 | 
			
		||||
rm -rf libs/*
 | 
			
		||||
#Format to LLVM
 | 
			
		||||
echo "Format to LLVM"
 | 
			
		||||
cd ..
 | 
			
		||||
./cformat.sh
 | 
			
		||||
#Compile RenderD7
 | 
			
		||||
echo "Compiling RenderD7"
 | 
			
		||||
make
 | 
			
		||||
#Copy new build
 | 
			
		||||
echo "Copy New Build"
 | 
			
		||||
cp -r include rd7tf/libs/
 | 
			
		||||
cp -r lib rd7tf/libs/
 | 
			
		||||
#Build Test Framework
 | 
			
		||||
echo "Building Test Framework"
 | 
			
		||||
cd rd7tf
 | 
			
		||||
make
 | 
			
		||||
 | 
			
		||||
echo "Done!"
 | 
			
		||||
							
								
								
									
										3
									
								
								source/FunctionTrace.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,3 @@
 | 
			
		||||
#include <renderd7/FunctionTrace.hpp>
 | 
			
		||||
 | 
			
		||||
std::map<std::string, RenderD7::Ftrace::FTRes> RenderD7::Ftrace::rd7_traces;
 | 
			
		||||
							
								
								
									
										46
									
								
								source/Hardware.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,46 @@
 | 
			
		||||
#include <renderd7/Hardware.hpp>
 | 
			
		||||
#include <renderd7/Security.hpp>
 | 
			
		||||
 | 
			
		||||
// Os Specific includes
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
 | 
			
		||||
// RenderD7 Security
 | 
			
		||||
extern bool isndspinit;
 | 
			
		||||
 | 
			
		||||
void RenderD7::Hardware::Initialisize() {
 | 
			
		||||
  rd7_security->SafeInit(mcuHwcInit, &mcuHwcExit);
 | 
			
		||||
  rd7_security->SafeInit(ptmuInit, &ptmuExit);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RenderD7::Hardware::IsHeadphones() {
 | 
			
		||||
  if (isndspinit) {
 | 
			
		||||
    bool inserted;
 | 
			
		||||
    DSP_GetHeadphoneStatus(&inserted);
 | 
			
		||||
    return inserted;
 | 
			
		||||
  } else
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RenderD7::Hardware::IsCharging() {
 | 
			
		||||
  uint8_t var;
 | 
			
		||||
  PTMU_GetBatteryChargeState(&var);
 | 
			
		||||
  // Some Security Stuff
 | 
			
		||||
  if (var < 0x00 && var > 0x01) {
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
  return (var == 0x01 ? true : false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float RenderD7::Hardware::GetBatteryPercentage() {
 | 
			
		||||
  uint8_t percentLevel;
 | 
			
		||||
  PTMU_GetBatteryLevel(&percentLevel);
 | 
			
		||||
  return (float)percentLevel / 100;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
float RenderD7::Hardware::Get3dSliderLevel() { return osGet3DSliderState(); }
 | 
			
		||||
 | 
			
		||||
float RenderD7::Hardware::GetSoundSliderLevel() {
 | 
			
		||||
  uint8_t percentLevel;
 | 
			
		||||
  MCUHWC_GetSoundSliderLevel(&percentLevel);
 | 
			
		||||
  return (float)percentLevel / 100;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										60
									
								
								source/Memory.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,60 @@
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <renderd7/Memory.hpp>
 | 
			
		||||
 | 
			
		||||
static RenderD7::Memory::memory_metrics metrics;
 | 
			
		||||
 | 
			
		||||
bool rd7_enable_memtrack;
 | 
			
		||||
 | 
			
		||||
void *operator new(size_t size) {
 | 
			
		||||
  void *ptr = malloc(size);
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    metrics.t_TotalAllocated += size;
 | 
			
		||||
  return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void operator delete(void *memory, size_t size) {
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    metrics.t_TotalFreed += size;
 | 
			
		||||
  free(memory);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int allocations = 0;
 | 
			
		||||
int total_size = 0;
 | 
			
		||||
std::map<void *, size_t> sizes;
 | 
			
		||||
 | 
			
		||||
void *operator new[](size_t size) {
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    allocations++;
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    total_size += size;
 | 
			
		||||
  void *ptr = malloc(size);
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    sizes[ptr] = size;
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    metrics.t_TotalAllocated += size;
 | 
			
		||||
  return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void operator delete[](void *ptr) {
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    allocations--;
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    total_size -= sizes[ptr];
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    metrics.t_TotalFreed += sizes[ptr];
 | 
			
		||||
  if (rd7_enable_memtrack)
 | 
			
		||||
    sizes.erase(ptr);
 | 
			
		||||
  free(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
 | 
			
		||||
namespace Memory {
 | 
			
		||||
 | 
			
		||||
size_t GetTotalAllocated() { return metrics.t_TotalAllocated; }
 | 
			
		||||
 | 
			
		||||
size_t GetTotalFreed() { return metrics.t_TotalFreed; }
 | 
			
		||||
 | 
			
		||||
size_t GetCurrent() { return metrics.t_CurrentlyAllocated(); }
 | 
			
		||||
} // namespace Memory
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										35
									
								
								source/Ovarlays.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,35 @@
 | 
			
		||||
#include <renderd7/FunctionTrace.hpp>
 | 
			
		||||
#include <renderd7/Ovarlays.hpp>
 | 
			
		||||
#include <renderd7/renderd7.hpp>
 | 
			
		||||
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
Ovl_Ftrace::Ovl_Ftrace() {}
 | 
			
		||||
 | 
			
		||||
void Ovl_Ftrace::Draw(void) const { RenderD7::OnScreen(Top); }
 | 
			
		||||
 | 
			
		||||
void Ovl_Ftrace::Logic() {}
 | 
			
		||||
 | 
			
		||||
Ovl_UiBattery::Ovl_UiBattery(float *percentage) { _pct_addr = percentage; }
 | 
			
		||||
 | 
			
		||||
void Ovl_UiBattery::Draw(void) const {}
 | 
			
		||||
 | 
			
		||||
void Ovl_UiBattery::Logic() {}
 | 
			
		||||
 | 
			
		||||
Ovl_UiSound::Ovl_UiSound(float *percentage) { _pct_addr = percentage; }
 | 
			
		||||
 | 
			
		||||
void Ovl_UiSound::Draw(void) const {}
 | 
			
		||||
 | 
			
		||||
void Ovl_UiSound::Logic() {}
 | 
			
		||||
 | 
			
		||||
Ovl_Ui3d::Ovl_Ui3d(float *percentage) { _pct_addr = percentage; }
 | 
			
		||||
 | 
			
		||||
void Ovl_Ui3d::Draw(void) const {}
 | 
			
		||||
 | 
			
		||||
void Ovl_Ui3d::Logic() {}
 | 
			
		||||
 | 
			
		||||
Ovl_UiWifi::Ovl_UiWifi(uint8_t *level) { _pct_addr = level; }
 | 
			
		||||
 | 
			
		||||
void Ovl_UiWifi::Draw(void) const {}
 | 
			
		||||
 | 
			
		||||
void Ovl_UiWifi::Logic() {}
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
							
								
								
									
										61
									
								
								source/Security.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,61 @@
 | 
			
		||||
#include <renderd7/Security.hpp>
 | 
			
		||||
 | 
			
		||||
#include <3ds.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
RenderD7::Security *rd7_security;
 | 
			
		||||
 | 
			
		||||
extern bool running;
 | 
			
		||||
bool *running_addr = NULL;
 | 
			
		||||
 | 
			
		||||
struct SecurityReport {
 | 
			
		||||
  uint32_t addr;
 | 
			
		||||
  std::string initialisized_at;
 | 
			
		||||
  bool success;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::vector<SecurityReport> rd7_security_reports;
 | 
			
		||||
 | 
			
		||||
RenderD7::Security::Level RenderD7::Security::GetLevel() {
 | 
			
		||||
  return RenderD7::Security::Level::FULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::Security::SetLevel(RenderD7::Security::Level level) {}
 | 
			
		||||
 | 
			
		||||
void RenderD7::Security::Report(uint32_t addr, void *result_ptr) {
 | 
			
		||||
  // Create Report
 | 
			
		||||
}
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
Security::Security() { running_addr = &running; }
 | 
			
		||||
 | 
			
		||||
Security::~Security() { *running_addr = false; }
 | 
			
		||||
void Security::SafeExit(void (*exit_func)()) { atexit(exit_func); }
 | 
			
		||||
 | 
			
		||||
void Security::SafeInit(void (*init_func)(), void (*exit_func)()) {
 | 
			
		||||
  init_func();
 | 
			
		||||
  atexit(exit_func);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Security::SafeInit(Result (*init_func)(), void (*exit_func)()) {
 | 
			
		||||
  init_func();
 | 
			
		||||
  atexit(exit_func);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Security::SafeInit(void (*init_func)(), Result (*exit_func)()) {
 | 
			
		||||
  init_func();
 | 
			
		||||
  atexit(reinterpret_cast<void (*)()>(exit_func));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Security::SafeInit(Result (*init_func)(), Result (*exit_func)()) {
 | 
			
		||||
  init_func();
 | 
			
		||||
  atexit(reinterpret_cast<void (*)()>(exit_func));
 | 
			
		||||
}
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
namespace RenderD7 {
 | 
			
		||||
namespace Init {
 | 
			
		||||
void Security() {
 | 
			
		||||
  rd7_security = new RenderD7::Security(); // Load and Init the Security System
 | 
			
		||||
}
 | 
			
		||||
} // namespace Init
 | 
			
		||||
} // namespace RenderD7
 | 
			
		||||
@@ -5,19 +5,17 @@
 | 
			
		||||
#include <renderd7/renderd7.hpp>
 | 
			
		||||
#include <renderd7/renderd7_logo.hpp>
 | 
			
		||||
 | 
			
		||||
#define TICKS_PER_MSEC 268111.856
 | 
			
		||||
#define D7_NOTHING 0x00000000
 | 
			
		||||
#define CFGVER "5"
 | 
			
		||||
 | 
			
		||||
#define D7_NOTHING C2D_Color32(0, 0, 0, 0)
 | 
			
		||||
#define CFGVER "4"
 | 
			
		||||
 | 
			
		||||
Log renderd7log;
 | 
			
		||||
float animtime;
 | 
			
		||||
bool isndspinit = false;
 | 
			
		||||
bool running = true;
 | 
			
		||||
std::stack<std::unique_ptr<RenderD7::Scene>> RenderD7::Scene::scenes;
 | 
			
		||||
std::unique_ptr<RenderD7::Scene> tmpFadeS;
 | 
			
		||||
std::stack<std::unique_ptr<RenderD7::Ovl>> overlays;
 | 
			
		||||
bool usedbgmsg = false;
 | 
			
		||||
/// @brief  Supports Multiple Overlays
 | 
			
		||||
std::vector<std::unique_ptr<RenderD7::Ovl>> overlays;
 | 
			
		||||
/// @brief Displays Overlays step by step from first 2 last
 | 
			
		||||
std::vector<std::unique_ptr<RenderD7::Ovl>> toast_overlays;
 | 
			
		||||
std::string dspststus = "Not Initialisized!";
 | 
			
		||||
 | 
			
		||||
int cobj___;
 | 
			
		||||
@@ -29,8 +27,6 @@ std::unique_ptr<INI::INIFile> cfgfile = nullptr;
 | 
			
		||||
INI::INIStructure cfgstruct;
 | 
			
		||||
std::string cfgpath;
 | 
			
		||||
 | 
			
		||||
// RD7 SuperReselution
 | 
			
		||||
bool rd7_superreselution;
 | 
			
		||||
u8 consoleModel = 0;
 | 
			
		||||
u8 sysRegion = CFG_REGION_USA;
 | 
			
		||||
bool is_citra = false;
 | 
			
		||||
@@ -64,8 +60,6 @@ std::string mt_gpu;
 | 
			
		||||
std::string mt_cmd;
 | 
			
		||||
std::string mt_lfr;
 | 
			
		||||
 | 
			
		||||
bool shouldbe_disabled = false;
 | 
			
		||||
int cnttttt = 0;
 | 
			
		||||
int mt_screen;
 | 
			
		||||
// int mt_width = mt_screen ? 320 : 400;
 | 
			
		||||
float mt_txtSize;
 | 
			
		||||
@@ -80,8 +74,8 @@ C3D_RenderTarget *Top;
 | 
			
		||||
C3D_RenderTarget *TopRight;
 | 
			
		||||
C3D_RenderTarget *Bottom;
 | 
			
		||||
 | 
			
		||||
#define DSEVENBLACK C2D_Color32(0, 0, 0, 255)
 | 
			
		||||
#define DSEVENWHITE C2D_Color32(255, 255, 255, 255)
 | 
			
		||||
#define DSEVENBLACK 0xff000000
 | 
			
		||||
#define DSEVENWHITE 0xffffffff
 | 
			
		||||
 | 
			
		||||
u64 delta_time;
 | 
			
		||||
u64 last_tm;
 | 
			
		||||
@@ -94,12 +88,6 @@ int fadecolor = 0;
 | 
			
		||||
bool waitFade = false;
 | 
			
		||||
bool FadeExit = false;
 | 
			
		||||
bool SceneFadeWait = false;
 | 
			
		||||
// Sercices
 | 
			
		||||
int sv_gfx = 0;
 | 
			
		||||
int sv_dsp = 0;
 | 
			
		||||
int sv_cfgu = 0;
 | 
			
		||||
int sv_apt = 0;
 | 
			
		||||
int sv_romfs = 0;
 | 
			
		||||
 | 
			
		||||
std::vector<std::string> string_to_lines(std::string input_str) {
 | 
			
		||||
  std::vector<std::string> lines;
 | 
			
		||||
@@ -136,8 +124,7 @@ void Npifade() {
 | 
			
		||||
    // No fade
 | 
			
		||||
  }
 | 
			
		||||
  RenderD7::OnScreen(Top);
 | 
			
		||||
  RenderD7::Draw::Rect(0, 0, RenderD7::IsRD7SR() ? 800 : 400, 240,
 | 
			
		||||
                       ((fadealpha << 24) | 0x00000000));
 | 
			
		||||
  RenderD7::Draw::Rect(0, 0, 400, 240, ((fadealpha << 24) | 0x00000000));
 | 
			
		||||
  RenderD7::OnScreen(Bottom);
 | 
			
		||||
  RenderD7::Draw::Rect(0, 0, 320, 240, ((fadealpha << 24) | 0x00000000));
 | 
			
		||||
}
 | 
			
		||||
@@ -205,26 +192,17 @@ bool RenderD7::DrawImageFromSheet(RenderD7::Sheet *sheet, size_t index, float x,
 | 
			
		||||
}
 | 
			
		||||
void RenderD7::Init::NdspFirm() {
 | 
			
		||||
  if (access("sdmc:/3ds/dspfirm.cdc", F_OK) != -1) {
 | 
			
		||||
    Result res;
 | 
			
		||||
    res = ndspInit();
 | 
			
		||||
    sv_dsp = R_FAILED(res) ? 1 : 2;
 | 
			
		||||
    rd7_security->SafeInit(ndspInit, ndspExit);
 | 
			
		||||
    isndspinit = true;
 | 
			
		||||
    dspststus = "Initialisized success!";
 | 
			
		||||
  } else {
 | 
			
		||||
    dspststus = "Not found: dspfirm.cdc";
 | 
			
		||||
    renderd7log.Write("RenderD7: SoundEngine Error! ndspfirm not found!");
 | 
			
		||||
    RenderD7::AddOvl(std::make_unique<RenderD7::DSP_NF>());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
void RenderD7::Exit::NdspFirm() {
 | 
			
		||||
  if (isndspinit) {
 | 
			
		||||
    ndspExit();
 | 
			
		||||
    RenderD7::AddToast(std::make_unique<RenderD7::DSP_NF>());
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::Msg::Display(std::string titletxt, std::string subtext,
 | 
			
		||||
                            C3D_RenderTarget *target) {
 | 
			
		||||
  shouldbe_disabled = true;
 | 
			
		||||
  cnttttt = 0;
 | 
			
		||||
  C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
  C2D_TargetClear(Top, DSEVENBLACK);
 | 
			
		||||
  C2D_TargetClear(Bottom, DSEVENBLACK);
 | 
			
		||||
@@ -242,8 +220,6 @@ void RenderD7::Msg::Display(std::string titletxt, std::string subtext,
 | 
			
		||||
void RenderD7::Msg::DisplayWithProgress(std::string titletext,
 | 
			
		||||
                                        std::string subtext, float current,
 | 
			
		||||
                                        float total, u32 prgbarcolor) {
 | 
			
		||||
  shouldbe_disabled = true;
 | 
			
		||||
  cnttttt = 0;
 | 
			
		||||
  RenderD7::ClearTextBufs();
 | 
			
		||||
  C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
  C2D_TargetClear(Top, DSEVENBLACK);
 | 
			
		||||
@@ -265,12 +241,9 @@ void RenderD7::Msg::DisplayWithProgress(std::string titletext,
 | 
			
		||||
  RenderD7::Draw::Rect(0, 0, 320, 240, RenderD7::Color::Hex("#111111"));
 | 
			
		||||
  C3D_FrameEnd(0);
 | 
			
		||||
}
 | 
			
		||||
void RenderD7::SetupLog() { renderd7log.Init("RenderD7/RenderD7.log"); }
 | 
			
		||||
 | 
			
		||||
void RenderD7::Error::DisplayError(std::string toptext, std::string errortext,
 | 
			
		||||
                                   int timesec) {
 | 
			
		||||
  shouldbe_disabled = true;
 | 
			
		||||
  cnttttt = 0;
 | 
			
		||||
  RenderD7::ClearTextBufs();
 | 
			
		||||
  C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
  C2D_TargetClear(Top, DSEVENBLACK);
 | 
			
		||||
@@ -287,34 +260,24 @@ void RenderD7::Error::DisplayError(std::string toptext, std::string errortext,
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#include <renderd7/BitmapPrinter.hpp>
 | 
			
		||||
 | 
			
		||||
void RenderD7::Error::DisplayFatalError(std::string toptext,
 | 
			
		||||
                                        std::string errortext) {
 | 
			
		||||
  shouldbe_disabled = true;
 | 
			
		||||
  cnttttt = 0;
 | 
			
		||||
  bool error___ = true;
 | 
			
		||||
  RenderD7::ClearTextBufs();
 | 
			
		||||
  C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
  C2D_TargetClear(Top, DSEVENBLACK);
 | 
			
		||||
  C2D_TargetClear(Bottom, DSEVENBLACK);
 | 
			
		||||
  RenderD7::BitmapPrinter errorss(400, 240);
 | 
			
		||||
  errorss.DrawRectFilled(0, 0, 400, 240, 0, 0, 0, 255);
 | 
			
		||||
  errorss.DrawDebugText(4, 4, 2, RenderD7::Color::Hex("#ff0000"), toptext);
 | 
			
		||||
  errorss.DrawDebugText(4, 26, 1, RenderD7::Color::Hex("#000000"), errortext);
 | 
			
		||||
  errorss.DrawDebugText(4, 230, 1, RenderD7::Color::Hex("#000000"),
 | 
			
		||||
                        "Press Start to Exit!");
 | 
			
		||||
  RenderD7::Image img;
 | 
			
		||||
  img.LoadFromBitmap(errorss.GetBitmap());
 | 
			
		||||
  C2D_TargetClear(Top, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
  C2D_TargetClear(Bottom, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
  RenderD7::OnScreen(Top);
 | 
			
		||||
  img.Draw(0, 0);
 | 
			
		||||
  /*RenderD7::Draw::TextCentered(0, 0, 0.7f, DSEVENWHITE, toptext, 400);
 | 
			
		||||
      RenderD7::Draw::TextCentered(0, 100, 0.6f, DSEVENWHITE, errortext, 400);
 | 
			
		||||
      RenderD7::Draw::TextCentered(0, 200, 0.6f, DSEVENWHITE, "Press Start to
 | 
			
		||||
     Exit!", 400);*/
 | 
			
		||||
  RenderD7::Draw::TextCentered(0, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                               toptext, 400);
 | 
			
		||||
  RenderD7::Draw::TextCentered(0, 100, 0.6f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                               errortext, 400);
 | 
			
		||||
  RenderD7::Draw::TextCentered(0, 200, 0.6f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                               "Press Start to Exit!", 400);
 | 
			
		||||
  C3D_FrameEnd(0);
 | 
			
		||||
  while (error___) {
 | 
			
		||||
    if (d7_hDown & KEY_START) {
 | 
			
		||||
      error___ = false;
 | 
			
		||||
      RenderD7::ExitApp();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -353,7 +316,8 @@ void frameloop() {
 | 
			
		||||
    last_time = osGetTime();
 | 
			
		||||
  }
 | 
			
		||||
  d11framerate = current_fps;
 | 
			
		||||
  // for (int i = 0; i < 320; i++) mt_fpsgraph[i] = current_fps;
 | 
			
		||||
  for (int i = 0; i < 320; i++)
 | 
			
		||||
    mt_fpsgraph[i] = current_fps;
 | 
			
		||||
}
 | 
			
		||||
float getframerate() { return d11framerate; }
 | 
			
		||||
 | 
			
		||||
@@ -362,6 +326,7 @@ std::string RenderD7::GetFramerate() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RenderD7::MainLoop() {
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7-core", f2s(RenderD7::MainLoop));
 | 
			
		||||
  if (!aptMainLoop())
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
@@ -384,29 +349,20 @@ bool RenderD7::MainLoop() {
 | 
			
		||||
  C2D_TargetClear(Top, C2D_Color32(0, 0, 0, 0));
 | 
			
		||||
  C2D_TargetClear(Bottom, C2D_Color32(0, 0, 0, 0));
 | 
			
		||||
  frameloop();
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7sm", f2s(RenderD7::Scene::doDraw));
 | 
			
		||||
  RenderD7::Scene::doDraw();
 | 
			
		||||
  RenderD7::Ftrace::End("rd7sm", f2s(RenderD7::Scene::doDraw));
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7sm", f2s(RenderD7::Scene::doLogic));
 | 
			
		||||
  RenderD7::Scene::doLogic(d7_hDown, d7_hHeld, d7_hUp, d7_touch);
 | 
			
		||||
  cnttttt++;
 | 
			
		||||
  // Disably Overlays For one Frame
 | 
			
		||||
  if (cnttttt > 1) {
 | 
			
		||||
    shouldbe_disabled = false;
 | 
			
		||||
    cnttttt = 0;
 | 
			
		||||
  }
 | 
			
		||||
  RenderD7::Ftrace::End("rd7sm", f2s(RenderD7::Scene::doLogic));
 | 
			
		||||
 | 
			
		||||
  // Disably Overlays For one Frame
 | 
			
		||||
  RenderD7::Ftrace::End("rd7-core", f2s(RenderD7::MainLoop));
 | 
			
		||||
  return running;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::ClearTextBufs(void) { C2D_TextBufClear(TextBuf); }
 | 
			
		||||
 | 
			
		||||
void MetrikThread(RenderD7::Parameter param) {
 | 
			
		||||
  while (true) {
 | 
			
		||||
    RenderD7::DrawMetrikOvl();
 | 
			
		||||
    RenderD7::Thread::sleep(
 | 
			
		||||
        1000 * 1); // wait; also, this is needed to allow for concurrency (refer
 | 
			
		||||
                   // to the documentation for m3d::Thread::sleep())
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::Init::Graphics() {
 | 
			
		||||
  C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
 | 
			
		||||
  C2D_Init(size_t(maxobj__));
 | 
			
		||||
@@ -418,16 +374,13 @@ void RenderD7::Init::Graphics() {
 | 
			
		||||
  Font = C2D_FontLoadSystem(CFG_REGION_USA);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::Exit::Graphics() {
 | 
			
		||||
  C2D_TextBufDelete(TextBuf);
 | 
			
		||||
  C2D_Fini();
 | 
			
		||||
  C3D_Fini();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
  gfxInitDefault();
 | 
			
		||||
  sv_gfx = 2;
 | 
			
		||||
  /// The only func that can be executed before Security
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7-core", f2s(RenderD7::Init::Main));
 | 
			
		||||
  RenderD7::Init::Security();
 | 
			
		||||
  rd7_security->SafeInit(gfxInitDefault, gfxExit);
 | 
			
		||||
  // consoleInit(GFX_TOP, NULL);
 | 
			
		||||
  // Dont safinit this cause it has security
 | 
			
		||||
  Result res = cfguInit();
 | 
			
		||||
  if (R_SUCCEEDED(res)) {
 | 
			
		||||
    CFGU_SecureInfoGetRegion(&sysRegion);
 | 
			
		||||
@@ -435,17 +388,14 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
    cfguExit();
 | 
			
		||||
  }
 | 
			
		||||
  printf("cfgu\n");
 | 
			
		||||
  if (rd7_superreselution) {
 | 
			
		||||
    gfxSetWide(consoleModel != 3);
 | 
			
		||||
  }
 | 
			
		||||
  printf("rd7sr\n");
 | 
			
		||||
  res = aptInit();
 | 
			
		||||
  sv_apt = R_FAILED(res) ? 1 : 2;
 | 
			
		||||
  res = romfsInit();
 | 
			
		||||
  sv_romfs = R_FAILED(res) ? 1 : 2;
 | 
			
		||||
 | 
			
		||||
  rd7_security->SafeInit(aptInit, aptExit);
 | 
			
		||||
  rd7_security->SafeInit(romfsInit, romfsExit);
 | 
			
		||||
 | 
			
		||||
  C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
 | 
			
		||||
  rd7_security->SafeExit(C3D_Fini);
 | 
			
		||||
  C2D_Init(C2D_DEFAULT_MAX_OBJECTS);
 | 
			
		||||
  rd7_security->SafeExit(C2D_Fini);
 | 
			
		||||
  C2D_Prepare();
 | 
			
		||||
  Top = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT);
 | 
			
		||||
  TopRight = C2D_CreateScreenTarget(GFX_TOP, GFX_RIGHT);
 | 
			
		||||
@@ -454,11 +404,11 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
  Font = C2D_FontLoadSystem(CFG_REGION_USA);
 | 
			
		||||
  printf("Graphical Interface\n");
 | 
			
		||||
  last_tm = svcGetSystemTick();
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7-core", "do_splash");
 | 
			
		||||
  if (rd7_do_splash)
 | 
			
		||||
    PushSplash();
 | 
			
		||||
  RenderD7::Ftrace::End("rd7-core", "do_splash");
 | 
			
		||||
 | 
			
		||||
  res = cfguInit();
 | 
			
		||||
  sv_cfgu = R_FAILED(res) ? 1 : 2;
 | 
			
		||||
  printf("stuff\n");
 | 
			
		||||
  if (cobj___) {
 | 
			
		||||
    maxobj__ = cobj___;
 | 
			
		||||
@@ -482,24 +432,14 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
      renew = true;
 | 
			
		||||
  }
 | 
			
		||||
  printf("vercheck\n");
 | 
			
		||||
  renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                    GetFileName<std::string>(__FILE__));
 | 
			
		||||
  if (!FS::FileExist(cfgpath + "/config.ini") || renew) {
 | 
			
		||||
    cfgfile = std::make_unique<INI::INIFile>(cfgpath + "/config.ini");
 | 
			
		||||
    renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                      GetFileName<std::string>(__FILE__));
 | 
			
		||||
    cfgfile->read(cfgstruct);
 | 
			
		||||
    renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                      GetFileName<std::string>(__FILE__));
 | 
			
		||||
    cfgstruct["info"]["version"] = CFGVER;
 | 
			
		||||
    cfgstruct["info"]["renderd7ver"] = RENDERD7VSTRING;
 | 
			
		||||
    cfgstruct["settings"]["doscreentimeout"] = "0";
 | 
			
		||||
    cfgstruct["settings"]["forcetimeoutLB"] = "1";
 | 
			
		||||
    cfgstruct["settings"]["forceFrameRate"] = "60";
 | 
			
		||||
    cfgstruct["settings"]["super-reselution"] = "0";
 | 
			
		||||
    cfgstruct["settings"]["renderer"] = "c3d_c2d";
 | 
			
		||||
    renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                      GetFileName<std::string>(__FILE__));
 | 
			
		||||
    cfgstruct["metrik-settings"]["enableoverlay"] = "0";
 | 
			
		||||
    cfgstruct["metrik-settings"]["Screen"] = "0";
 | 
			
		||||
    cfgstruct["metrik-settings"]["txtColor"] = "#ffffff";
 | 
			
		||||
@@ -509,13 +449,8 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
    cfgstruct["metrik-settings"]["txtSize"] = "0.7f";
 | 
			
		||||
    cfgfile->write(cfgstruct);
 | 
			
		||||
  }
 | 
			
		||||
  if (renew)
 | 
			
		||||
    printf("renew\n");
 | 
			
		||||
  renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                    GetFileName<std::string>(__FILE__));
 | 
			
		||||
  cfgfile = std::make_unique<INI::INIFile>(cfgpath + "/config.ini");
 | 
			
		||||
  cfgfile->read(cfgstruct);
 | 
			
		||||
  std::string Fps = cfgstruct["settings"]["forceFrameRate"];
 | 
			
		||||
  ////C3D_FrameRate(RenderD7::Convert::StringtoFloat(Fps));
 | 
			
		||||
  metrikd = RenderD7::Convert::FloatToBool(RenderD7::Convert::StringtoFloat(
 | 
			
		||||
      cfgstruct["metrik-settings"]["enableoverlay"]));
 | 
			
		||||
@@ -530,9 +465,6 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
      RenderD7::Convert::StringtoFloat(cfgstruct["metrik-settings"]["txtSize"]);
 | 
			
		||||
  mt_screen =
 | 
			
		||||
      RenderD7::Convert::StringtoInt(cfgstruct["metrik-settings"]["Screen"]);
 | 
			
		||||
  rd7_superreselution =
 | 
			
		||||
      RenderD7::Convert::FloatToBool(RenderD7::Convert::StringtoFloat(
 | 
			
		||||
          cfgstruct["settings"]["super-reselution"]));
 | 
			
		||||
  printf("read\n");
 | 
			
		||||
  // Check if citra
 | 
			
		||||
  s64 citracheck = 0;
 | 
			
		||||
@@ -542,14 +474,7 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
  // Speedup
 | 
			
		||||
  osSetSpeedupEnable(true);
 | 
			
		||||
  printf("boost\n");
 | 
			
		||||
  if (!is_citra && rd7_superreselution) {
 | 
			
		||||
    if (consoleModel != 3)
 | 
			
		||||
      gfxSetWide(true);
 | 
			
		||||
  }
 | 
			
		||||
  printf("rd7sr\n");
 | 
			
		||||
  // consoleInit(GFX_BOTTOM, NULL);
 | 
			
		||||
  printf("csv\n");
 | 
			
		||||
 | 
			
		||||
  RenderD7::Ftrace::End("rd7-core", f2s(RenderD7::Init::Main));
 | 
			
		||||
  // RenderD7::Msg::Display("RenderD7", "RenderD7 init success!\nWaiting for
 | 
			
		||||
  // MainLoop!", Top);
 | 
			
		||||
  return 0;
 | 
			
		||||
@@ -557,15 +482,15 @@ Result RenderD7::Init::Main(std::string app_name) {
 | 
			
		||||
 | 
			
		||||
Result RenderD7::Init::Minimal(std::string app_name) {
 | 
			
		||||
  D_app_name = app_name;
 | 
			
		||||
  Result res_;
 | 
			
		||||
  gfxInitDefault();
 | 
			
		||||
  sv_gfx = 2;
 | 
			
		||||
  res_ = romfsInit();
 | 
			
		||||
  sv_romfs = R_FAILED(res_) ? 1 : 2;
 | 
			
		||||
  RenderD7::Init::Security();
 | 
			
		||||
  rd7_security->SafeInit(gfxInitDefault, gfxExit);
 | 
			
		||||
  rd7_security->SafeInit(romfsInit, romfsExit);
 | 
			
		||||
 | 
			
		||||
  osSetSpeedupEnable(true);
 | 
			
		||||
  C3D_Init(C3D_DEFAULT_CMDBUF_SIZE);
 | 
			
		||||
  rd7_security->SafeExit(C3D_Fini);
 | 
			
		||||
  C2D_Init(C2D_DEFAULT_MAX_OBJECTS);
 | 
			
		||||
  rd7_security->SafeExit(C2D_Fini);
 | 
			
		||||
  C2D_Prepare();
 | 
			
		||||
  Top = C2D_CreateScreenTarget(GFX_TOP, GFX_LEFT);
 | 
			
		||||
  TopRight = C2D_CreateScreenTarget(GFX_TOP, GFX_RIGHT);
 | 
			
		||||
@@ -601,24 +526,14 @@ Result RenderD7::Init::Minimal(std::string app_name) {
 | 
			
		||||
      renew = true;
 | 
			
		||||
  }
 | 
			
		||||
  printf("vercheck\n");
 | 
			
		||||
  renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                    GetFileName<std::string>(__FILE__));
 | 
			
		||||
  if (!FS::FileExist(cfgpath + "/config.ini") || renew) {
 | 
			
		||||
    cfgfile = std::make_unique<INI::INIFile>(cfgpath + "/config.ini");
 | 
			
		||||
    renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                      GetFileName<std::string>(__FILE__));
 | 
			
		||||
    cfgfile->read(cfgstruct);
 | 
			
		||||
    renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                      GetFileName<std::string>(__FILE__));
 | 
			
		||||
    cfgstruct["info"]["version"] = CFGVER;
 | 
			
		||||
    cfgstruct["info"]["renderd7ver"] = RENDERD7VSTRING;
 | 
			
		||||
    cfgstruct["settings"]["doscreentimeout"] = "0";
 | 
			
		||||
    cfgstruct["settings"]["forcetimeoutLB"] = "1";
 | 
			
		||||
    cfgstruct["settings"]["forceFrameRate"] = "60";
 | 
			
		||||
    cfgstruct["settings"]["super-reselution"] = "0";
 | 
			
		||||
    cfgstruct["settings"]["renderer"] = "c3d_c2d";
 | 
			
		||||
    renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                      GetFileName<std::string>(__FILE__));
 | 
			
		||||
    cfgstruct["metrik-settings"]["enableoverlay"] = "0";
 | 
			
		||||
    cfgstruct["metrik-settings"]["Screen"] = "0";
 | 
			
		||||
    cfgstruct["metrik-settings"]["txtColor"] = "#ffffff";
 | 
			
		||||
@@ -630,11 +545,8 @@ Result RenderD7::Init::Minimal(std::string app_name) {
 | 
			
		||||
  }
 | 
			
		||||
  if (renew)
 | 
			
		||||
    printf("renew\n");
 | 
			
		||||
  renderd7log.Write("Point At: " + std::to_string(__LINE__) + " : " +
 | 
			
		||||
                    GetFileName<std::string>(__FILE__));
 | 
			
		||||
  cfgfile = std::make_unique<INI::INIFile>(cfgpath + "/config.ini");
 | 
			
		||||
  cfgfile->read(cfgstruct);
 | 
			
		||||
  std::string Fps = cfgstruct["settings"]["forceFrameRate"];
 | 
			
		||||
  // C3D_FrameRate(RenderD7::Convert::StringtoFloat(Fps));
 | 
			
		||||
  metrikd = RenderD7::Convert::FloatToBool(RenderD7::Convert::StringtoFloat(
 | 
			
		||||
      cfgstruct["metrik-settings"]["enableoverlay"]));
 | 
			
		||||
@@ -649,14 +561,7 @@ Result RenderD7::Init::Minimal(std::string app_name) {
 | 
			
		||||
      RenderD7::Convert::StringtoFloat(cfgstruct["metrik-settings"]["txtSize"]);
 | 
			
		||||
  mt_screen =
 | 
			
		||||
      RenderD7::Convert::StringtoInt(cfgstruct["metrik-settings"]["Screen"]);
 | 
			
		||||
  rd7_superreselution =
 | 
			
		||||
      RenderD7::Convert::FloatToBool(RenderD7::Convert::StringtoFloat(
 | 
			
		||||
          cfgstruct["settings"]["super-reselution"]));
 | 
			
		||||
  printf("boost\n");
 | 
			
		||||
  if (!is_citra && rd7_superreselution) {
 | 
			
		||||
    if (consoleModel != 3)
 | 
			
		||||
      gfxSetWide(true);
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -676,42 +581,6 @@ Result RenderD7::Init::Reload() {
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::ToggleRD7SR() {
 | 
			
		||||
  shouldbe_disabled = true;
 | 
			
		||||
  cnttttt = 0;
 | 
			
		||||
  // Display black screen
 | 
			
		||||
  C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
  C2D_TargetClear(Top, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
  RenderD7::OnScreen(Top);
 | 
			
		||||
  C3D_FrameEnd(0);
 | 
			
		||||
  // Toggle 400px/800px mode
 | 
			
		||||
  gfxSetWide(gfxIsWide() ? false : true);
 | 
			
		||||
  rd7_superreselution = gfxIsWide();
 | 
			
		||||
  RenderD7::Init::Reload();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RenderD7::IsRD7SR() { return gfxIsWide(); }
 | 
			
		||||
 | 
			
		||||
void RenderD7::Exit::Main() {
 | 
			
		||||
  cfgfile->write(cfgstruct);
 | 
			
		||||
  C2D_TextBufDelete(TextBuf);
 | 
			
		||||
  C2D_Fini();
 | 
			
		||||
  C3D_Fini();
 | 
			
		||||
  aptExit();
 | 
			
		||||
  gfxExit();
 | 
			
		||||
  romfsExit();
 | 
			
		||||
  cfguExit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::Exit::Minimal() {
 | 
			
		||||
  cfgfile->write(cfgstruct);
 | 
			
		||||
  C2D_TextBufDelete(TextBuf);
 | 
			
		||||
  C2D_Fini();
 | 
			
		||||
  C3D_Fini();
 | 
			
		||||
  gfxExit();
 | 
			
		||||
  romfsExit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::DrawTObjects(std::vector<RenderD7::TObject> tobjects, u32 color,
 | 
			
		||||
                            u32 txtcolor, int selection, u32 selbgcolor,
 | 
			
		||||
                            u32 selcolor) {
 | 
			
		||||
@@ -724,25 +593,25 @@ void RenderD7::DrawTObjects(std::vector<RenderD7::TObject> tobjects, u32 color,
 | 
			
		||||
      RenderD7::Draw::Rect(tobjects[i].x, tobjects[i].y, tobjects[i].w,
 | 
			
		||||
                           tobjects[i].h, selcolor);
 | 
			
		||||
      RenderD7::Draw::Text(tobjects[i].x + (tobjects[i].w / 2) -
 | 
			
		||||
                               RenderD7::Draw::GetTextHeight(
 | 
			
		||||
                                   tobjects[i].txtsize, tobjects[i].text) +
 | 
			
		||||
                               tobjects[i].correctx,
 | 
			
		||||
                               RenderD7::Draw::GetTextWidth(tobjects[i].txtsize,
 | 
			
		||||
                                                            tobjects[i].text) /
 | 
			
		||||
                                   2,
 | 
			
		||||
                           tobjects[i].y + (tobjects[i].h / 2) -
 | 
			
		||||
                               RenderD7::Draw::GetTextHeight(
 | 
			
		||||
                                   tobjects[i].txtsize, tobjects[i].text) +
 | 
			
		||||
                               tobjects[i].correcty,
 | 
			
		||||
                                   tobjects[i].txtsize, tobjects[i].text) /
 | 
			
		||||
                                   2,
 | 
			
		||||
                           tobjects[i].txtsize, txtcolor, tobjects[i].text);
 | 
			
		||||
    } else {
 | 
			
		||||
      RenderD7::Draw::Rect(tobjects[i].x, tobjects[i].y - 1, tobjects[i].w,
 | 
			
		||||
                           tobjects[i].h, color);
 | 
			
		||||
      RenderD7::Draw::Text(tobjects[i].x + (tobjects[i].w / 2) -
 | 
			
		||||
                               RenderD7::Draw::GetTextHeight(
 | 
			
		||||
                                   tobjects[i].txtsize, tobjects[i].text) +
 | 
			
		||||
                               tobjects[i].correctx,
 | 
			
		||||
                               RenderD7::Draw::GetTextWidth(tobjects[i].txtsize,
 | 
			
		||||
                                                            tobjects[i].text) /
 | 
			
		||||
                                   2,
 | 
			
		||||
                           tobjects[i].y + (tobjects[i].h / 2) -
 | 
			
		||||
                               RenderD7::Draw::GetTextHeight(
 | 
			
		||||
                                   tobjects[i].txtsize, tobjects[i].text) +
 | 
			
		||||
                               tobjects[i].correcty,
 | 
			
		||||
                                   tobjects[i].txtsize, tobjects[i].text) /
 | 
			
		||||
                                   2,
 | 
			
		||||
                           tobjects[i].txtsize, txtcolor, tobjects[i].text);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
@@ -765,20 +634,10 @@ void RenderD7::DrawTLBtns(std::vector<RenderD7::TLBtn> btns, u32 color,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::ExitApp() {
 | 
			
		||||
  if (!rd7settings) {
 | 
			
		||||
    if (waitFade) {
 | 
			
		||||
      FadeExit = true;
 | 
			
		||||
    } else
 | 
			
		||||
      running = false;
 | 
			
		||||
  } else {
 | 
			
		||||
    // Normally Forbidden
 | 
			
		||||
    fadein = false;
 | 
			
		||||
    waitFade = false;
 | 
			
		||||
    RenderD7::FadeIn();
 | 
			
		||||
    RenderD7::AddOvl(std::make_unique<RenderD7::Toast>(
 | 
			
		||||
        "RenderD7", "Exiting in Settings is Not Allowed!\nPress B to Get Out "
 | 
			
		||||
                    "and then Exit."));
 | 
			
		||||
  }
 | 
			
		||||
  if (waitFade) {
 | 
			
		||||
    FadeExit = true;
 | 
			
		||||
  } else
 | 
			
		||||
    running = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RenderD7::touchTObj(touchPosition touch, RenderD7::TObject button) {
 | 
			
		||||
@@ -810,62 +669,16 @@ void RenderD7::DrawSTObject(std::vector<RenderD7::TObject> tobject,
 | 
			
		||||
                       tobject[tobjectindex].w, tobject[tobjectindex].h, color);
 | 
			
		||||
  RenderD7::Draw::Text(
 | 
			
		||||
      tobject[tobjectindex].x + (tobject[tobjectindex].w / 2) -
 | 
			
		||||
          RenderD7::Draw::GetTextHeight(tobject[tobjectindex].txtsize,
 | 
			
		||||
                                        tobject[tobjectindex].text) +
 | 
			
		||||
          tobject[tobjectindex].correctx,
 | 
			
		||||
          RenderD7::Draw::GetTextWidth(tobject[tobjectindex].txtsize,
 | 
			
		||||
                                       tobject[tobjectindex].text) /
 | 
			
		||||
              2,
 | 
			
		||||
      tobject[tobjectindex].y + (tobject[tobjectindex].h / 2) -
 | 
			
		||||
          RenderD7::Draw::GetTextHeight(tobject[tobjectindex].txtsize,
 | 
			
		||||
                                        tobject[tobjectindex].text) +
 | 
			
		||||
          tobject[tobjectindex].correcty,
 | 
			
		||||
                                        tobject[tobjectindex].text) /
 | 
			
		||||
              2,
 | 
			
		||||
      tobject[tobjectindex].txtsize, txtcolor, tobject[tobjectindex].text);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool dirEntryPredicate(const RenderD7::DirContent &lhs,
 | 
			
		||||
                       const RenderD7::DirContent &rhs) {
 | 
			
		||||
  if (!lhs.isDir && rhs.isDir)
 | 
			
		||||
    return false;
 | 
			
		||||
  if (lhs.isDir && !rhs.isDir)
 | 
			
		||||
    return true;
 | 
			
		||||
 | 
			
		||||
  return strcasecmp(lhs.name.c_str(), rhs.name.c_str()) < 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::GetDirContentsExt(std::vector<RenderD7::DirContent> &dircontent,
 | 
			
		||||
                                 const std::vector<std::string> &extensions) {
 | 
			
		||||
  struct stat st;
 | 
			
		||||
 | 
			
		||||
  dircontent.clear();
 | 
			
		||||
 | 
			
		||||
  DIR *pdir = opendir(".");
 | 
			
		||||
 | 
			
		||||
  if (pdir != nullptr) {
 | 
			
		||||
    while (true) {
 | 
			
		||||
      RenderD7::DirContent dirEntry;
 | 
			
		||||
 | 
			
		||||
      struct dirent *pent = readdir(pdir);
 | 
			
		||||
      if (pent == NULL)
 | 
			
		||||
        break;
 | 
			
		||||
 | 
			
		||||
      stat(pent->d_name, &st);
 | 
			
		||||
      dirEntry.name = pent->d_name;
 | 
			
		||||
      dirEntry.isDir = (st.st_mode & S_IFDIR) ? true : false;
 | 
			
		||||
 | 
			
		||||
      if (dirEntry.name.compare(".") != 0 &&
 | 
			
		||||
          (dirEntry.isDir ||
 | 
			
		||||
           RenderD7::NameIsEndingWith(dirEntry.name, extensions))) {
 | 
			
		||||
        dircontent.push_back(dirEntry);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    closedir(pdir);
 | 
			
		||||
  }
 | 
			
		||||
  sort(dircontent.begin(), dircontent.end(), dirEntryPredicate);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::GetDirContents(std::vector<RenderD7::DirContent> &dircontent) {
 | 
			
		||||
  RenderD7::GetDirContentsExt(dircontent, {});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool RenderD7::FS::FileExist(const std::string &path) {
 | 
			
		||||
  FILE *test = fopen(path.c_str(), "r");
 | 
			
		||||
  if (test != NULL) {
 | 
			
		||||
@@ -958,13 +771,6 @@ void RenderD7::DrawMetrikOvl() {
 | 
			
		||||
  RenderD7::Draw::Text(0, 90, mt_txtSize, mt_txtcolor, mt_cmd);
 | 
			
		||||
  RenderD7::Draw::Text(0, 110, mt_txtSize, mt_txtcolor, mt_lfr);
 | 
			
		||||
  RenderD7::Draw::Text(0, infoy, mt_txtSize, mt_txtcolor, info);
 | 
			
		||||
 | 
			
		||||
  /*for (int z = 0; z < (int)mt_fpsgraph.size(); z++)
 | 
			
		||||
  {
 | 
			
		||||
              //mt_fpsgraph[z] = (int)d11framerate;
 | 
			
		||||
      C2D_DrawLine(z, 239 - mt_fpsgraph[z], mt_txtcolor, z + 1, 239 -
 | 
			
		||||
  mt_fpsgraph[z + 1], mt_txtcolor, 1, 1);
 | 
			
		||||
  }*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RenderD7::DSP_NF::DSP_NF() {}
 | 
			
		||||
@@ -974,7 +780,7 @@ void RenderD7::DSP_NF::Draw(void) const {
 | 
			
		||||
  RenderD7::Draw::Rect(0, msgposy, 400, 70, RenderD7::Color::Hex("#111111"));
 | 
			
		||||
  RenderD7::Draw::Rect(0, msgposy, 400, 25, RenderD7::Color::Hex("#222222"));
 | 
			
		||||
  RenderD7::Draw::Text(2, msgposy + 3, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                       "Warning! Code: 00027");
 | 
			
		||||
                       "RenderD7: Warning!");
 | 
			
		||||
  RenderD7::Draw::Text(2, msgposy + 30, 0.6f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                       "You can't use Sound effects because the "
 | 
			
		||||
                       "file\n<<sdmc:/3ds/dspfirm.cdc>> was not found!");
 | 
			
		||||
@@ -993,32 +799,36 @@ void RenderD7::DSP_NF::Logic() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OvlHandler() {
 | 
			
		||||
  if (!overlays.empty()) {
 | 
			
		||||
    overlays.top()->Draw();
 | 
			
		||||
  for (size_t i = 0; i < toast_overlays.size(); i++) {
 | 
			
		||||
    if (toast_overlays[i]->IsKilled())
 | 
			
		||||
      toast_overlays.erase(toast_overlays.begin() + i);
 | 
			
		||||
  }
 | 
			
		||||
  if (!overlays.empty()) {
 | 
			
		||||
    overlays.top()->Logic();
 | 
			
		||||
  if ((int)toast_overlays.size() > 0) {
 | 
			
		||||
    toast_overlays[0]->Draw();
 | 
			
		||||
    toast_overlays[0]->Logic();
 | 
			
		||||
  }
 | 
			
		||||
  if (!overlays.empty()) {
 | 
			
		||||
    if (overlays.top()->IsKilled())
 | 
			
		||||
      overlays.pop();
 | 
			
		||||
  for (size_t i = 0; i < overlays.size(); i++) {
 | 
			
		||||
    overlays[i]->Draw();
 | 
			
		||||
    overlays[i]->Logic();
 | 
			
		||||
    if (overlays[i]->IsKilled())
 | 
			
		||||
      overlays.erase(overlays.begin() + i);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
int lp = 0;
 | 
			
		||||
 | 
			
		||||
void RenderD7::FrameEnd() {
 | 
			
		||||
  if (metrikd && !shouldbe_disabled)
 | 
			
		||||
  C3D_FrameBegin(2);
 | 
			
		||||
  if (metrikd)
 | 
			
		||||
    RenderD7::DrawMetrikOvl();
 | 
			
		||||
  if (!shouldbe_disabled) {
 | 
			
		||||
    OvlHandler();
 | 
			
		||||
    Npifade();
 | 
			
		||||
  }
 | 
			
		||||
  lp++;
 | 
			
		||||
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7oh", f2s(OvlHandler));
 | 
			
		||||
  OvlHandler();
 | 
			
		||||
  RenderD7::Ftrace::End("rd7oh", f2s(OvlHandler));
 | 
			
		||||
  Npifade();
 | 
			
		||||
 | 
			
		||||
  C3D_FrameEnd(0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RenderD7::RSettings::RSettings() {
 | 
			
		||||
  aptSetHomeAllowed(false);
 | 
			
		||||
  RenderD7::FadeIn();
 | 
			
		||||
  cfgfile = std::make_unique<INI::INIFile>(cfgpath + "/config.ini");
 | 
			
		||||
  cfgfile->read(cfgstruct);
 | 
			
		||||
@@ -1027,10 +837,7 @@ RenderD7::RSettings::RSettings() {
 | 
			
		||||
  calculate_screens(lines, screen_index, screens);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
RenderD7::RSettings::~RSettings() {
 | 
			
		||||
  cfgfile->write(cfgstruct);
 | 
			
		||||
  aptSetHomeAllowed(false);
 | 
			
		||||
}
 | 
			
		||||
RenderD7::RSettings::~RSettings() {}
 | 
			
		||||
 | 
			
		||||
std::vector<std::string> StrHelper(std::string input) {
 | 
			
		||||
  std::string ss(input);
 | 
			
		||||
@@ -1050,16 +857,13 @@ void RenderD7::RSettings::Draw(void) const {
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, DSEVENWHITE, "RenderD7->Settings");
 | 
			
		||||
    RenderD7::Draw::TextRight(400, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                              RENDERD7VSTRING);
 | 
			
		||||
    RenderD7::Draw::Text(0, 30, 0.7f, DSEVENBLACK, "RD7SR: " + rd7srstate);
 | 
			
		||||
    RenderD7::Draw::Text(0, 70, 0.7f, DSEVENBLACK,
 | 
			
		||||
    RenderD7::Draw::Text(0, 30, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "Metrik Overlay: " + mtovlstate);
 | 
			
		||||
    RenderD7::Draw::Text(0, 90, 0.7f, DSEVENBLACK, "Force FPS: " + fpsstate);
 | 
			
		||||
    RenderD7::Draw::Text(0, 110, 0.7f, DSEVENBLACK,
 | 
			
		||||
    RenderD7::Draw::Text(0, 50, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "Metrik Screen: " + mtscreenstate);
 | 
			
		||||
    /*RenderD7::Draw::Text(0, 130, 0.7f, DSEVENBLACK, "Metrik Text RGB: " +
 | 
			
		||||
    mttxtcolstate); RenderD7::Draw::Text(0, 150, 0.7f, DSEVENBLACK, "Metrik
 | 
			
		||||
    Alpha: " + mtcola); RenderD7::Draw::Text(0, 170, 0.7f, DSEVENBLACK, "Metrik
 | 
			
		||||
    Text Alpha: " + mttxtcola);*/
 | 
			
		||||
    RenderD7::Draw::Text(
 | 
			
		||||
        0, 70, 0.7f, DSEVENBLACK,
 | 
			
		||||
        "Current: " + std::to_string(RenderD7::Memory::GetCurrent()) + "b");
 | 
			
		||||
    RenderD7::OnScreen(Bottom);
 | 
			
		||||
    std::string verc = "Config Version: ";
 | 
			
		||||
    verc += CFGVER;
 | 
			
		||||
@@ -1075,29 +879,9 @@ void RenderD7::RSettings::Draw(void) const {
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, DSEVENWHITE, "RenderD7->Services");
 | 
			
		||||
    RenderD7::Draw::TextRight(400, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                              RENDERD7VSTRING);
 | 
			
		||||
    RenderD7::Draw::Text(0, 30, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "gfx: " + std::string(sv_gfx == 0   ? "Not Init"
 | 
			
		||||
                                               : sv_gfx == 2 ? "Success"
 | 
			
		||||
                                                             : "Failed"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 50, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "Apt: " + std::string(sv_apt == 0   ? "Not Init"
 | 
			
		||||
                                               : sv_apt == 2 ? "Success"
 | 
			
		||||
                                                             : "Failed"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 70, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "Romfs: " + std::string(sv_romfs == 0   ? "Not Init"
 | 
			
		||||
                                                 : sv_romfs == 2 ? "Success"
 | 
			
		||||
                                                                 : "Failed"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 90, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "cfgu: " + std::string(sv_cfgu == 0   ? "Not Init"
 | 
			
		||||
                                                : sv_cfgu == 2 ? "Success"
 | 
			
		||||
                                                               : "Failed"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 110, 0.7f, DSEVENBLACK,
 | 
			
		||||
                         "NDSP: " + std::string(sv_dsp == 0   ? "Not Init"
 | 
			
		||||
                                                : sv_dsp == 2 ? "Success"
 | 
			
		||||
                                                              : "Failed"));
 | 
			
		||||
    RenderD7::OnScreen(Bottom);
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 320, 240, RenderD7::Color::Hex("#eeeeee"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, RenderD7::Color::Hex("#111111"),
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                         "Press B to Get back!");
 | 
			
		||||
 | 
			
		||||
  } else if (m_state == RCLOG) {
 | 
			
		||||
@@ -1121,7 +905,8 @@ void RenderD7::RSettings::Draw(void) const {
 | 
			
		||||
                              RENDERD7VSTRING);
 | 
			
		||||
    RenderD7::OnScreen(Bottom);
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 320, 240, RenderD7::Color::Hex("#eeeeee"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, RenderD7::Color::Hex("#111111"),
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 400, 21, RenderD7::Color::Hex("#111111"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                         "Press B to Get back!");
 | 
			
		||||
 | 
			
		||||
  } else if (m_state == RINFO) {
 | 
			
		||||
@@ -1156,10 +941,76 @@ void RenderD7::RSettings::Draw(void) const {
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 320, 240, RenderD7::Color::Hex("#eeeeee"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, RenderD7::Color::Hex("#111111"),
 | 
			
		||||
                         "Press B to Get back!");
 | 
			
		||||
  } else if (m_state == RFTRACE) {
 | 
			
		||||
    RenderD7::OnScreen(Top);
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 400, 21, RenderD7::Color::Hex("#111111"));
 | 
			
		||||
    RenderD7::Draw::Rect(0, 21, 400, 220, RenderD7::Color::Hex("#eeeeee"));
 | 
			
		||||
    RenderD7::Draw::Text(5, 0, 0.7f, DSEVENWHITE, "RenderD7->FTrace");
 | 
			
		||||
    RenderD7::Draw::TextRight(395, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                              RENDERD7VSTRING);
 | 
			
		||||
    RenderD7::Draw::Rect(0, 219, 400, 21, RenderD7::Color::Hex("#111111"));
 | 
			
		||||
    RenderD7::Draw::Text(
 | 
			
		||||
        5, 220, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
        "Traces: " + std::to_string(ftrace_index + 1) + "/" +
 | 
			
		||||
            std::to_string(RenderD7::Ftrace::rd7_traces.size()));
 | 
			
		||||
    RenderD7::Draw::Rect(0, 21, 400, 19, RenderD7::Color::Hex("#aaaaaa"));
 | 
			
		||||
    RenderD7::Draw::Text(10, 19, 0.7f, RenderD7::Color::Hex("#000000"),
 | 
			
		||||
                         "Function:");
 | 
			
		||||
    RenderD7::Draw::TextRight(390, 19, 0.7f, RenderD7::Color::Hex("#000000"),
 | 
			
		||||
                              "Time (ms):");
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < 10; i++) {
 | 
			
		||||
      if ((i % 2 == 0))
 | 
			
		||||
        RenderD7::Draw::Rect(0, 40 + (i)*18, 400, 18,
 | 
			
		||||
                             RenderD7::Color::Hex("#cccccc"));
 | 
			
		||||
      else
 | 
			
		||||
        RenderD7::Draw::Rect(0, 40 + (i)*18, 400, 18,
 | 
			
		||||
                             RenderD7::Color::Hex("#bbbbbb"));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RenderD7::Ftrace::Beg("rd7ft", "display_traces");
 | 
			
		||||
    int start_index = ftrace_index < 9 ? 0 : ftrace_index - 9;
 | 
			
		||||
    auto it = RenderD7::Ftrace::rd7_traces.begin();
 | 
			
		||||
    std::advance(it, start_index);
 | 
			
		||||
    int ix = start_index;
 | 
			
		||||
    std::string _fkey__ = "0";
 | 
			
		||||
 | 
			
		||||
    while (ix < (int)RenderD7::Ftrace::rd7_traces.size() &&
 | 
			
		||||
           ix < start_index + 10 && it != RenderD7::Ftrace::rd7_traces.end()) {
 | 
			
		||||
      if (ix == ftrace_index) {
 | 
			
		||||
        _fkey__ = it->first;
 | 
			
		||||
        RenderD7::Draw::Rect(0, 40 + (ix - start_index) * 18, 400, 18,
 | 
			
		||||
                             RenderD7::Color::Hex("#222222"));
 | 
			
		||||
        RenderD7::Draw::Text(
 | 
			
		||||
            10, 38 + (ix - start_index) * 18, 0.7f,
 | 
			
		||||
            RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
            RenderD7::ShortString(it->second.func_name, 0.7f, 250));
 | 
			
		||||
        RenderD7::Draw::TextRight(390, 38 + (ix - start_index) * 18, 0.7f,
 | 
			
		||||
                                  RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                                  RenderD7::MsTimeFmt(it->second.time_of));
 | 
			
		||||
      } else {
 | 
			
		||||
        RenderD7::Draw::Text(
 | 
			
		||||
            10, 38 + (ix - start_index) * 18, 0.7f,
 | 
			
		||||
            RenderD7::Color::Hex("#000000"),
 | 
			
		||||
            RenderD7::ShortString(it->second.func_name, 0.7f, 250));
 | 
			
		||||
        RenderD7::Draw::TextRight(390, 38 + (ix - start_index) * 18, 0.7f,
 | 
			
		||||
                                  RenderD7::Color::Hex("#000000"),
 | 
			
		||||
                                  RenderD7::MsTimeFmt(it->second.time_of));
 | 
			
		||||
      }
 | 
			
		||||
      ++it;
 | 
			
		||||
      ++ix;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    RenderD7::Ftrace::End("rd7ft", "display_traces");
 | 
			
		||||
 | 
			
		||||
    RenderD7::OnScreen(Bottom);
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 320, 240, RenderD7::Color::Hex("#eeeeee"));
 | 
			
		||||
    RenderD7::Draw::Rect(0, 0, 400, 21, RenderD7::Color::Hex("#111111"));
 | 
			
		||||
    RenderD7::Draw::Text(0, 0, 0.7f, RenderD7::Color::Hex("#ffffff"),
 | 
			
		||||
                         "Press B to Get back!");
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
std::string RenderD7::Kbd(int lenght, SwkbdType tp) {
 | 
			
		||||
  shouldbe_disabled = true;
 | 
			
		||||
  RenderD7::FrameEnd();
 | 
			
		||||
  SwkbdState state;
 | 
			
		||||
  char temp[lenght + 1] = {0};
 | 
			
		||||
@@ -1174,19 +1025,8 @@ std::string RenderD7::Kbd(int lenght, SwkbdType tp) {
 | 
			
		||||
void RenderD7::RSettings::Logic(u32 hDown, u32 hHeld, u32 hUp,
 | 
			
		||||
                                touchPosition touch) {
 | 
			
		||||
  if (m_state == RSETTINGS) {
 | 
			
		||||
    rd7srstate = rd7_superreselution ? "true" : "false";
 | 
			
		||||
    mtovlstate = metrikd ? "true" : "false";
 | 
			
		||||
    fpsstate = cfgstruct["settings"]["forceFrameRate"];
 | 
			
		||||
    mtscreenstate = mt_screen ? "Bottom" : "Top";
 | 
			
		||||
    if (d7_hDown & KEY_TOUCH && RenderD7::touchTObj(d7_touch, buttons[0]) &&
 | 
			
		||||
        !metrikd) {
 | 
			
		||||
      RenderD7::AddOvl(std::make_unique<RenderD7::Toast>(
 | 
			
		||||
          "RenderD7",
 | 
			
		||||
          "RenderD7-Super-Reselution Does not\nWork Correctly yet!"));
 | 
			
		||||
      RenderD7::ToggleRD7SR();
 | 
			
		||||
      cfgstruct["settings"]["super-reselution"] =
 | 
			
		||||
          rd7_superreselution ? "1" : "0";
 | 
			
		||||
    }
 | 
			
		||||
    if (d7_hDown & KEY_TOUCH && RenderD7::touchTObj(d7_touch, buttons[1])) {
 | 
			
		||||
      m_state = RCLOG;
 | 
			
		||||
    }
 | 
			
		||||
@@ -1194,15 +1034,8 @@ void RenderD7::RSettings::Logic(u32 hDown, u32 hHeld, u32 hUp,
 | 
			
		||||
      metrikd = metrikd ? false : true;
 | 
			
		||||
      cfgstruct["metrik-settings"]["enableoverlay"] = metrikd ? "1" : "0";
 | 
			
		||||
    }
 | 
			
		||||
    /*if (d7_hDown & KEY_TOUCH && RenderD7::touchTObj(d7_touch, buttons[3]) &&
 | 
			
		||||
        !metrikd) {
 | 
			
		||||
      cfgstruct["settings"]["forceFrameRate"] = Kbd(2, SWKBD_TYPE_NUMPAD);
 | 
			
		||||
      // C3D_FrameRate(RenderD7::Convert::StringtoFloat(
 | 
			
		||||
      // cfgstruct["settings"]["forceFrameRate"]));
 | 
			
		||||
    }*/
 | 
			
		||||
    if (d7_hDown & KEY_TOUCH && RenderD7::touchTObj(d7_touch, buttons[4])) {
 | 
			
		||||
      mt_screen = mt_screen ? 0 : 1;
 | 
			
		||||
      cfgstruct["metrik-settings"]["screen"] = mt_screen ? "1" : "0";
 | 
			
		||||
      m_state = RFTRACE;
 | 
			
		||||
    }
 | 
			
		||||
    /*if (d7_hDown & KEY_TOUCH && RenderD7::touchTObj(d7_touch, buttons[5])) {
 | 
			
		||||
      RenderD7::AddOvl(std::make_unique<RenderD7::DSP_NF>());
 | 
			
		||||
@@ -1229,6 +1062,19 @@ void RenderD7::RSettings::Logic(u32 hDown, u32 hHeld, u32 hUp,
 | 
			
		||||
      m_state = RSETTINGS;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (m_state == RFTRACE) {
 | 
			
		||||
    if (d7_hDown & KEY_DOWN) {
 | 
			
		||||
      if (ftrace_index < (int)RenderD7::Ftrace::rd7_traces.size() - 1)
 | 
			
		||||
        ftrace_index++;
 | 
			
		||||
    }
 | 
			
		||||
    if (d7_hDown & KEY_UP) {
 | 
			
		||||
      if (ftrace_index > 0)
 | 
			
		||||
        ftrace_index--;
 | 
			
		||||
    }
 | 
			
		||||
    if (d7_hDown & KEY_B) {
 | 
			
		||||
      m_state = RSETTINGS;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  if (m_state == RCLOG) {
 | 
			
		||||
    if (d7_hDown & KEY_B) {
 | 
			
		||||
      m_state = RSETTINGS;
 | 
			
		||||
@@ -1255,7 +1101,11 @@ void RenderD7::LoadSettings() {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::AddOvl(std::unique_ptr<RenderD7::Ovl> overlay) {
 | 
			
		||||
  overlays.push(std::move(overlay));
 | 
			
		||||
  overlays.push_back(std::move(overlay));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::AddToast(std::unique_ptr<RenderD7::Ovl> overlay) {
 | 
			
		||||
  toast_overlays.push_back(std::move(overlay));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::DoNpiIntro() {
 | 
			
		||||
@@ -1269,8 +1119,6 @@ void RenderD7::DoNpiIntro() {
 | 
			
		||||
  stream->ReadNext(nimg);
 | 
			
		||||
  while(true)
 | 
			
		||||
  {
 | 
			
		||||
    shouldbe_disabled = true;
 | 
			
		||||
    cnttttt = 0;
 | 
			
		||||
    C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
    C2D_TargetClear(Top, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
    C2D_TargetClear(Bottom, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
@@ -1291,14 +1139,14 @@ void RenderD7::DoNpiIntro() {
 | 
			
		||||
      break;
 | 
			
		||||
    C3D_FrameEnd(0);
 | 
			
		||||
  }*/
 | 
			
		||||
  RenderD7::Ftrace::Beg("rd7-core", "load_nvid");
 | 
			
		||||
  auto images = LoadMemNVID(npi_intro, npi_intro_size);
 | 
			
		||||
  RenderD7::Ftrace::End("rd7-core", "load_nvid");
 | 
			
		||||
  int c = 0;
 | 
			
		||||
  float xc = 0;
 | 
			
		||||
  RenderD7::Image img;
 | 
			
		||||
  uint64_t lastT = osGetTime();
 | 
			
		||||
  while (c < 59) {
 | 
			
		||||
    shouldbe_disabled = true;
 | 
			
		||||
    cnttttt = 0;
 | 
			
		||||
    C3D_FrameBegin(C3D_FRAME_SYNCDRAW);
 | 
			
		||||
    C2D_TargetClear(Top, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
    C2D_TargetClear(Bottom, RenderD7::Color::Hex("#000000"));
 | 
			
		||||
@@ -1335,4 +1183,21 @@ void RenderD7::FadeIn() {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void RenderD7::FadeDisplay() { Npifade(); }
 | 
			
		||||
void RenderD7::FadeDisplay() { Npifade(); }
 | 
			
		||||
 | 
			
		||||
std::string RenderD7::ShortString(std::string in, float size, int maxlen,
 | 
			
		||||
                                  C2D_Font font) {
 | 
			
		||||
  if (RenderD7::Draw::GetTextWidth(size, in, font) > (float)maxlen) {
 | 
			
		||||
    std::string out;
 | 
			
		||||
    for (size_t i = 0; i < in.size(); i++) {
 | 
			
		||||
      out += in[i];
 | 
			
		||||
      if (RenderD7::Draw::GetTextWidth(size, out, font) +
 | 
			
		||||
              RenderD7::Draw::GetTextWidth(size, "(...)", font) >
 | 
			
		||||
          (float)maxlen) {
 | 
			
		||||
        out += "(...)";
 | 
			
		||||
        return out;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return in;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#Build Tools
 | 
			
		||||
echo "Generate Directorys"
 | 
			
		||||
mkdir -p bin
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
#Delete Tools
 | 
			
		||||
echo "Delete Binary Directory"
 | 
			
		||||
rm -rf bin
 | 
			
		||||
 
 | 
			
		||||
@@ -1,10 +0,0 @@
 | 
			
		||||
// rd7cc
 | 
			
		||||
#include <fstream>
 | 
			
		||||
#include <iostream>
 | 
			
		||||
int main(int argc, char *argv[]) {
 | 
			
		||||
  std::ofstream result("result.hpp");
 | 
			
		||||
 | 
			
		||||
  result << "//Result" << std::endl;
 | 
			
		||||
 | 
			
		||||
  result.close();
 | 
			
		||||
}
 | 
			
		||||