Files
Yajbir Singh f1b860b25c
Some checks failed
check / markdownlint (push) Has been cancelled
check / spellchecker (push) Has been cancelled
updated
2025-12-11 19:03:17 +05:30

198 lines
6.1 KiB
C++

#include <algorithm>
#include <iostream>
#include <string>
#include "../../../DesktopEditor/graphics/pro/Fonts.h"
#include "../../../DesktopEditor/graphics/pro/Graphics.h"
#include "../../../DesktopEditor/fontengine/ApplicationFontsWorker.h"
#include "../../../DesktopEditor/common/Directory.h"
#define METAFILE_SUCCESSFUL_CONVERSION 0
#define METAFILE_UNSUCCESSFUL_CONVERSION -1
#define METAFILE_INVALID_NUMBERS_ARGUMENTS -3
#define METAFILE_FILE_NOT_FOUND -4
#define METAFILE_INVALID_VALUE_ARGUMENT -5
#define METAFILE_INVALID_FORMAT_FILE -6
#define METAFILE_OPENNING_ERROR -7
#define METAFILE_FAILED_CREATE_FILE -8
__ENUM_CXIMAGE_FORMATS IdentifyFileFormat(const std::wstring& wsFilePath)
{
std::wstring::const_reverse_iterator itPointPos = std::find(wsFilePath.rbegin(), wsFilePath.rend(), L'.');
if (wsFilePath.rend() == itPointPos || wsFilePath.rbegin() == itPointPos)
return _CXIMAGE_FORMAT_UNKNOWN;
std::wstring wsFileExtension = std::wstring(itPointPos.base(), wsFilePath.end());
std::transform(wsFileExtension.begin(), wsFileExtension.end(), wsFileExtension.begin(), tolower);
if (L"bmp" == wsFileExtension)
return _CXIMAGE_FORMAT_BMP;
else if (L"gif" == wsFileExtension)
return _CXIMAGE_FORMAT_GIF;
else if (L"jpg" == wsFileExtension)
return _CXIMAGE_FORMAT_JPG;
else if (L"png" == wsFileExtension)
return _CXIMAGE_FORMAT_PNG;
else if (L"ico" == wsFileExtension)
return _CXIMAGE_FORMAT_ICO;
else if (L"tif" == wsFileExtension)
return _CXIMAGE_FORMAT_TIF;
else if (L"tga" == wsFileExtension)
return _CXIMAGE_FORMAT_TGA;
else if (L"pcx" == wsFileExtension)
return _CXIMAGE_FORMAT_PCX;
else if (L"wmf" == wsFileExtension)
return _CXIMAGE_FORMAT_WMF;
else if (L"jp2" == wsFileExtension)
return _CXIMAGE_FORMAT_JP2;
else if (L"jpc" == wsFileExtension)
return _CXIMAGE_FORMAT_JPC;
else if (L"pgx" == wsFileExtension)
return _CXIMAGE_FORMAT_PGX;
else if (L"pnm" == wsFileExtension)
return _CXIMAGE_FORMAT_PNM;
else if (L"ras" == wsFileExtension)
return _CXIMAGE_FORMAT_RAS;
else if (L"jbg" == wsFileExtension)
return _CXIMAGE_FORMAT_JBG;
else if (L"mng" == wsFileExtension)
return _CXIMAGE_FORMAT_MNG;
else if (L"ska" == wsFileExtension)
return _CXIMAGE_FORMAT_SKA;
else if (L"raw" == wsFileExtension)
return _CXIMAGE_FORMAT_RAW;
else if (L"psd" == wsFileExtension)
return _CXIMAGE_FORMAT_PSD;
else if (L"emf" == wsFileExtension)
return _CXIMAGE_FORMAT_EMF;
else if (L"wb" == wsFileExtension)
return _CXIMAGE_FORMAT_WB;
else if (L"svm" == wsFileExtension)
return _CXIMAGE_FORMAT_SVM;
else if (L"svg" == wsFileExtension)
return _CXIMAGE_FORMAT_SVG;
return _CXIMAGE_FORMAT_UNKNOWN;
}
#if !defined(_WIN32) && !defined(_WIN64)
static std::wstring utf8_to_unicode(const char* src)
{
return NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)src, (LONG)strlen(src));
}
int main(int argc, char* argv[])
#else
int wmain(int argc, wchar_t* argv[])
#endif
{
std::wcout << std::endl;
std::wcout << L"-------------------------------------------------------------------------------" << std::endl;
std::wcout << L"METAFILE CONVERSION TEST" << std::endl;
std::wcout << L"-------------------------------------------------------------------------------" << std::endl;
if (argc < 3)
{
std::wcout << L"INVALID NUMBER ARGUMENTS" << std::endl;
std::wcout << "USAGE: metafile \"path_to_input_file\" \"path_to_output_file\"" << std::endl;
std::wcout << L"WHERE:" << std::endl;
std::wcout << L"\"path_to_input_file\" is the path to the metafile" << std::endl;
std::wcout << L"\"path_to_output_file\" is the path to the final file with the specified format (.png, .jpeg, .jpg, .svg, ...)" << std::endl;
return METAFILE_INVALID_NUMBERS_ARGUMENTS;
}
std::wstring wsInputFilePath, wsOutputFilePath;
#if !defined(_WIN32) && !defined(_WIN64)
wsInputFilePath = utf8_to_unicode(argv[1]);
wsOutputFilePath = utf8_to_unicode(argv[2]);
#else
wsInputFilePath = std::wstring(argv[1]);
wsOutputFilePath = std::wstring(argv[2]);
#endif
if (!NSFile::CFileBinary::Exists(wsInputFilePath))
{
std::wcout << L"THE \"" << wsInputFilePath << L"\" FILE WAS NOT FOUND" << std::endl;
return METAFILE_FILE_NOT_FOUND;
}
__ENUM_CXIMAGE_FORMATS enImageFormats = IdentifyFileFormat(wsOutputFilePath);
if (_CXIMAGE_FORMAT_UNKNOWN == enImageFormats)
{
std::wcout << L"INVALID FILE FORMATS" << std::endl;
std::wcout << L"The \"" << wsOutputFilePath << L"\" argument specifies an unsupported format" << std::endl;
return METAFILE_INVALID_FORMAT_FILE;
}
CApplicationFontsWorker oWorker;
oWorker.m_sDirectory = NSFile::GetProcessDirectory() + L"/fonts_cache";
oWorker.m_bIsNeedThumbnails = false;
if (!NSDirectory::Exists(oWorker.m_sDirectory))
NSDirectory::CreateDirectory(oWorker.m_sDirectory);
NSFonts::IApplicationFonts* pFonts = oWorker.Check();
MetaFile::IMetaFile* pMetafile = MetaFile::Create(pFonts);
int nResult;
if (!pMetafile->LoadFromFile(wsInputFilePath.c_str()))
{
std::wcout << L"METAFILE OPENNING ERROR" << std::endl;
nResult = METAFILE_OPENNING_ERROR;
}
else if (_CXIMAGE_FORMAT_SVG == enImageFormats)
{
const std::wstring wsSvg = pMetafile->ConvertToSvg();
if (!wsSvg.empty())
{
NSFile::CFileBinary oFile;
if (!oFile.CreateFileW(wsOutputFilePath))
{
std::wcout << L"FAILED TO CREATE FILE: \"" << wsOutputFilePath << L"\"" << std::endl;
nResult = METAFILE_FAILED_CREATE_FILE;
}
else
{
oFile.WriteStringUTF8(wsSvg);
oFile.CloseFile();
nResult = METAFILE_SUCCESSFUL_CONVERSION;
}
}
else
{
nResult = METAFILE_UNSUCCESSFUL_CONVERSION;
}
}
else
{
double dX, dY, dWidth, dHeight;
pMetafile->GetBounds(&dX, &dY, &dWidth, &dHeight);
if (0. == dWidth)
{
dWidth = 1000.;
dHeight = -1;
}
pMetafile->ConvertToRaster(wsOutputFilePath.c_str(), enImageFormats, dWidth, dHeight);
nResult = METAFILE_SUCCESSFUL_CONVERSION;
}
pMetafile->Release();
pFonts->Release();
std::wcout << ((METAFILE_SUCCESSFUL_CONVERSION != nResult) ? L"UN" : L"") << L"SUCCESSFUL CONVERSION OF THE \"" << argv[1] << L"\" file to \"" << wsOutputFilePath << L"\"" << std::endl;
return nResult;
}