Commit 8e91112c authored by Sergey.Konovalov's avatar Sergey.Konovalov Committed by Alexander Trofimov

ASCHTMLRendererLib Linux build,некоторые файла переведены в utf8.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@58853 954022d7-b5bf-4e40-9824-e11837661b57
parent 778b60d5
......@@ -167,7 +167,6 @@
/>
<Tool
Name="VCPostBuildEventTool"
Description=""
CommandLine=""
/>
</Configuration>
......@@ -226,10 +225,6 @@
RelativePath=".\Writer\Const.h"
>
</File>
<File
RelativePath="..\DesktopEditor\editor\DibPainter.h"
>
</File>
<File
RelativePath=".\IBaseMatrixUpdater.h"
>
......@@ -242,10 +237,6 @@
<Filter
Name="Writer"
>
<File
RelativePath=".\Writer\CanvasWriter.h"
>
</File>
<File
RelativePath=".\Writer\StringWriter.h"
>
......
#include "ASCSVGWriter.h"
#include "ASCSVGWriter.h"
#include "../DesktopEditor/graphics/GraphicsPath.h"
#include "Writer/VectorGraphicsWriter2.h"
......@@ -32,7 +32,7 @@ namespace NSHtmlRenderer
m_pTransform = new Aggplus::CMatrix();
m_pFullTransform = new Aggplus::CMatrix();
//todo , ?
//todo вроде как подбора нет, но может нужно передавать?
m_pFontManager = new CFontManager();
m_pFontManager->Initialize();
......@@ -62,7 +62,7 @@ namespace NSHtmlRenderer
*lType = c_nSVGRendrerer;
return S_OK;
}
//-------- --------------------------------------------------
//-------- Функции для работы со страницей --------------------------------------------------
HRESULT CASCSVGWriter::NewPage()
{
return S_OK;
......@@ -393,7 +393,7 @@ namespace NSHtmlRenderer
m_pFont->FaceIndex = lFaceIndex;
return S_OK;
}
//-------- --------------------------------------------------------
//-------- Функции для вывода текста --------------------------------------------------------
HRESULT CASCSVGWriter::CommandDrawTextCHAR(const LONG& c, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset)
{
//todo new command
......@@ -433,7 +433,7 @@ namespace NSHtmlRenderer
PathCommandEnd();
return S_OK;
}
//-------- ---------------------------------------------------------------
//-------- Маркеры для команд ---------------------------------------------------------------
HRESULT CASCSVGWriter::BeginCommand(const DWORD& lType)
{
if (m_bIsRaster)
......@@ -467,7 +467,7 @@ namespace NSHtmlRenderer
m_lCurrentCommandType = -1;
return S_OK;
}
//-------- Graphics Path -----------------------------------------------
//-------- Функции для работы с Graphics Path -----------------------------------------------
HRESULT CASCSVGWriter::PathCommandMoveTo(const double& fX, const double& fY)
{
if (m_bIsRaster)
......@@ -641,7 +641,7 @@ namespace NSHtmlRenderer
m_pFont->StringGID = bGid;
return S_OK;
}
//-------- ---------------------------------------------------
//-------- Функции для вывода изображений ---------------------------------------------------
HRESULT CASCSVGWriter::DrawImage(IGrObject* pImage, const double& fX, const double& fY, const double& fWidth, const double& fHeight)
{
m_bIsRaster = true;
......@@ -797,7 +797,7 @@ namespace NSHtmlRenderer
}
HRESULT CASCSVGWriter::IsRaster(bool* bVal)
{
*bVal = m_bIsRaster ? VARIANT_TRUE : VARIANT_FALSE;
*bVal = m_bIsRaster;
return S_OK;
}
// additiaonal params ----------------------------------------------------------------------
......@@ -924,4 +924,4 @@ namespace NSHtmlRenderer
*m_pInstalledFont = *m_pFont;
}
}
\ No newline at end of file
}
#pragma once
#pragma once
#include "../DesktopEditor/graphics/IRenderer.h"
#include "IBaseMatrixUpdater.h"
......@@ -27,9 +27,9 @@ namespace NSHtmlRenderer
~CASCSVGWriter();
public:
// -----------------------------------------------------------------------------
// тип рендерера-----------------------------------------------------------------------------
HRESULT get_Type(LONG* lType);
//-------- --------------------------------------------------
//-------- Функции для работы со страницей --------------------------------------------------
HRESULT NewPage();
HRESULT get_Height(double* dHeight);
HRESULT put_Height(const double& dHeight);
......@@ -101,18 +101,18 @@ namespace NSHtmlRenderer
HRESULT get_FontFaceIndex(int* lFaceIndex);
HRESULT put_FontFaceIndex(const int& lFaceIndex);
//-------- --------------------------------------------------------
//-------- Функции для вывода текста --------------------------------------------------------
HRESULT CommandDrawTextCHAR(const LONG& c, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset);
HRESULT CommandDrawText(const std::wstring& bsText, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset);
HRESULT CommandDrawTextExCHAR(const LONG& c, const LONG& gid, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset, const DWORD& lFlags);
HRESULT CommandDrawTextEx(const std::wstring& bsUnicodeText, const std::wstring& bsGidText, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset, const DWORD& lFlags);
//-------- ---------------------------------------------------------------
//-------- Маркеры для команд ---------------------------------------------------------------
HRESULT BeginCommand(const DWORD& lType);
HRESULT EndCommand(const DWORD& lType);
//-------- Graphics Path -----------------------------------------------
//-------- Функции для работы с Graphics Path -----------------------------------------------
HRESULT PathCommandMoveTo(const double& x, const double& y);
HRESULT PathCommandLineTo(const double& x, const double& y);
HRESULT PathCommandLinesTo(double* points, const int& count);
......@@ -131,7 +131,7 @@ namespace NSHtmlRenderer
HRESULT PathCommandTextExCHAR(const LONG& c, const LONG& gid, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset, const DWORD& lFlags);
HRESULT PathCommandTextEx(const std::wstring& bsUnicodeText, const std::wstring& bsGidText, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset, const DWORD& lFlags);
//-------- ---------------------------------------------------
//-------- Функции для вывода изображений ---------------------------------------------------
HRESULT DrawImage(IGrObject* pImage, const double& x, const double& y, const double& w, const double& h);
HRESULT DrawImageFromFile(const std::wstring&, const double& x, const double& y, const double& w, const double& h, const BYTE& lAlpha);
......@@ -160,17 +160,17 @@ namespace NSHtmlRenderer
NSHtmlRenderer::CSVGGraphicsWriter* m_pVectorWriter;
Aggplus::CGraphicsPathSimpleConverter* m_pSimpleGraphicsConverter; //
CFontManager* m_pFontManager; //
Aggplus::CGraphicsPathSimpleConverter* m_pSimpleGraphicsConverter; // конвертер сложных гафических путей в простые
CFontManager* m_pFontManager; // менеджер шрифтов
bool m_bDeleteFontManager;
Aggplus::CMatrix* m_pBaseTransform; // (: -> )
Aggplus::CMatrix* m_pTransform; //
Aggplus::CMatrix* m_pFullTransform; // (m_oBaseTransform * m_oTransform)
Aggplus::CMatrix* m_pBaseTransform; // матрица перерасчета координатных осей (здесь: миллиметры -> пикселы)
Aggplus::CMatrix* m_pTransform; // текущая матрица преобразований рендерера
Aggplus::CMatrix* m_pFullTransform; // полная матрица преобразований (m_oBaseTransform * m_oTransform)
double m_dTransformAngle;
LONG m_lCurrentCommandType; //
LONG m_lCurrentCommandType; // текущая команда
double m_dDpiX;
double m_dDpiY;
......@@ -180,7 +180,7 @@ namespace NSHtmlRenderer
LONG m_lClipMode;
NSStructures::CPen* m_pPen; // ( AVSGraphics)
NSStructures::CPen* m_pPen; // настройки всей графики (скопирован ашник из AVSGraphics)
NSStructures::CBrush* m_pBrush;
NSStructures::CFont* m_pFont;
......
#include "CASCImage.h"
#include "CASCImage.h"
#include "../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfFile.h"
#include "../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/RendererOutput.h"
......@@ -105,21 +105,21 @@ namespace NSHtmlRenderer
}
void CASCImage::Open(const std::wstring& bsFilePath)
{
// ( )
// Закроем раннее открытый файл (если он был открыт)
Close();
// WMF
// Сначала попытаемя открыть файл как WMF
m_pWmfFile->OpenFromFile( bsFilePath.c_str() );
m_pWmfFile->Scan( m_pRect );
//
// Файл открылся нормально
if ( !m_pWmfFile->CheckError() )
{
m_lImageType = c_lImageTypeMetafile | c_lMetaWmf;
return;
}
// Wmf, Emf
// Это не Wmf, попробуем открыть его как Emf
m_pWmfFile->Close();
#ifdef _WIN32
CGdiPlusInit oCGdiPlusInit;
......@@ -127,7 +127,7 @@ namespace NSHtmlRenderer
Gdiplus::Metafile *pMetaFile = new Gdiplus::Metafile( bsFilePath.c_str() );
if ( NULL != pMetaFile )
{
// , Wmf Gdi
// Похоже это метафайл, конвертируем его в Wmf с помощью Gdi
HENHMETAFILE hEmf = pMetaFile->GetHENHMETAFILE();
if ( NULL != hEmf )
{
......@@ -155,17 +155,17 @@ namespace NSHtmlRenderer
{
::fclose( pFile );
// Wmf
// Сохраняем Wmf
HMETAFILE hTempWmf = CopyMetaFile( hWmf, m_wsTempFilePath.GetBuffer() );
DeleteMetaFile( hTempWmf );
// Wmf
// Открываем Wmf
m_pWmfFile->OpenFromFile( m_wsTempFilePath.GetBuffer() );
m_pWmfFile->Scan( m_pRect );
if ( !m_pWmfFile->CheckError() )
{
// Wmf
// Wmf нормально открылся
m_lImageType = c_lImageTypeMetafile | c_lMetaWmf;
DeleteMetaFile( hWmf );
......@@ -177,12 +177,12 @@ namespace NSHtmlRenderer
}
else if ( m_pWmfFile->UnSupportedWmf() )
{
// Emf, Wmf
// Исходный файл Emf, но после конвертации в Wmf он не открылся
m_lImageType = c_lImageTypeMetafile | c_lMetaEmf;
}
else
{
//
// Сконвертированный файл не прочитался
m_pWmfFile->Close();
m_lImageType = c_lImageTypeUnknown;
}
......@@ -225,8 +225,8 @@ namespace NSHtmlRenderer
//}
//else
{
// (Wmf/Emf)
// TODO: Bitmap
// Исходный файл не явлется метафайлом (Wmf/Emf)
// TODO: Сделать чтение Bitmap
m_pMediaData = new Aggplus::CImage(bsFilePath);
if(Aggplus::Ok != m_pMediaData->GetLastStatus())
m_lImageType = c_lImageTypeBitmap;
......@@ -244,8 +244,15 @@ namespace NSHtmlRenderer
m_pWmfFile->Close();
if ( m_lImageType & c_lMetaEmf )
{
//
::_wunlink( m_wsTempFilePath.GetBuffer() );
// Удаляем временный файл
//todo может проверять не пустой ли m_wsTempFilePath, а не m_lImageType & c_lMetaEmf
#ifdef _WIN32
::_wunlink( m_wsTempFilePath.GetBuffer() );
#else
std::string sTempFilePath = U_TO_UTF8(m_wsTempFilePath);
::unlink( sTempFilePath.c_str() );
#endif
}
}
......@@ -335,7 +342,7 @@ namespace NSHtmlRenderer
}
HRESULT CASCImage::LoadFromFile(const std::wstring& bsFilePath)
{
// Open Close
// Внутри комманды Open выполняется команда Close
Open( bsFilePath );
return S_OK;
......@@ -438,4 +445,4 @@ namespace NSHtmlRenderer
{
return m_pMediaData;
}
}
\ No newline at end of file
}
#include "CASCSVGRenderer.h"
#include "CASCSVGRenderer.h"
#include "../DesktopEditor/graphics/GraphicsPath.h"
#include "Writer/StringWriter.h"
#include "CMetafile.h"
......@@ -30,22 +30,22 @@ namespace NSSVG
namespace NSHtmlRenderer
{
static CString g_string_svgOpen = _T("<svg width=\"%dpx\" height=\"%dpx\" viewBox=\"0 0 %d %d\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n");
static _bstr_t g_bstr_svgClose = L"</svg>";
static CString g_bstr_svgClose = L"</svg>";
static CString g_string_image = _T("<image x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" xlink:href=\"%s\" preserveAspectRatio=\"none\"/>\n");
static _bstr_t g_bstr_graphicOpen = L"<g>\n";
static _bstr_t g_bstr_graphicClose = L"</g>\n";
static CString g_bstr_graphicOpen = L"<g>\n";
static CString g_bstr_graphicClose = L"</g>\n";
static _bstr_t g_bstr_path_d = L" d=\"";
static _bstr_t g_bstr_path_d_end = L"\" ";
static CString g_bstr_path_d = L" d=\"";
static CString g_bstr_path_d_end = L"\" ";
static _bstr_t g_bstr_vml_ClosePath = L"Z ";
static CString g_bstr_vml_ClosePath = L"Z ";
static CString g_string_vml_MoveTo = _T("M %d,%d ");
static CString g_string_vml_LineTo = _T("L %d,%d ");
static CString g_string_vml_CurveTo = _T("C %d,%d %d,%d %d,%d ");
static _bstr_t g_bstr_vml_Path = L"<path ";
static _bstr_t g_bstr_nodeClose = L" />\n";
static CString g_bstr_vml_Path = L"<path ";
static CString g_bstr_nodeClose = L" />\n";
static CString g_string_vml_StyleStroke = _T("style=\"fill:none;stroke:#%06x;stroke-width:%dpx;stroke-opacity:%.2lf\" ");
static CString g_string_vml_StyleStroke_class = _T("class=\"stroke%d\" style=\"fill:none;stroke-width:%dpx;stroke-opacity:%.2lf\" ");
static CString g_string_vml_StyleFill = _T("style=\"fill:#%06x;fill-opacity:%.2lf;fill-rule:%s;stroke:none\" ");
......@@ -106,7 +106,7 @@ namespace NSHtmlRenderer
*lType = c_nSVGRendrerer;
return S_OK;
}
//-------- --------------------------------------------------
//-------- Функции для работы со страницей --------------------------------------------------
HRESULT CASCSVGRenderer::NewPage()
{
return S_OK;
......@@ -460,7 +460,7 @@ namespace NSHtmlRenderer
m_pFont->FaceIndex = lFaceIndex;
return S_OK;
}
//-------- --------------------------------------------------------
//-------- Функции для вывода текста --------------------------------------------------------
HRESULT CASCSVGRenderer::CommandDrawTextCHAR(const LONG& c, const double& x, const double& y, const double& w, const double& h, const double& baselineOffset)
{
//todo new command
......@@ -518,7 +518,7 @@ namespace NSHtmlRenderer
m_pFont->StringGID = FALSE;
return CommandDrawText(bsUnicodeText, x, y, w, h, baselineOffset);
}
//-------- ---------------------------------------------------------------
//-------- Маркеры для команд ---------------------------------------------------------------
HRESULT CASCSVGRenderer::BeginCommand(const DWORD& lType)
{
if (c_nClipType == lType)
......@@ -551,7 +551,7 @@ namespace NSHtmlRenderer
return S_OK;
}
//-------- Graphics Path -----------------------------------------------
//-------- Функции для работы с Graphics Path -----------------------------------------------
HRESULT CASCSVGRenderer::PathCommandMoveTo(const double& fX, const double& fY)
{
if (c_nSimpleGraphicType == m_lCurrentCommandType)
......@@ -793,7 +793,7 @@ namespace NSHtmlRenderer
m_pFont->StringGID = FALSE;
return PathCommandText(bsUnicodeText, x, y, w, h, baselineOffset);
}
//-------- ---------------------------------------------------
//-------- Функции для вывода изображений ---------------------------------------------------
HRESULT CASCSVGRenderer::DrawImage(IGrObject* pImage, const double& fX, const double& fY, const double& fWidth, const double& fHeight)
{
double x = fX;
......@@ -823,7 +823,7 @@ namespace NSHtmlRenderer
if ((1 == lFileType) || (2 == lFileType))
{
//
// метафайл
oExt.DrawOnRenderer(this, sVal, fX, fY, fWidth, fHeight, TRUE);
return S_OK;
}
......@@ -930,7 +930,7 @@ namespace NSHtmlRenderer
NSFile::CFileBinary oFile;
if (S_OK == oFile.CreateFile(m_strDstFile))
if (S_OK == oFile.CreateFileW(m_strDstFile))
{
CString strData = m_pWriter->GetCString();
oFile.WriteFile((BYTE*)strData.GetBuffer(), sizeof(WCHAR) * strData.GetLength());
......@@ -1057,4 +1057,4 @@ namespace NSHtmlRenderer
*m_pInstalledFont = *m_pFont;
}
}
\ No newline at end of file
}
#-------------------------------------------------
#
# Project created by QtCreator 2014-10-10T14:24:04
#
#-------------------------------------------------
QT -= core gui
TARGET = ASCHTMLRendererLib
TEMPLATE = lib
CONFIG += staticlib
QMAKE_CXXFLAGS += -std=c++11 -Wall -Wno-ignored-qualifiers -g
DEFINES += UNICODE _UNICODE _LINUX_QT NODOCX DESKTOP_EDITOR_GRAPHICS
INCLUDEPATH += \
../../DesktopEditor/freetype-2.5.2/include \
../../DesktopEditor/agg-2.4/include
SOURCES += ../ASCSVGWriter.cpp \
../CASCImage.cpp \
../CASCSVGRenderer.cpp \
../CMetafile.cpp \
HEADERS += ../ASCSVGWriter.h \
../CASCImage.h \
../CASCSVGRenderer.h \
../CMetafile.h \
../Writer/Common.h \
../Writer/Const.h \
../IBaseMatrixUpdater.h \
../Writer/TextItem.h \
../Writer/StringWriter.h \
../Writer/SVGWriter.h \
../Writer/VectorGraphicsWriter2.h \
../Writer/VMLWriter.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/RendererOutput.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfCharsets.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfCodePage932.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfCodePage936.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfCodePage949.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfCodePage950.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfCodePage1361.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfColor.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfFile.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfMemory.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfOutputDevice.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfRegion.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfTypes.h \
../../ASCImageStudio3/ASCGraphics/Objects/Image/Wmf/WmfUtils.h
unix {
target.path = /usr/lib
INSTALLS += target
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.1.2, 2014-10-14T12:16:08. -->
<qtcreator>
<data>
<variable>ProjectExplorer.Project.ActiveTarget</variable>
<value type="int">-1</value>
</data>
<data>
<variable>ProjectExplorer.Project.EditorSettings</variable>
<valuemap type="QVariantMap">
<value type="bool" key="EditorConfiguration.AutoIndent">true</value>
<value type="bool" key="EditorConfiguration.AutoSpacesForTabs">false</value>
<value type="bool" key="EditorConfiguration.CamelCaseNavigation">true</value>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.0">
<value type="QString" key="language">Cpp</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">CppGlobal</value>
</valuemap>
</valuemap>
<valuemap type="QVariantMap" key="EditorConfiguration.CodeStyle.1">
<value type="QString" key="language">QmlJS</value>
<valuemap type="QVariantMap" key="value">
<value type="QByteArray" key="CurrentPreferences">QmlJSGlobal</value>
</valuemap>
</valuemap>
<value type="int" key="EditorConfiguration.CodeStyle.Count">2</value>
<value type="QByteArray" key="EditorConfiguration.Codec">UTF-8</value>
<value type="bool" key="EditorConfiguration.ConstrainTooltips">false</value>
<value type="int" key="EditorConfiguration.IndentSize">4</value>
<value type="bool" key="EditorConfiguration.KeyboardTooltips">false</value>
<value type="int" key="EditorConfiguration.MarginColumn">80</value>
<value type="bool" key="EditorConfiguration.MouseHiding">true</value>
<value type="bool" key="EditorConfiguration.MouseNavigation">true</value>
<value type="int" key="EditorConfiguration.PaddingMode">1</value>
<value type="bool" key="EditorConfiguration.ScrollWheelZooming">true</value>
<value type="bool" key="EditorConfiguration.ShowMargin">false</value>
<value type="int" key="EditorConfiguration.SmartBackspaceBehavior">0</value>
<value type="bool" key="EditorConfiguration.SpacesForTabs">true</value>
<value type="int" key="EditorConfiguration.TabKeyBehavior">0</value>
<value type="int" key="EditorConfiguration.TabSize">8</value>
<value type="bool" key="EditorConfiguration.UseGlobal">true</value>
<value type="int" key="EditorConfiguration.Utf8BomBehavior">1</value>
<value type="bool" key="EditorConfiguration.addFinalNewLine">true</value>
<value type="bool" key="EditorConfiguration.cleanIndentation">true</value>
<value type="bool" key="EditorConfiguration.cleanWhitespace">true</value>
<value type="bool" key="EditorConfiguration.inEntireDocument">false</value>
</valuemap>
</data>
<data>
<variable>ProjectExplorer.Project.PluginSettings</variable>
<valuemap type="QVariantMap"/>
</data>
<data>
<variable>ProjectExplorer.Project.TargetCount</variable>
<value type="int">0</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.EnvironmentId</variable>
<value type="QByteArray">{dddbb3a8-974f-495c-bf78-01c688e01f07}</value>
</data>
<data>
<variable>ProjectExplorer.Project.Updater.FileVersion</variable>
<value type="int">15</value>
</data>
</qtcreator>
......@@ -43,7 +43,8 @@ namespace NSHtmlRenderer
}
#ifdef _WIN32
#import "../Redist/ASCMediaCore3.dll" named_guids raw_interfaces_only rename_namespace("MediaCore"), exclude("tagRECT")
static RECT GetImageBounds(MediaCore::IAVSUncompressedVideoFrame* pFrame)
{
BYTE* pBuffer = NULL;
......@@ -244,6 +245,7 @@ namespace NSHtmlRenderer
}
#endif
const double c_ag_Inch_to_MM = 25.4;
const double c_ag_1pxWidth = 25.4 / 96;
......@@ -277,12 +279,12 @@ namespace NSHtmlRenderer
}
};
__forceinline static double FABS(double dVal)
AVSINLINE static double FABS(double dVal)
{
return (dVal >= 0) ? dVal : -dVal;
}
__forceinline static int round(double dVal)
AVSINLINE static int round(double dVal)
{
return (int)(dVal + 0.5);
}
}
\ No newline at end of file
}
#pragma once
// viewer
static _bstr_t g_bstr_viewer_page = L"<div class=\"blockpage\">\n";
static CString g_bstr_viewer_page = L"<div class=\"blockpage\">\n";
static CString g_string_viewer_page = _T("<div id=\"page%d\" class=\"blockpage\" style=\"top: %dpx; width: %dpx; height: %dpx;\">\n");
static _bstr_t g_bstr_viewer_page_between = L"<div class=\"blockpagebetween\"></div>\n";
static _bstr_t g_bstr_viewer_end_div = L"</div>\n";
static _bstr_t g_bstr_viewer_end_div2 = L"\n</div>\n";
static CString g_bstr_viewer_page_between = L"<div class=\"blockpagebetween\"></div>\n";
static CString g_bstr_viewer_end_div = L"</div>\n";
static CString g_bstr_viewer_end_div2 = L"\n</div>\n";
// script constans
static _bstr_t g_bstr_script_open = L"{\n";
static _bstr_t g_bstr_script_close = L"}\n";
static _bstr_t g_bstr_script_var = L"var ";
static CString g_bstr_script_open = L"{\n";
static CString g_bstr_script_close = L"}\n";
static CString g_bstr_script_var = L"var ";
// canvas (vector graphics)
static CString g_string_canvas_ByID = _T("_canvas = document.getElementById('shape_%d');\n");
static _bstr_t g_bstr_canvas_Correct = L"if(_canvas && _canvas.getContext)\n";
static _bstr_t g_bstr_canvas_Context = L"c = _canvas.getContext('2d');\n";
static CString g_bstr_canvas_Correct = L"if(_canvas && _canvas.getContext)\n";
static CString g_bstr_canvas_Context = L"c = _canvas.getContext('2d');\n";
static _bstr_t g_bstr_canvas_StartPath = L"b(c);\n";
static _bstr_t g_bstr_canvas_ClosePath = L"x(c);\n";
static CString g_bstr_canvas_StartPath = L"b(c);\n";
static CString g_bstr_canvas_ClosePath = L"x(c);\n";
static CString g_string_canvas_MoveTo = _T("m(c,%.2lf,%.2lf);\n");
static CString g_string_canvas_LineTo = _T("l(c,%.2lf,%.2lf);\n");
......@@ -28,12 +28,12 @@ static CString g_string_canvas_MoveToD = _T("m(c,%d,%d);\n");
static CString g_string_canvas_LineToD = _T("l(c,%d,%d);\n");
static CString g_string_canvas_CurveToD = _T("cu(c,%d,%d,%d,%d,%d,%d);\n");
static _bstr_t g_bstr_canvas_Save = L"c.save();\n";
static _bstr_t g_bstr_canvas_Restore = L"c.restore();\n";
static _bstr_t g_bstr_canvas_Clip = L"c.clip();\n";
static CString g_bstr_canvas_Save = L"c.save();\n";
static CString g_bstr_canvas_Restore = L"c.restore();\n";
static CString g_bstr_canvas_Clip = L"c.clip();\n";
static _bstr_t g_bstr_canvas_Stroke = L"s(c);\n";
static _bstr_t g_bstr_canvas_Fill = L"f(c);\n";
static CString g_bstr_canvas_Stroke = L"s(c);\n";
static CString g_bstr_canvas_Fill = L"f(c);\n";
static CString g_string_css_color = _T("rgb(%d,%d,%d)");
......@@ -44,10 +44,10 @@ static CString g_string_canvas_StrokeColorA = _T("c.strokeStyle = \"rgba(%d
static CString g_string_canvas_drawImage = _T("img%d = new Image();img%d.src = \"media\\\\image%d.jpg\";img%d.onload = function(){c.drawImage(img%d,%d,%d,%d,%d);drawpage%d_%d(c);};\n}\nfunction drawpage%d_%d(c)\n{\n");
// vector markup language
static _bstr_t g_bstr_vml_InitializeStyle = L"v\\:*{behavior:url(#default#VML)}\n";
static CString g_bstr_vml_InitializeStyle = L"v\\:*{behavior:url(#default#VML)}\n";
static _bstr_t g_bstr_vml_StartPath = L"";
static _bstr_t g_bstr_vml_ClosePath = L"x";
static CString g_bstr_vml_StartPath = L"";
static CString g_bstr_vml_ClosePath = L"x";
static CString g_string_vml_MoveTo = _T("m%d,%d ");
static CString g_string_vml_LineTo = _T("l%d,%d ");
......@@ -60,12 +60,12 @@ static CString g_string_text = _T("<p style=\"position:absolute; left:%d
static CString g_string_image = _T("<img style=\"position:absolute; left:%dpx; top: %dpx; width: %dpx; height:%dpx;\" src=\"media\\image%d.jpg\"");
//shape
static _bstr_t g_bstr_shape_div = L"<div style=\"position: absolute; width: 100%; height: 100%;\">\n";
static CString g_bstr_shape_div = L"<div style=\"position: absolute; width: 100%; height: 100%;\">\n";
static CString g_string_shape = _T("<canvas style=\"position:absolute left:0; top:0; width:%dpx; height:%dpx;\" id=\"shape_%d\" width=\"%dpx\" height=\"%dpx\">\n");
static CString g_string_shape_vml = _T("<v:shape style=\"position:absolute; width:1; height:1\" coordsize=\"1 1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" fillcolor=\"#%x\" path=\"%s\" />\n");
static CString g_string_shape_vmlTexture = _T("<v:shape style=\"position:absolute; width:1; height:1\" coordsize=\"1 1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" path=\"%s\"><v:fill src=\"media\\image%d.jpg\" type=\"frame\" opacity=\"%.2lf\"/></v:shape>\n");
static CString g_string_shape_vmlAlpha = _T("<v:shape style=\"position:absolute; width:1; height:1\" coordsize=\"1 1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" fillcolor=\"#%x\" path=\"%s\"><v:fill opacity=\"%.2lf\"/></v:shape>\n");
static _bstr_t g_bstr_shape_closecanvas = L"</canvas>\n";
static CString g_bstr_shape_closecanvas = L"</canvas>\n";
static CString g_string_rect = _T("<div class=\"rt\" style=\"border-width: %dpx; background-color: %s; border-color: %s; opacity:%.2lf; left: %dpx; top: %dpx; width: %dpx; height: %dpx;\"></div>\n");
// new
......@@ -75,7 +75,7 @@ static CString g_string_page_script = _T("<script type=\"text/javascript\
static CString g_string_page_method = _T("function _tx%d(){\n");
static CString g_string_canvas_page_script2 = _T("function drawpage%d()\n{\nvar drawingCanvas = document.getElementById('page%d_2D');\nif(drawingCanvas && drawingCanvas.getContext)\n{\nvar c = drawingCanvas.getContext('2d');\n");
static _bstr_t g_bstr_paragraph1 = _T("<p class=\"bp\">");
static CString g_bstr_paragraph1 = _T("<p class=\"bp\">");
static CString g_string_paragraph2 = _T("<p class=\"bp\" style=\"font-family: %s; font-size: %dpx; color:#%x;\">");
static CString g_string_paragraph3 = _T("<p class=\"bp\" style=\"left: %dpx; top: %dpx; font-family: %s; font-size: %dpx; color:#%x; white-space: nowrap;\">");
static CString g_string_paragraph4 = _T("<p class=\"bp\" style=\"left: %dpx; top: %dpx; width: %dpx; height: %dpx; text-align: %s; line-height: %d; text-indent: %dpx\">");
......@@ -92,14 +92,14 @@ static CString g_string_text_css_i = _T("font-family: %s; font-size: %dpx
static CString g_string_text_css_b = _T("font-family: %s; font-size: %dpx; color:#%06x; font-weight:bold; font-style:normal;");
static CString g_string_style_name = _T(".s%d {");
static _bstr_t g_bstr_paragraph_end = _T("</p>\n");
static _bstr_t g_bstr_nobr_start = _T("<nobr>");
static _bstr_t g_bstr_nobr_end = _T("</nobr>");
static CString g_bstr_paragraph_end = _T("</p>\n");
static CString g_bstr_nobr_start = _T("<nobr>");
static CString g_bstr_nobr_end = _T("</nobr>");
static CString g_string_lineFunc = _T("mt(\"l%d\",%d);");
//static _bstr_t g_bstr_lineMeasure = L"function mt(id,size){var el = document.getElementById(id);if (el.offsetWidth < size){el.style.whiteSpace = \"normal\";el.style.width = size;el.style.height = el.offsetHeight;el.style.textAlign = \"justify\";el.innerHTML += \"<span class=\\\"jf\\\"></span>\";}}";
static _bstr_t g_bstr_lineMeasure = L"function mt(id,size){var el = document.getElementById(id);if (el.offsetWidth < size){el.className=\"pa\";el.style.width=size;}}\n";
//static CString g_bstr_lineMeasure = L"function mt(id,size){var el = document.getElementById(id);if (el.offsetWidth < size){el.style.whiteSpace = \"normal\";el.style.width = size;el.style.height = el.offsetHeight;el.style.textAlign = \"justify\";el.innerHTML += \"<span class=\\\"jf\\\"></span>\";}}";
static CString g_bstr_lineMeasure = L"function mt(id,size){var el = document.getElementById(id);if (el.offsetWidth < size){el.className=\"pa\";el.style.width=size;}}\n";
static CString g_string_span1 = _T("<span class=\"bt\" style=\"left:%d; top:%d;\">");
static CString g_string_span2 = _T("<span class=\"bt\" style=\"left:%d; top:%d; font-family: %s; font-size: %dpx; color:#%x;\">");
......@@ -109,14 +109,14 @@ static CString g_string_span_style_underline = _T("<span class=\"s%d\" style
static CString g_string_span_style_strike = _T("<span class=\"s%d\" style=\"text-decoration:line-through;\">");
static CString g_string_span_style_underline_strike = _T("<span class=\"s%d\" style=\"text-decoration:underline line-through;\">");
static _bstr_t g_string_span_style_underline2 = _T("<span style=\"text-decoration:underline;\">");
static _bstr_t g_string_span_style_strike2 = _T("<span style=\"text-decoration:line-through;\">");
static _bstr_t g_string_span_style_underline_strike2 = _T("<span style=\"text-decoration:underline line-through;\">");
static CString g_string_span_style_underline2 = _T("<span style=\"text-decoration:underline;\">");
static CString g_string_span_style_strike2 = _T("<span style=\"text-decoration:line-through;\">");
static CString g_string_span_style_underline_strike2 = _T("<span style=\"text-decoration:underline line-through;\">");
static _bstr_t g_bstr_span_end = _T("</span>");
static CString g_bstr_span_end = _T("</span>");
static _bstr_t g_bstr_space = L"&nbsp;";
static _bstr_t g_bstr_space2 = L" ";
static CString g_bstr_space = L"&nbsp;";
static CString g_bstr_space2 = L" ";
static _bstr_t g_bstr_basicscript = L"function b(c) { c.beginPath(); }\nfunction m(c,x,y) { c.moveTo(x,y); }\nfunction l(c,x,y) { c.lineTo(x,y); }\nfunction cu(c,x1,y1,x2,y2,x3,y3) { c.bezierCurveTo(x1,y1,x2,y2,x3,y3); }\nfunction s(c) { c.stroke(); }\nfunction f(c) { c.fill(); }\nfunction x(c) { c.closePath(); }\n\n";
static CString g_bstr_basicscript = L"function b(c) { c.beginPath(); }\nfunction m(c,x,y) { c.moveTo(x,y); }\nfunction l(c,x,y) { c.lineTo(x,y); }\nfunction cu(c,x1,y1,x2,y2,x3,y3) { c.bezierCurveTo(x1,y1,x2,y2,x3,y3); }\nfunction s(c) { c.stroke(); }\nfunction f(c) { c.fill(); }\nfunction x(c) { c.closePath(); }\n\n";
#pragma once
#include "..\stdafx.h"
#pragma once
//#include "..\stdafx.h"
#include "StringWriter.h"
#include <atlbase.h>
#include <atlcoll.h>
#include <vector>
namespace NSHtmlRenderer
{
using namespace NSStrings;
static CString g_svg_string_svgOpen = _T("<svg width=\"%dpx\" height=\"%dpx\" viewBox=\"0 0 %d %d\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n");
static _bstr_t g_svg_bstr_svgClose = L"</svg>";
static CString g_svg_bstr_svgClose = L"</svg>";
static CString g_svg_string_image = _T("<image x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" xlink:href=\"%s\" preserveAspectRatio=\"none\"/>\n");
static _bstr_t g_svg_bstr_graphicOpen = L"<g>\n";
static _bstr_t g_svg_bstr_graphicClose = L"</g>\n";
static CString g_svg_bstr_graphicOpen = L"<g>\n";
static CString g_svg_bstr_graphicClose = L"</g>\n";
static _bstr_t g_svg_bstr_path_d = L" d=\"";
static _bstr_t g_svg_bstr_path_d_end = L"\" ";
static CString g_svg_bstr_path_d = L" d=\"";
static CString g_svg_bstr_path_d_end = L"\" ";
static CString g_svg_string_clip = _T("clip-path=\"url(#clip%d)\" ");
static CString g_svg_string_clipCreate = _T("<clipPath id=\"clip%d\"><path id=\"path%d\" d=\"");
static _bstr_t g_svg_bstr_clipendWinding = _T("\" clip-rule=\"nonzero\" /></clipPath>");
static _bstr_t g_svg_bstr_clipendEvenodd = _T("\" clip-rule=\"evenodd\" /></clipPath>");
static CString g_svg_bstr_clipendWinding = _T("\" clip-rule=\"nonzero\" /></clipPath>");
static CString g_svg_bstr_clipendEvenodd = _T("\" clip-rule=\"evenodd\" /></clipPath>");
static CString g_svg_string_gclip = _T("<g clip-path=\"url(#clip%d)\">");
static _bstr_t g_svg_bstr_vml_ClosePath = L"Z ";
static CString g_svg_bstr_vml_ClosePath = L"Z ";
static CString g_svg_string_vml_MoveTo = _T("M %d,%d ");
static CString g_svg_string_vml_LineTo = _T("L %d,%d ");
static CString g_svg_string_vml_CurveTo = _T("C %d,%d %d,%d %d,%d ");
static _bstr_t g_svg_bstr_vml_Path = L"<path ";
static _bstr_t g_svg_bstr_nodeClose = L" />\n";
static CString g_svg_bstr_vml_Path = L"<path ";
static CString g_svg_bstr_nodeClose = L" />\n";
static CString g_svg_string_vml_StyleStrokeDash = _T("style=\"fill:none;stroke:#%06x;stroke-width:%dpx;stroke-opacity:%.2lf;stroke-dasharray: 2,2;\" ");
static CString g_svg_string_vml_StyleStroke = _T("style=\"fill:none;stroke:#%06x;stroke-width:%dpx;stroke-opacity:%.2lf;\" ");
static CString g_svg_string_vml_StyleFill = _T("style=\"fill:#%06x;fill-opacity:%.2lf;fill-rule:%s;stroke:none\" ");
......@@ -75,15 +74,15 @@ namespace NSHtmlRenderer
static CString g_svg_string_vml_StyleTx = _T("style=\"fill:url(#pt%d);fill-opacity:%.2lf;fill-rule:%s;stroke:#%06x;stroke-width:%dpx;stroke-opacity:%.2lf\" ");
static CString g_svg_object_start = _T("<object class=\"_svg\" data=\"page%d.svg\" type=\"image/svg+xml\">");
static _bstr_t g_svg_object_end = L"</object>";
static CString g_svg_object_end = L"</object>";
static CString g_string_intersect_clip = _T("<clipPath id=\"clip%d\" clip-path=\"url(#clip%d)\"><use x=\"0\" y=\"0\" width=\"%d\" height=\"%d\" xlink:href=\"#path%d\"/></clipPath>");
class CClipSVG
{
public:
CAtlArray<CString> m_arPaths;
CAtlArray<LONG> m_arTypes;
std::vector<CString> m_arPaths;
std::vector<LONG> m_arTypes;
LONG m_lWidth;
LONG m_lHeight;
......@@ -99,8 +98,8 @@ namespace NSHtmlRenderer
void Write(NSHtmlRenderer::CStringWriter& oWriter, LONG& lCurrentClipPath)
{
//
size_t nCount = m_arPaths.GetCount();
// сначала запишем все пути
size_t nCount = m_arPaths.size();
for (size_t i = 0; i < nCount; ++i)
{
......@@ -118,7 +117,7 @@ namespace NSHtmlRenderer
}
LONG lWritePathID = (LONG)lCurrentClipPath - 2;
//
// теперь запишем пересечения
for (size_t i = 1; i < nCount; ++i)
{
CString strWrite = _T("");
......@@ -131,8 +130,8 @@ namespace NSHtmlRenderer
void Write2(NSHtmlRenderer::CStringWriter& oWriter, LONG& lCurrentClipPath)
{
//
size_t nCount = m_arPaths.GetCount();
// сначала запишем все пути
size_t nCount = m_arPaths.size();
double dMemoryClipTypes = 0;
for (size_t i = 0; i < nCount; ++i)
{
......@@ -159,22 +158,22 @@ namespace NSHtmlRenderer
++lCurrentClipPath;
}
__forceinline void Clear()
AVSINLINE void Clear()
{
m_arPaths.RemoveAll();
m_arTypes.RemoveAll();
m_arPaths.clear();
m_arTypes.clear();
}
__forceinline bool IsInit()
AVSINLINE bool IsInit()
{
return (0 != m_arPaths.GetCount());
return (0 != m_arPaths.size());
}
};
class CClipSVG2
{
public:
CAtlArray<CString> m_arPaths;
CAtlArray<LONG> m_arTypes;
std::vector<CString> m_arPaths;
std::vector<LONG> m_arTypes;
LONG m_lWidth;
LONG m_lHeight;
......@@ -194,8 +193,8 @@ namespace NSHtmlRenderer
void Write(NSHtmlRenderer::CStringWriter& oWriter, LONG& lCurrentClipPath)
{
//
size_t nCount = m_arPaths.GetCount();
// сначала запишем все пути
size_t nCount = m_arPaths.size();
LONG lOld = lCurrentClipPath;
for (size_t i = 0; i < nCount; ++i)
......@@ -232,14 +231,14 @@ namespace NSHtmlRenderer
}
}
__forceinline void Clear()
AVSINLINE void Clear()
{
m_arPaths.RemoveAll();
m_arTypes.RemoveAll();
m_arPaths.clear();
m_arTypes.clear();
}
__forceinline bool IsInit()
AVSINLINE bool IsInit()
{
return (0 != m_arPaths.GetCount());
return (0 != m_arPaths.size());
}
};
......@@ -319,9 +318,12 @@ namespace NSHtmlRenderer
m_oDocument.WriteString(g_svg_bstr_svgClose);
//CDirectory::SaveToFile(strFile, m_oDocument.GetCString());
NSFile::CFileBinary oFile;
oFile.CreateFile(std::wstring(strFile.GetString()));
CStringA strA(m_oDocument.GetBuffer(), (int)m_oDocument.GetCurSize());
oFile.WriteFile((BYTE*)strA.GetBuffer(), strA.GetLength());
oFile.CreateFileW(std::wstring(strFile.GetString()));
BYTE* pData;
LONG nDataSize;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(m_oDocument.GetBuffer(), m_oDocument.GetCurSize(), pData, nDataSize);
oFile.WriteFile(pData, nDataSize);
RELEASEARRAYOBJECTS(pData);
}
if (3000000 < m_oDocument.GetSize())
......@@ -557,7 +559,7 @@ namespace NSHtmlRenderer
int _w = round(r - x);
int _h = round(b - y);
//
// пока заглушка
return WriteImage(oInfo, _x, _y, _w, _h, dAngle);
CString strPattern = _T("");
......@@ -656,8 +658,8 @@ namespace NSHtmlRenderer
if (0 == m_oPath.GetCurSize())
return;
m_oClip.m_arPaths.Add(m_oPath.GetCString());
m_oClip.m_arTypes.Add(m_lClipMode);
m_oClip.m_arPaths.push_back(m_oPath.GetCString());
m_oClip.m_arTypes.push_back(m_lClipMode);
}
void WritePathResetClip()
{
......@@ -786,4 +788,4 @@ namespace NSHtmlRenderer
}
}
};
}
\ No newline at end of file
}
......@@ -47,11 +47,6 @@ namespace NSStrings
public:
AVSINLINE void WriteString(_bstr_t& bsString)
{
size_t nLen = bsString.length();
CTextItem::WriteString(bsString.GetBSTR(), nLen);
}
AVSINLINE void WriteString(CString& sString)
{
size_t nLen = (size_t)sString.GetLength();
......
#pragma once
#include "../stdafx.h"
#pragma once
//#include "../stdafx.h"
#ifdef _WIN32
#include <atlbase.h>
#include <atlcom.h>
#else
#include "../../Common/DocxFormat/Source/Base/ASCString.h"
#endif
#ifndef AVSINLINE
#if defined(_MSC_VER)
......@@ -99,7 +106,7 @@ namespace NSStrings
{
if (NULL == m_pData)
{
m_lSize = max(nSize, 1000);
m_lSize = nSize > 1000 ? nSize : 1000;
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
m_lSizeCur = 0;
......@@ -117,7 +124,7 @@ namespace NSStrings
wchar_t* pRealloc = (wchar_t*)realloc(m_pData, m_lSize * sizeof(wchar_t));
if (NULL != pRealloc)
{
//
// реаллок сработал
m_pData = pRealloc;
m_pDataCur = m_pData + m_lSizeCur;
}
......@@ -139,11 +146,6 @@ namespace NSStrings
{
WriteString(oTemp.m_pData, oTemp.m_lSizeCur);
}
AVSINLINE void operator+=(_bstr_t& oTemp)
{
size_t nLen = oTemp.length();
WriteString(oTemp.GetBSTR(), nLen);
}
AVSINLINE void operator+=(CString& oTemp)
{
size_t nLen = (size_t)oTemp.GetLength();
......@@ -216,7 +218,7 @@ namespace NSStrings
}
public:
AVSINLINE void WriteString(wchar_t* pString, const size_t& nLen)
AVSINLINE void WriteString(const wchar_t* pString, const size_t& nLen)
{
AddSize(nLen);
//memcpy(m_pDataCur, pString, nLen * sizeof(wchar_t));
......@@ -253,9 +255,9 @@ namespace NSStrings
m_lSizeCur = 0;
}
AVSINLINE size_t GetStringLen(wchar_t* pData)
AVSINLINE size_t GetStringLen(const wchar_t* pData)
{
wchar_t* s = pData;
const wchar_t* s = pData;
for (; *s != 0; ++s);
return (size_t)(s - pData);
}
......@@ -374,4 +376,4 @@ namespace NSStrings
++m_lSizeCur;
}
};
}
\ No newline at end of file
}
#pragma once
#include "..\stdafx.h"
//#include "..\stdafx.h"
#include "StringWriter.h"
namespace NSHtmlRenderer
{
using namespace NSStrings;
static _bstr_t g_vml_bstr_ClosePath = L"x";
static CString g_vml_bstr_ClosePath = L"x";
static CString g_vml_string_MoveTo = _T("m%d,%d ");
static CString g_vml_string_LineTo = _T("l%d,%d ");
static CString g_vml_string_CurveTo = _T("c%d,%d,%d,%d,%d,%d ");
......@@ -24,7 +24,7 @@ namespace NSHtmlRenderer
static CString g_vml_string_shape_image_png = _T("<v:image src=\"media/image%d.png\" style=\"left:%d;top:%d;width:%d;height:%d;\"/>");
static CString g_vml_string_document = _T("<xml xmlns:v=\"urn:schemas-microsoft-com:vml\">\n<v:group id=\"page%d\" style=\"position: absolute; width:1; height:1;\" coordsize=\"1 1\">\n");
static _bstr_t g_vml_bstr_document_end = L"</v:group>\n</xml>";
static CString g_vml_bstr_document_end = L"</v:group>\n</xml>";
static CString g_vml_string_frame = _T("<v:vmlframe clip=\"true\" origin=\"0,0\" size=\"%d,%d\" src=\"page%d.vml#page%d\" unselectable=\"on\"/>\n");
......@@ -82,9 +82,12 @@ namespace NSHtmlRenderer
m_oDocument.WriteString(g_vml_bstr_document_end);
//CDirectory::SaveToFile(strFile, m_oDocument.GetCString());
NSFile::CFileBinary oFile;
oFile.CreateFile(std::wstring(strFile.GetString()));
CStringA strA(m_oDocument.GetBuffer(), (int)m_oDocument.GetCurSize());
oFile.WriteFile((BYTE*)strA.GetBuffer(), strA.GetLength());
oFile.CreateFileW(std::wstring(strFile.GetString()));
BYTE* pData;
LONG nDataSize;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(m_oDocument.GetBuffer(), m_oDocument.GetCurSize(), pData, nDataSize);
oFile.WriteFile(pData, nDataSize);
RELEASEARRAYOBJECTS(pData);
}
if (3000000 < m_oDocument.GetSize())
......@@ -297,4 +300,4 @@ namespace NSHtmlRenderer
}
}
};
}
\ No newline at end of file
}
#pragma once
#pragma once
//#include "Const.h"
#include "SVGWriter.h"
#include "VMLWriter.h"
#include "CanvasWriter.h"
#include "../DesktopEditor/graphics/GraphicsPath.h"
//#include "CanvasWriter.h"
#include "../../DesktopEditor/graphics/GraphicsPath.h"
namespace NSHtmlRenderer
{
......@@ -13,7 +13,7 @@ namespace NSHtmlRenderer
public:
CSVGWriter m_oSVG;
CVMLWriter m_oVML;
CCanvasWriter m_oCanvas;
//CCanvasWriter m_oCanvas;
Aggplus::CGraphicsPathSimpleConverter* m_pSimpleConverter;
......@@ -29,7 +29,7 @@ namespace NSHtmlRenderer
double m_dHeight;
public:
CVectorGraphicsWriter() : m_oSVG(), m_oVML(), m_oCanvas()
CVectorGraphicsWriter() : m_oSVG(), m_oVML()/*, m_oCanvas()*/
{
m_pSimpleConverter = NULL;
m_lCurrentObjectInPage = 0;
......@@ -108,10 +108,10 @@ namespace NSHtmlRenderer
}
inline void WriteDrawPath(LONG lType, CImageInfo& oInfo, const double& dAngle)
{
// pdf
// , path - - .
// . ,
// -
// вот мега заглушка под некоторые таблицы из pdf
// проблема в том, что приходит path нулевой толщины - а след-но он не рисуется.
// здесь это отслеживаем и правим пат. Не очень хорошо, так как всякие пунктирности
// в таких патах - теряются при таком подходе
if (0x00 == (lType & 0xFF))
{
double x = 0;
......@@ -196,7 +196,7 @@ namespace NSHtmlRenderer
inline bool IsGraphics()
{
// 10
// 10 цифр на номер страницы
return ((g_vml_string_document.GetLength() + 10) < (int)m_oVML.m_oDocument.GetCurSize());
}
......@@ -307,8 +307,8 @@ namespace NSHtmlRenderer
inline bool IsGraphics()
{
// 10
// 10 цифр на номер страницы
return ((g_vml_string_document.GetLength() + 10) < (int)m_oSVG.m_oDocument.GetCurSize());
}
};
}
\ No newline at end of file
}
#ifndef _RENDERER_OUTPUT_H
#ifndef _RENDERER_OUTPUT_H
#define _RENDERER_OUTPUT_H
#ifdef DESKTOP_EDITOR_GRAPHICS
......@@ -15,18 +15,18 @@
#include "WmfUtils.h"
#include "WmfCharsets.h"
//------ ----------------------------------------------------
//#define NO_PIE // Draw_Pie
//#define NO_ARC // Draw_Arc
//#define NO_ELLIPSE // Draw_Ellipse
//#define NO_LINE // Draw_Line
//#define NO_POLYGON // Draw_Polygon
//#define NO_POLYGONS // Draw_Polypolygon
//#define NO_POLYLINE // Draw_Polyline
//#define NO_CLIP // Region_Clip
//#define NO_RECT // Draw_Rectangle
//#define NO_TEXT // Draw_Text
//#define DRAW_BOUNDS //
//------ Для дебага ----------------------------------------------------
//#define NO_PIE // отключаем команду Draw_Pie
//#define NO_ARC // отключаем команду Draw_Arc
//#define NO_ELLIPSE // отключаем команду Draw_Ellipse
//#define NO_LINE // отключаем команду Draw_Line
//#define NO_POLYGON // отключаем команду Draw_Polygon
//#define NO_POLYGONS // отключаем команду Draw_Polypolygon
//#define NO_POLYLINE // отключаем команду Draw_Polyline
//#define NO_CLIP // отключаем комануд Region_Clip
//#define NO_RECT // отключаем команду Draw_Rectangle
//#define NO_TEXT // отключаем комунду Draw_Text
//#define DRAW_BOUNDS // рисуем границы
//----------------------------------------------------------------------
#define RGBA(r, g, b) ((DWORD)( ( (BYTE)(r) )| ( ( (BYTE)(g) ) << 8 ) | ( ( (BYTE)(b) ) << 16 ) | ( (BYTE)(0) << 24 ) ) )
......@@ -98,18 +98,18 @@ public:
void Flood_Interior(TWmfFlood *pFlood)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k = 10;
}
void Flood_Exterior(TWmfFlood *pFlood)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k = 10;
}
void Draw_Pixel (TWmfDrawPixel *pDrawPixel)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k =10;
}
......@@ -192,7 +192,7 @@ public:
}
void Draw_Chord (TWmfDrawArc *pArc)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k =10;
}
void Draw_Arc (TWmfDrawArc *pArc)
......@@ -479,7 +479,7 @@ public:
m_pRenderer->PathCommandEnd();
if ( 0 == pRect->fWidth && 0 == pRect->fHeight ) //
if ( 0 == pRect->fWidth && 0 == pRect->fHeight ) // Простой прямоугольник
{
double dX = pRect->oTL.fX;
double dY = pRect->oTL.fY;
......@@ -504,7 +504,7 @@ public:
m_pRenderer->PathCommandClose();
}
else //
else // прямоугольник с закругленными углами
{
double dA = pRect->fWidth / 2;
double dB = pRect->fHeight / 2;
......@@ -573,7 +573,7 @@ public:
void Rop_Draw(TWmfROPDraw *pROP)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k =10;
}
void Bmp_Draw(TWmfBMPDraw *pDrawBitmap)
......@@ -625,7 +625,7 @@ public:
pInterface = pMediaData;
#endif
// pBufferPtr
// Пишем данные в pBufferPtr
for ( int nIndex = 0; nIndex < 4 * nWidth * nHeight; nIndex += 4 )
{
......@@ -660,7 +660,7 @@ public:
BYTE *pBuffer = pReadBitmap->pBuffer;
long lBufLen = pReadBitmap->lLength;
//
// Считываем заголовок
unsigned int unHeaderSize = ReadUInt ( pBuffer ); pBuffer += 4; lBufLen -=4;
if ( unHeaderSize < 0x0000000C )
......@@ -686,7 +686,9 @@ public:
double dSize = pText->dFontHeight * m_dScaleY * 72 / 25.4;
SetFont( pText->pDC, dSize );
#ifndef DESKTOP_EDITOR_GRAPHICS
USES_CONVERSION;
#endif
double dTheta = - ( ( ( (double)pText->pDC->pFont->shEscapement ) / 10 ) * M_PI / 180 );
......@@ -700,9 +702,9 @@ public:
{
TWmfFont *pFont = pText->pDC->pFont;
long lStyle = ( pFont->ushWeight > 550 ? 1 : 0 ) + ( pFont->unItalic ? 2 : 0 );
m_pWmfFile->m_pFontManager->LoadFontByName( A2W(pText->pDC->pFont->sFaceName), dSize, lStyle, 72, 72 );
#ifdef DESKTOP_EDITOR_GRAPHICS
m_pWmfFile->m_pFontManager->LoadString2( A2W(pText->sText), 0, 0 );
m_pWmfFile->m_pFontManager->LoadFontByName( UTF8_TO_U(pText->pDC->pFont->sFaceName), dSize, lStyle, 72, 72 );
m_pWmfFile->m_pFontManager->LoadString2( UTF8_TO_U(pText->sText), 0, 0 );
TBBox oBox = m_pWmfFile->m_pFontManager->MeasureString2();
fL = oBox.fMinX;
fT = oBox.fMinY;
......@@ -710,6 +712,7 @@ public:
fH = oBox.fMaxY - oBox.fMinY;
m_pWmfFile->m_pFontManager->GetUnderline( &fUndX1, &fUndY1, &fUndX2, &fUndY2, &fUndSize );
#else
m_pWmfFile->m_pFontManager->LoadFontByName( A2W(pText->pDC->pFont->sFaceName), dSize, lStyle, 72, 72 );
m_pWmfFile->m_pFontManager->LoadStringW( A2W(pText->sText), 0, 0 );
m_pWmfFile->m_pFontManager->MeasureString2( &fL, &fT, &fW, &fH );
m_pWmfFile->m_pFontManager->GetUnderline( &fUndX1, &fUndY1, &fUndX2, &fUndY2, &fUndSize );
......@@ -733,11 +736,11 @@ public:
dY = pText->oOrigin.fY;
Trans( pText->pDC, &dX, &dY );
//
// Найдем начальную точку текста
if ( pText->pDC->ushTextAlign & TA_BASELINE )
{
//
// Ничего не делаем
}
else if ( pText->pDC->ushTextAlign & TA_BOTTOM )
{
......@@ -766,7 +769,7 @@ public:
}
else //if ( pText->pDC->ushTextAlign & TA_LEFT )
{
//
// Ничего не делаем
}
}
else
......@@ -786,18 +789,21 @@ public:
}
CStringW wsText = TextToUnicode( pText->pDC, pText->sText );
#ifdef DESKTOP_EDITOR_GRAPHICS
std::wstring bsText = wsText.GetString();
#else
BSTR bsText = wsText.AllocSysString();
#endif
bool bChangeCTM = false;
if ( 0 != pText->pDC->pFont->shEscapement )
{
// TO DO: shEscapement, shOrientation
// TO DO: тут реализован только параметр shEscapement, еще нужно реализовать параметр shOrientation
m_pRenderer->SetTransform( fCosTheta, fSinTheta, -fSinTheta, fCosTheta, dX - dX * fCosTheta + dY * fSinTheta, dY - dX * fSinTheta - dY * fCosTheta );
bChangeCTM = true;
}
//
// Для начала нарисуем фон текста
if ( OPAQUE == pText->pDC->ushBGMode )
{
......@@ -838,7 +844,7 @@ public:
m_pRenderer->put_BrushAlpha1(m_oBrush.Alpha1);
}
//
// Нарисуем подчеркивание
if ( pText->pDC->pFont->unUnderline )
{
double dOldSize = m_oPen.Size;
......@@ -863,11 +869,13 @@ public:
m_pRenderer->put_PenLineStartCap( unOldStartCap );
}
//
// Рисуем сам текст
m_pRenderer->CommandDrawText( bsText, (float)dX, (float)(dY ), 0, 0, 0 );
#ifndef DESKTOP_EDITOR_GRAPHICS
::SysFreeString( bsText );
#endif
if ( bChangeCTM )
m_pRenderer->ResetTransform( );
......@@ -876,12 +884,12 @@ public:
void Region_Frame(TWmfPolyRectangle *pRect)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k =10;
}
void Region_Paint(TWmfPolyRectangle *pRect)
{
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
int k =10;
}
void Region_Clip (TWmfPolyRectangle *pRect)
......@@ -890,7 +898,7 @@ public:
return;
#endif
// TO DO: ,
// TO DO: Сделать, как будут тестовые файлы
m_pRenderer->BeginCommand( c_nResetClipType );
m_pRenderer->EndCommand( c_nResetClipType );
......@@ -1023,7 +1031,7 @@ private:
CStringW TextToUnicode(TWmfDC *pDC, char *sText)
{
// Charset -> Codepage: http://support.microsoft.com/kb/165478
// Соответствие Charset -> Codepage: http://support.microsoft.com/kb/165478
// http://msdn.microsoft.com/en-us/library/cc194829.aspx
// Charset Name Charset Value(hex) Codepage number
......@@ -1096,7 +1104,7 @@ private:
}
else if ( SYMBOL_CHARSET == pDC->pFont->unCharSet )
{
// , 0xF000 ( :))
// Ко всем символам, кроме пробела добавляем 0xF000 (Вот и вся кодировка :))
wchar_t *wsText = new wchar_t[strlen(sText) + 1];
if ( NULL == wsText )
......@@ -1118,7 +1126,7 @@ private:
}
else if ( MAC_CHARSET == pDC->pFont->unCharSet )
{
//
// Не используется
return _T("");
}
......@@ -1356,16 +1364,16 @@ private:
return _T("");
wsText[nLen] = '\0';
//
#ifdef _WIN32
// Пытаемся воспользоваться системной функцией
if ( !OemToCharBuffW( sText, wsText, nLen ) )
{
// - . .
// Системная функция почему-то не сработала. Конвертируем самостоятельно.
//
// Запрашиваем кодировку
UINT unCP = GetOEMCP();
// , CP866 ( , unCP)
// Предполагаем, что кодировка CP866 (на самом деле, надо исходить из unCP)
for ( int nIndex = 0; nIndex < nLen; nIndex++ )
{
unsigned char unChar = (unsigned char)(sText[nIndex]);
......@@ -1375,7 +1383,7 @@ private:
wsText[nIndex] = (wchar_t)( c_anUnicodeMapCP866[unChar - MSCP_FIRST_CHAR] );
}
}
#endif
CStringW wsResult( wsText );
delete []wsText;
......@@ -1406,7 +1414,7 @@ private:
unsigned short ushPenJoin = pPen->ushStyle & PS_JOIN_MASK;
unsigned short ushPenStyle = pPen->ushStyle & PS_STYLE_MASK;
byte nCapStyle = 0;
BYTE nCapStyle = 0;
if ( 0 == ushPenEndCap )
nCapStyle = 2;
else if ( 1 == ushPenEndCap )
......@@ -1417,7 +1425,7 @@ private:
m_oPen.LineStartCap = nCapStyle;
m_oPen.LineEndCap = nCapStyle;
byte nJoinStyle = 0;
BYTE nJoinStyle = 0;
if ( 0 == ushPenJoin )
nJoinStyle = 2;
else if ( 1 == ushPenJoin )
......@@ -1428,7 +1436,7 @@ private:
m_oPen.LineJoin = nJoinStyle;
if ( PS_NULL != ushPenStyle )
m_oPen.DashStyle = (byte)ushPenStyle;
m_oPen.DashStyle = (BYTE)ushPenStyle;
m_pRenderer->put_PenDashStyle( m_oPen.DashStyle );
m_pRenderer->put_PenLineJoin( m_oPen.LineJoin );
......@@ -1438,9 +1446,9 @@ private:
m_pRenderer->put_PenSize( m_oPen.Size );
m_pRenderer->put_PenAlpha( 255 );
// TO DO: AVSRenderer, ushROPMode
// .
// Pen'a, .
// TO DO: С текущим интерфейсом AVSRenderer, остальные случаи ushROPMode
// реализовать невозможно. Потому что данный параметр нужно протаскивать
// как параметр Pen'a, и тот кто рисует сам должен разруливать все случаи.
switch (pDC->ushROPMode)
{
......@@ -1475,7 +1483,7 @@ private:
}
else if ( BS_PATTERN == pBrush->ushStyle )
{
// TO DO:
// TO DO: сделать этот вариант
}
else if ( BS_DIBPATTERN == pBrush->ushStyle )
{
......@@ -1526,7 +1534,7 @@ private:
pInterface = pMediaData;
#endif
// pBufferPtr
// Пишем данные в pBufferPtr
for ( int nIndex = 0; nIndex < 4 * nWidth * nHeight; nIndex += 4 )
{
......@@ -1574,13 +1582,13 @@ private:
//m_oBrush.SetTexturePath( wsTempFileName );
//m_oBrush.SetTextureMode( 1 );
//m_oBrush.SetType( 8 ); //
//m_oBrush.SetType( 8 ); // Текстурный
//BSTR bsBrush = m_oBrush.ToXmlString().AllocSysString();
//m_pRenderer->SetBrush( bsBrush );
//::SysFreeString( bsBrush );
// TO DO: ,
// TO DO: Либо переделать этот вариант, либо разобраться что делать с темповым файлом в конце
return true;
}
......@@ -1623,11 +1631,14 @@ private:
bool SetFont (TWmfDC *pDC, double dFontHeight)
{
TWmfFont *pFont = pDC->pFont;
#ifdef DESKTOP_EDITOR_GRAPHICS
m_pRenderer->put_FontName(UTF8_TO_U(pFont->sFaceName));
#else
CString strName(pFont->sFaceName);
BSTR bsName = strName.AllocSysString();
m_pRenderer->put_FontName(bsName);
SysFreeString(bsName);
#endif
m_pRenderer->put_FontSize(dFontHeight);
......@@ -1644,7 +1655,7 @@ private:
m_pRenderer->put_FontStyle(lStyle);
//
// Установим цвет текста и фона
m_oBrush.Color1 = ( RGB( pDC->oTextColor.r, pDC->oTextColor.g, pDC->oTextColor.b ) );
m_oBrush.Alpha1 = ( 255 );
......@@ -1714,12 +1725,12 @@ private:
return false;
if ( BI_BITCOUNT_0 == ushBitCount ) // PNG, JPEG
if ( BI_BITCOUNT_0 == ushBitCount ) // Значит компрессия либо PNG, либо JPEG
{
if ( BI_JPEG != unCompression || BI_PNG != unCompression )
return false;
// ImageStudio
// Читаем через ImageStudio
//todo
#ifndef DESKTOP_EDITOR_GRAPHICS
USES_CONVERSION;
......@@ -1734,7 +1745,7 @@ private:
IUnknown* punkFrame = ImageStudio::ISLoadImage(bsFilePath);
SysFreeString(bsFilePath);
// TO DO:
// TO DO: Сделать чтение
RELEASEINTERFACE(punkFrame);
//VARIANT oVar;
......@@ -1748,7 +1759,7 @@ private:
}
else if ( BI_BITCOUNT_1 == ushBitCount )
{
// , 2-
// Двуцветная картинка, значит палитра состоит из 2-х цветов
TWmfRGB oColor1, oColor2;
oColor1.r = ReadByte( pBuffer ); pBuffer++; lBufLen--;
......@@ -1761,7 +1772,7 @@ private:
oColor2.b = ReadByte( pBuffer ); pBuffer++; lBufLen--;
pBuffer++; lBufLen--;
//
// Считываем саму картинку
long lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight);
if ( lCalcLen != lBufLen )
return false;
......@@ -1814,7 +1825,7 @@ private:
}
else if ( BI_BITCOUNT_2 == ushBitCount )
{
// TO DO: ,
// TO DO: Сделать данный вариант, как только будет файлы с данным типом
int nTODO = 100;
......@@ -1832,7 +1843,7 @@ private:
if ( lBufLen < ushColorTableLen * 4 )
return false;
//
// Считываем палитру
for ( unsigned short ushIndex = 0; ushIndex < ushColorTableLen; ushIndex++ )
{
oColorTable[ushIndex].r = ReadByte( pBuffer ); pBuffer++; lBufLen--;
......@@ -1841,9 +1852,9 @@ private:
pBuffer++; lBufLen--;
}
// 1 - 1
// 1 байт - 1 пиксел
// 4.
// Ширина должна быть кратна 4.
int nAdd = 0;
while ( 0 != div_t(div( nWidth + nAdd, 4 )).rem )
{
......@@ -1902,7 +1913,7 @@ private:
}
else if ( BI_BITCOUNT_4 == ushBitCount )
{
// TO DO: ,
// TO DO: Сделать данный вариант, как только будет файлы с данным типом
int nTODO = 100;
......@@ -1910,19 +1921,19 @@ private:
}
else if ( BI_BITCOUNT_5 == ushBitCount )
{
// ( )
// Пропускаем таблицу цветов (она не нужна)
pBuffer += unColorUsed * 4; lBufLen -= unColorUsed * 4;
if ( BI_RGB != unCompression )
return false; // TO DO: ,
return false; // TO DO: Сделать данный вариант, как только будет файлы с данным типом
//
// Считываем саму картинку
long lCalcLen = (((nWidth * ushPlanes * ushBitCount + 31) & ~31) / 8) * abs(nHeight);
if ( lCalcLen != lBufLen )
return false;
// 1
// ( * 3) 4.
// 1 байт на каждый канал
// (Ширина * 3) должна быть кратна 4.
int nAdd = 0;
while ( 0 != div_t(div( 3 * nWidth + nAdd, 4 )).rem )
{
......@@ -1973,7 +1984,7 @@ private:
}
else if ( BI_BITCOUNT_6 == ushBitCount )
{
// TO DO: ,
// TO DO: Сделать данный вариант, как только будет файлы с данным типом
int nTODO = 100;
......@@ -2003,15 +2014,15 @@ private:
double m_dDpiX;
double m_dDpiY;
TWmfRectF m_oWmfRect; // ,
double m_dX; //
TWmfRectF m_oWmfRect; // Общий рект, в котором рисуется вся картинка
double m_dX; // Координаты левого верхнего угла
double m_dY; //
double m_dScaleX; // /,
double m_dScaleY; // .
double m_dScaleX; // Коэффициенты сжатия/растяжения, чтобы
double m_dScaleY; // результирующая картинка была нужных размеров.
double m_dX1;
double m_dY1;
CWmfFile *m_pWmfFile;
};
#endif /* _RENDERER_OUTPUT_H */
\ No newline at end of file
#endif /* _RENDERER_OUTPUT_H */
#ifndef _WMF_FILE_H
#ifndef _WMF_FILE_H
#define _WMF_FILE_H
#include <stdio.h>
......@@ -17,6 +17,14 @@
#include "..\..\Font\FontUtils.h"
#endif
#ifndef AVSINLINE
#if defined(_MSC_VER)
#define AVSINLINE __forceinline
#else
#define AVSINLINE inline
#endif
#endif
#ifdef _DEBUG
//#define DebugWriteXml
#endif
......@@ -93,8 +101,12 @@ public:
delete m_pBufferData;
FILE *pFile = NULL;
#ifdef _WIN32
if ( NULL == ( pFile = _wfopen( wsFilePath, _T("rb") ) ) )
#else
std::string sFilePath = U_TO_UTF8(wsFilePath);
if ( NULL == ( pFile = fopen( sFilePath.c_str(), "rb" ) ) )
#endif
{
m_eError = wmf_error_BadFile;
return FALSE;
......@@ -422,7 +434,7 @@ public:
double dBoundHeight = pPlayer->oBoundBR.fY - pPlayer->oBoundTL.fY;
//// ,
//// Если рисунок не убирается в границы заданные в файле, тогда используем границы самого рисунка
//if ( dDisplayWidth > dBoundWidth || dDisplayHeight > dBoundHeight )
//{
// oRect.oBR = pPlayer->oBoundBR;
......@@ -573,7 +585,7 @@ private:
return -1;
}
//------------------------------------------------------------------------------------------------------------------------
__forceinline void WriteHeader (long lHeaderStart, long lHeaderEnd)
AVSINLINE void WriteHeader (long lHeaderStart, long lHeaderEnd)
{
#ifndef DebugWriteXml
return;
......@@ -623,7 +635,7 @@ private:
m_oMemoryManager.Free( sHeader );
}
__forceinline void Write(unsigned long ulSize, unsigned int unFunction, const char *sName, char **psAttrs, const unsigned char *sBuffer, unsigned long ulLength)
AVSINLINE void Write(unsigned long ulSize, unsigned int unFunction, const char *sName, char **psAttrs, const unsigned char *sBuffer, unsigned long ulLength)
{
#ifndef DebugWriteXml
return;
......@@ -682,7 +694,7 @@ private:
fprintf( pInfo->pFile, " </%s>\n", sName );
}
__forceinline void WriteBegin(const char *sFileName)
AVSINLINE void WriteBegin(const char *sFileName)
{
#ifndef DebugWriteXml
return;
......@@ -745,7 +757,7 @@ private:
WriteStr("<wmfxml>\n");
}
}
__forceinline void WriteEnd()
AVSINLINE void WriteEnd()
{
#ifndef DebugWriteXml
return;
......@@ -763,7 +775,7 @@ private:
m_pWriteData = 0;
}
__forceinline void WriteStr (const char *sString)
AVSINLINE void WriteStr (const char *sString)
{
#ifndef DebugWriteXml
return;
......@@ -783,7 +795,7 @@ private:
fputs( sString, pInfo->pFile );
}
__forceinline void WriteB64(const unsigned char *sBuffer, unsigned long ulLength)
AVSINLINE void WriteB64(const unsigned char *sBuffer, unsigned long ulLength)
{
#ifndef DebugWriteXml
return;
......@@ -1006,7 +1018,7 @@ private:
void SetDefaults(TWmfPen *pPen, TWmfBrush *pBrush, TWmfFont *pFont)
{
pPen->oColor = c_oColorBlack;
pPen->dWidth = 0; // 0 - 1 Dpi
pPen->dWidth = 0; // 0 - это 1 при любом Dpi
pPen->dHeight = 1;
pPen->ushStyle = (pPen->ushStyle & ~PS_STYLE_MASK ) | (PS_SOLID & PS_STYLE_MASK );
pPen->ushStyle = (pPen->ushStyle & ~PS_ENDCAP_MASK) | (PS_ENDCAP_ROUND & PS_ENDCAP_MASK);
......@@ -1331,7 +1343,7 @@ private:
case META_SETVIEWPORTEXT: // 2.3.5.28
pPlayer->unViewportWidth = nParX;
pPlayer->unViewportHeight = nParY;
GetPixelWidth(); // Dpi
GetPixelWidth(); // пересчитываем Dpi
GetPixelHeight(); //
break;
......@@ -1342,7 +1354,7 @@ private:
pPlayer->oWindow.nWidth = nParX;
pPlayer->oWindow.nHeight = nParY;
GetPixelWidth(); // Dpi
GetPixelWidth(); // пересчитываем Dpi
GetPixelHeight(); //
{
......@@ -1382,10 +1394,10 @@ private:
{
TWmfPlayer *pPlayer = (TWmfPlayer*)m_pPlayerData;
double dNumX = (double) Record_GetIntPar( pRecord, 3 ); //
double dDenomX = (double) Record_GetIntPar( pRecord, 2 ); //
double dNumY = (double) Record_GetIntPar( pRecord, 1 ); //
double dDenomY = (double) Record_GetIntPar( pRecord, 0 ); //
double dNumX = (double) Record_GetIntPar( pRecord, 3 ); // числитель по Х
double dDenomX = (double) Record_GetIntPar( pRecord, 2 ); // знаменатель по Х
double dNumY = (double) Record_GetIntPar( pRecord, 1 ); // числитель по У
double dDenomY = (double) Record_GetIntPar( pRecord, 0 ); // знаменатель по У
if ( ( dDenomX == 0 ) || ( dDenomY == 0 ) )
{
......@@ -1414,7 +1426,7 @@ private:
break;
}
GetPixelWidth(); // Dpi
GetPixelWidth(); // Пересчитываем Dpi
GetPixelHeight(); //
return 0;
......@@ -1450,7 +1462,7 @@ private:
oFlood.oPoint = TranslateCoordF( oPoint );
oFlood.oColor = CWmfColor::LongToRGB( ushRG, ushB );
//
// При сканировании мы добавляем цвет и точку
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
m_oColorData.Add( &(oFlood.oColor) );
......@@ -1502,7 +1514,7 @@ private:
oDrawPixel.dPixelWidth = abs( pPlayer->pDC->dPixelWidth );
oDrawPixel.dPixelHeight = abs( pPlayer->pDC->dPixelHeight );
//
// При сканировании мы добавляем цвет и точку
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
m_oColorData.Add( &(oDrawPixel.oColor) );
......@@ -1548,7 +1560,7 @@ private:
if ( ( ushEndX == ushX ) && ( ushEndY == ushY ) )
{
// TO DO: :
// TO DO: Начальная точка совпадает с конечной: возможно тут надо рисовать эллипс
}
oTempPoint = WmfCoord( ushEndX, ushEndY );
......@@ -1568,7 +1580,7 @@ private:
oPointC.fX = (oDrawArc.oTL.fX + oDrawArc.oBR.fX) / 2;
oPointC.fY = (oDrawArc.oTL.fY + oDrawArc.oBR.fY) / 2;
// ,
// Для определения четверти, в котороый находятся начальная и конечная точки
oDrawArc.oStart.fX -= oPointC.fX;
oDrawArc.oStart.fY -= oPointC.fY;
oDrawArc.oEnd.fX -= oPointC.fX;
......@@ -1723,8 +1735,8 @@ private:
return 0;
}
oPointF.fX = (oDrawArc.oBR.fX - oDrawArc.oTL.fX) / 2; //
oPointF.fY = (oDrawArc.oBR.fY - oDrawArc.oTL.fY) / 2; //
oPointF.fX = (oDrawArc.oBR.fX - oDrawArc.oTL.fX) / 2; // Половина ширины эллипса
oPointF.fY = (oDrawArc.oBR.fY - oDrawArc.oTL.fY) / 2; // Половина высоты эллипса
if ( ( oDrawArc.oStart.fX == 0 ) && ( oDrawArc.oStart.fY == 0 ) )
oDrawArc.oStart.fX = oPointF.fX;
......@@ -1846,7 +1858,7 @@ private:
TWmfPolyLine oPolyLine;
oPolyLine.ushCount = Record_GetUShortPar( pRecord, 0 );
//
// Во время сканирования регистрируем все точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
TWmfPen *pPen = pPlayer->pDC->pPen;
......@@ -1907,7 +1919,7 @@ private:
TWmfPolyLine oPolyLine;
oPolyLine.ushCount = Record_GetUShortPar( pRecord, 0 );
//
// Во время сканирования регистрируем все точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
TWmfPen *pPen = pPlayer->pDC->pPen;
......@@ -1985,18 +1997,18 @@ private:
return 0;
}
unsigned short ushCount = 0; // PolyLine
unsigned short ushNumPars = 0; // PolyPoly
unsigned short ushCount = 0; // Суммарное количество точек в PolyLine
unsigned short ushNumPars = 0; // Суммарное количество точек в PolyPoly
int nSkipRecord = 0;
for ( unsigned short ushPolyIndex = 0; ushPolyIndex < oPolyPoly.ushPolyCount; ushPolyIndex++ )
{
oPolyPoly.pCount[ushPolyIndex] = Record_GetUShortPar( pRecord, (unsigned long) (1 + ushPolyIndex) );
ushCount += oPolyPoly.pCount[ushPolyIndex] + 2; // : PolyPoly -> PolyLine
ushCount += oPolyPoly.pCount[ushPolyIndex] + 2; // Для преобразования: PolyPoly -> PolyLine
ushNumPars += oPolyPoly.pCount[ushPolyIndex];
if ( ( oPolyPoly.pCount[ushPolyIndex] < 3 ) && ( 0 == nSkipRecord ) )
{
// 2-
// Странный полигон из 2-х или менее точек
nSkipRecord = 1;
}
if ( nSkipRecord )
......@@ -2016,7 +2028,7 @@ private:
if ( nSkipRecord )
{
// m_eError = wmf_error_BadFormat,
// Тут можно выдать ошибку m_eError = wmf_error_BadFormat, но тут не так критично
for ( unsigned short ushPolyIndex = 0; ushPolyIndex < oPolyPoly.ushPolyCount; ushPolyIndex++ )
{
if ( oPolyPoly.ppPoints[ushPolyIndex] )
......@@ -2157,7 +2169,7 @@ private:
oPoint = WmfCoord( ushX, ushY );
oDrawRect.oBR = TranslateCoordF( oPoint );
//
// Во время сканирования регистрируем крайние точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
TWmfPen *pPen = pPlayer->pDC->pPen;
......@@ -2199,7 +2211,7 @@ private:
oPoint = WmfCoord( ushX, ushY );
oDrawRect.oBR = TranslateCoordF( oPoint );
//
// Во время сканирования регистрируем крайние точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
TWmfPen *pPen = pPlayer->pDC->pPen;
......@@ -2266,7 +2278,7 @@ private:
fHeight = 0;
}
//
// Во время сканирования регистрируем крайние точки региона
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
TWmfCoordF oPoint = pRegion->oExtents.oTL;
......@@ -2294,7 +2306,7 @@ private:
oPolyRect.fHeight = 0;
if ( m_pOutput )
m_pOutput->Region_Clip( &oPolyRect ); //
m_pOutput->Region_Clip( &oPolyRect ); // Реально ничего не делается
TWmfRegion *pClip = (TWmfRegion*)pPlayer->pDC->pClip;
......@@ -2402,7 +2414,7 @@ private:
TWmfRegion *pRegion = &(pObject_Region->uObject.oRegion);
//
// Во время сканирования регистрируем крайние точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
TWmfCoordF oPoint = pRegion->oExtents.oTL;
......@@ -2424,7 +2436,7 @@ private:
oPolyRect.fHeight = 0;
if ( m_pOutput )
m_pOutput->Region_Clip( &oPolyRect ); //
m_pOutput->Region_Clip( &oPolyRect ); // Ничего не делается
TWmfRegion *pClip = (TWmfRegion*)pPlayer->pDC->pClip;
......@@ -2556,7 +2568,7 @@ private:
TWmfRecord oStart = Record_OffsetRecord( &oEnd, 1 );
unsigned short ushCount = Record_GetUShortPar( &oStart, 0 );
// ushCount
// Проверяем значение ushCount на четность
if ( ushCount & 1 )
{
m_oMemoryManager.Free( pRegion->pRects );
......@@ -2570,7 +2582,7 @@ private:
oEnd = Record_OffsetRecord( &oStart, (unsigned long)( ushCount + 3 ) );
// count count2
// В соответствии со спецификацией проверяем совпадение параметров count и count2
if ( Record_GetUShortPar( &oEnd, 0 ) != ushCount )
{
m_oMemoryManager.Free( pRegion->pRects );
......@@ -2618,10 +2630,10 @@ private:
if ( OBJ_REGION != pObject_Region->nType )
{
// ,
// . ,
// .
// .
// Некоторые метафайлы используют данную запись, даже когда ни одного
// региона не определено в файле. Возможно, в таких случаях область
// клипа мы должны сделать во весь файл. В любом случае данная ошибка
// не критична.
return 0;
}
......@@ -2657,7 +2669,7 @@ private:
pClip->oExtents.oBR.fX += oPoint.unX;
pClip->oExtents.oBR.fY += oPoint.unY;
//
// Во время сканирования в данной функции нам больше ничего не надо делать
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
return 0;
......@@ -2734,7 +2746,7 @@ private:
if ( CheckError() )
return 0;
//
// Во время сканирования в данной функции больше ничего не делаем
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
return 0;
......@@ -2784,7 +2796,7 @@ private:
unsigned short ushW = 0;
unsigned short ushH = 0;
if ( ( pRecord->unFunction == META_DIBBITBLT ) && ( ( pRecord->ulSize ) == 9 ) ) // : 2.3.1.2.2
if ( ( pRecord->unFunction == META_DIBBITBLT ) && ( ( pRecord->ulSize ) == 9 ) ) // Специальный случай: 2.3.1.2.2
{
return Meta_ROPDraw( pRecord, pAttrlist );
}
......@@ -2808,7 +2820,7 @@ private:
oBmpDraw.oCrop.ushX = Record_GetUShortPar( pRecord, 4 );
oBmpDraw.oCrop.ushY = Record_GetUShortPar( pRecord, 3 );
oBmpRead.ushWidth = Record_GetUShortPar( pRecord, 2 ); // :)
oBmpRead.ushWidth = Record_GetUShortPar( pRecord, 2 ); // Не уверен насчет этого :)
oBmpRead.ushHeight = Record_GetUShortPar( pRecord, 1 );
oBmpDraw.unType = SRCCOPY;
......@@ -2898,7 +2910,7 @@ private:
int nWidth = abs( (int)oPoint.unX );
int nHeight = abs( (int)oPoint.unY );
//
// Во время сканирования регистрируем граничные точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
CoordFRegister( oBmpDraw.oPoint, 0 );
......@@ -3052,7 +3064,7 @@ private:
switch ( pRecord->unFunction )
{
case META_DIBBITBLT: // META_DIBBITBLT: : Size = 9
case META_DIBBITBLT: // META_DIBBITBLT: Специальный случай: Size = 9
ushX = Record_GetUShortPar( pRecord, 8 );
ushY = Record_GetUShortPar( pRecord, 7 );
......@@ -3094,7 +3106,7 @@ private:
oROPDraw.oBR = TranslateCoordF( oPoint );
//
// Во время сканирования регистрируем граничные точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
CoordFRegister( oROPDraw.oTL, 0 );
......@@ -3124,7 +3136,7 @@ private:
break;
case META_SETTEXTJUSTIFICATION: // 2.3.5.27
// TO DO:
// TO DO: Здесь должно считываться два параметра
pPlayer->pDC->ushBreakExtra = ushParameter;
break;
......@@ -3150,7 +3162,7 @@ private:
pPlayer->pDC->ushBGMode = OPAQUE;
if ( OPAQUE != ushParameter )
{
// TO DO: ,
// TO DO: Такого быть не должно, но данная ошибка не критичная
}
}
break;
......@@ -3223,7 +3235,7 @@ private:
default:
// ,
// Согласно спецификации, смена палитры данной функцией не осуществляется
break;
}
......@@ -3443,10 +3455,10 @@ private:
TWmfFont *pFont = pPlayer->pDC->pFont;
// TO DO:
// TO DO: Возможна отрицательная высота шрифта
oDrawText.dFontHeight = (double)pFont->ushHeight * abs( pPlayer->pDC->dPixelHeight );
// TO DO: /
// TO DO: Ширина и высота шрифта не обязательно имеют одинаковый коэффициент растяжения/сжатия
if ( 0 == pFont->ushHeight )
{
m_oMemoryManager.Free( oDrawText.sText );
......@@ -3469,8 +3481,9 @@ private:
}
}
oDrawText.sText[ushLength] = '\0';
#ifndef DESKTOP_EDITOR_GRAPHICS
USES_CONVERSION;
#endif
float fWidth = 0;
......@@ -3481,9 +3494,9 @@ private:
//m_pFontManager->LoadStringW( A2W(oDrawText.sText), 0, 0 );
float fTempX, fTempY, fTempW, fTempH;
m_pFontManager->LoadFontByName( A2W(pPlayer->pDC->pFont->sFaceName), (float)(oDrawText.dFontHeight * 72 / 25.4), lStyle, 72.0f, 72.0f );
#ifdef DESKTOP_EDITOR_GRAPHICS
m_pFontManager->LoadString2( A2W(oDrawText.sText), 0, 0 );
m_pFontManager->LoadFontByName( UTF8_TO_U(pPlayer->pDC->pFont->sFaceName), (float)(oDrawText.dFontHeight * 72 / 25.4), lStyle, 72.0f, 72.0f );
m_pFontManager->LoadString2( UTF8_TO_U(oDrawText.sText), 0, 0 );
TBBox oBox = m_pFontManager->MeasureString2();
fTempX = oBox.fMinX;
......@@ -3491,6 +3504,7 @@ private:
fTempW = oBox.fMaxX - oBox.fMinX;
fTempH = oBox.fMaxX - oBox.fMinX;
#else
m_pFontManager->LoadFontByName( A2W(pPlayer->pDC->pFont->sFaceName), (float)(oDrawText.dFontHeight * 72 / 25.4), lStyle, 72.0f, 72.0f );
m_pFontManager->LoadStringW( A2W(oDrawText.sText), 0, 0 );
m_pFontManager->MeasureString2( &fTempX, &fTempY, &fTempW, &fTempH );
......@@ -3548,11 +3562,11 @@ private:
if ( pPlayer->pDC->ushTextAlign & TA_BASELINE )
{
//
// Ничего не делаем
}
else if ( pPlayer->pDC->ushTextAlign & TA_BOTTOM )
{
oPointD.fY = (float) ( -oDrawText.dFontHeight / 3 ); //
oPointD.fY = (float) ( -oDrawText.dFontHeight / 3 ); // Аппроксимация
oPointT.fX = -oPointD.fY * fSinTheta;
oPointT.fY = oPointD.fY * fCosTheta;
oDrawText.oPoint.fX += oPointT.fX;
......@@ -3560,7 +3574,7 @@ private:
}
else // if ( pPlayer->pDC->ushTextAlign & TA_TOP )
{
oPointD.fY = (float) oDrawText.dFontHeight; //
oPointD.fY = (float) oDrawText.dFontHeight; // Аппроксимация
oPointT.fX = -oPointD.fY * fSinTheta;
oPointT.fY = oPointD.fY * fCosTheta;
oDrawText.oPoint.fX += oPointT.fX;
......@@ -3708,7 +3722,7 @@ private:
}
}
//
// Во время сканирования мы только регистриуем граничные точки
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
{
m_oMemoryManager.Free( oDrawText.sText );
......@@ -3760,7 +3774,7 @@ private:
oPointD.fX -= oPointO.fX;
oPointD.fY -= oPointO.fY;
fWidth = 100; //
fWidth = 100; // Временно
//fWidth = FD->stringwidth (API,font,drawtext.str);
fWidth = (float) ( (double)fWidth * oDrawText.dFontHeight * dRatio );
......@@ -3844,7 +3858,7 @@ private:
TWmfRGB oColor = CWmfColor::LongToRGB( ushRG, ushB );
pPen->oColor = oColor;
//
// Во время сканирования регистрируем цвет
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
m_oColorData.Add( &oColor );
......@@ -3891,7 +3905,7 @@ private:
pBrush->oBitmap = oBitmap;
//
// Во время сканирования регистрируем цвет
if ( 0 == ( pPlayer->ulFlags & PLAYER_PLAY ) )
m_oColorData.Add( &oColor );
......@@ -3927,7 +3941,7 @@ private:
pFont->ushWidth = abs( shWidth );
pFont->ushHeight = abs( shHeight );
pFont->shEscapement = Record_GetShortPar( pRecord, 2 ); //
pFont->shEscapement = Record_GetShortPar( pRecord, 2 ); // Угол текса
pFont->shOrientation = Record_GetShortPar( pRecord, 3 );
pFont->ushWeight = Record_GetUShortPar( pRecord, 4 );
......@@ -3941,8 +3955,8 @@ private:
pFont->unStrikeOut = ushParam & 0xff;
pFont->unCharSet = (ushParam >> 8) & 0xff;
// Wmf , DEFAULT_CHARSET ,
// .
// В спецификации Wmf сказано, что значение DEFAULT_CHARSET может означать, что
// шрифт ищется только по имени и размеру.
#ifdef DESKTOP_EDITOR_GRAPHICS
//todo
//if ( DEFAULT_CHARSET == pFont->unCharSet )
......@@ -3995,8 +4009,12 @@ private:
if ( m_pFontManager )
{
// ,
// Проверим есть ли такой шрифт в системе, если запишем имя ближайшайшего шрифта
#ifdef DESKTOP_EDITOR_GRAPHICS
std::wstring bsFontName = UTF8_TO_U( pFont->sFaceName );
#else
BSTR bsFontName = CString( pFont->sFaceName ).AllocSysString();
#endif
BOOL bNeedFindByParams = FALSE;
if ( S_OK == m_pFontManager->LoadFontByName( bsFontName, 1, 0, 0, 0 ) )
......@@ -4029,11 +4047,9 @@ private:
if ( bNeedFindByParams )
{
USES_CONVERSION;
::SysFreeString( bsFontName );
#ifdef DESKTOP_EDITOR_GRAPHICS
CFontSelectFormat oFontSelectFormat;
oFontSelectFormat.wsName = new std::wstring(A2W(pFont->sFaceName));
oFontSelectFormat.wsName = new std::wstring(bsFontName);
oFontSelectFormat.unCharset = new BYTE;
*oFontSelectFormat.unCharset = pFont->unCharSet;
oFontSelectFormat.usWeight = new USHORT;
......@@ -4045,19 +4061,21 @@ private:
if ( NULL != pFontInfo && S_OK == m_pFontManager->LoadFontByName( pFontInfo->m_wsFontName, 11, lStyle, 96, 96 ) )
{
free( pFont->sFaceName );
char *sNewName = W2A( bsFontName );
int nLen = (int)strlen( sNewName );
std::string sNewName = U_TO_UTF8( pFontInfo->m_wsFontName.c_str());
int nLen = sNewName.length();
pFont->sFaceName = (char*)m_oMemoryManager.Malloc( nLen + 1, _T("Meta_FontCreate function") );
if ( !pFont->sFaceName )
m_eError = wmf_error_NotEnoughMemory;
else
{
pFont->sFaceName[nLen] = '\0';
memcpy( pFont->sFaceName, sNewName, nLen );
memcpy( pFont->sFaceName, sNewName.c_str(), nLen );
}
}
::SysFreeString( bsFontName );
}
#else
USES_CONVERSION;
::SysFreeString( bsFontName );
CString sXml;
sXml.Format( _T("<FontProperties><Name value='%s'/><Charset value='%X'/><Weight value='%d'/></FontProperties>"), A2W(pFont->sFaceName), pFont->unCharSet, pFont->ushWeight);
BSTR bsXml = sXml.AllocSysString();
......@@ -4088,12 +4106,12 @@ private:
}
::SysFreeString( bsPath );
#endif
}
else
{
::SysFreeString( bsFontName );
}
#endif
}
pFont->pUserData = NULL;
......@@ -4236,7 +4254,7 @@ private:
unsigned short ushByteCount = Record_GetUShortPar( pRecord, 0 );
if ( 0x0014 != ushByteCount )
return -1; //
return -1; // Неправильная запись
long lX = Record_GetLongPar( pRecord, 1, 2 );
long lY = Record_GetLongPar( pRecord, 3, 4 );
......@@ -4726,7 +4744,7 @@ private:
ulSize = ReadLong( NULL, NULL );
unFunction = ReadShort();
if ( (3 == ulSize ) && ( /*META_EOF*/0 == unFunction ) ) //
if ( (3 == ulSize ) && ( /*META_EOF*/0 == unFunction ) ) // Проверяем на последнюю запись в метафайле
{
if ( 0 == (pPlayer->ulFlags & PLAYER_PLAY) )
Write( ulSize, unFunction, "empty", pAtts->psAttrs, 0, 0 );
......@@ -5072,7 +5090,7 @@ private:
//-----------------------------------------------------------------------------
// (c) BMP & ROP stuff
//
// Ширина и высота картинок может быть отрицательной
//-----------------------------------------------------------------------------
case META_SETDIBTODEV: // 2.3.1.4
......@@ -5446,32 +5464,32 @@ private:
public:
private:
void *m_pBufferData; //
int m_nBufferType; // : 0 - TFileInfo, 1 - TMemoryInfo, -1 -
EWmfError m_eError; //
void *m_pBufferData; // Буфер
int m_nBufferType; // Что храним в буфере: 0 - указатель на TFileInfo, 1 - указатель на TMemoryInfo, -1 - файл не открыт
EWmfError m_eError; // Ошибка
TWmfHead m_pHead; //
TWmfPlaceableMetaHeader m_pPlaceableMetaHeader; //
TWmfPlaceableMetaHeader m_pPlaceableMetaHeader; // Заголовки метафайла
TWmfMetaHeader m_pMetaHeader; //
TWmfFile m_pFile; //
void *m_pWriteData; // Xml
TWmfAttributeStore m_oStore; // Xml
void *m_pWriteData; // Запись Xml в дебаге
TWmfAttributeStore m_oStore; // Хранение Xml
TWmfPlayer *m_pPlayerData; // Wmf
TWmfPlayer *m_pPlayerData; // Проигрыватель Wmf файла
#ifdef DESKTOP_EDITOR_GRAPHICS
CFontManager *m_pFontManager; //
CFontManager *m_pFontManager; // Интерефейс для работы с шрифтами
bool m_bDeleteFontManager;
#else
IASCFontManager *m_pFontManager; //
IASCFontManager *m_pFontManager; // Интерефейс для работы с шрифтами
#endif
CWmfColor m_oColorData; //
CWmfOutputDevice *m_pOutput; // ,
CWmfColor m_oColorData; // Паллитра
CWmfOutputDevice *m_pOutput; // Выходное устройство, для изображения данного метафайла
bool m_bWindow; // SETWINDOWEXT
bool m_bWindow; // Были ли заданы размеры картинки командой SETWINDOWEXT
CWmfMemoryManager m_oMemoryManager;
friend class CRendererOutput;
};
#endif /* _WMF_FILE_H */
\ No newline at end of file
#endif /* _WMF_FILE_H */
#ifndef _WMF_UTILS_H
#ifndef _WMF_UTILS_H
#define _WMF_UTILS_H
#include "WmfTypes.h"
......@@ -10,7 +10,1202 @@
#endif
#include <math.h>
#ifdef DESKTOP_EDITOR_GRAPHICS
#include "../../../../../DesktopEditor/common/File.h"
#define UTF8_TO_U(val) NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)val, strlen(val))
#define U_TO_UTF8(val) NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(val, wcslen(val))
#if !defined(WIN32) && !defined(_WIN32_WCE)
//from MinGw wingdi.h
#define BI_RGB 0
#define BI_RLE8 1
#define BI_RLE4 2
#define BI_BITFIELDS 3
#define BI_JPEG 4
#define BI_PNG 5
#define LF_FACESIZE 32
#define LF_FULLFACESIZE 64
#define CA_NEGATIVE 1
#define CA_LOG_FILTER 2
#define ILLUMINANT_DEVICE_DEFAULT 0
#define ILLUMINANT_A 1
#define ILLUMINANT_B 2
#define ILLUMINANT_C 3
#define ILLUMINANT_D50 4
#define ILLUMINANT_D55 5
#define ILLUMINANT_D65 6
#define ILLUMINANT_D75 7
#define ILLUMINANT_F2 8
#define ILLUMINANT_MAX_INDEX ILLUMINANT_F2
#define ILLUMINANT_TUNGSTEN ILLUMINANT_A
#define ILLUMINANT_DAYLIGHT ILLUMINANT_C
#define ILLUMINANT_FLUORESCENT ILLUMINANT_F2
#define ILLUMINANT_NTSC ILLUMINANT_C
#define RGB_GAMMA_MIN 2500
#define RGB_GAMMA_MAX 65000
#define REFERENCE_WHITE_MIN 6000
#define REFERENCE_WHITE_MAX 10000
#define REFERENCE_BLACK_MIN 0
#define REFERENCE_BLACK_MAX 4000
#define COLOR_ADJ_MIN (-100)
#define COLOR_ADJ_MAX 100
#define CCHDEVICENAME 32
#define CCHFORMNAME 32
#define DI_COMPAT 4
#define DI_DEFAULTSIZE 8
#define DI_IMAGE 2
#define DI_MASK 1
#define DI_NORMAL 3
#define DI_APPBANDING 1
#define EMR_HEADER 1
#define EMR_POLYBEZIER 2
#define EMR_POLYGON 3
#define EMR_POLYLINE 4
#define EMR_POLYBEZIERTO 5
#define EMR_POLYLINETO 6
#define EMR_POLYPOLYLINE 7
#define EMR_POLYPOLYGON 8
#define EMR_SETWINDOWEXTEX 9
#define EMR_SETWINDOWORGEX 10
#define EMR_SETVIEWPORTEXTEX 11
#define EMR_SETVIEWPORTORGEX 12
#define EMR_SETBRUSHORGEX 13
#define EMR_EOF 14
#define EMR_SETPIXELV 15
#define EMR_SETMAPPERFLAGS 16
#define EMR_SETMAPMODE 17
#define EMR_SETBKMODE 18
#define EMR_SETPOLYFILLMODE 19
#define EMR_SETROP2 20
#define EMR_SETSTRETCHBLTMODE 21
#define EMR_SETTEXTALIGN 22
#define EMR_SETCOLORADJUSTMENT 23
#define EMR_SETTEXTCOLOR 24
#define EMR_SETBKCOLOR 25
#define EMR_OFFSETCLIPRGN 26
#define EMR_MOVETOEX 27
#define EMR_SETMETARGN 28
#define EMR_EXCLUDECLIPRECT 29
#define EMR_INTERSECTCLIPRECT 30
#define EMR_SCALEVIEWPORTEXTEX 31
#define EMR_SCALEWINDOWEXTEX 32
#define EMR_SAVEDC 33
#define EMR_RESTOREDC 34
#define EMR_SETWORLDTRANSFORM 35
#define EMR_MODIFYWORLDTRANSFORM 36
#define EMR_SELECTOBJECT 37
#define EMR_CREATEPEN 38
#define EMR_CREATEBRUSHINDIRECT 39
#define EMR_DELETEOBJECT 40
#define EMR_ANGLEARC 41
#define EMR_ELLIPSE 42
#define EMR_RECTANGLE 43
#define EMR_ROUNDRECT 44
#define EMR_ARC 45
#define EMR_CHORD 46
#define EMR_PIE 47
#define EMR_SELECTPALETTE 48
#define EMR_CREATEPALETTE 49
#define EMR_SETPALETTEENTRIES 50
#define EMR_RESIZEPALETTE 51
#define EMR_REALIZEPALETTE 52
#define EMR_EXTFLOODFILL 53
#define EMR_LINETO 54
#define EMR_ARCTO 55
#define EMR_POLYDRAW 56
#define EMR_SETARCDIRECTION 57
#define EMR_SETMITERLIMIT 58
#define EMR_BEGINPATH 59
#define EMR_ENDPATH 60
#define EMR_CLOSEFIGURE 61
#define EMR_FILLPATH 62
#define EMR_STROKEANDFILLPATH 63
#define EMR_STROKEPATH 64
#define EMR_FLATTENPATH 65
#define EMR_WIDENPATH 66
#define EMR_SELECTCLIPPATH 67
#define EMR_ABORTPATH 68
#define EMR_GDICOMMENT 70
#define EMR_FILLRGN 71
#define EMR_FRAMERGN 72
#define EMR_INVERTRGN 73
#define EMR_PAINTRGN 74
#define EMR_EXTSELECTCLIPRGN 75
#define EMR_BITBLT 76
#define EMR_STRETCHBLT 77
#define EMR_MASKBLT 78
#define EMR_PLGBLT 79
#define EMR_SETDIBITSTODEVICE 80
#define EMR_STRETCHDIBITS 81
#define EMR_EXTCREATEFONTINDIRECTW 82
#define EMR_EXTTEXTOUTA 83
#define EMR_EXTTEXTOUTW 84
#define EMR_POLYBEZIER16 85
#define EMR_POLYGON16 86
#define EMR_POLYLINE16 87
#define EMR_POLYBEZIERTO16 88
#define EMR_POLYLINETO16 89
#define EMR_POLYPOLYLINE16 90
#define EMR_POLYPOLYGON16 91
#define EMR_POLYDRAW16 92
#define EMR_CREATEMONOBRUSH 93
#define EMR_CREATEDIBPATTERNBRUSHPT 94
#define EMR_EXTCREATEPEN 95
#define EMR_POLYTEXTOUTA 96
#define EMR_POLYTEXTOUTW 97
#define EMR_SETICMMODE 98
#define EMR_CREATECOLORSPACE 99
#define EMR_SETCOLORSPACE 100
#define EMR_DELETECOLORSPACE 101
#define EMR_GLSRECORD 102
#define EMR_GLSBOUNDEDRECORD 103
#define EMR_PIXELFORMAT 104
#define ENHMETA_SIGNATURE 1179469088
#define EPS_SIGNATURE 0x46535045
#define META_SETBKCOLOR 0x201
#define META_SETBKMODE 0x102
#define META_SETMAPMODE 0x103
#define META_SETROP2 0x104
#define META_SETRELABS 0x105
#define META_SETPOLYFILLMODE 0x106
#define META_SETSTRETCHBLTMODE 0x107
#define META_SETTEXTCHAREXTRA 0x108
#define META_SETTEXTCOLOR 0x209
#define META_SETTEXTJUSTIFICATION 0x20A
#define META_SETWINDOWORG 0x20B
#define META_SETWINDOWEXT 0x20C
#define META_SETVIEWPORTORG 0x20D
#define META_SETVIEWPORTEXT 0x20E
#define META_OFFSETWINDOWORG 0x20F
#define META_SCALEWINDOWEXT 0x410
#define META_OFFSETVIEWPORTORG 0x211
#define META_SCALEVIEWPORTEXT 0x412
#define META_LINETO 0x213
#define META_MOVETO 0x214
#define META_EXCLUDECLIPRECT 0x415
#define META_INTERSECTCLIPRECT 0x416
#define META_ARC 0x817
#define META_ELLIPSE 0x418
#define META_FLOODFILL 0x419
#define META_PIE 0x81A
#define META_RECTANGLE 0x41B
#define META_ROUNDRECT 0x61C
#define META_PATBLT 0x61D
#define META_SAVEDC 0x1E
#define META_SETPIXEL 0x41F
#define META_OFFSETCLIPRGN 0x220
#define META_TEXTOUT 0x521
#define META_BITBLT 0x922
#define META_STRETCHBLT 0xB23
#define META_POLYGON 0x324
#define META_POLYLINE 0x325
#define META_ESCAPE 0x626
#define META_RESTOREDC 0x127
#define META_FILLREGION 0x228
#define META_FRAMEREGION 0x429
#define META_INVERTREGION 0x12A
#define META_PAINTREGION 0x12B
#define META_SELECTCLIPREGION 0x12C
#define META_SELECTOBJECT 0x12D
#define META_SETTEXTALIGN 0x12E
#define META_CHORD 0x830
#define META_SETMAPPERFLAGS 0x231
#define META_EXTTEXTOUT 0xa32
#define META_SETDIBTODEV 0xd33
#define META_SELECTPALETTE 0x234
#define META_REALIZEPALETTE 0x35
#define META_ANIMATEPALETTE 0x436
#define META_SETPALENTRIES 0x37
#define META_POLYPOLYGON 0x538
#define META_RESIZEPALETTE 0x139
#define META_DIBBITBLT 0x940
#define META_DIBSTRETCHBLT 0xb41
#define META_DIBCREATEPATTERNBRUSH 0x142
#define META_STRETCHDIB 0xf43
#define META_EXTFLOODFILL 0x548
#define META_DELETEOBJECT 0x1f0
#define META_CREATEPALETTE 0xf7
#define META_CREATEPATTERNBRUSH 0x1F9
#define META_CREATEPENINDIRECT 0x2FA
#define META_CREATEFONTINDIRECT 0x2FB
#define META_CREATEBRUSHINDIRECT 0x2FC
#define META_CREATEREGION 0x6FF
#define PT_MOVETO 6
#define PT_LINETO 2
#define PT_BEZIERTO 4
#define PT_CLOSEFIGURE 1
#define ELF_VENDOR_SIZE 4
#define ELF_VERSION 0
#define ELF_CULTURE_LATIN 0
#define PFD_TYPE_RGBA 0
#define PFD_TYPE_COLORINDEX 1
#define PFD_MAIN_PLANE 0
#define PFD_OVERLAY_PLANE 1
#define PFD_UNDERLAY_PLANE (-1)
#define PFD_DOUBLEBUFFER 1
#define PFD_STEREO 2
#define PFD_DRAW_TO_WINDOW 4
#define PFD_DRAW_TO_BITMAP 8
#define PFD_SUPPORT_GDI 16
#define PFD_SUPPORT_OPENGL 32
#define PFD_GENERIC_FORMAT 64
#define PFD_NEED_PALETTE 128
#define PFD_NEED_SYSTEM_PALETTE 0x00000100
#define PFD_SWAP_EXCHANGE 0x00000200
#define PFD_SWAP_COPY 0x00000400
#define PFD_SWAP_LAYER_BUFFERS 0x00000800
#define PFD_GENERIC_ACCELERATED 0x00001000
#define PFD_DEPTH_DONTCARE 0x20000000
#define PFD_DOUBLEBUFFER_DONTCARE 0x40000000
#define PFD_STEREO_DONTCARE 0x80000000
#define SP_ERROR (-1)
#define SP_OUTOFDISK (-4)
#define SP_OUTOFMEMORY (-5)
#define SP_USERABORT (-3)
#define SP_APPABORT (-2)
#define BLACKNESS 0x00000042
#define NOTSRCERASE 0x001100A6
#define NOTSRCCOPY 0x00330008
#define SRCERASE 0x00440328
#define DSTINVERT 0x00550009
#define PATINVERT 0x005A0049
#define SRCINVERT 0x00660046
#define SRCAND 0x008800C6
#define MERGEPAINT 0x00BB0226
#define MERGECOPY 0x00C000CA
#define SRCCOPY 0x00CC0020
#define SRCPAINT 0x00EE0086
#define PATCOPY 0x00F00021
#define PATPAINT 0x00FB0A09
#define WHITENESS 0x00FF0062
#define CAPTUREBLT 0x40000000
#define NOMIRRORBITMAP 0x80000000
#define R2_BLACK 1
#define R2_COPYPEN 13
#define R2_MASKNOTPEN 3
#define R2_MASKPEN 9
#define R2_MASKPENNOT 5
#define R2_MERGENOTPEN 12
#define R2_MERGEPEN 15
#define R2_MERGEPENNOT 14
#define R2_NOP 11
#define R2_NOT 6
#define R2_NOTCOPYPEN 4
#define R2_NOTMASKPEN 8
#define R2_NOTMERGEPEN 2
#define R2_NOTXORPEN 10
#define R2_WHITE 16
#define R2_XORPEN 7
#define CM_OUT_OF_GAMUT 255
#define CM_IN_GAMUT 0
#define RGN_AND 1
#define RGN_COPY 5
#define RGN_DIFF 4
#define RGN_OR 2
#define RGN_XOR 3
#define NULLREGION 1
#define SIMPLEREGION 2
#define COMPLEXREGION 3
#define ERROR 0
#define CBM_INIT 4
#define DIB_PAL_COLORS 1
#define DIB_RGB_COLORS 0
#define FW_DONTCARE 0
#define FW_THIN 100
#define FW_EXTRALIGHT 200
#define FW_ULTRALIGHT FW_EXTRALIGHT
#define FW_LIGHT 300
#define FW_NORMAL 400
#define FW_REGULAR 400
#define FW_MEDIUM 500
#define FW_SEMIBOLD 600
#define FW_DEMIBOLD FW_SEMIBOLD
#define FW_BOLD 700
#define FW_EXTRABOLD 800
#define FW_ULTRABOLD FW_EXTRABOLD
#define FW_HEAVY 900
#define FW_BLACK FW_HEAVY
#define ANSI_CHARSET 0
#define DEFAULT_CHARSET 1
#define SYMBOL_CHARSET 2
#define SHIFTJIS_CHARSET 128
#define HANGEUL_CHARSET 129
#define HANGUL_CHARSET 129
#define GB2312_CHARSET 134
#define CHINESEBIG5_CHARSET 136
#define GREEK_CHARSET 161
#define TURKISH_CHARSET 162
#define HEBREW_CHARSET 177
#define ARABIC_CHARSET 178
#define BALTIC_CHARSET 186
#define RUSSIAN_CHARSET 204
#define THAI_CHARSET 222
#define EASTEUROPE_CHARSET 238
#define OEM_CHARSET 255
#define JOHAB_CHARSET 130
#define VIETNAMESE_CHARSET 163
#define MAC_CHARSET 77
#define OUT_DEFAULT_PRECIS 0
#define OUT_STRING_PRECIS 1
#define OUT_CHARACTER_PRECIS 2
#define OUT_STROKE_PRECIS 3
#define OUT_TT_PRECIS 4
#define OUT_DEVICE_PRECIS 5
#define OUT_RASTER_PRECIS 6
#define OUT_TT_ONLY_PRECIS 7
#define OUT_OUTLINE_PRECIS 8
/* http://www.pinvoke.net/default.aspx/Structures/LOGFONT.html */
#define OUT_PS_ONLY_PRECIS 10
#define CLIP_DEFAULT_PRECIS 0
#define CLIP_CHARACTER_PRECIS 1
#define CLIP_STROKE_PRECIS 2
#define CLIP_MASK 15
#define CLIP_LH_ANGLES 16
#define CLIP_TT_ALWAYS 32
#define CLIP_EMBEDDED 128
#define DEFAULT_QUALITY 0
#define DRAFT_QUALITY 1
#define PROOF_QUALITY 2
#define NONANTIALIASED_QUALITY 3
#define ANTIALIASED_QUALITY 4
#define DEFAULT_PITCH 0
#define FIXED_PITCH 1
#define VARIABLE_PITCH 2
#define MONO_FONT 8
#define FF_DECORATIVE 80
#define FF_DONTCARE 0
#define FF_MODERN 48
#define FF_ROMAN 16
#define FF_SCRIPT 64
#define FF_SWISS 32
#define PANOSE_COUNT 10
#define PAN_FAMILYTYPE_INDEX 0
#define PAN_SERIFSTYLE_INDEX 1
#define PAN_WEIGHT_INDEX 2
#define PAN_PROPORTION_INDEX 3
#define PAN_CONTRAST_INDEX 4
#define PAN_STROKEVARIATION_INDEX 5
#define PAN_ARMSTYLE_INDEX 6
#define PAN_LETTERFORM_INDEX 7
#define PAN_MIDLINE_INDEX 8
#define PAN_XHEIGHT_INDEX 9
#define PAN_CULTURE_LATIN 0
#define PAN_ANY 0
#define PAN_NO_FIT 1
#define PAN_FAMILY_TEXT_DISPLAY 2
#define PAN_FAMILY_SCRIPT 3
#define PAN_FAMILY_DECORATIVE 4
#define PAN_FAMILY_PICTORIAL 5
#define PAN_SERIF_COVE 2
#define PAN_SERIF_OBTUSE_COVE 3
#define PAN_SERIF_SQUARE_COVE 4
#define PAN_SERIF_OBTUSE_SQUARE_COVE 5
#define PAN_SERIF_SQUARE 6
#define PAN_SERIF_THIN 7
#define PAN_SERIF_BONE 8
#define PAN_SERIF_EXAGGERATED 9
#define PAN_SERIF_TRIANGLE 10
#define PAN_SERIF_NORMAL_SANS 11
#define PAN_SERIF_OBTUSE_SANS 12
#define PAN_SERIF_PERP_SANS 13
#define PAN_SERIF_FLARED 14
#define PAN_SERIF_ROUNDED 15
#define PAN_WEIGHT_VERY_LIGHT 2
#define PAN_WEIGHT_LIGHT 3
#define PAN_WEIGHT_THIN 4
#define PAN_WEIGHT_BOOK 5
#define PAN_WEIGHT_MEDIUM 6
#define PAN_WEIGHT_DEMI 7
#define PAN_WEIGHT_BOLD 8
#define PAN_WEIGHT_HEAVY 9
#define PAN_WEIGHT_BLACK 10
#define PAN_WEIGHT_NORD 11
#define PAN_PROP_OLD_STYLE 2
#define PAN_PROP_MODERN 3
#define PAN_PROP_EVEN_WIDTH 4
#define PAN_PROP_EXPANDED 5
#define PAN_PROP_CONDENSED 6
#define PAN_PROP_VERY_EXPANDED 7
#define PAN_PROP_VERY_CONDENSED 8
#define PAN_PROP_MONOSPACED 9
#define PAN_CONTRAST_NONE 2
#define PAN_CONTRAST_VERY_LOW 3
#define PAN_CONTRAST_LOW 4
#define PAN_CONTRAST_MEDIUM_LOW 5
#define PAN_CONTRAST_MEDIUM 6
#define PAN_CONTRAST_MEDIUM_HIGH 7
#define PAN_CONTRAST_HIGH 8
#define PAN_CONTRAST_VERY_HIGH 9
#define PAN_STROKE_GRADUAL_DIAG 2
#define PAN_STROKE_GRADUAL_TRAN 3
#define PAN_STROKE_GRADUAL_VERT 4
#define PAN_STROKE_GRADUAL_HORZ 5
#define PAN_STROKE_RAPID_VERT 6
#define PAN_STROKE_RAPID_HORZ 7
#define PAN_STROKE_INSTANT_VERT 8
#define PAN_STRAIGHT_ARMS_HORZ 2
#define PAN_STRAIGHT_ARMS_WEDGE 3
#define PAN_STRAIGHT_ARMS_VERT 4
#define PAN_STRAIGHT_ARMS_SINGLE_SERIF 5
#define PAN_STRAIGHT_ARMS_DOUBLE_SERIF 6
#define PAN_BENT_ARMS_HORZ 7
#define PAN_BENT_ARMS_WEDGE 8
#define PAN_BENT_ARMS_VERT 9
#define PAN_BENT_ARMS_SINGLE_SERIF 10
#define PAN_BENT_ARMS_DOUBLE_SERIF 11
#define PAN_LETT_NORMAL_CONTACT 2
#define PAN_LETT_NORMAL_WEIGHTED 3
#define PAN_LETT_NORMAL_BOXED 4
#define PAN_LETT_NORMAL_FLATTENED 5
#define PAN_LETT_NORMAL_ROUNDED 6
#define PAN_LETT_NORMAL_OFF_CENTER 7
#define PAN_LETT_NORMAL_SQUARE 8
#define PAN_LETT_OBLIQUE_CONTACT 9
#define PAN_LETT_OBLIQUE_WEIGHTED 10
#define PAN_LETT_OBLIQUE_BOXED 11
#define PAN_LETT_OBLIQUE_FLATTENED 12
#define PAN_LETT_OBLIQUE_ROUNDED 13
#define PAN_LETT_OBLIQUE_OFF_CENTER 14
#define PAN_LETT_OBLIQUE_SQUARE 15
#define PAN_MIDLINE_STANDARD_TRIMMED 2
#define PAN_MIDLINE_STANDARD_POINTED 3
#define PAN_MIDLINE_STANDARD_SERIFED 4
#define PAN_MIDLINE_HIGH_TRIMMED 5
#define PAN_MIDLINE_HIGH_POINTED 6
#define PAN_MIDLINE_HIGH_SERIFED 7
#define PAN_MIDLINE_CONSTANT_TRIMMED 8
#define PAN_MIDLINE_CONSTANT_POINTED 9
#define PAN_MIDLINE_CONSTANT_SERIFED 10
#define PAN_MIDLINE_LOW_TRIMMED 11
#define PAN_MIDLINE_LOW_POINTED 12
#define PAN_MIDLINE_LOW_SERIFED 13
#define PAN_XHEIGHT_CONSTANT_SMALL 2
#define PAN_XHEIGHT_CONSTANT_STD 3
#define PAN_XHEIGHT_CONSTANT_LARGE 4
#define PAN_XHEIGHT_DUCKING_SMALL 5
#define PAN_XHEIGHT_DUCKING_STD 6
#define PAN_XHEIGHT_DUCKING_LARGE 7
#define FS_LATIN1 1
#define FS_LATIN2 2
#define FS_CYRILLIC 4
#define FS_GREEK 8
#define FS_TURKISH 16
#define FS_HEBREW 32
#define FS_ARABIC 64
#define FS_BALTIC 128
#define FS_THAI 0x10000
#define FS_JISJAPAN 0x20000
#define FS_CHINESESIMP 0x40000
#define FS_WANSUNG 0x80000
#define FS_CHINESETRAD 0x100000
#define FS_JOHAB 0x200000
#define FS_SYMBOL 0x80000000
#define HS_BDIAGONAL 3
#define HS_CROSS 4
#define HS_DIAGCROSS 5
#define HS_FDIAGONAL 2
#define HS_HORIZONTAL 0
#define HS_VERTICAL 1
#define PS_GEOMETRIC 65536
#define PS_COSMETIC 0
#define PS_ALTERNATE 8
#define PS_SOLID 0
#define PS_DASH 1
#define PS_DOT 2
#define PS_DASHDOT 3
#define PS_DASHDOTDOT 4
#define PS_NULL 5
#define PS_USERSTYLE 7
#define PS_INSIDEFRAME 6
#define PS_ENDCAP_ROUND 0
#define PS_ENDCAP_SQUARE 256
#define PS_ENDCAP_FLAT 512
#define PS_JOIN_BEVEL 4096
#define PS_JOIN_MITER 8192
#define PS_JOIN_ROUND 0
#define PS_JOIN_MASK 614400
#define PS_STYLE_MASK 15
#define PS_ENDCAP_MASK 3840
#define PS_TYPE_MASK 983040
#define ALTERNATE 1
#define WINDING 2
#define DC_BINNAMES 12
#define DC_BINS 6
#define DC_COPIES 18
#define DC_DRIVER 11
#define DC_DATATYPE_PRODUCED 21
#define DC_DUPLEX 7
#define DC_EMF_COMPLIANT 20
#define DC_ENUMRESOLUTIONS 13
#define DC_EXTRA 9
#define DC_FIELDS 1
#define DC_FILEDEPENDENCIES 14
#define DC_MAXEXTENT 5
#define DC_MINEXTENT 4
#define DC_ORIENTATION 17
#define DC_PAPERNAMES 16
#define DC_PAPERS 2
#define DC_PAPERSIZE 3
#define DC_SIZE 8
#define DC_TRUETYPE 15
#define DCTT_BITMAP 1
#define DCTT_DOWNLOAD 2
#define DCTT_SUBDEV 4
#define DCTT_DOWNLOAD_OUTLINE 8
#define DC_VERSION 10
#define DC_BINADJUST 19
#define DC_EMF_COMPLIANT 20
#define DC_DATATYPE_PRODUCED 21
#define DC_MANUFACTURER 23
#define DC_MODEL 24
#define DCBA_FACEUPNONE 0
#define DCBA_FACEUPCENTER 1
#define DCBA_FACEUPLEFT 2
#define DCBA_FACEUPRIGHT 3
#define DCBA_FACEDOWNNONE 256
#define DCBA_FACEDOWNCENTER 257
#define DCBA_FACEDOWNLEFT 258
#define DCBA_FACEDOWNRIGHT 259
#define FLOODFILLBORDER 0
#define FLOODFILLSURFACE 1
#define ETO_CLIPPED 0x0004
#define ETO_GLYPH_INDEX 0x0010
#define ETO_OPAQUE 0x0002
#define ETO_NUMERICSLATIN 0x0800
#define ETO_NUMERICSLOCAL 0x0400
#define ETO_RTLREADING 0x0080
#define ETO_IGNORELANGUAGE 0x1000
#define GDICOMMENT_WINDOWS_METAFILE (-2147483647)
#define GDICOMMENT_BEGINGROUP 2
#define GDICOMMENT_ENDGROUP 3
#define GDICOMMENT_MULTIFORMATS 1073741828
#define GDICOMMENT_IDENTIFIER 1128875079
#define AD_COUNTERCLOCKWISE 1
#define AD_CLOCKWISE 2
#define RDH_RECTANGLES 1
#define GCPCLASS_LATIN 1
#define GCPCLASS_HEBREW 2
#define GCPCLASS_ARABIC 2
#define GCPCLASS_NEUTRAL 3
#define GCPCLASS_LOCALNUMBER 4
#define GCPCLASS_LATINNUMBER 5
#define GCPCLASS_LATINNUMERICTERMINATOR 6
#define GCPCLASS_LATINNUMERICSEPARATOR 7
#define GCPCLASS_NUMERICSEPARATOR 8
#define GCPCLASS_PREBOUNDLTR 128
#define GCPCLASS_PREBOUNDRTL 64
#define GCPCLASS_POSTBOUNDLTR 32
#define GCPCLASS_POSTBOUNDRTL 16
#define GCPGLYPH_LINKBEFORE 0x8000
#define GCPGLYPH_LINKAFTER 0x4000
#define DCB_DISABLE 8
#define DCB_ENABLE 4
#define DCB_RESET 1
#define DCB_SET 3
#define DCB_ACCUMULATE 2
#define DCB_DIRTY 2
#define OBJ_BRUSH 2
#define OBJ_PEN 1
#define OBJ_PAL 5
#define OBJ_FONT 6
#define OBJ_BITMAP 7
#define OBJ_EXTPEN 11
#define OBJ_REGION 8
#define OBJ_DC 3
#define OBJ_MEMDC 10
#define OBJ_METAFILE 9
#define OBJ_METADC 4
#define OBJ_ENHMETAFILE 13
#define OBJ_ENHMETADC 12
#define DRIVERVERSION 0
#define TECHNOLOGY 2
#define DT_PLOTTER 0
#define DT_RASDISPLAY 1
#define DT_RASPRINTER 2
#define DT_RASCAMERA 3
#define DT_CHARSTREAM 4
#define DT_METAFILE 5
#define DT_DISPFILE 6
#define HORZSIZE 4
#define VERTSIZE 6
#define HORZRES 8
#define VERTRES 10
#define LOGPIXELSX 88
#define LOGPIXELSY 90
#define BITSPIXEL 12
#define PLANES 14
#define NUMBRUSHES 16
#define NUMPENS 18
#define NUMFONTS 22
#define NUMCOLORS 24
#define NUMMARKERS 20
#define ASPECTX 40
#define ASPECTY 42
#define ASPECTXY 44
#define PDEVICESIZE 26
#define CLIPCAPS 36
#define SIZEPALETTE 104
#define NUMRESERVED 106
#define COLORRES 108
#define PHYSICALWIDTH 110
#define PHYSICALHEIGHT 111
#define PHYSICALOFFSETX 112
#define PHYSICALOFFSETY 113
#define SCALINGFACTORX 114
#define SCALINGFACTORY 115
#define VREFRESH 116
#define DESKTOPHORZRES 118
#define DESKTOPVERTRES 117
#define BLTALIGNMENT 119
#define RASTERCAPS 38
#define RC_BANDING 2
#define RC_BITBLT 1
#define RC_BITMAP64 8
#define RC_DI_BITMAP 128
#define RC_DIBTODEV 512
#define RC_FLOODFILL 4096
#define RC_GDI20_OUTPUT 16
#define RC_PALETTE 256
#define RC_SCALING 4
#define RC_STRETCHBLT 2048
#define RC_STRETCHDIB 8192
#define RC_DEVBITS 0x8000
#define RC_OP_DX_OUTPUT 0x4000
#define CURVECAPS 28
#define CC_NONE 0
#define CC_CIRCLES 1
#define CC_PIE 2
#define CC_CHORD 4
#define CC_ELLIPSES 8
#define CC_WIDE 16
#define CC_STYLED 32
#define CC_WIDESTYLED 64
#define CC_INTERIORS 128
#define CC_ROUNDRECT 256
#define LINECAPS 30
#define LC_NONE 0
#define LC_POLYLINE 2
#define LC_MARKER 4
#define LC_POLYMARKER 8
#define LC_WIDE 16
#define LC_STYLED 32
#define LC_WIDESTYLED 64
#define LC_INTERIORS 128
#define POLYGONALCAPS 32
#define RC_BANDING 2
#define RC_BIGFONT 1024
#define RC_BITBLT 1
#define RC_BITMAP64 8
#define RC_DEVBITS 0x8000
#define RC_DI_BITMAP 128
#define RC_GDI20_OUTPUT 16
#define RC_GDI20_STATE 32
#define RC_NONE 0
#define RC_OP_DX_OUTPUT 0x4000
#define RC_PALETTE 256
#define RC_SAVEBITMAP 64
#define RC_SCALING 4
#define PC_NONE 0
#define PC_POLYGON 1
#define PC_POLYPOLYGON 256
#define PC_PATHS 512
#define PC_RECTANGLE 2
#define PC_WINDPOLYGON 4
#define PC_SCANLINE 8
#define PC_TRAPEZOID 4
#define PC_WIDE 16
#define PC_STYLED 32
#define PC_WIDESTYLED 64
#define PC_INTERIORS 128
#define PC_PATHS 512
#define TEXTCAPS 34
#define TC_OP_CHARACTER 1
#define TC_OP_STROKE 2
#define TC_CP_STROKE 4
#define TC_CR_90 8
#define TC_CR_ANY 16
#define TC_SF_X_YINDEP 32
#define TC_SA_DOUBLE 64
#define TC_SA_INTEGER 128
#define TC_SA_CONTIN 256
#define TC_EA_DOUBLE 512
#define TC_IA_ABLE 1024
#define TC_UA_ABLE 2048
#define TC_SO_ABLE 4096
#define TC_RA_ABLE 8192
#define TC_VA_ABLE 16384
#define TC_RESERVED 32768
#define TC_SCROLLBLT 65536
#define GCP_DBCS 1
#define GCP_ERROR 0x8000
#define GCP_CLASSIN 0x80000
#define GCP_DIACRITIC 256
#define GCP_DISPLAYZWG 0x400000
#define GCP_GLYPHSHAPE 16
#define GCP_JUSTIFY 0x10000
#define GCP_JUSTIFYIN 0x200000
#define GCP_KASHIDA 1024
#define GCP_LIGATE 32
#define GCP_MAXEXTENT 0x100000
#define GCP_NEUTRALOVERRIDE 0x2000000
#define GCP_NUMERICOVERRIDE 0x1000000
#define GCP_NUMERICSLATIN 0x4000000
#define GCP_NUMERICSLOCAL 0x8000000
#define GCP_REORDER 2
#define GCP_SYMSWAPOFF 0x800000
#define GCP_USEKERNING 8
#define FLI_GLYPHS 0x40000
#define FLI_MASK 0x103b
#define GGO_METRICS 0
#define GGO_BITMAP 1
#define GGO_NATIVE 2
#define GGO_BEZIER 3
#define GGO_GRAY2_BITMAP 4
#define GGO_GRAY4_BITMAP 5
#define GGO_GRAY8_BITMAP 6
#define GGO_GLYPH_INDEX 128
#define GM_COMPATIBLE 1
#define GM_ADVANCED 2
#define MM_ANISOTROPIC 8
#define MM_HIENGLISH 5
#define MM_HIMETRIC 3
#define MM_ISOTROPIC 7
#define MM_LOENGLISH 4
#define MM_LOMETRIC 2
#define MM_TEXT 1
#define MM_TWIPS 6
#define MM_MAX_FIXEDSCALE MM_TWIPS
#define ABSOLUTE 1
#define RELATIVE 2
#define PC_EXPLICIT 2
#define PC_NOCOLLAPSE 4
#define PC_RESERVED 1
#define CLR_NONE 0xffffffff
#define CLR_INVALID CLR_NONE
#define CLR_DEFAULT 0xff000000
#define PT_MOVETO 6
#define PT_LINETO 2
#define PT_BEZIERTO 4
#define PT_CLOSEFIGURE 1
#define TT_AVAILABLE 1
#define TT_ENABLED 2
#define BLACK_BRUSH 4
#define DKGRAY_BRUSH 3
#define GRAY_BRUSH 2
#define HOLLOW_BRUSH 5
#define LTGRAY_BRUSH 1
#define NULL_BRUSH 5
#define WHITE_BRUSH 0
#define BLACK_PEN 7
#define NULL_PEN 8
#define WHITE_PEN 6
#define ANSI_FIXED_FONT 11
#define ANSI_VAR_FONT 12
#define DEVICE_DEFAULT_FONT 14
#define DEFAULT_GUI_FONT 17
#define OEM_FIXED_FONT 10
#define SYSTEM_FONT 13
#define SYSTEM_FIXED_FONT 16
#define DEFAULT_PALETTE 15
#define SYSPAL_ERROR 0
#define SYSPAL_STATIC 1
#define SYSPAL_NOSTATIC 2
#define SYSPAL_NOSTATIC256 3
#define TA_BASELINE 24
#define TA_BOTTOM 8
#define TA_TOP 0
#define TA_CENTER 6
#define TA_LEFT 0
#define TA_RIGHT 2
#define TA_RTLREADING 256
#define TA_NOUPDATECP 0
#define TA_UPDATECP 1
#define TA_MASK (TA_BASELINE+TA_CENTER+TA_UPDATECP+TA_RTLREADING)
#define VTA_BASELINE 24
#define VTA_CENTER 6
#define VTA_LEFT TA_BOTTOM
#define VTA_RIGHT TA_TOP
#define VTA_BOTTOM TA_RIGHT
#define VTA_TOP TA_LEFT
#define MWT_IDENTITY 1
#define MWT_LEFTMULTIPLY 2
#define MWT_RIGHTMULTIPLY 3
#define OPAQUE 2
#define TRANSPARENT 1
#define BLACKONWHITE 1
#define WHITEONBLACK 2
#define COLORONCOLOR 3
#define HALFTONE 4
#define MAXSTRETCHBLTMODE 4
#define STRETCH_ANDSCANS 1
#define STRETCH_DELETESCANS 3
#define STRETCH_HALFTONE 4
#define STRETCH_ORSCANS 2
#define TCI_SRCCHARSET 1
#define TCI_SRCCODEPAGE 2
#define TCI_SRCFONTSIG 3
#define ICM_ON 2
#define ICM_OFF 1
#define ICM_QUERY 3
#define NEWFRAME 1
#define ABORTDOC 2
#define NEXTBAND 3
#define SETCOLORTABLE 4
#define GETCOLORTABLE 5
#define FLUSHOUTPUT 6
#define DRAFTMODE 7
#define QUERYESCSUPPORT 8
#define SETABORTPROC 9
#define STARTDOC 10
#define ENDDOC 11
#define GETPHYSPAGESIZE 12
#define GETPRINTINGOFFSET 13
#define GETSCALINGFACTOR 14
#define MFCOMMENT 15
#define GETPENWIDTH 16
#define SETCOPYCOUNT 17
#define SELECTPAPERSOURCE 18
#define DEVICEDATA 19
#define PASSTHROUGH 19
#define GETTECHNOLGY 20
#define GETTECHNOLOGY 20
#define SETLINECAP 21
#define SETLINEJOIN 22
#define SETMITERLIMIT 23
#define BANDINFO 24
#define DRAWPATTERNRECT 25
#define GETVECTORPENSIZE 26
#define GETVECTORBRUSHSIZE 27
#define ENABLEDUPLEX 28
#define GETSETPAPERBINS 29
#define GETSETPRINTORIENT 30
#define ENUMPAPERBINS 31
#define SETDIBSCALING 32
#define EPSPRINTING 33
#define ENUMPAPERMETRICS 34
#define GETSETPAPERMETRICS 35
#define POSTSCRIPT_DATA 37
#define POSTSCRIPT_IGNORE 38
#define MOUSETRAILS 39
#define GETDEVICEUNITS 42
#define GETEXTENDEDTEXTMETRICS 256
#define GETEXTENTTABLE 257
#define GETPAIRKERNTABLE 258
#define GETTRACKKERNTABLE 259
#define EXTTEXTOUT 512
#define GETFACENAME 513
#define DOWNLOADFACE 514
#define ENABLERELATIVEWIDTHS 768
#define ENABLEPAIRKERNING 769
#define SETKERNTRACK 770
#define SETALLJUSTVALUES 771
#define SETCHARSET 772
#define STRETCHBLT 2048
#define GETSETSCREENPARAMS 3072
#define QUERYDIBSUPPORT 3073
#define BEGIN_PATH 4096
#define CLIP_TO_PATH 4097
#define END_PATH 4098
#define EXT_DEVICE_CAPS 4099
#define RESTORE_CTM 4100
#define SAVE_CTM 4101
#define SET_ARC_DIRECTION 4102
#define SET_BACKGROUND_COLOR 4103
#define SET_POLY_MODE 4104
#define SET_SCREEN_ANGLE 4105
#define SET_SPREAD 4106
#define TRANSFORM_CTM 4107
#define SET_CLIP_BOX 4108
#define SET_BOUNDS 4109
#define SET_MIRROR_MODE 4110
#define OPENCHANNEL 4110
#define DOWNLOADHEADER 4111
#define CLOSECHANNEL 4112
#define POSTSCRIPT_PASSTHROUGH 4115
#define ENCAPSULATED_POSTSCRIPT 4116
#define QDI_SETDIBITS 1
#define QDI_GETDIBITS 2
#define QDI_DIBTOSCREEN 4
#define QDI_STRETCHDIB 8
#define SP_NOTREPORTED 0x4000
#define PR_JOBSTATUS 0
#define ASPECT_FILTERING 1
#define BS_SOLID 0
#define BS_NULL 1
#define BS_HOLLOW 1
#define BS_HATCHED 2
#define BS_PATTERN 3
#define BS_INDEXED 4
#define BS_DIBPATTERN 5
#define BS_DIBPATTERNPT 6
#define BS_PATTERN8X8 7
#define BS_DIBPATTERN8X8 8
#define LCS_CALIBRATED_RGB 0
#define LCS_DEVICE_RGB 1
#define LCS_DEVICE_CMYK 2
#define LCS_GM_BUSINESS 1
#define LCS_GM_GRAPHICS 2
#define LCS_GM_IMAGES 4
#define RASTER_FONTTYPE 1
#define DEVICE_FONTTYPE 2
#define TRUETYPE_FONTTYPE 4
#define DMORIENT_PORTRAIT 1
#define DMORIENT_LANDSCAPE 2
#define DMPAPER_FIRST 1
#define DMPAPER_LETTER 1
#define DMPAPER_LETTERSMALL 2
#define DMPAPER_TABLOID 3
#define DMPAPER_LEDGER 4
#define DMPAPER_LEGAL 5
#define DMPAPER_STATEMENT 6
#define DMPAPER_EXECUTIVE 7
#define DMPAPER_A3 8
#define DMPAPER_A4 9
#define DMPAPER_A4SMALL 10
#define DMPAPER_A5 11
#define DMPAPER_B4 12
#define DMPAPER_B5 13
#define DMPAPER_FOLIO 14
#define DMPAPER_QUARTO 15
#define DMPAPER_10X14 16
#define DMPAPER_11X17 17
#define DMPAPER_NOTE 18
#define DMPAPER_ENV_9 19
#define DMPAPER_ENV_10 20
#define DMPAPER_ENV_11 21
#define DMPAPER_ENV_12 22
#define DMPAPER_ENV_14 23
#define DMPAPER_CSHEET 24
#define DMPAPER_DSHEET 25
#define DMPAPER_ESHEET 26
#define DMPAPER_ENV_DL 27
#define DMPAPER_ENV_C5 28
#define DMPAPER_ENV_C3 29
#define DMPAPER_ENV_C4 30
#define DMPAPER_ENV_C6 31
#define DMPAPER_ENV_C65 32
#define DMPAPER_ENV_B4 33
#define DMPAPER_ENV_B5 34
#define DMPAPER_ENV_B6 35
#define DMPAPER_ENV_ITALY 36
#define DMPAPER_ENV_MONARCH 37
#define DMPAPER_ENV_PERSONAL 38
#define DMPAPER_FANFOLD_US 39
#define DMPAPER_FANFOLD_STD_GERMAN 40
#define DMPAPER_FANFOLD_LGL_GERMAN 41
#define DMPAPER_ISO_B4 42
#define DMPAPER_JAPANESE_POSTCARD 43
#define DMPAPER_9X11 44
#define DMPAPER_10X11 45
#define DMPAPER_15X11 46
#define DMPAPER_ENV_INVITE 47
#define DMPAPER_RESERVED_48 48
#define DMPAPER_RESERVED_49 49
#define DMPAPER_LETTER_EXTRA 50
#define DMPAPER_LEGAL_EXTRA 51
#define DMPAPER_TABLOID_EXTRA 52
#define DMPAPER_A4_EXTRA 53
#define DMPAPER_LETTER_TRANSVERSE 54
#define DMPAPER_A4_TRANSVERSE 55
#define DMPAPER_LETTER_EXTRA_TRANSVERSE 56
#define DMPAPER_A_PLUS 57
#define DMPAPER_B_PLUS 58
#define DMPAPER_LETTER_PLUS 59
#define DMPAPER_A4_PLUS 60
#define DMPAPER_A5_TRANSVERSE 61
#define DMPAPER_B5_TRANSVERSE 62
#define DMPAPER_A3_EXTRA 63
#define DMPAPER_A5_EXTRA 64
#define DMPAPER_B5_EXTRA 65
#define DMPAPER_A2 66
#define DMPAPER_A3_TRANSVERSE 67
#define DMPAPER_A3_EXTRA_TRANSVERSE 68
#define DMPAPER_LAST 68
#define DMPAPER_USER 256
#define DMBIN_FIRST 1
#define DMBIN_UPPER 1
#define DMBIN_ONLYONE 1
#define DMBIN_LOWER 2
#define DMBIN_MIDDLE 3
#define DMBIN_MANUAL 4
#define DMBIN_ENVELOPE 5
#define DMBIN_ENVMANUAL 6
#define DMBIN_AUTO 7
#define DMBIN_TRACTOR 8
#define DMBIN_SMALLFMT 9
#define DMBIN_LARGEFMT 10
#define DMBIN_LARGECAPACITY 11
#define DMBIN_CASSETTE 14
#define DMBIN_FORMSOURCE 15
#define DMBIN_LAST 15
#define DMBIN_USER 256
#define DMRES_DRAFT (-1)
#define DMRES_LOW (-2)
#define DMRES_MEDIUM (-3)
#define DMRES_HIGH (-4)
#define DMCOLOR_MONOCHROME 1
#define DMCOLOR_COLOR 2
#define DMDUP_SIMPLEX 1
#define DMDUP_VERTICAL 2
#define DMDUP_HORIZONTAL 3
#define DMTT_BITMAP 1
#define DMTT_DOWNLOAD 2
#define DMTT_SUBDEV 3
#define DMTT_DOWNLOAD_OUTLINE 4
#define DMCOLLATE_FALSE 0
#define DMCOLLATE_TRUE 1
#define DM_SPECVERSION 800
#define DM_GRAYSCALE 1
#define DM_INTERLACED 2
#define DM_UPDATE 1
#define DM_COPY 2
#define DM_PROMPT 4
#define DM_MODIFY 8
#define DM_IN_BUFFER DM_MODIFY
#define DM_IN_PROMPT DM_PROMPT
#define DM_OUT_BUFFER DM_COPY
#define DM_OUT_DEFAULT DM_UPDATE
#define DM_ORIENTATION 0x00000001
#define DM_PAPERSIZE 0x00000002
#define DM_PAPERLENGTH 0x00000004
#define DM_PAPERWIDTH 0x00000008
#define DM_SCALE 0x00000010
#define DM_POSITION 0x00000020
#define DM_COPIES 0x00000100
#define DM_DEFAULTSOURCE 0x00000200
#define DM_PRINTQUALITY 0x00000400
#define DM_COLOR 0x00000800
#define DM_DUPLEX 0x00001000
#define DM_YRESOLUTION 0x00002000
#define DM_TTOPTION 0x00004000
#define DM_COLLATE 0x00008000
#define DM_FORMNAME 0x00010000
#define DM_LOGPIXELS 0x00020000
#define DM_BITSPERPEL 0x00040000
#define DM_PELSWIDTH 0x00080000
#define DM_PELSHEIGHT 0x00100000
#define DM_DISPLAYFLAGS 0x00200000
#define DM_DISPLAYFREQUENCY 0x00400000
#define DM_ICMMETHOD 0x00800000
#define DM_ICMINTENT 0x01000000
#define DM_MEDIATYPE 0x02000000
#define DM_DITHERTYPE 0x04000000
#define DMICMMETHOD_NONE 1
#define DMICMMETHOD_SYSTEM 2
#define DMICMMETHOD_DRIVER 3
#define DMICMMETHOD_DEVICE 4
#define DMICMMETHOD_USER 256
#define DMICM_SATURATE 1
#define DMICM_CONTRAST 2
#define DMICM_COLORMETRIC 3
#define DMICM_USER 256
#define DMMEDIA_STANDARD 1
#define DMMEDIA_TRANSPARENCY 2
#define DMMEDIA_GLOSSY 3
#define DMMEDIA_USER 256
#define DMDITHER_NONE 1
#define DMDITHER_COARSE 2
#define DMDITHER_FINE 3
#define DMDITHER_LINEART 4
#define DMDITHER_ERRORDIFFUSION 5
#define DMDITHER_RESERVED6 6
#define DMDITHER_RESERVED7 7
#define DMDITHER_RESERVED8 8
#define DMDITHER_RESERVED9 9
#define DMDITHER_GRAYSCALE 10
#define DMDITHER_USER 256
#define GDI_ERROR 0xFFFFFFFF
#define HGDI_ERROR ((HANDLE)GDI_ERROR)
#define TMPF_FIXED_PITCH 1
#define TMPF_VECTOR 2
#define TMPF_TRUETYPE 4
#define TMPF_DEVICE 8
#define NTM_ITALIC 1
#define NTM_BOLD 32
#define NTM_REGULAR 64
#define TT_POLYGON_TYPE 24
#define TT_PRIM_LINE 1
#define TT_PRIM_QSPLINE 2
#define TT_PRIM_CSPLINE 3
#define FONTMAPPER_MAX 10
#define ENHMETA_STOCK_OBJECT 0x80000000
#define WGL_FONT_LINES 0
#define WGL_FONT_POLYGONS 1
#define LPD_DOUBLEBUFFER 1
#define LPD_STEREO 2
#define LPD_SUPPORT_GDI 16
#define LPD_SUPPORT_OPENGL 32
#define LPD_SHARE_DEPTH 64
#define LPD_SHARE_STENCIL 128
#define LPD_SHARE_ACCUM 256
#define LPD_SWAP_EXCHANGE 512
#define LPD_SWAP_COPY 1024
#define LPD_TRANSPARENT 4096
#define LPD_TYPE_RGBA 0
#define LPD_TYPE_COLORINDEX 1
#define WGL_SWAP_MAIN_PLANE 1
#define WGL_SWAP_OVERLAY1 2
#define WGL_SWAP_OVERLAY2 4
#define WGL_SWAP_OVERLAY3 8
#define WGL_SWAP_OVERLAY4 16
#define WGL_SWAP_OVERLAY5 32
#define WGL_SWAP_OVERLAY6 64
#define WGL_SWAP_OVERLAY7 128
#define WGL_SWAP_OVERLAY8 256
#define WGL_SWAP_OVERLAY9 512
#define WGL_SWAP_OVERLAY10 1024
#define WGL_SWAP_OVERLAY11 2048
#define WGL_SWAP_OVERLAY12 4096
#define WGL_SWAP_OVERLAY13 8192
#define WGL_SWAP_OVERLAY14 16384
#define WGL_SWAP_OVERLAY15 32768
#define WGL_SWAP_UNDERLAY1 65536
#define WGL_SWAP_UNDERLAY2 0x20000
#define WGL_SWAP_UNDERLAY3 0x40000
#define WGL_SWAP_UNDERLAY4 0x80000
#define WGL_SWAP_UNDERLAY5 0x100000
#define WGL_SWAP_UNDERLAY6 0x200000
#define WGL_SWAP_UNDERLAY7 0x400000
#define WGL_SWAP_UNDERLAY8 0x800000
#define WGL_SWAP_UNDERLAY9 0x1000000
#define WGL_SWAP_UNDERLAY10 0x2000000
#define WGL_SWAP_UNDERLAY11 0x4000000
#define WGL_SWAP_UNDERLAY12 0x8000000
#define WGL_SWAP_UNDERLAY13 0x10000000
#define WGL_SWAP_UNDERLAY14 0x20000000
#define WGL_SWAP_UNDERLAY15 0x40000000
#define AC_SRC_OVER 0x00
#define AC_SRC_ALPHA 0x01
#define AC_SRC_NO_PREMULT_ALPHA 0x01
#define AC_SRC_NO_ALPHA 0x02
#define AC_DST_NO_PREMULT_ALPHA 0x10
#define AC_DST_NO_ALPHA 0x20
#define LAYOUT_RTL 1
#define LAYOUT_BITMAPORIENTATIONPRESERVED 8
#define CS_ENABLE 0x00000001
#define CS_DISABLE 0x00000002
#define CS_DELETE_TRANSFORM 0x00000003
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP 0x00000001
#define DISPLAY_DEVICE_MULTI_DRIVER 0x00000002
#define DISPLAY_DEVICE_PRIMARY_DEVICE 0x00000004
#define DISPLAY_DEVICE_MIRRORING_DRIVER 0x00000008
#define DISPLAY_DEVICE_VGA_COMPATIBLE 0x00000010
#define DISPLAY_DEVICE_REMOVABLE 0x00000020
#define DISPLAY_DEVICE_MODESPRUNED 0x08000000
#endif
#endif
static char *WmfStrDup(const char *sString)
{
if ( NULL == sString )
......@@ -44,7 +1239,7 @@ static void PolyPoly_To_PolyLine(TWmfPolyPoly *pPolyPoly, TWmfPolyLine *pPolyLin
if ( ( NULL == pPolyPoly->ppPoints[ushPolyIndex] ) || ( pPolyPoly->pCount[ushPolyIndex] < 3 ) )
return;
//
// Избавляемся от лишних точек
while ( ( pPolyPoly->ppPoints[ushPolyIndex][0].fX == pPolyPoly->ppPoints[ushPolyIndex][ushCount - 1].fX ) && ( pPolyPoly->ppPoints[ushPolyIndex][0].fY == pPolyPoly->ppPoints[ushPolyIndex][ushCount - 1].fY ) )
{
ushCount--;
......@@ -54,7 +1249,7 @@ static void PolyPoly_To_PolyLine(TWmfPolyPoly *pPolyPoly, TWmfPolyLine *pPolyLin
if ( ushCount < 3 )
return;
//
// Определяем последний ли полигон
bool bLast = false;
if ( ushPolyIndex < ( pPolyPoly->ushPolyCount - 1 ) )
{
......@@ -83,7 +1278,7 @@ static void PolyPoly_To_PolyLine(TWmfPolyPoly *pPolyPoly, TWmfPolyLine *pPolyLin
return;
}
// (.. , )
// Ищем в данном полигоне точку ближающую к нулевой точке следующего полигона (т.к. этот полигон не последний, то все впорядке)
unsigned short ushMinIndex = 0;
double dMinR2;
for ( unsigned short ushPointIndex = 0; ushPointIndex < ushCount; ushPointIndex++ )
......@@ -126,14 +1321,20 @@ static void PolyPoly_To_PolyLine(TWmfPolyPoly *pPolyPoly, TWmfPolyLine *pPolyLin
static BOOL WmfOpenTempFile(CString *pwsName, FILE **ppFile, wchar_t *wsMode, wchar_t *wsExt, wchar_t *wsFolder)
{
wchar_t *wsTempDir;
CStringW wsTemp, wsFileName;
wchar_t wsBuffer[32];
FILE *pTempFile;
#ifdef _WIN32
wchar_t *wsTempDir;
if ( ( wsTempDir = _wgetenv( _T("TEMP") ) ) && ( wsFolder == NULL ) )
{
wsTemp = CString( wsTempDir );
#else
char *wsTempDirA;
if ( ( wsTempDirA = getenv( "TEMP" ) ) && ( wsFolder == NULL ) )
{
std::wstring wsTempDir = UTF8_TO_U( wsTempDirA );
wsTemp = wsTempDir.c_str();
#endif
wsTemp.Append( L"\\" );
}
else if( wsFolder != NULL )
......@@ -149,17 +1350,24 @@ static BOOL WmfOpenTempFile(CString *pwsName, FILE **ppFile, wchar_t *wsMode, wc
int nTime = (int)time(NULL);
for (int nIndex = 0; nIndex < 1000; ++nIndex )
{
_swprintf( wsBuffer, L"%d", nTime + nIndex );
wsFileName = wsTemp;
wsFileName.Append( wsBuffer );
wsFileName.AppendFormat( L"%d", nTime + nIndex );
if ( wsExt )
{
wsFileName.Append( wsExt );
}
#ifdef _WIN32
if ( !( pTempFile = _wfopen( wsFileName.GetBuffer(), L"r" ) ) )
{
if ( !( pTempFile = _wfopen( wsFileName.GetBuffer(), wsMode ) ) )
#else
std::string sFileName = U_TO_UTF8(wsFileName);
if ( !( pTempFile = fopen( sFileName.c_str(), "r" ) ) )
{
std::string sMode = U_TO_UTF8(wsMode);
if ( !( pTempFile = fopen( sFileName.c_str(), sMode.c_str() ) ) )
#endif
{
return FALSE;
}
......@@ -175,4 +1383,4 @@ static BOOL WmfOpenTempFile(CString *pwsName, FILE **ppFile, wchar_t *wsMode, wc
}
#endif /* _WMF_UTILS_H */
\ No newline at end of file
#endif /* _WMF_UTILS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment