From 0ad2f3da454feca1fc9ba9c3f8592e104028b936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Wed, 16 Dec 2020 15:34:50 +0100 Subject: [PATCH] Core: Remove ImageWrite and get rid of -Wmissing-declarations warnings --- Source/Core/Common/Image.cpp | 25 ++++++++ Source/Core/Common/Image.h | 5 ++ .../Core/VideoBackends/Software/DebugUtil.cpp | 23 ++++---- Source/Core/VideoCommon/AbstractTexture.cpp | 9 +-- Source/Core/VideoCommon/CMakeLists.txt | 2 - Source/Core/VideoCommon/ImageWrite.cpp | 57 ------------------- Source/Core/VideoCommon/ImageWrite.h | 12 ---- Source/Core/VideoCommon/RenderBase.cpp | 15 +++-- Source/Core/VideoCommon/VideoCommon.vcxproj | 4 +- .../VideoCommon/VideoCommon.vcxproj.filters | 8 +-- 10 files changed, 57 insertions(+), 103 deletions(-) delete mode 100644 Source/Core/VideoCommon/ImageWrite.cpp delete mode 100644 Source/Core/VideoCommon/ImageWrite.h diff --git a/Source/Core/Common/Image.cpp b/Source/Core/Common/Image.cpp index 678a64db8c..3fe2f99109 100644 --- a/Source/Core/Common/Image.cpp +++ b/Source/Core/Common/Image.cpp @@ -65,4 +65,29 @@ bool SavePNG(const std::string& path, const u8* input, ImageByteFormat format, u return true; } + +bool ConvertRGBAToRGBAndSavePNG(const std::string& path, const u8* input, u32 width, u32 height, + int stride) +{ + const std::vector data = RGBAToRGB(input, width, height, stride); + return SavePNG(path, data.data(), ImageByteFormat::RGB, width, height); +} + +std::vector RGBAToRGB(const u8* input, u32 width, u32 height, int row_stride) +{ + std::vector buffer; + buffer.reserve(width * height * 3); + + for (u32 y = 0; y < height; ++y) + { + const u8* pos = input + y * row_stride; + for (u32 x = 0; x < width; ++x) + { + buffer.push_back(pos[x * 4]); + buffer.push_back(pos[x * 4 + 1]); + buffer.push_back(pos[x * 4 + 2]); + } + } + return buffer; +} } // namespace Common diff --git a/Source/Core/Common/Image.h b/Source/Core/Common/Image.h index 9ef399138e..271f0b5624 100644 --- a/Source/Core/Common/Image.h +++ b/Source/Core/Common/Image.h @@ -22,4 +22,9 @@ enum class ImageByteFormat bool SavePNG(const std::string& path, const u8* input, ImageByteFormat format, u32 width, u32 height, int stride = 0); +bool ConvertRGBAToRGBAndSavePNG(const std::string& path, const u8* input, u32 width, u32 height, + int stride = 0); + +std::vector RGBAToRGB(const u8* input, u32 width, u32 height, int row_stride = 0); + } // namespace Common diff --git a/Source/Core/VideoBackends/Software/DebugUtil.cpp b/Source/Core/VideoBackends/Software/DebugUtil.cpp index c427160fc7..4c20c08d1a 100644 --- a/Source/Core/VideoBackends/Software/DebugUtil.cpp +++ b/Source/Core/VideoBackends/Software/DebugUtil.cpp @@ -5,18 +5,18 @@ #include "VideoBackends/Software/DebugUtil.h" #include +#include #include "Common/CommonTypes.h" #include "Common/FileUtil.h" +#include "Common/Image.h" #include "Common/StringUtil.h" #include "Common/Swap.h" #include "VideoBackends/Software/EfbInterface.h" -#include "VideoBackends/Software/SWRenderer.h" #include "VideoBackends/Software/TextureSampler.h" #include "VideoCommon/BPMemory.h" -#include "VideoCommon/ImageWrite.h" #include "VideoCommon/Statistics.h" #include "VideoCommon/VideoCommon.h" #include "VideoCommon/VideoConfig.h" @@ -61,12 +61,10 @@ static void SaveTexture(const std::string& filename, u32 texmap, s32 mip) u32 width = ti0.width + 1; u32 height = ti0.height + 1; - u8* data = new u8[width * height * 4]; + auto data = std::make_unique(width * height * 4); - GetTextureRGBA(data, texmap, mip, width, height); - - TextureToPng(data, width * 4, filename, width, height, true); - delete[] data; + GetTextureRGBA(data.get(), texmap, mip, width, height); + Common::SavePNG(filename, data.get(), Common::ImageByteFormat::RGBA, width, height, width * 4); } void GetTextureRGBA(u8* dst, u32 texmap, s32 mip, u32 width, u32 height) @@ -133,8 +131,8 @@ void DumpActiveTextures() static void DumpEfb(const std::string& filename) { - u8* data = new u8[EFB_WIDTH * EFB_HEIGHT * 4]; - u8* writePtr = data; + auto data = std::make_unique(EFB_WIDTH * EFB_HEIGHT * 4); + u8* writePtr = data.get(); for (u32 y = 0; y < EFB_HEIGHT; y++) { @@ -148,8 +146,8 @@ static void DumpEfb(const std::string& filename) } } - TextureToPng(data, EFB_WIDTH * 4, filename, EFB_WIDTH, EFB_HEIGHT, true); - delete[] data; + Common::SavePNG(filename, data.get(), Common::ImageByteFormat::RGBA, EFB_WIDTH, EFB_HEIGHT, + EFB_WIDTH * 4); } void DrawObjectBuffer(s16 x, s16 y, const u8* color, int bufferBase, int subBuffer, @@ -219,7 +217,8 @@ void OnObjectEnd() "%sobject%i_%s(%i).png", File::GetUserPath(D_DUMPOBJECTS_IDX).c_str(), g_stats.this_frame.num_drawn_objects, ObjectBufferName[i], i - BufferBase[i]); - TextureToPng((u8*)ObjectBuffer[i], EFB_WIDTH * 4, filename, EFB_WIDTH, EFB_HEIGHT, true); + Common::SavePNG(filename, reinterpret_cast(ObjectBuffer[i]), + Common::ImageByteFormat::RGBA, EFB_WIDTH, EFB_HEIGHT, EFB_WIDTH * 4); memset(ObjectBuffer[i], 0, EFB_WIDTH * EFB_HEIGHT * sizeof(u32)); } } diff --git a/Source/Core/VideoCommon/AbstractTexture.cpp b/Source/Core/VideoCommon/AbstractTexture.cpp index 8e2dc39d76..9b26d55ff8 100644 --- a/Source/Core/VideoCommon/AbstractTexture.cpp +++ b/Source/Core/VideoCommon/AbstractTexture.cpp @@ -5,10 +5,10 @@ #include #include "Common/Assert.h" +#include "Common/Image.h" #include "Common/MsgHandler.h" #include "VideoCommon/AbstractStagingTexture.h" #include "VideoCommon/AbstractTexture.h" -#include "VideoCommon/ImageWrite.h" #include "VideoCommon/RenderBase.h" AbstractTexture::AbstractTexture(const TextureConfig& c) : m_config(c) @@ -48,9 +48,10 @@ bool AbstractTexture::Save(const std::string& filename, unsigned int level) if (!readback_texture->Map()) return false; - return TextureToPng(reinterpret_cast(readback_texture->GetMappedPointer()), - static_cast(readback_texture->GetMappedStride()), filename, level_width, - level_height); + return Common::SavePNG(filename, + reinterpret_cast(readback_texture->GetMappedPointer()), + Common::ImageByteFormat::RGBA, level_width, level_height, + static_cast(readback_texture->GetMappedStride())); } bool AbstractTexture::IsCompressedFormat(AbstractTextureFormat format) diff --git a/Source/Core/VideoCommon/CMakeLists.txt b/Source/Core/VideoCommon/CMakeLists.txt index 8e957f4a8d..2470c5ee4d 100644 --- a/Source/Core/VideoCommon/CMakeLists.txt +++ b/Source/Core/VideoCommon/CMakeLists.txt @@ -42,8 +42,6 @@ add_library(videocommon HiresTextures.cpp HiresTextures.h HiresTextures_DDSLoader.cpp - ImageWrite.cpp - ImageWrite.h IndexGenerator.cpp IndexGenerator.h LightingShaderGen.cpp diff --git a/Source/Core/VideoCommon/ImageWrite.cpp b/Source/Core/VideoCommon/ImageWrite.cpp deleted file mode 100644 index d2dcbc9dc5..0000000000 --- a/Source/Core/VideoCommon/ImageWrite.cpp +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#include -#include -#include - -#include "Common/CommonTypes.h" -#include "Common/File.h" -#include "Common/FileUtil.h" -#include "Common/Image.h" - -bool SaveData(const std::string& filename, const std::string& data) -{ - std::ofstream f; - File::OpenFStream(f, filename, std::ios::binary); - f << data; - - return true; -} - -/* -TextureToPng - -Inputs: -data : This is an array of RGBA with 8 bits per channel. 4 bytes for each pixel. -row_stride: Determines the amount of bytes per row of pixels. -*/ -bool TextureToPng(const u8* data, int row_stride, const std::string& filename, int width, - int height, bool save_alpha) -{ - if (!data) - return false; - - if (save_alpha) - { - return Common::SavePNG(filename, data, Common::ImageByteFormat::RGBA, width, height, - row_stride); - } - - std::vector buffer; - buffer.reserve(width * height * 3); - - for (int y = 0; y < height; ++y) - { - const u8* pos = data + y * row_stride; - for (int x = 0; x < width; ++x) - { - buffer.push_back(pos[x * 4]); - buffer.push_back(pos[x * 4 + 1]); - buffer.push_back(pos[x * 4 + 2]); - } - } - - return Common::SavePNG(filename, buffer.data(), Common::ImageByteFormat::RGB, width, height); -} diff --git a/Source/Core/VideoCommon/ImageWrite.h b/Source/Core/VideoCommon/ImageWrite.h deleted file mode 100644 index 46ce760e16..0000000000 --- a/Source/Core/VideoCommon/ImageWrite.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2008 Dolphin Emulator Project -// Licensed under GPLv2+ -// Refer to the license.txt file included. - -#pragma once - -#include -#include "Common/CommonTypes.h" - -bool SaveData(const std::string& filename, const std::string& data); -bool TextureToPng(const u8* data, int row_stride, const std::string& filename, int width, - int height, bool save_alpha = true); diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp index 94379909ec..02deb3a8b1 100644 --- a/Source/Core/VideoCommon/RenderBase.cpp +++ b/Source/Core/VideoCommon/RenderBase.cpp @@ -29,9 +29,9 @@ #include "Common/ChunkFile.h" #include "Common/CommonTypes.h" #include "Common/Config/Config.h" -#include "Common/Event.h" #include "Common/FileUtil.h" #include "Common/Flag.h" +#include "Common/Image.h" #include "Common/Logging/Log.h" #include "Common/MsgHandler.h" #include "Common/Profiler.h" @@ -64,7 +64,6 @@ #include "VideoCommon/FramebufferManager.h" #include "VideoCommon/FramebufferShaderGen.h" #include "VideoCommon/FreeLookCamera.h" -#include "VideoCommon/ImageWrite.h" #include "VideoCommon/NetPlayChatUI.h" #include "VideoCommon/NetPlayGolfUI.h" #include "VideoCommon/OnScreenDisplay.h" @@ -92,6 +91,12 @@ static float AspectToWidescreen(float aspect) return aspect * ((16.0f / 9.0f) / (4.0f / 3.0f)); } +static bool DumpFrameToPNG(const FrameDump::FrameData& frame, const std::string& file_name) +{ + return Common::ConvertRGBAToRGBAndSavePNG(file_name, frame.data, frame.width, frame.height, + frame.stride); +} + Renderer::Renderer(int backbuffer_width, int backbuffer_height, float backbuffer_scale, AbstractTextureFormat backbuffer_format) : m_backbuffer_width(backbuffer_width), m_backbuffer_height(backbuffer_height), @@ -1572,8 +1577,7 @@ void Renderer::FrameDumpThreadFunc() { std::lock_guard lk(m_screenshot_lock); - if (TextureToPng(frame.data, frame.stride, m_screenshot_name, frame.width, frame.height, - false)) + if (DumpFrameToPNG(frame, m_screenshot_name)) OSD::AddMessage("Screenshot saved to " + m_screenshot_name); // Reset settings @@ -1681,8 +1685,7 @@ bool Renderer::StartFrameDumpToImage(const FrameDump::FrameData&) void Renderer::DumpFrameToImage(const FrameDump::FrameData& frame) { - std::string filename = GetFrameDumpNextImageFileName(); - TextureToPng(frame.data, frame.stride, filename, frame.width, frame.height, false); + DumpFrameToPNG(frame, GetFrameDumpNextImageFileName()); m_frame_dump_image_counter++; } diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj b/Source/Core/VideoCommon/VideoCommon.vcxproj index bd144ae0f6..ecfc6b2def 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj @@ -48,7 +48,6 @@ - @@ -132,7 +131,6 @@ - @@ -201,4 +199,4 @@ - \ No newline at end of file + diff --git a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters index 1535249e06..96d76b5646 100644 --- a/Source/Core/VideoCommon/VideoCommon.vcxproj.filters +++ b/Source/Core/VideoCommon/VideoCommon.vcxproj.filters @@ -95,9 +95,6 @@ Util - - Util - Util @@ -290,9 +287,6 @@ Util - - Util - Util @@ -411,4 +405,4 @@ - \ No newline at end of file +