Compare commits

...

6 Commits

Author SHA1 Message Date
acc81f8c8d Added gradient testing 2023-08-17 18:54:12 +03:00
c0fd800149 Merge pull request #1247 from ONLYOFFICE/fix/x2ttester
Fix bug 63562
2023-08-17 12:39:03 +05:00
0eb442dceb Fix bug 63609 2023-08-16 13:48:43 +03:00
399add2545 fix bug #63682 2023-08-16 09:01:12 +03:00
f245a5b6a5 fix bug #63681 2023-08-16 08:37:42 +03:00
4c3f983cb4 Fix bug 63562 2023-08-05 16:43:44 +03:00
8 changed files with 242 additions and 22 deletions

View File

@ -392,9 +392,10 @@ namespace NSCSS
std::wstring CColor::ConvertRGBtoHEX(const TRGB &oValue)
{
wchar_t arTemp[7];
const int tempLen = 7;
wchar_t arTemp[tempLen];
swprintf(arTemp, sizeof(arTemp), L"%02X%02X%02X", oValue.uchRed, oValue.uchGreen, oValue.uchBlue);
swprintf(arTemp, tempLen, L"%02X%02X%02X", oValue.uchRed, oValue.uchGreen, oValue.uchBlue);
return std::wstring(arTemp, 6);
}
@ -2212,8 +2213,25 @@ namespace NSCSS
bool CColorValue::operator==(const CColorValue &oColorValue) const
{
return (m_enType == oColorValue.m_enType) && ((ColorEmpty == m_enType) || (ColorNone == m_enType) ||
(ColorRGB == m_enType && *static_cast<std::wstring*>(m_pColor) == *static_cast<std::wstring*>(oColorValue.m_pColor)) || ((ColorHEX == m_enType || ColorUrl == m_enType) && *static_cast<std::wstring*>(m_pColor) == *static_cast<std::wstring*>(oColorValue.m_pColor)));
if (m_enType != oColorValue.m_enType)
return false;
if (ColorEmpty == m_enType ||
ColorNone == m_enType)
return true;
switch (m_enType)
{
case ColorRGB:
return *static_cast<TRGB*>(m_pColor) == *static_cast<TRGB*>(oColorValue.m_pColor);
case ColorHEX:
case ColorUrl:
return *static_cast<std::wstring*>(m_pColor) == *static_cast<std::wstring*>(oColorValue.m_pColor);
default:
break;
}
return false;
}
CColorValue &CColorValue::operator=(const CColorValue &oColorValue)

View File

@ -0,0 +1,23 @@
QT -= core
QT -= gui
TARGET = test
CONFIG += console
TEMPLATE = app
CORE_ROOT_DIR = $$PWD/../../../..
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
include($$CORE_ROOT_DIR/Common/3dParty/icu/icu.pri)
ADD_DEPENDENCY(kernel, graphics, UnicodeConverter)
GRAPHICS_AGG_PATH = $$PWD/../../../agg-2.4
INCLUDEPATH += \
$$GRAPHICS_AGG_PATH/include
SOURCES += main.cpp
DESTDIR = $$PWD_ROOT_DIR/build/$$CORE_BUILDS_PLATFORM_PREFIX/$$CORE_BUILDS_CONFIGURATION_PREFIX

View File

@ -0,0 +1,131 @@
#include "../../pro/Graphics.h"
#include "../../../raster/BgraFrame.h"
#include "../../../common/Directory.h"
#ifndef RGBA_TO_INT
#define RGBA_TO_INT(r, g, b, a) ((unsigned int)( ( (unsigned char)(r) )| ( ( (unsigned char)(g) ) << 8 ) | ( ( (unsigned char)(b) ) << 16 ) ) | ( ( (unsigned char)(a) ) << 24 ) )
#endif
struct TRectD
{
double m_dX;
double m_dY;
double m_dWidth;
double m_dHeight;
};
void StartDrawing(IRenderer* pRenderer)
{
pRenderer->BeginCommand(c_nPathType);
pRenderer->PathCommandStart();
}
void DrawRectangle(IRenderer* pRenderer, const TRectD& oRect)
{
pRenderer->PathCommandMoveTo(oRect.m_dX, oRect.m_dY);
pRenderer->PathCommandLineTo(oRect.m_dX + oRect.m_dWidth, oRect.m_dY);
pRenderer->PathCommandLineTo(oRect.m_dX + oRect.m_dWidth, oRect.m_dY + oRect.m_dHeight);
pRenderer->PathCommandLineTo(oRect.m_dX, oRect.m_dY + oRect.m_dHeight);
pRenderer->PathCommandClose();
}
void EndDrawing(IRenderer* pRenderer)
{
pRenderer->EndCommand(c_nPathType);
pRenderer->DrawPath(c_nWindingFillMode);
pRenderer->PathCommandEnd();
}
#define USETRANSFORM 0 // используем для трансформации Transform (1) или Bounds (0)
int main(int argc, char *argv[])
{
NSGraphics::IGraphicsRenderer* pRasterRenderer = NSGraphics::Create();
unsigned int unWidth = 1000;
unsigned int unHeight = 1000;
// Создание основной картинки
BYTE* pData = new BYTE[4 * unWidth * unHeight];
for (unsigned long unIndex = 0; unIndex < unWidth * unHeight; ++unIndex)
((unsigned int*)pData)[unIndex] = 0xffffff;
CBgraFrame oFrame;
oFrame.put_Data(pData);
oFrame.put_Width(unWidth);
oFrame.put_Height(unHeight);
oFrame.put_Stride(4 * unWidth);
pRasterRenderer->CreateFromBgraFrame(&oFrame);
pRasterRenderer->SetSwapRGB(false);
double dW_MM = unWidth;
double dH_MM = unHeight;
pRasterRenderer->put_Width(dW_MM);
pRasterRenderer->put_Height(dH_MM);
// Объявляем цвета градиента и их позиции
const UINT unCountColors = 3;
LONG *pColors = new LONG[unCountColors];
double *pPositions = new double[unCountColors];
pColors[0] = RGBA_TO_INT(255, 0, 0, 255); // Красный
pColors[1] = RGBA_TO_INT(255, 255, 255, 255); // Белый
pColors[2] = RGBA_TO_INT(0, 0, 255, 255); // Синий
pPositions[0] = 0;
pPositions[1] = 0.5;
pPositions[2] = 1;
pRasterRenderer->put_BrushType(c_BrushTypePathGradient1);
pRasterRenderer->put_BrushGradientColors(pColors, pPositions, unCountColors);
// Создадим 3 прямоугольника, которые будут заполнены градиентами
TRectD oRect1{100, 100, 800, 200};
TRectD oRect2{100, 400, 800, 200};
TRectD oRect3{100, 700, 800, 200};
// Отрисовываем первый прямоугольник (градиент без изменений)
StartDrawing(pRasterRenderer);
DrawRectangle(pRasterRenderer, oRect1);
pRasterRenderer->BrushBounds(oRect1.m_dX, oRect1.m_dY, oRect1.m_dWidth, oRect1.m_dHeight);
EndDrawing(pRasterRenderer);
// Отрисовываем второй прямоугольник (сам градиент в 2 раза больше, а размер прямоугольника без изменений)
StartDrawing(pRasterRenderer);
DrawRectangle(pRasterRenderer, oRect2);
const double dXScale = 2;
const double dYScale = 2;
#if USETRANSFORM == 1
pRasterRenderer->put_BrushTransform(Aggplus::CMatrix(dXScale, 0., 0., dYScale, 0., 0.));
pRasterRenderer->BrushBounds(oRect2.m_dX, oRect2.m_dY, oRect2.m_dWidth, oRect2.m_dHeight);
#else
pRasterRenderer->BrushBounds(oRect2.m_dX, oRect2.m_dY, oRect2.m_dWidth * dXScale, oRect2.m_dHeight * dYScale);
#endif
EndDrawing(pRasterRenderer);
// Отрисовываем второй прямоугольник (сам градиент смещен вправо)
StartDrawing(pRasterRenderer);
DrawRectangle(pRasterRenderer, oRect3);
const double dSkipX = 200;
const double dSkipY = 0;
#if USETRANSFORM == 1
pRasterRenderer->put_BrushTransform(Aggplus::CMatrix(1., 0., 0., 1., dSkipX, dSkipY));
pRasterRenderer->BrushBounds(oRect3.m_dX, oRect3.m_dY, oRect3.m_dWidth, oRect3.m_dHeight);
#else
pRasterRenderer->BrushBounds(oRect3.m_dX + dSkipX, oRect3.m_dY + dSkipY, oRect3.m_dWidth, oRect3.m_dHeight);
#endif
EndDrawing(pRasterRenderer);
oFrame.SaveFile(L"testGradients.png", 4);
delete [] pColors;
delete [] pPositions;
RELEASEINTERFACE(pRasterRenderer);
return 0;
}

View File

@ -1528,7 +1528,7 @@ std::wstring PPT::CShapeWriter::ConvertGroup()
double width = bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetWidth() : pGroupElement->m_rcAnchor.GetWidth();
double height = bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetHeight() : pGroupElement->m_rcAnchor.GetHeight();
if ( width > 0 || height > 0 )
if ( width > 0 && height > 0 )
{
m_oWriter.WriteString(L"<a:ext cx=\"" + std::to_wstring((int)width) + L"\" cy=\"" + std::to_wstring((int)height) + L"\"/>");
}
@ -1770,7 +1770,7 @@ std::wstring PPT::CShapeWriter::ConvertTable ()
double width = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetWidth() : pGroupElement->m_rcAnchor.GetWidth();
double height = pGroupElement->m_bChildAnchorEnabled ? pGroupElement->m_rcChildAnchor.GetHeight() : pGroupElement->m_rcAnchor.GetHeight();
if ( width > 0 || height > 0 )
if ( width > 0 && height > 0 )
{
m_oWriter.WriteString(L"<a:ext cx=\"" + std::to_wstring((int)width) + L"\" cy=\"" + std::to_wstring((int)height) + L"\"/>");
}
@ -1883,7 +1883,7 @@ std::wstring PPT::CShapeWriter::ConvertShape()
double width = pShapeElement->m_bChildAnchorEnabled ? pShapeElement->m_rcChildAnchor.GetWidth() : pShapeElement->m_rcAnchor.GetWidth();
double height = pShapeElement->m_bChildAnchorEnabled ? pShapeElement->m_rcChildAnchor.GetHeight() : pShapeElement->m_rcAnchor.GetHeight();
if ( width > 0 || height > 0 )
if ( width > 0 && height > 0 )
{
m_oWriter.WriteString(L"<a:ext cx=\"" + std::to_wstring((int)width) + L"\" cy=\"" + std::to_wstring((int)height) + L"\"/>");
}
@ -2135,7 +2135,7 @@ std::wstring PPT::CShapeWriter::ConvertImage()
_INT64 width = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth());
_INT64 height = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight());
if (( width > 0 || height > 0 ) && ((_UINT64)width) < 0xffffffffffff && ((_UINT64)height) < 0xffffffffffff)
if (( width > 0 && height > 0 ) && ((_UINT64)width) < 0xffffffffffff && ((_UINT64)height) < 0xffffffffffff)
{
m_oWriter.WriteString(L"<a:ext cx=\"" + std::to_wstring(width) + L"\" cy=\"" + std::to_wstring(height) + L"\"/>");
}

View File

@ -57,7 +57,7 @@ CRecordShapeProgBinaryTagSubContainerOrAtom *CRecordOfficeArtClientData::getProg
{
for (auto* progtag : m_rgShapeClientRoundtripData)
{
if (progtag->m_pTagName->m_strText == tagname)
if ((progtag->m_pTagName) && (progtag->m_pTagName->m_strText == tagname))
return progtag;
}

View File

@ -75,8 +75,10 @@ void ExternSheet::readFields(CFRecord& record)
{
_UINT16 cXTI_2b;
record >> cXTI_2b;
for(int i = 0; i < cXTI_2b; ++i)
for(_UINT16 i = 0; i < cXTI_2b; ++i)
{
if (record.getRdPtr() + 6 > record.getDataSize())
break;
XTIPtr xti(new XTI);
record >> *xti;
rgXTI.push_back(xti);
@ -86,7 +88,7 @@ void ExternSheet::readFields(CFRecord& record)
else
{
record >> cXTI;
for(int i = 0; i < cXTI; ++i)
for(_UINT32 i = 0; i < cXTI; ++i)
{
XTIPtr xti(new XTI);
record >> *xti;

View File

@ -89,6 +89,10 @@ bool CFormatsList::IsPdf(const std::wstring& ext) const
{
return ext == m_pdf;
}
bool CFormatsList::IsAny(const std::wstring& ext) const
{
return IsDocument(ext) || IsPresentation(ext) || IsSpreadsheet(ext) || IsCrossplatform(ext) || IsImage(ext) || IsPdf(ext);
}
void CFormatsList::AddDocument(const std::wstring& ext)
{
@ -199,8 +203,8 @@ CFormatsList CFormatsList::GetDefaultExts()
list.m_crossplatform.push_back(L"djvu");
list.m_crossplatform.push_back(L"xps");
list.m_images.push_back(L"jpg");
list.m_images.push_back(L"png");
// list.m_images.push_back(L"jpg");
// list.m_images.push_back(L"png");
list.m_pdf = L"pdf";
@ -494,20 +498,27 @@ void Cx2tTester::Start()
m_outputDirectory = m_troughConversionDirectory;
m_outputExts = {L"doct", L"xlst", L"pptt"};
Convert(files, true);
Convert(files, true, true);
m_outputDirectory = copy_outputDirectory;
m_inputExts = m_outputExts;
m_outputExts = copy_outputExts;
m_inputDirectory = m_troughConversionDirectory;
m_inputDirectory = m_troughConversionDirectory;
files = NSDirectory::GetFiles(m_troughConversionDirectory, true);
}
Convert(files);
WriteTime();
for(auto&& val : m_deleteLaterFiles)
NSFile::CFileBinary::Remove(val);
for(auto&& val : m_deleteLaterDirectories)
NSDirectory::DeleteDirectory(val);
}
void Cx2tTester::Convert(const std::vector<std::wstring>& files, bool bNoDirectory)
void Cx2tTester::Convert(const std::vector<std::wstring>& files, bool bNoDirectory, bool bTrough)
{
for(int i = 0; i < files.size(); i++)
{
@ -544,7 +555,9 @@ void Cx2tTester::Convert(const std::vector<std::wstring>& files, bool bNoDirecto
// all formats -> pdf
|| m_outputFormatsList.IsPdf(ext))
// input format != output format
&& ext != input_ext)
&& ext != input_ext
// any good input ext
&& m_inputFormatsList.IsAny(input_ext))
{
output_file_exts.push_back(ext);
}
@ -617,6 +630,7 @@ void Cx2tTester::Convert(const std::vector<std::wstring>& files, bool bNoDirecto
converter->SetX2tPath(m_x2tPath);
converter->SetErrorsOnly(m_bIsErrorsOnly);
converter->SetDeleteOk(m_bIsDeleteOk);
converter->SetTrough(bTrough);
converter->SetXmlErrorsDirectory(m_errorsXmlDirectory);
converter->SetCsvTxtEncoding(csvTxtEncoding);
converter->SetCsvDelimiter(csvDelimiter);
@ -682,6 +696,15 @@ void Cx2tTester::WriteTime()
m_reportStream.WriteStringUTF8(L"Time: " + std::to_wstring(time));
}
void Cx2tTester::AddDeleteLaterFile(const std::wstring& file)
{
m_deleteLaterFiles.push_back(file);
}
void Cx2tTester::AddDeleteLaterDirectory(const std::wstring& directory)
{
m_deleteLaterDirectories.push_back(directory);
}
bool Cx2tTester::IsAllBusy()
{
CTemporaryCS CS(&m_coresCS);
@ -758,6 +781,10 @@ void CConverter::SetDeleteOk(bool bIsDeleteOk)
{
m_bIsDeleteOk = bIsDeleteOk;
}
void CConverter::SetTrough(bool bIsTrough)
{
m_bIsTrough = bIsTrough;
}
void CConverter::SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory)
{
m_errorsXmlDirectory = errorsXmlDirectory;
@ -1015,15 +1042,25 @@ DWORD CConverter::ThreadProc()
if(m_bIsDeleteOk && ok)
{
if(output_format & AVS_OFFICESTUDIO_FILE_IMAGE)
NSDirectory::DeleteDirectory(output_file);
if(m_bIsTrough)
{
if(output_format & AVS_OFFICESTUDIO_FILE_IMAGE)
m_internal->AddDeleteLaterDirectory(output_file);
else
m_internal->AddDeleteLaterFile(output_file);
}
else
NSFile::CFileBinary::Remove(output_file);
{
if(output_format & AVS_OFFICESTUDIO_FILE_IMAGE)
NSDirectory::DeleteDirectory(output_file);
else
NSFile::CFileBinary::Remove(output_file);
}
}
}
m_internal->WriteReports(reports);
if(m_bIsDeleteOk && is_all_ok)
if(m_bIsDeleteOk && is_all_ok && !m_bIsTrough)
NSDirectory::DeleteDirectory(m_outputFilesDirectory);
CTemporaryCS CS(&m_internal->m_coresCS);

View File

@ -41,6 +41,7 @@ public:
bool IsCrossplatform(const std::wstring& ext) const;
bool IsImage(const std::wstring& ext) const;
bool IsPdf(const std::wstring& ext) const;
bool IsAny(const std::wstring& ext) const;
void AddDocument(const std::wstring& ext);
void AddPresentation(const std::wstring& ext);
@ -93,6 +94,9 @@ public:
void WriteReports(const std::vector<Report>& reports);
void WriteTime();
void AddDeleteLaterFile(const std::wstring& file);
void AddDeleteLaterDirectory(const std::wstring& directory);
bool IsAllBusy();
bool IsAllFree();
@ -106,7 +110,7 @@ public:
private:
// parse string like "docx txt" into vector
std::vector<std::wstring> ParseExtensionsString(std::wstring extensions, const CFormatsList& fl);
void Convert(const std::vector<std::wstring>& files, bool bNoDirectory = false);
void Convert(const std::vector<std::wstring>& files, bool bNoDirectory = false, bool bTrough = false);
// takes from config
std::wstring m_reportFile;
@ -149,6 +153,9 @@ private:
// format -> *t format -> all formats
bool m_bTroughConversion;
std::vector<std::wstring> m_deleteLaterFiles;
std::vector<std::wstring> m_deleteLaterDirectories;
};
// generates temp xml, convert, calls m_internal->writeReport
@ -166,6 +173,7 @@ public:
void SetX2tPath(const std::wstring& x2tPath);
void SetErrorsOnly(bool bIsErrorsOnly);
void SetDeleteOk(bool bIsDeleteOk);
void SetTrough(bool bIsTrough);
void SetXmlErrorsDirectory(const std::wstring& errorsXmlDirectory);
void SetCsvTxtEncoding(int csvTxtEncoding);
void SetCsvDelimiter(const std::wstring& csvDelimiter);
@ -195,6 +203,7 @@ private:
bool m_bIsErrorsOnly;
bool m_bIsDeleteOk;
bool m_bIsTrough;
int m_totalFiles;
int m_currFile;