From af5daa4717202145cdd9767575067687dcfb060c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 25 Oct 2025 00:56:05 -0300 Subject: [PATCH] Add Image::diff. Fixed inavalid memory access due to double free in FontBMP and FontSprite. Added FontRendering unit-tests. --- .github/workflows/eepp-linux-build-check.yml | 4 +- .github/workflows/eepp-macos-build-check.yml | 8 +- .../workflows/eepp-windows-build-check.yml | 14 + .../assets/fontrendering/eepp-fonts.webp | Bin 0 -> 91852 bytes include/eepp/graphics/image.hpp | 38 ++- include/eepp/window/window.hpp | 6 + src/eepp/graphics/fontbmfont.cpp | 5 - src/eepp/graphics/fontsprite.cpp | 5 - src/eepp/graphics/image.cpp | 250 ++++++++++++++++++ src/eepp/window/window.cpp | 80 ++++-- src/tests/unit_tests/fontrendering.cpp | 149 +++++++++++ 11 files changed, 517 insertions(+), 42 deletions(-) create mode 100644 bin/unit_tests/assets/fontrendering/eepp-fonts.webp create mode 100644 src/tests/unit_tests/fontrendering.cpp diff --git a/.github/workflows/eepp-linux-build-check.yml b/.github/workflows/eepp-linux-build-check.yml index 10d2d7dcd..87a0ac5fe 100644 --- a/.github/workflows/eepp-linux-build-check.yml +++ b/.github/workflows/eepp-linux-build-check.yml @@ -19,7 +19,7 @@ jobs: sudo add-apt-repository -y universe sudo add-apt-repository -y multiverse sudo apt update - sudo apt install -y gcc-12 g++-12 wget libsdl2-2.0-0 libsdl2-dev + sudo apt install -y gcc-12 g++-12 wget libsdl2-2.0-0 libsdl2-dev mesa-utils xvfb sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 10 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 10 sudo update-alternatives --install /usr/bin/cc cc /usr/bin/gcc 30 @@ -38,4 +38,4 @@ jobs: - name: Unit Tests run: | cd bin/unit_tests - ./eepp-unit_tests + xvfb-run ./eepp-unit_tests diff --git a/.github/workflows/eepp-macos-build-check.yml b/.github/workflows/eepp-macos-build-check.yml index 3e31adb00..462662a8e 100644 --- a/.github/workflows/eepp-macos-build-check.yml +++ b/.github/workflows/eepp-macos-build-check.yml @@ -16,7 +16,7 @@ jobs: git submodule update --init --recursive - name: Install dependencies run: | - brew install wget SDL2 premake + brew install wget SDL2 premake mesa - name: Build run: | premake5 --with-text-shaper --disable-static-build gmake @@ -24,5 +24,9 @@ jobs: - name: Unit Tests run: | cd bin/unit_tests + export LIBGL_ALWAYS_SOFTWARE=1 + export GALLIUM_DRIVER=llvmpipe + export SDL_VIDEODRIVER=cocoa ./eepp-unit_tests - + env: + DYLD_LIBRARY_PATH: /opt/homebrew/lib # Ensures Mesa's libGL is used diff --git a/.github/workflows/eepp-windows-build-check.yml b/.github/workflows/eepp-windows-build-check.yml index 861a160bc..02b8491ff 100644 --- a/.github/workflows/eepp-windows-build-check.yml +++ b/.github/workflows/eepp-windows-build-check.yml @@ -33,7 +33,21 @@ jobs: shell: cmd run: | "%MSBUILD_PATH%\MSBuild.exe" .\make\windows\eepp.sln -m /p:Platform="x64" /p:Configuration="release" + - name: Download Mesa3D for Windows + run: | + Invoke-WebRequest -Uri "https://github.com/pal1000/mesa-dist-win/releases/download/25.2.4/mesa3d-25.2.4-release-msvc.7z" -OutFile "mesa.7z" + 7z x mesa.7z -o"C:\mesa" + shell: powershell + - name: Set up Mesa DLLs + run: | + copy C:\mesa\x64\opengl32.dll . + copy C:\mesa\x64\libglapi.dll . + # Add Mesa to PATH for dependencies + set PATH=C:\mesa\x64;%PATH% + shell: cmd - name: Unit Tests shell: cmd run: | + set LIBGL_ALWAYS_SOFTWARE=1 + set GALLIUM_DRIVER=llvmpipe bin\unit_tests\eepp-unit_tests.exe diff --git a/bin/unit_tests/assets/fontrendering/eepp-fonts.webp b/bin/unit_tests/assets/fontrendering/eepp-fonts.webp new file mode 100644 index 0000000000000000000000000000000000000000..53c543eeb810ead1fe49d2fc132a2d62fc621de2 GIT binary patch literal 91852 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 texture->getTextureId() ); - mPages.clear(); mFontSize = 0; mFilePath = ""; diff --git a/src/eepp/graphics/fontsprite.cpp b/src/eepp/graphics/fontsprite.cpp index 987005b25..fcd51031e 100644 --- a/src/eepp/graphics/fontsprite.cpp +++ b/src/eepp/graphics/fontsprite.cpp @@ -26,11 +26,6 @@ FontSprite::FontSprite( const std::string FontName ) : void FontSprite::cleanup() { sendEvent( Event::Unload ); - Texture* texture = mPages[mFontSize].texture; - - if ( NULL != texture && TextureFactory::existsSingleton() ) - TextureFactory::instance()->remove( texture->getTextureId() ); - mPages.clear(); mFontSize = 0; mFilePath = ""; diff --git a/src/eepp/graphics/image.cpp b/src/eepp/graphics/image.cpp index 6bdbd4edc..43e1d485c 100644 --- a/src/eepp/graphics/image.cpp +++ b/src/eepp/graphics/image.cpp @@ -27,6 +27,129 @@ namespace EE { namespace Graphics { +// Helper structs for color spaces +struct XYZ { + double x, y, z; +}; + +struct Lab { + double l, a, b; +}; + +// sRGB to Linear RGB conversion +static constexpr double srgbToLinear( double c ) { + return ( c > 0.04045 ) ? pow( ( c + 0.055 ) / 1.055, 2.4 ) : ( c / 12.92 ); +} + +// RGB to XYZ conversion (D65 illuminant) +static constexpr XYZ rgbToXyz( const Color& c ) { + double r = srgbToLinear( c.r / 255.0 ); + double g = srgbToLinear( c.g / 255.0 ); + double b = srgbToLinear( c.b / 255.0 ); + return { + .x = r * 0.4124564 + g * 0.3575761 + b * 0.1804375, + .y = r * 0.2126729 + g * 0.7151522 + b * 0.0721750, + .z = r * 0.0193339 + g * 0.1191920 + b * 0.9503041, + }; +} + +// XYZ to CIELAB conversion (D65 illuminant) +static constexpr Lab xyzToLab( const XYZ& xyz ) { + auto f = []( double t ) { return ( t > 0.008856 ) ? cbrt( t ) : ( 7.787 * t + 16.0 / 116.0 ); }; + // Reference white point for D65 + constexpr double ref_x = 0.95047; + constexpr double ref_y = 1.00000; + constexpr double ref_z = 1.08883; + + double fx = f( xyz.x / ref_x ); + double fy = f( xyz.y / ref_y ); + double fz = f( xyz.z / ref_z ); + + return { + .l = 116.0 * fy - 16.0, + .a = 500.0 * ( fx - fy ), + .b = 200.0 * ( fy - fz ), + }; +} + +// Calculate CIEDE2000 Delta E between two Lab colors +static constexpr double deltaECIEDE2000( const Lab& lab1, const Lab& lab2 ) { + double l1 = lab1.l, a1 = lab1.a, b1 = lab1.b; + double l2 = lab2.l, a2 = lab2.a, b2 = lab2.b; + + // Constants + constexpr double kL = 1.0, kC = 1.0, kH = 1.0; + constexpr double pi = 3.14159265358979323846; + + double c1 = sqrt( a1 * a1 + b1 * b1 ); + double c2 = sqrt( a2 * a2 + b2 * b2 ); + double c_bar = ( c1 + c2 ) / 2.0; + double c_bar7 = pow( c_bar, 7 ); + double g = 0.5 * ( 1.0 - sqrt( c_bar7 / ( c_bar7 + 6103515625.0 ) ) ); // 25^7 + + double a1_prime = a1 * ( 1.0 + g ); + double a2_prime = a2 * ( 1.0 + g ); + + double c1_prime = sqrt( a1_prime * a1_prime + b1 * b1 ); + double c2_prime = sqrt( a2_prime * a2_prime + b2 * b2 ); + + double h1_prime = ( a1_prime == 0 && b1 == 0 ) ? 0 : atan2( b1, a1_prime ); + if ( h1_prime < 0 ) + h1_prime += 2 * pi; + double h2_prime = ( a2_prime == 0 && b2 == 0 ) ? 0 : atan2( b2, a2_prime ); + if ( h2_prime < 0 ) + h2_prime += 2 * pi; + + double delta_l_prime = l2 - l1; + double delta_c_prime = c2_prime - c1_prime; + + double delta_h_prime; + double h_diff = h2_prime - h1_prime; + if ( c1_prime * c2_prime == 0 ) { + delta_h_prime = 0; + } else if ( fabs( h_diff ) <= pi ) { + delta_h_prime = h_diff; + } else if ( h_diff > pi ) { + delta_h_prime = h_diff - 2 * pi; + } else { + delta_h_prime = h_diff + 2 * pi; + } + delta_h_prime = 2.0 * sqrt( c1_prime * c2_prime ) * sin( delta_h_prime / 2.0 ); + + double l_bar_prime = ( l1 + l2 ) / 2.0; + double c_bar_prime = ( c1_prime + c2_prime ) / 2.0; + double h_bar_prime; + if ( c1_prime * c2_prime == 0 ) { + h_bar_prime = h1_prime + h2_prime; + } else if ( fabs( h1_prime - h2_prime ) <= pi ) { + h_bar_prime = ( h1_prime + h2_prime ) / 2.0; + } else if ( ( h1_prime + h2_prime ) < 2 * pi ) { + h_bar_prime = ( h1_prime + h2_prime + 2 * pi ) / 2.0; + } else { + h_bar_prime = ( h1_prime + h2_prime - 2 * pi ) / 2.0; + } + + double t = 1.0 - 0.17 * cos( h_bar_prime - pi / 6.0 ) + 0.24 * cos( 2.0 * h_bar_prime ) + + 0.32 * cos( 3.0 * h_bar_prime + pi / 30.0 ) - + 0.20 * cos( 4.0 * h_bar_prime - 63.0 * pi / 180.0 ); + + double s_l = 1.0 + ( 0.015 * pow( l_bar_prime - 50.0, 2 ) ) / + sqrt( 20.0 + pow( l_bar_prime - 50.0, 2 ) ); + double s_c = 1.0 + 0.045 * c_bar_prime; + double s_h = 1.0 + 0.015 * c_bar_prime * t; + + double delta_theta = + ( 30.0 * pi / 180.0 ) * exp( -pow( ( h_bar_prime * 180.0 / pi - 275.0 ) / 25.0, 2 ) ); + double r_c = 2.0 * sqrt( pow( c_bar_prime, 7 ) / ( pow( c_bar_prime, 7 ) + 6103515625.0 ) ); + double r_t = -r_c * sin( 2.0 * delta_theta ); + + double term_l = delta_l_prime / ( kL * s_l ); + double term_c = delta_c_prime / ( kC * s_c ); + double term_h = delta_h_prime / ( kH * s_h ); + + return sqrt( term_l * term_l + term_c * term_c + term_h * term_h + r_t * term_c * term_h ); +} + static const char* get_resampler_name( Image::ResamplerFilter filter ) { switch ( filter ) { case Image::ResamplerFilter::RESAMPLER_BOX: @@ -736,6 +859,57 @@ Image::Image( IOStream& stream, const unsigned int& forceChannels, } } +Image::Image( const Image& other ) : + mPixels( nullptr ), + mWidth( 0 ), + mHeight( 0 ), + mChannels( 0 ), + mSize( 0 ), + mAvoidFree( false ), + mLoadedFromStbi( false ) { + *this = other; // Delegate to copy assignment operator +} + +Image::Image( Image&& other ) noexcept : + mPixels( other.mPixels ), + mWidth( other.mWidth ), + mHeight( other.mHeight ), + mChannels( other.mChannels ), + mSize( other.mSize ), + mAvoidFree( other.mAvoidFree ), + mLoadedFromStbi( other.mLoadedFromStbi ), + mFormatConfiguration( std::move( other.mFormatConfiguration ) ) { + other.mPixels = nullptr; + other.mWidth = 0; + other.mHeight = 0; + other.mChannels = 0; + other.mSize = 0; +} + +Image& Image::operator=( Image&& other ) noexcept { + if ( this != &other ) { + if ( !mAvoidFree ) { + clearCache(); + } + + mPixels = other.mPixels; + mWidth = other.mWidth; + mHeight = other.mHeight; + mChannels = other.mChannels; + mSize = other.mSize; + mAvoidFree = other.mAvoidFree; + mLoadedFromStbi = other.mLoadedFromStbi; + mFormatConfiguration = std::move( other.mFormatConfiguration ); + + other.mPixels = nullptr; + other.mWidth = 0; + other.mHeight = 0; + other.mChannels = 0; + other.mSize = 0; + } + return *this; +} + Image::~Image() { if ( !mAvoidFree ) clearCache(); @@ -1264,6 +1438,9 @@ Graphics::Image* Image::copy() { } Graphics::Image& Image::operator=( const Image& right ) { + if (this == &right) + return *this; + mWidth = right.mWidth; mHeight = right.mHeight; mChannels = right.mChannels; @@ -1333,4 +1510,77 @@ std::pair, int> Image::loadGif( IOStream& stream ) { return { std::move( gif ), delay ? delay : 100 }; } +Image::DiffResult Image::diff( const Image& other, float threshold, const Color& diffColor ) const { + DiffResult result; + + if ( getWidth() != other.getWidth() || getHeight() != other.getHeight() ) { + Log::error( "Image::diff: Image dimensions do not match." ); + result.numDifferentPixels = getWidth() * getHeight(); + return result; + } + + if ( getChannels() < 3 || other.getChannels() < 3 ) { + Log::warning( "Image::diff: Perceptual diff requires at least 3 color channels. " + "Falling back to simple comparison." ); + return result; + } + + // Create a 4-channel RGBA image for the diff output + result.diffImage = Image::New( getWidth(), getHeight(), 4 ); + if ( !result.diffImage ) { + Log::error( "Image::diff: Failed to create diff image." ); + return result; + } + + const Uint8* p1 = this->getPixelsPtr(); + const Uint8* p2 = other.getPixelsPtr(); + Uint8* pDiff = result.diffImage->getPixels(); + + unsigned int channels1 = this->getChannels(); + unsigned int channels2 = other.getChannels(); + unsigned int channelsDiff = result.diffImage->getChannels(); + + for ( unsigned int y = 0; y < getHeight(); ++y ) { + for ( unsigned int x = 0; x < getWidth(); ++x ) { + size_t offset1 = ( y * getWidth() + x ) * channels1; + size_t offset2 = ( y * getWidth() + x ) * channels2; + size_t offsetDiff = ( y * getWidth() + x ) * channelsDiff; + + Color c1( p1[offset1], p1[offset1 + 1], p1[offset1 + 2], + channels1 == 4 ? p1[offset1 + 3] : 255 ); + Color c2( p2[offset2], p2[offset2 + 1], p2[offset2 + 2], + channels2 == 4 ? p2[offset2 + 3] : 255 ); + + // Also compare alpha channels directly, as perceptual diff is for color only + bool alphaDiffers = ( c1.a != c2.a ); + + Lab lab1 = xyzToLab( rgbToXyz( c1 ) ); + Lab lab2 = xyzToLab( rgbToXyz( c2 ) ); + double delta = deltaECIEDE2000( lab1, lab2 ); + + if ( delta > result.maxDeltaE ) { + result.maxDeltaE = delta; + } + + if ( delta > threshold || alphaDiffers ) { + result.numDifferentPixels++; + pDiff[offsetDiff] = diffColor.r; + pDiff[offsetDiff + 1] = diffColor.g; + pDiff[offsetDiff + 2] = diffColor.b; + pDiff[offsetDiff + 3] = diffColor.a; + } else { + // Blend original pixel with a transparent gray to fade it out + // This makes the highlighted differences stand out more. + Uint8 avg = ( c1.r + c1.g + c1.b ) / 3; + pDiff[offsetDiff] = avg; + pDiff[offsetDiff + 1] = avg; + pDiff[offsetDiff + 2] = avg; + pDiff[offsetDiff + 3] = 128; // Semi-transparent + } + } + } + + return result; +} + }} // namespace EE::Graphics diff --git a/src/eepp/window/window.cpp b/src/eepp/window/window.cpp index 2db1582cb..ce71cfd4c 100644 --- a/src/eepp/window/window.cpp +++ b/src/eepp/window/window.cpp @@ -252,56 +252,86 @@ RGB Window::getClearColor() const { return mWindow.ClearColor; } -bool Window::takeScreenshot( std::string filepath, const Image::SaveType& Format ) { +bool Window::takeScreenshot( std::string filepath, const Image::SaveType& format ) { GlobalBatchRenderer::instance()->draw(); - bool CreateNewFile = false; - std::string File, Ext; + bool createNewFile = false; + std::string file; + std::string ext; if ( filepath.size() ) { - File = filepath.substr( filepath.find_last_of( "/\\" ) + 1 ); - Ext = File.substr( File.find_last_of( "." ) + 1 ); - - if ( FileSystem::isDirectory( filepath ) || !Ext.size() ) - CreateNewFile = true; + file = filepath.substr( filepath.find_last_of( "/\\" ) + 1 ); + ext = file.substr( file.find_last_of( "." ) + 1 ); + if ( FileSystem::isDirectory( filepath ) || !ext.size() ) + createNewFile = true; } else { filepath = Sys::getProcessPath(); - CreateNewFile = true; + createNewFile = true; } - if ( CreateNewFile ) { // Search if file path is given, and if have and extension + std::string finalPath; + + if ( createNewFile ) { // Search if file path is given, and if have and extension bool find = false; - Int32 FileNum = 1; - std::string TmpPath = filepath; + int fileNum = 1; + std::string tmpPath = filepath; if ( !FileSystem::isDirectory( filepath ) ) FileSystem::makeDir( filepath ); - Ext = "." + Image::saveTypeToExtension( Format ); + ext = "." + Image::saveTypeToExtension( format ); - while ( !find && FileNum < 10000 ) { - TmpPath = String::format( "%s%05d%s", filepath.c_str(), FileNum, Ext.c_str() ); + while ( !find && fileNum < 10000 ) { + tmpPath = String::format( "%s%05d%s", filepath.c_str(), fileNum, ext.c_str() ); + fileNum++; - FileNum++; - - if ( !FileSystem::fileExists( TmpPath ) ) + if ( !FileSystem::fileExists( tmpPath ) ) find = true; - if ( FileNum == 10000 && find == false ) + if ( fileNum == 10000 && find == false ) return false; } - return 0 != SOIL_save_screenshot( TmpPath.c_str(), (int)Format, 0, 0, - mWindow.WindowConfig.Width, mWindow.WindowConfig.Height ); + finalPath = std::move( tmpPath ); } else { std::string Direc = FileSystem::fileRemoveFileName( filepath ); - if ( !FileSystem::isDirectory( Direc ) ) FileSystem::makeDir( Direc ); - - return 0 != SOIL_save_screenshot( filepath.c_str(), (int)Format, 0, 0, - mWindow.WindowConfig.Width, mWindow.WindowConfig.Height ); + finalPath = filepath; } + + return getFrontBufferImage().saveToFile( finalPath, format ); +} + +Image Window::getFrontBufferImage() { + GlobalBatchRenderer::instance()->draw(); + Image fb( mWindow.WindowConfig.Width, mWindow.WindowConfig.Height, 3 ); + + GLint pack_alignment; + glGetIntegerv( GL_PACK_ALIGNMENT, &pack_alignment ); + if ( 1 != pack_alignment ) + glPixelStorei( GL_PACK_ALIGNMENT, 1 ); + + Uint8* pixelData = fb.getPixels(); + glReadPixels( 0, 0, mWindow.WindowConfig.Width, mWindow.WindowConfig.Height, GL_RGB, + GL_UNSIGNED_BYTE, pixelData ); + + if ( 1 != pack_alignment ) + glPixelStorei( GL_PACK_ALIGNMENT, pack_alignment ); + + for ( unsigned int j = 0; j * 2 < fb.getHeight(); ++j ) { + int index1 = j * fb.getWidth() * fb.getChannels(); + int index2 = ( fb.getHeight() - 1 - j ) * fb.getWidth() * fb.getChannels(); + for ( int i = fb.getWidth() * fb.getChannels(); i > 0; --i ) { + Uint8 temp = pixelData[index1]; + pixelData[index1] = pixelData[index2]; + pixelData[index2] = temp; + ++index1; + ++index2; + } + } + + return fb; } bool Window::isRunning() const { diff --git a/src/tests/unit_tests/fontrendering.cpp b/src/tests/unit_tests/fontrendering.cpp new file mode 100644 index 000000000..0cd627f53 --- /dev/null +++ b/src/tests/unit_tests/fontrendering.cpp @@ -0,0 +1,149 @@ +#include "utest.h" +#include +#include + +using namespace EE::System; + +UTEST( FontRendering, fontsTest ) { + FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); + + auto win = Engine::instance()->createWindow( WindowSettings( 1220, 850, "eepp - Fonts" ) ); + + if ( !win->isOpen() ) { + std::cout << "OpenGL context not available, skipping" << std::endl; + return; + } + + // This will never trigger for the moment + ASSERT_TRUE_MSG( win->isOpen(), "Failed to create Window" ); + + win->setClearColor( RGB( 230, 230, 230 ) ); + + String Txt( "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod " + "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, " + "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo " + "consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse " + "cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non " + "proident, sunt in culpa qui officia deserunt mollit anim id est laborum." ); + + FontTrueType* fontTest = FontTrueType::New( "DejaVuSansMono" ); + fontTest->loadFromFile( "../assets/fonts/DejaVuSansMono.ttf" ); + + FontTrueType* fontTest2 = FontTrueType::New( "NotoSans-Regular" ); + fontTest2->loadFromFile( "../assets/fonts/NotoSans-Regular.ttf" ); + + FontTrueType* fontEmoji = FontTrueType::New( "NotoEmoji-Regular" ); + fontEmoji->loadFromFile( "../assets/fonts/NotoEmoji-Regular.ttf" ); + + FontTrueType* fontEmojiColor = FontTrueType::New( "NotoColorEmoji" ); + fontEmojiColor->loadFromFile( "../assets/fonts/NotoColorEmoji.ttf" ); + + FontBMFont* fontBMFont = FontBMFont::New( "bmfont" ); + fontBMFont->loadFromFile( "../assets/fonts/bmfont.fnt" ); + + FontSprite* fontSprite = FontSprite::New( "alagard" ); + fontSprite->loadFromFile( "../assets/fonts/custom_alagard.png", Color::Fuchsia, 32, -4 ); + + Text text; + text.setFont( fontTest ); + text.setFontSize( 24 ); + text.setAlign( TEXT_ALIGN_CENTER ); + text.setString( Txt ); + text.wrapText( win->getWidth() - 96 ); + + int size = (int)Txt.size(); + + for ( int i = 0; i < size; i++ ) { + text.setFillColor( Color( 255 * i / size, 0, 0, 255 ), i, i + 1 ); + } + + Text text2; + text2.setFont( fontTest2 ); + text2.setString( "Lorem ipsum dolor sit amet, consectetur adipisicing elit. 👽" ); + text2.setFontSize( 32 ); + text2.setFillColor( Color::Black ); + + Text text3; + text3.setFont( fontTest ); + text3.setString( text2.getString() ); + text3.setFontSize( 24 ); + text3.setFillColor( Color( 255, 255, 255, 255 ) ); + text3.setOutlineThickness( 2 ); + text3.setOutlineColor( Color( 0, 0, 0, 255 ) ); + + Text text4; + text4.setFont( fontBMFont ); + text4.setString( text2.getString() ); + text4.setFontSize( 45 ); + text4.setFillColor( Color::Black ); + + Text text5; + text5.setFont( fontSprite ); + text5.setString( text2.getString() ); + text5.setFontSize( 38 ); + + Text text6; + text6.setFont( fontEmojiColor ); + text6.setFontSize( 64 ); + text6.setString( "👽 😀 💩 😃 👻" ); + + Text text7; + text7.setFont( fontEmoji ); + text7.setFontSize( 32 ); + text7.setString( "👽 😀 💩 😃 👻" ); + text7.setFillColor( Color::Gray ); + text7.setOutlineThickness( 2 ); + text7.setOutlineColor( Color( 0, 0, 0, 255 ) ); + + win->clear(); + text.draw( std::floor( ( win->getWidth() - text.getTextWidth() ) * 0.5f ), 32 ); + text2.draw( std::floor( ( win->getWidth() - text2.getTextWidth() ) * 0.5f ), 300 ); + text7.draw( std::floor( ( win->getWidth() - text7.getTextWidth() ) * 0.5f ), 400 ); + text2.draw( std::floor( ( win->getWidth() - text2.getTextWidth() ) * 0.5f ), 430, + Vector2f( 1.1f, 1.1f ), 12.5f ); + text3.draw( std::floor( ( win->getWidth() - text3.getTextWidth() ) * 0.5f ), 560 ); + text4.draw( std::floor( ( win->getWidth() - text4.getTextWidth() ) * 0.5f ), 590 ); + text5.draw( std::floor( ( win->getWidth() - text5.getTextWidth() ) * 0.5f ), 640 ); + text6.draw( std::floor( ( win->getWidth() - text6.getTextWidth() ) * 0.5f ), 690 ); + + { + Image::FormatConfiguration fconf; + fconf.webpSaveLossless( true ); + Image actualImage = win->getFrontBufferImage(); + actualImage.setImageFormatConfiguration( fconf ); + auto saveType = Image::SaveType::WEBP; + auto saveExt( Image::saveTypeToExtension( saveType ) ); + std::string expectedImagePath( "assets/fontrendering/eepp-fonts." + saveExt ); + + if ( !FileSystem::fileExists( expectedImagePath ) ) + actualImage.saveToFile( expectedImagePath, saveType ); + + Image expectedImage( expectedImagePath ); + + ASSERT_TRUE( expectedImage.getPixelsPtr() != nullptr ); + + Image::DiffResult result = actualImage.diff( expectedImage ); + + EXPECT_TRUE( result.areSame() ); + + if ( !result.areSame() ) { + std::cerr << "Test FAILED: " << result.numDifferentPixels << " pixels differ." + << std::endl; + std::cerr << "Maximum perceptual difference (Delta E): " << result.maxDeltaE + << std::endl; + if ( result.diffImage ) { + std::string actualImagePath = + Sys::getTempPath() + "eepp-fonts_actual_output." + saveExt; + std::string diffImagePath = + Sys::getTempPath() + "eepp-fonts_diff_output." + saveExt; + result.diffImage->setImageFormatConfiguration( fconf ); + result.diffImage->saveToFile( diffImagePath, saveType ); + actualImage.saveToFile( actualImagePath, saveType ); + std::cerr << "Visual diff saved to: " << diffImagePath << std::endl; + std::cerr << "Actual image saved to: " << actualImagePath << std::endl; + } + } + } + + Engine::destroySingleton(); +}