Files
core/ASCOfficeDocFile/DocxDocConverter/DocxToDocUtils.h
Alexander.Trofimov beb64a6efa utf8 -> utf8 with BOM
2016-06-23 19:23:34 +03:00

1223 lines
42 KiB
C++

/*
* (c) Copyright Ascensio System SIA 2010-2016
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
#include <string>
#include <map>
#include <string>
#include <algorithm>
#include <math.h>
#include "../../Common/DocxFormat/Source/Common/Color.h"
//#include "../../Common/DocxFormat/Source/DocxFormat/Logic/ColorsTable.h"
#include "Constants.h"
#include "OfficeArt/Common.h"
#include "OfficeArt/Enumerations.h"
#define DPI_DEFAULT 72.0
namespace DOCX
{
class CPointF
{
public:
CPointF () : m_X (0), m_Y (0), m_TX (0), m_TY (0), m_fCorrection (65536.0)
{
}
CPointF (unsigned int dX, unsigned int dY) : m_X (dX), m_Y (dY), m_TX (0), m_TY (0), m_fCorrection (65536.0)
{
}
CPointF (const std::string& value) : m_X (0), m_Y (0), m_TX (0), m_TY (0), m_fCorrection (65536.0)
{
if (0 == value.length())
return;
std::string strText = value;
strText.erase(std::remove(strText.begin(), strText.end(), L' '), strText.end());
double fT = 1.0; //
// MM
size_t from = strText.find("mm");
if (std::string::npos != from)
{
strText.erase(std::remove(strText.begin(), strText.end(), L'm'), strText.end());
m_fCorrection = 36000;
fT = (DPI_DEFAULT * 20.0) / 25.399931;
}
// PT
from = strText.find("pt");
if (std::string::npos != from)
{
strText.erase(std::remove(strText.begin(), strText.end(), L'p'), strText.end());
strText.erase(std::remove(strText.begin(), strText.end(), L't'), strText.end());
m_fCorrection = 12700.0;
fT = 20.0;
}
// DEF
from = strText.find(',');
if (std::string::npos != from)
{
if (0 == from)
{
if (1 == (int)strText.length())
return;
double dX = atof (strText.c_str());
strText = strText.substr(from + 1, ((int)strText.length() - 1) - from);
m_Y = (unsigned int)(dX * m_fCorrection);
m_TX = (int)(dX * fT);
return;
}
double dX = atof (strText.substr(0, from).c_str());
m_X = FormatNum (dX, m_fCorrection);
m_TX = (int)(dX * fT);
strText = strText.substr(from + 1, ((int)strText.length() - 1) - from);
if (0 == (int)strText.length())
return;
double dY = atof (strText.c_str());
m_Y = FormatNum (strText, m_fCorrection);
m_TY = (int)(dY * fT);
return;
}
if (strText.length())
{
double dX = atof (strText.c_str());
m_X = (unsigned int)(dX * m_fCorrection);
m_TX = (int)(dX * fT);
}
}
inline unsigned int X () const
{
return m_X;
}
inline unsigned int Y () const
{
return m_Y;
}
inline int GetTX() const
{
return m_TX;
}
inline int GetTY() const
{
return m_TY;
}
private:
inline unsigned int ToFixed(double dNumber) const
{
if (dNumber < 0.0)
{
return (unsigned int)(((long)dNumber - dNumber) * 65536.0) | (0xffff << 16);
}
if (dNumber > 0.0)
{
return (unsigned int)((dNumber - (long)dNumber) * 65536.0);
}
return 0;
}
inline unsigned int FormatNum (const std::string& strVal, double dMul) const
{
return FormatNum (atof (strVal.c_str()), dMul);
}
inline unsigned int FormatNum (double dVal, double dMul) const
{
dVal = dVal * dMul;
if (dVal > 0.0)
dVal += 0.5;
if (dVal < 0.0)
dVal -= 0.5;
return (unsigned int)dVal;
}
private:
unsigned int m_X;
unsigned int m_Y;
double m_fCorrection;
int m_TX;
int m_TY;
};
class CFPoint
{
public:
CFPoint () : m_dX(0.0), m_dY(0.0)
{
}
CFPoint (const std::string& value, double dX, double dY) : m_dX(dX), m_dY(dY)
{
if (value.length())
{
std::string strText = value;
strText.erase(std::remove(strText.begin(), strText.end(), L' '), strText.end());
if (strText.length())
{
size_t find = strText.find(',');
if (std::string::npos != find)
{
m_dX = atof ((strText.substr(0, find)).c_str());
strText = strText.substr(find + 1, ((int)strText.length() - 1) - find);
if (strText.length())
m_dY = atof (strText.c_str());
}
else
{
m_dX = atof (strText.c_str());
}
}
}
}
inline double X()
{
return m_dX;
}
inline double Y()
{
return m_dY;
}
private:
double m_dX;
double m_dY;
};
class CMatrixF
{
public:
CMatrixF () : m_XToX (0), m_XToY(0), m_YToX(0), m_YToY(0), m_PX(0), m_PY(0)
{
}
CMatrixF (const std::string& str) : m_XToX (0), m_XToY(0), m_YToX(0), m_YToY(0), m_PX(0), m_PY(0)
{
if (0 == str.length())
return;
std::string strText = str;
strText.erase(std::remove(strText.begin(), strText.end(), L' '), strText.end());
//
size_t from = strText.find(',');
if (std::string::npos == from)
return;
if (0 != from)
{
std::string number = strText.substr(0, from);
if (std::string::npos != number.find('f'))
m_XToX = atoi (number.substr(0,number.length()-1).c_str());
else
m_XToX = ToFixed (atof (number.c_str()) );
if (std::string::npos == from)
return;
}
strText = strText.substr(from + 1, strText.length() - 1 - from);
//
from = strText.find(',');
if (0 != from)
{
std::string number = strText.substr(0, from);
if (std::string::npos != number.find('f'))
m_YToX = atoi (number.substr(0,number.length()-1).c_str());
else
m_YToX = ToFixed (atof (number.c_str()) );
if (std::string::npos == from)
return;
}
strText = strText.substr(from + 1, strText.length() - 1 - from);
//
from = strText.find(',');
if (0 != from)
{
std::string number = strText.substr(0, from);
if (std::string::npos != number.find('f'))
m_XToY = atoi (number.substr(0,number.length()-1).c_str());
else
m_XToY = ToFixed (atof (number.c_str()));
if (std::string::npos == from)
return;
}
strText = strText.substr(from + 1, strText.length() - 1 - from);
//
from = strText.find(',');
if (0 != from)
{
std::string number = strText.substr(0, from);
if (std::string::npos != number.find('f'))
m_YToY = atoi (number.substr(0,number.length()-1).c_str());
else
m_YToY = ToFixed (atof (number.c_str()));
if (std::string::npos == from)
return;
}
strText = strText.substr(from + 1, strText.length() - 1 - from);
//
from = strText.find(',');
if (0 != from)
{
std::string number = strText.substr(0, from);
if (std::string::npos != number.find('f'))
m_PX = atoi (number.substr(0,number.length()-1).c_str());
else
m_PX = ToPerspective (atof (number.c_str()));
if (std::string::npos == from)
return;
}
strText = strText.substr(from + 1, strText.length() - 1 - from);
//
from = strText.find(',');
if (0 != from)
{
std::string number = strText.substr(0, from);
double df = atof (number.c_str());
if (std::string::npos != number.find('f'))
m_PY = atoi (number.substr(0,number.length()-1).c_str());
else
m_PY = ToPerspective (atof (number.c_str()));
}
}
inline unsigned int XToX ()
{
return m_XToX;
}
inline unsigned int XToY ()
{
return m_XToY;
}
inline unsigned int YToX ()
{
return m_YToX;
}
inline unsigned int YToY ()
{
return m_YToY;
}
inline unsigned int PX ()
{
return m_PX;
}
inline unsigned int PY ()
{
return m_PY;
}
private:
unsigned int ToFixed(double dNumber)
{
if (dNumber < 0.0)
{
return (unsigned int)(((long)dNumber - dNumber) * 65536.0) | (0xffff << 16);
}
if (dNumber > 0.0)
{
//return (unsigned int)((dNumber - (long)dNumber) * 65536.0);
return (unsigned int)(dNumber * 65536.0);
}
return 0;
}
unsigned int ToPerspective(double dNumber)
{
static const double WEIGHT = 256.0; // если сохраням матрицу как это делает Office 2010 (через свойства Shadow), то вес по умолчанию 0x00000100
if (dNumber < 0.0)
{
return 0xffffffff - (unsigned int)((-1.0 * dNumber * WEIGHT * 65536.0));
}
if (dNumber > 0.0)
{
return (unsigned int)(dNumber * WEIGHT * 65536.0);
}
return 0;
}
private:
unsigned m_XToX;
unsigned m_XToY;
unsigned m_YToX;
unsigned m_YToY;
unsigned m_PX;
unsigned m_PY;
};
class CEmu
{
public:
CEmu() : m_nVal(0)
{
}
CEmu(const std::string& str) : m_nVal(0)
{
if (0 == str.length())
return;
std::string strText = str;
int nCorrection = 1;
strText.erase(std::remove(strText.begin(), strText.end(), L' '), strText.end());
size_t from = strText.find("mm");
if (std::string::npos != from)
{
strText.erase(std::remove(strText.begin(), strText.end(), L'm'), strText.end());
nCorrection = 36000;
}
from = strText.find("pt");
if (std::string::npos != from)
{
strText.erase(std::remove(strText.begin(), strText.end(), L'p'), strText.end());
strText.erase(std::remove(strText.begin(), strText.end(), L't'), strText.end());
nCorrection = 12700;
}
m_nVal = atoi(str.c_str()) * nCorrection;
}
inline int Get()
{
return m_nVal;
}
private:
int m_nVal;
};
}
namespace DOCXDOCUTILS
{
inline unsigned char ColorToIco (const OOX::Logic::Color& oColor)
{
OOX::Logic::ColorsTable colorsTable;
std::string colorName = colorsTable.fromColor(oColor);
if (std::string("auto") == colorName)
colorName = std::string ("000000");
std::map<std::string, unsigned char> colorsMap;
colorsMap.insert( std::pair<std::string, unsigned char>( "auto", 0x00 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "black", 0x01 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "blue", 0x02 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "cyan", 0x03 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "green", 0x04 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "magenta", 0x05 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "red", 0x06 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "yellow", 0x07 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "white", 0x08 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkBlue", 0x09 ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkCyan", 0x0A ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkGreen", 0x0B ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkMagenta", 0x0C ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkRed", 0x0D ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkYellow", 0x0E ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "darkGray", 0x0F ) );
colorsMap.insert( std::pair<std::string, unsigned char>( "lightGray", 0x10 ) );
return colorsMap[colorName];
}
inline unsigned char AlignFromString (const std::wstring& align)
{
//!!!TODO!!!
if (align == std::wstring(L"left"))
return 0;
else if (align == std::wstring(L"center"))
return 1;
else if (align == std::wstring(L"right"))
return 2;
else if (align == std::wstring(L"both"))
return 3;
return 0;
}
inline short StiToIstd (short nDef)
{
if (nDef >= 0 && nDef <= 9)
return nDef;
if (65 == nDef)
return 10;
if (105 == nDef)
return 11;
if (107 == nDef)
return 12;
return -1;
}
inline static std::vector<int> GetValues(const std::string& strValues)
{
std::vector<int> values;
if (strValues.empty())
return values;
int number = 0;
std::string str = strValues;
while(str.length())
{
size_t separator = str.find (',');
if (std::string::npos != separator)
{
std::string snumber = str.substr(0, separator);
if (std::string::npos != snumber.find('f'))
number = (int) (21600.0 * (atof (snumber.substr(0,snumber.length()-1).c_str()) / 65536.0)); // ????
else
number = atoi (snumber.c_str());
values.push_back (number);
str = str.substr(separator + 1, str.length() - separator - 1);
}
else
{
if (std::string::npos != str.find('f'))
number = atoi (str.substr(0,str.length()-1).c_str());
else
number = atoi (str.c_str());
values.push_back (number);
break;
}
}
return values;
}
}
namespace DOCXDOCUTILS
{
inline unsigned int HexString2UInt (const std::string& value)
{
unsigned int summa = 0;
for (int i = 0; i != value.size(); ++i)
summa += HexChar2Int(value[i]) << (4 * (value.size() - i - 1));
return summa;
}
inline unsigned int HexString2UInt2X (const std::string& value)
{
unsigned int summa = 0;
for (int i = 0; i != value.size(); ++i)
{
summa += HexChar2Int(value[i]) << (4 * (value.size() - i - 1));
}
return summa;
}
inline unsigned int HexChar2Int (const char value)
{
if (value >= '0' && value <= '9')
return value - '0';
if (value >= 'a' && value <= 'f')
return 10 + value - 'a';
if (value >= 'A' && value <= 'F')
return 10 + value - 'A';
return 0;
}
inline unsigned int RGBToBGR (const unsigned int& nColor)
{
return ((nColor>>16) & 0xFF) | (0xFF00 & nColor) | (0xFF0000 & (nColor<<16));
}
inline bool GetFillColor(const std::string& value, unsigned int& nColor)
{
nColor = 0;
if (value.length() >= 6)
{
int from = value.find(' ');
if (-1 == from)
{
if ('#' == value[0])
{
nColor = RGBToBGR(HexString2UInt(value.substr(1,value.length()-1)));
return TRUE;
}
nColor = RGBToBGR(HexString2UInt(value));
return TRUE;
}
else
{
if ('#' == value[0])
{
nColor = RGBToBGR(HexString2UInt(value.substr(1,from-1)));
return TRUE;
}
nColor = RGBToBGR(HexString2UInt(value));
return TRUE;
}
}
else
{
if ('#' == value[0] && 4 == value.length()) // #cfc -> CCFFCC
{
nColor = 0;
nColor += HexChar2Int(value[1]);
nColor += HexChar2Int(value[1]) << 4;
nColor += HexChar2Int(value[2]) << 8;
nColor += HexChar2Int(value[2]) << 12;
nColor += HexChar2Int(value[3]) << 16;
nColor += HexChar2Int(value[3]) << 20;
return TRUE;
}
}
return FALSE;
}
inline unsigned int GetFixePointValue (const std::string& value)
{
if (value.length() > 1)
{
std::string strText = value;
if ('f' == strText[strText.length()-1] )
{
std::string number = strText.substr(0,strText.length()-1);
if (number.length ())
return atoi (number.c_str());
}
else
{
return (unsigned int)(atof (strText.c_str()) * 65536.0);
}
}
return 0;
}
inline static int GetArcValue(const std::string& strValue)
{
if (0==strValue.length())
return 0;
if (std::string::npos != strValue.find('f'))
{
return (int) (21600.0 * (atof (strValue.substr(0,strValue.length()-1).c_str()) / 65536.0)); // ????
}
else
{
return (int)(21600.0 * atof (strValue.c_str()));
}
return 0;
}
inline static unsigned int ToFixed2(double dNumber)
{
if (dNumber < 0.0)
{
return (unsigned int)(((long)dNumber - dNumber) * 65536.0) | (0xffff << 16);
}
if (dNumber > 0.0)
{
return (unsigned int)((dNumber - (long)dNumber) * 65536.0);
}
return 0;
}
inline static double GetAngleValue (const std::string& strValue)
{
size_t from = strValue.find("fd");
if (std::string::npos != from)
{
std::string strText = strValue;
strText.erase(std::remove(strText.begin(), strText.end(), L'f'), strText.end());
strText.erase(std::remove(strText.begin(), strText.end(), L'd'), strText.end());
return atof(strText.c_str()) / 65536.0;
}
return atof(strValue.c_str());
}
}
namespace DOCXDOCUTILS // fonts
{
inline ASCDocFileFormat::Constants::FontFamilyType FontFamilyFromString (const std::wstring& sFontFamily)
{
if (sFontFamily == std::wstring(L"auto"))
{
return ASCDocFileFormat::Constants::fontFamilyTypeUnspecified;
}
else if (sFontFamily == std::wstring(L"roman"))
{
return ASCDocFileFormat::Constants::fontFamilyTypeRomanSerif;
}
else if (sFontFamily == std::wstring(L"swiss"))
{
return ASCDocFileFormat::Constants::fontFamilyTypeSwissSansSerif;
}
else if (sFontFamily == std::wstring(L"modern"))
{
return ASCDocFileFormat::Constants::fontFamilyTypeModernMonospace;
}
else if (sFontFamily == std::wstring(L"script"))
{
return ASCDocFileFormat::Constants::fontFamilyTypeScriptCursive;
}
else if (sFontFamily == std::wstring(L"decorative"))
{
return ASCDocFileFormat::Constants::fontFamilyTypeDecorativeFantasy;
}
return ASCDocFileFormat::Constants::fontFamilyTypeUnspecified;
}
inline ASCDocFileFormat::Constants::CharacterPitch FontPitchFromString (const std::wstring& sPitch)
{
if (sPitch == std::wstring(L"variable"))
return ASCDocFileFormat::Constants::characterPitchVariable;
else if (sPitch == std::wstring(L"fixed"))
return ASCDocFileFormat::Constants::characterPitchFixed;
return ASCDocFileFormat::Constants::characterPitchDefault;
}
inline unsigned char FontCharsetFromString (const std::wstring& Charset)
{
if (Charset == std::wstring(L"CC"))
return RUSSIAN_CHARSET;
else if (Charset == std::wstring(L"00"))
return ANSI_CHARSET;
else if (Charset == std::wstring(L"02"))
return SYMBOL_CHARSET;
else if (Charset == std::wstring(L"80"))
return SHIFTJIS_CHARSET;
else if (Charset == std::wstring(L"86"))
return GB2312_CHARSET;
return DEFAULT_CHARSET;
}
}
namespace DOCXDOCUTILS
{
inline unsigned short GetStyleWrapType (const std::string& type)
{
if (type == std::string("none"))
return 3;
if (type == std::string("topAndBottom"))
return 1;
if (type == std::string("square"))
return 2;
if (type == std::string("tight"))
return 4;
if (type == std::string("through"))
return 5;
return 0;
}
}
namespace DOCXDOCUTILS
{
inline bool GetFlipH (const std::string& strFlip)
{
if (strFlip.length())
{
if ((std::string::npos != strFlip.find('x')) || (std::string::npos != strFlip.find('1')))
return true;
}
return false;
}
inline bool GetFlipV (const std::string& strFlip)
{
if (strFlip.length())
{
if ((std::string::npos != strFlip.find('y')) || (std::string::npos != strFlip.find('1')))
return true;
}
return false;
}
}
namespace DOCXDOCUTILS
{
inline std::wstring GetInstrText_FieldCode(std::wstring InstrText, std::wstring& Source)
{
if (0 == InstrText.length())
return std::wstring(L"");
std::wstring instrText = InstrText;
instrText.erase(std::remove(instrText.begin(), instrText.end(), L' '), instrText.end());
if (L'H' == instrText[0])
{
std::wstring::size_type pos = InstrText.find(L"HYPERLINK");
if (std::wstring::npos != pos)
{
Source = InstrText.substr (pos + std::wstring(L"HYPERLINK").length(),InstrText.length() - pos + std::wstring(L"HYPERLINK").length() - 1);
return std::wstring(L"HYPERLINK");
}
}
if (L'P' == instrText[0])
{
if (std::wstring::npos != instrText.find(L"PAGEREF"))
return std::wstring(L"PAGEREF");
if (std::wstring::npos != instrText.find(L"PAGE"))
return std::wstring(L"PAGE");
}
if (L'T' == instrText[0])
{
if (std::wstring::npos != instrText.find(L"TOC"))
return std::wstring(L"TOC");
}
if (L'A' == instrText[0])
{
if (std::wstring::npos != instrText.find(L"ADDRESSBLOCK"))
return std::wstring(L"ADDRESSBLOCK");
}
if (L'G' == instrText[0])
{
if (std::wstring::npos != instrText.find(L"GREETINGLINE"))
return std::wstring(L"GREETINGLINE");
}
if (L'M' == instrText[0])
{
if (std::wstring::npos != instrText.find(L"MERGEFIELD"))
return std::wstring(L"MERGEFIELD");
}
return std::wstring(L"");
}
}
namespace DOCX
{
class CSColor
{
public:
CSColor () : m_nColor (0)
{
}
inline bool Init (const std::string& Color)
{
if (Color.length() <= 0)
return FALSE;
CString color = CString(Color.c_str());
wchar_t wChar = color.GetAt(0);
switch (wChar)
{
case L'a':
if ( color.Find( _T("aliceBlue") ) >= 0) { m_nColor = RGB2(240,248,255); return TRUE; }
else if ( color.Find( _T("antiqueWhite") ) >= 0) { m_nColor = RGB2(250,235,215); return TRUE; }
else if ( color.Find( _T("aqua") ) >= 0) { m_nColor = RGB2(0,255,255); return TRUE; }
else if ( color.Find( _T("aquamarine") ) >= 0) { m_nColor = RGB2(127,255,212); return TRUE; }
else if ( color.Find( _T("azure") ) >= 0) { m_nColor = RGB2(240,255,255); return TRUE; }
break;
case L'b':
if ( color.Find( _T("beige") ) >= 0) { m_nColor = RGB2(245,245,220); return TRUE; }
else if ( color.Find( _T("bisque") ) >= 0) { m_nColor = RGB2(255,228,196); return TRUE; }
else if ( color.Find( _T("black") ) >= 0) { m_nColor = RGB2(0,0,0); return TRUE; }
else if ( color.Find( _T("blanchedAlmond") ) >= 0) { m_nColor = RGB2(255,235,205); return TRUE; }
else if ( color.Find( _T("blue") ) >= 0) { m_nColor = RGB2(0,0,255); return TRUE; }
else if ( color.Find( _T("blueViolet") ) >= 0) { m_nColor = RGB2(138,43,226); return TRUE; }
else if ( color.Find( _T("brown") ) >= 0) { m_nColor = RGB2(165,42,42); return TRUE; }
else if ( color.Find( _T("burlyWood") ) >= 0) { m_nColor = RGB2(222,184,135); return TRUE; }
break;
case L'c':
if ( color.Find( _T("cadetBlue") ) >= 0) { m_nColor = RGB2(95,158,160); return TRUE; }
else if ( color.Find( _T("chartreuse") ) >= 0) { m_nColor = RGB2(127,255,0); return TRUE; }
else if ( color.Find( _T("chocolate") ) >= 0) { m_nColor = RGB2(210,105,30); return TRUE; }
else if ( color.Find( _T("coral") ) >= 0) { m_nColor = RGB2(255,127,80); return TRUE; }
else if ( color.Find( _T("cornflowerBlue") ) >= 0) { m_nColor = RGB2(100,149,237); return TRUE; }
else if ( color.Find( _T("cornsilk") ) >= 0) { m_nColor = RGB2(255,248,220); return TRUE; }
else if ( color.Find( _T("crimson") ) >= 0) { m_nColor = RGB2(220,20,60); return TRUE; }
else if ( color.Find( _T("cyan") ) >= 0) { m_nColor = RGB2(0,255,255); return TRUE; }
break;
case L'd':
if ( color.Find( _T("darkBlue") ) >= 0) { m_nColor = RGB2(0,0,139); return TRUE; }
else if ( color.Find( _T("darkCyan") ) >= 0) { m_nColor = RGB2(0,139,139); return TRUE; }
else if ( color.Find( _T("darkGoldenrod") ) >= 0) { m_nColor = RGB2(184,134,11); return TRUE; }
else if ( color.Find( _T("darkGray") ) >= 0) { m_nColor = RGB2(169,169,169); return TRUE; }
else if ( color.Find( _T("darkGreen") ) >= 0) { m_nColor = RGB2(0,100,0); return TRUE; }
else if ( color.Find( _T("darkGrey") ) >= 0) { m_nColor = RGB2(169,169,169); return TRUE; }
else if ( color.Find( _T("darkKhaki") ) >= 0) { m_nColor = RGB2(189,183,107); return TRUE; }
else if ( color.Find( _T("darkMagenta") ) >= 0) { m_nColor = RGB2(139,0,139); return TRUE; }
else if ( color.Find( _T("darkOliveGreen") ) >= 0) { m_nColor = RGB2(85,107,47); return TRUE; }
else if ( color.Find( _T("darkOrange") ) >= 0) { m_nColor = RGB2(255,140,0); return TRUE; }
else if ( color.Find( _T("darkOrchid") ) >= 0) { m_nColor = RGB2(153,50,204); return TRUE; }
else if ( color.Find( _T("darkRed") ) >= 0) { m_nColor = RGB2(139,0,0); return TRUE; }
else if ( color.Find( _T("darkSalmon") ) >= 0) { m_nColor = RGB2(233,150,122); return TRUE; }
else if ( color.Find( _T("darkSeaGreen") ) >= 0) { m_nColor = RGB2(143,188,143); return TRUE; }
else if ( color.Find( _T("darkSlateBlue") ) >= 0) { m_nColor = RGB2(72,61,139); return TRUE; }
else if ( color.Find( _T("darkSlateGray") ) >= 0) { m_nColor = RGB2(47,79,79); return TRUE; }
else if ( color.Find( _T("darkSlateGrey") ) >= 0) { m_nColor = RGB2(47,79,79); return TRUE; }
else if ( color.Find( _T("darkTurquoise") ) >= 0) { m_nColor = RGB2(0,206,209); return TRUE; }
else if ( color.Find( _T("darkViolet") ) >= 0) { m_nColor = RGB2(148,0,211); return TRUE; }
else if ( color.Find( _T("deepPink") ) >= 0) { m_nColor = RGB2(255,20,147); return TRUE; }
else if ( color.Find( _T("deepSkyBlue") ) >= 0) { m_nColor = RGB2(0,191,255); return TRUE; }
else if ( color.Find( _T("dimGray") ) >= 0) { m_nColor = RGB2(105,105,105); return TRUE; }
else if ( color.Find( _T("dimGrey") ) >= 0) { m_nColor = RGB2(105,105,105); return TRUE; }
else if ( color.Find( _T("dkBlue") ) >= 0) { m_nColor = RGB2(0,0,139); return TRUE; }
else if ( color.Find( _T("dkCyan") ) >= 0) { m_nColor = RGB2(0,139,139); return TRUE; }
else if ( color.Find( _T("dkGoldenrod") ) >= 0) { m_nColor = RGB2(184,134,11); return TRUE; }
else if ( color.Find( _T("dkGray") ) >= 0) { m_nColor = RGB2(169,169,169); return TRUE; }
else if ( color.Find( _T("dkGreen") ) >= 0) { m_nColor = RGB2(0,100,0); return TRUE; }
else if ( color.Find( _T("dkGrey") ) >= 0) { m_nColor = RGB2(169,169,169); return TRUE; }
else if ( color.Find( _T("dkKhaki") ) >= 0) { m_nColor = RGB2(189,183,107); return TRUE; }
else if ( color.Find( _T("dkMagenta") ) >= 0) { m_nColor = RGB2(139,0,139); return TRUE; }
else if ( color.Find( _T("dkOliveGreen") ) >= 0) { m_nColor = RGB2(85,107,47); return TRUE; }
else if ( color.Find( _T("dkOrange") ) >= 0) { m_nColor = RGB2(255,140,0); return TRUE; }
else if ( color.Find( _T("dkOrchid") ) >= 0) { m_nColor = RGB2(153,50,204); return TRUE; }
else if ( color.Find( _T("dkRed") ) >= 0) { m_nColor = RGB2(139,0,0); return TRUE; }
else if ( color.Find( _T("dkSalmon") ) >= 0) { m_nColor = RGB2(233,150,122); return TRUE; }
else if ( color.Find( _T("dkSeaGreen") ) >= 0) { m_nColor = RGB2(143,188,139); return TRUE; }
else if ( color.Find( _T("dkSlateBlue") ) >= 0) { m_nColor = RGB2(72,61,139); return TRUE; }
else if ( color.Find( _T("dkSlateGray") ) >= 0) { m_nColor = RGB2(47,79,79); return TRUE; }
else if ( color.Find( _T("dkSlateGrey") ) >= 0) { m_nColor = RGB2(47,79,79); return TRUE; }
else if ( color.Find( _T("dkTurquoise") ) >= 0) { m_nColor = RGB2(0,206,209); return TRUE; }
else if ( color.Find( _T("dkViolet") ) >= 0) { m_nColor = RGB2(148,0,211); return TRUE; }
else if ( color.Find( _T("dodgerBlue") ) >= 0) { m_nColor = RGB2(30,144,255); return TRUE; }
break;
case L'f':
if ( color.Find( _T("firebrick") ) >= 0) { m_nColor = RGB2(178,34,34); return TRUE; }
else if ( color.Find( _T("floralWhite") ) >= 0) { m_nColor = RGB2(255,250,240); return TRUE; }
else if ( color.Find( _T("forestGreen") ) >= 0) { m_nColor = RGB2(34,139,34); return TRUE; }
else if ( color.Find( _T("fuchsia") ) >= 0) { m_nColor = RGB2(255,0,255); return TRUE; }
break;
case L'g':
if ( color.Find( _T("gainsboro") ) >= 0) { m_nColor = RGB2(220,220,220); return TRUE; }
else if ( color.Find( _T("ghostWhite") ) >= 0) { m_nColor = RGB2(248,248,255); return TRUE; }
else if ( color.Find( _T("gold") ) >= 0) { m_nColor = RGB2(255,215,0); return TRUE; }
else if ( color.Find( _T("goldenrod") ) >= 0) { m_nColor = RGB2(218,165,32); return TRUE; }
else if ( color.Find( _T("gray") ) >= 0) { m_nColor = RGB2(128,128,128); return TRUE; }
else if ( color.Find( _T("green") ) >= 0) { m_nColor = RGB2(0,128,0); return TRUE; }
else if ( color.Find( _T("greenYellow") ) >= 0) { m_nColor = RGB2(173,255,47); return TRUE; }
else if ( color.Find( _T("grey") ) >= 0) { m_nColor = RGB2(128,128,128); return TRUE; }
break;
case L'h':
if ( color.Find( _T("honeydew") ) >= 0) { m_nColor = RGB2(240,255,240); return TRUE; }
else if ( color.Find( _T("hotPink") ) >= 0) { m_nColor = RGB2(255,105,180); return TRUE; }
break;
case L'i':
if ( color.Find( _T("indianRed") ) >= 0) { m_nColor = RGB2(205,92,92); return TRUE; }
else if ( color.Find( _T("indigo") ) >= 0) { m_nColor = RGB2(75,0,130); return TRUE; }
else if ( color.Find( _T("ivory") ) >= 0) { m_nColor = RGB2(255,255,240); return TRUE; }
break;
case L'k':
if ( color.Find( _T("khaki") ) >= 0) { m_nColor = RGB2(240,230,140); return TRUE; }
break;
case L'l':
if ( color.Find( _T("lavender") ) >= 0) { m_nColor = RGB2(230,230,250); return TRUE; }
else if ( color.Find( _T("lavenderBlush") ) >= 0) { m_nColor = RGB2(255,240,245); return TRUE; }
else if ( color.Find( _T("lawnGreen") ) >= 0) { m_nColor = RGB2(124,252,0); return TRUE; }
else if ( color.Find( _T("lemonChiffon") ) >= 0) { m_nColor = RGB2(255,250,205); return TRUE; }
else if ( color.Find( _T("lightBlue") ) >= 0) { m_nColor = RGB2(173,216,230); return TRUE; }
else if ( color.Find( _T("lightCoral") ) >= 0) { m_nColor = RGB2(240,128,128); return TRUE; }
else if ( color.Find( _T("lightCyan") ) >= 0) { m_nColor = RGB2(224,255,255); return TRUE; }
else if ( color.Find( _T("lightGoldenrodYellow")) >= 0) { m_nColor = RGB2(250,250,210); return TRUE; }
else if ( color.Find( _T("lightGray") ) >= 0) { m_nColor = RGB2(211,211,211); return TRUE; }
else if ( color.Find( _T("lightGreen") ) >= 0) { m_nColor = RGB2(144,238,144); return TRUE; }
else if ( color.Find( _T("lightGrey") ) >= 0) { m_nColor = RGB2(211,211,211); return TRUE; }
else if ( color.Find( _T("lightPink") ) >= 0) { m_nColor = RGB2(255,182,193); return TRUE; }
else if ( color.Find( _T("lightSalmon") ) >= 0) { m_nColor = RGB2(255,160,122); return TRUE; }
else if ( color.Find( _T("lightSeaGreen") ) >= 0) { m_nColor = RGB2(32,178,170); return TRUE; }
else if ( color.Find( _T("lightSkyBlue") ) >= 0) { m_nColor = RGB2(135,206,250); return TRUE; }
else if ( color.Find( _T("lightSlateGray") ) >= 0) { m_nColor = RGB2(119,136,153); return TRUE; }
else if ( color.Find( _T("lightSlateGrey") ) >= 0) { m_nColor = RGB2(119,136,153); return TRUE; }
else if ( color.Find( _T("lightSteelBlue") ) >= 0) { m_nColor = RGB2(176,196,222); return TRUE; }
else if ( color.Find( _T("lightYellow") ) >= 0) { m_nColor = RGB2(255,255,224); return TRUE; }
else if ( color.Find( _T("lime") ) >= 0) { m_nColor = RGB2(0,255,0); return TRUE; }
else if ( color.Find( _T("limeGreen") ) >= 0) { m_nColor = RGB2(50,205,50); return TRUE; }
else if ( color.Find( _T("linen") ) >= 0) { m_nColor = RGB2(250,240,230); return TRUE; }
else if ( color.Find( _T("ltBlue") ) >= 0) { m_nColor = RGB2(173,216,230); return TRUE; }
else if ( color.Find( _T("ltCoral") ) >= 0) { m_nColor = RGB2(240,128,128); return TRUE; }
else if ( color.Find( _T("ltCyan") ) >= 0) { m_nColor = RGB2(224,255,255); return TRUE; }
else if ( color.Find( _T("ltGoldenrodYellow") ) >= 0) { m_nColor = RGB2(250,250,120); return TRUE; }
else if ( color.Find( _T("ltGray") ) >= 0) { m_nColor = RGB2(211,211,211); return TRUE; }
else if ( color.Find( _T("ltGreen") ) >= 0) { m_nColor = RGB2(144,238,144); return TRUE; }
else if ( color.Find( _T("ltGrey") ) >= 0) { m_nColor = RGB2(211,211,211); return TRUE; }
else if ( color.Find( _T("ltPink") ) >= 0) { m_nColor = RGB2(255,182,193); return TRUE; }
else if ( color.Find( _T("ltSalmon") ) >= 0) { m_nColor = RGB2(255,160,122); return TRUE; }
else if ( color.Find( _T("ltSeaGreen") ) >= 0) { m_nColor = RGB2(32,178,170); return TRUE; }
else if ( color.Find( _T("ltSkyBlue") ) >= 0) { m_nColor = RGB2(135,206,250); return TRUE; }
else if ( color.Find( _T("ltSlateGray") ) >= 0) { m_nColor = RGB2(119,136,153); return TRUE; }
else if ( color.Find( _T("ltSlateGrey") ) >= 0) { m_nColor = RGB2(119,136,153); return TRUE; }
else if ( color.Find( _T("ltSteelBlue") ) >= 0) { m_nColor = RGB2(176,196,222); return TRUE; }
else if ( color.Find( _T("ltYellow") ) >= 0) { m_nColor = RGB2(255,255,224); return TRUE; }
break;
case L'm':
if ( color.Find( _T("magenta") ) >= 0) { m_nColor = RGB2(255,0,255); return TRUE; }
else if ( color.Find( _T("maroon") ) >= 0) { m_nColor = RGB2(128,0,0); return TRUE; }
else if ( color.Find( _T("medAquamarine") ) >= 0) { m_nColor = RGB2(102,205,170); return TRUE; }
else if ( color.Find( _T("medBlue") ) >= 0) { m_nColor = RGB2(0,0,205); return TRUE; }
else if ( color.Find( _T("mediumAquamarine") ) >= 0) { m_nColor = RGB2(102,205,170); return TRUE; }
else if ( color.Find( _T("mediumBlue") ) >= 0) { m_nColor = RGB2(0,0,205); return TRUE; }
else if ( color.Find( _T("mediumOrchid") ) >= 0) { m_nColor = RGB2(186,85,211); return TRUE; }
else if ( color.Find( _T("mediumPurple") ) >= 0) { m_nColor = RGB2(147,112,219); return TRUE; }
else if ( color.Find( _T("mediumSeaGreen") ) >= 0) { m_nColor = RGB2(60,179,113); return TRUE; }
else if ( color.Find( _T("mediumSlateBlue") ) >= 0) { m_nColor = RGB2(123,104,238); return TRUE; }
else if ( color.Find( _T("mediumSpringGreen") ) >= 0) { m_nColor = RGB2(0,250,154); return TRUE; }
else if ( color.Find( _T("mediumTurquoise") ) >= 0) { m_nColor = RGB2(72,209,204); return TRUE; }
else if ( color.Find( _T("mediumVioletRed") ) >= 0) { m_nColor = RGB2(199,21,133); return TRUE; }
else if ( color.Find( _T("medOrchid") ) >= 0) { m_nColor = RGB2(186,85,211); return TRUE; }
else if ( color.Find( _T("medPurple") ) >= 0) { m_nColor = RGB2(147,112,219); return TRUE; }
else if ( color.Find( _T("medSeaGreen") ) >= 0) { m_nColor = RGB2(60,179,113); return TRUE; }
else if ( color.Find( _T("medSlateBlue") ) >= 0) { m_nColor = RGB2(123,104,238); return TRUE; }
else if ( color.Find( _T("medSpringGreen") ) >= 0) { m_nColor = RGB2(0,250,154); return TRUE; }
else if ( color.Find( _T("medTurquoise") ) >= 0) { m_nColor = RGB2(72,209,204); return TRUE; }
else if ( color.Find( _T("medVioletRed") ) >= 0) { m_nColor = RGB2(199,21,133); return TRUE; }
else if ( color.Find( _T("midnightBlue") ) >= 0) { m_nColor = RGB2(25,25,112); return TRUE; }
else if ( color.Find( _T("mintCream") ) >= 0) { m_nColor = RGB2(245,255,250); return TRUE; }
else if ( color.Find( _T("mistyRose") ) >= 0) { m_nColor = RGB2(255,228,225); return TRUE; }
else if ( color.Find( _T("moccasin") ) >= 0) { m_nColor = RGB2(255,228,181); return TRUE; }
break;
case L'n':
if ( color.Find( _T("navajoWhite") ) >= 0) { m_nColor = RGB2(255,222,173); return TRUE; }
else if ( color.Find( _T("navy") ) >= 0) { m_nColor = RGB2(0,0,128); return TRUE; }
break;
case L'o':
if ( color.Find( _T("oldLace") ) >= 0) { m_nColor = RGB2(253,245,230); return TRUE; }
else if ( color.Find( _T("olive") ) >= 0) { m_nColor = RGB2(128,128,0); return TRUE; }
else if ( color.Find( _T("oliveDrab") ) >= 0) { m_nColor = RGB2(107,142,35); return TRUE; }
else if ( color.Find( _T("orange") ) >= 0) { m_nColor = RGB2(255,165,0); return TRUE; }
else if ( color.Find( _T("orangeRed") ) >= 0) { m_nColor = RGB2(255,69,0); return TRUE; }
else if ( color.Find( _T("orchid") ) >= 0) { m_nColor = RGB2(218,112,214); return TRUE; }
break;
case L'p':
if ( color.Find( _T("paleGoldenrod") ) >= 0) { m_nColor = RGB2(238,232,170); return TRUE; }
else if ( color.Find( _T("paleGreen") ) >= 0) { m_nColor = RGB2(152,251,152); return TRUE; }
else if ( color.Find( _T("paleTurquoise") ) >= 0) { m_nColor = RGB2(175,238,238); return TRUE; }
else if ( color.Find( _T("paleVioletRed") ) >= 0) { m_nColor = RGB2(219,112,147); return TRUE; }
else if ( color.Find( _T("papayaWhip") ) >= 0) { m_nColor = RGB2(255,239,213); return TRUE; }
else if ( color.Find( _T("peachPuff") ) >= 0) { m_nColor = RGB2(255,218,185); return TRUE; }
else if ( color.Find( _T("peru") ) >= 0) { m_nColor = RGB2(205,133,63); return TRUE; }
else if ( color.Find( _T("pink") ) >= 0) { m_nColor = RGB2(255,192,203); return TRUE; }
else if ( color.Find( _T("plum") ) >= 0) { m_nColor = RGB2(221,160,221); return TRUE; }
else if ( color.Find( _T("powderBlue") ) >= 0) { m_nColor = RGB2(176,224,230); return TRUE; }
else if ( color.Find( _T("purple") ) >= 0) { m_nColor = RGB2(128,0,128); return TRUE; }
break;
case L'r':
if ( color.Find( _T("red") ) >= 0) { m_nColor = RGB2(255,0,0); return TRUE; }
else if ( color.Find( _T("rosyBrown") ) >= 0) { m_nColor = RGB2(188,143,143); return TRUE; }
else if ( color.Find( _T("royalBlue") ) >= 0) { m_nColor = RGB2(65,105,225); return TRUE; }
break;
case L's':
if ( color.Find( _T("saddleBrown") ) >= 0) { m_nColor = RGB2(139,69,19); return TRUE; }
else if ( color.Find( _T("salmon") ) >= 0) { m_nColor = RGB2(250,128,114); return TRUE; }
else if ( color.Find( _T("sandyBrown") ) >= 0) { m_nColor = RGB2(244,164,96); return TRUE; }
else if ( color.Find( _T("seaGreen") ) >= 0) { m_nColor = RGB2(46,139,87); return TRUE; }
else if ( color.Find( _T("seaShell") ) >= 0) { m_nColor = RGB2(255,245,238); return TRUE; }
else if ( color.Find( _T("sienna") ) >= 0) { m_nColor = RGB2(160,82,45); return TRUE; }
else if ( color.Find( _T("silver") ) >= 0) { m_nColor = RGB2(192,192,192); return TRUE; }
else if ( color.Find( _T("skyBlue") ) >= 0) { m_nColor = RGB2(135,206,235); return TRUE; }
else if ( color.Find( _T("slateBlue") ) >= 0) { m_nColor = RGB2(106,90,205); return TRUE; }
else if ( color.Find( _T("slateGray") ) >= 0) { m_nColor = RGB2(112,128,144); return TRUE; }
else if ( color.Find( _T("slateGrey") ) >= 0) { m_nColor = RGB2(112,128,144); return TRUE; }
else if ( color.Find( _T("snow") ) >= 0) { m_nColor = RGB2(255,250,250); return TRUE; }
else if ( color.Find( _T("springGreen") ) >= 0) { m_nColor = RGB2(0,255,127); return TRUE; }
else if ( color.Find( _T("steelBlue") ) >= 0) { m_nColor = RGB2(70,130,180); return TRUE; }
break;
case L't':
if ( color.Find( _T("tan") ) >= 0) { m_nColor = RGB2(210,180,140); return TRUE; }
else if ( color.Find( _T("teal") ) >= 0) { m_nColor = RGB2(0,128,128); return TRUE; }
else if ( color.Find( _T("thistle") ) >= 0) { m_nColor = RGB2(216,191,216); return TRUE; }
else if ( color.Find( _T("tomato") ) >= 0) { m_nColor = RGB2(255,99,71); return TRUE; }
else if ( color.Find( _T("turquoise") ) >= 0) { m_nColor = RGB2(64,224,208); return TRUE; }
break;
case L'v':
if ( color.Find( _T("violet") ) >= 0) { m_nColor = RGB2(238,130,238); return TRUE; }
break;
case L'w':
if ( color.Find( _T("wheat") ) >= 0) { m_nColor = RGB2(245,222,179); return TRUE; }
else if ( color.Find( _T("white") ) >= 0) { m_nColor = RGB2(255,255,255); return TRUE; }
else if ( color.Find( _T("whiteSmoke") ) >= 0) { m_nColor = RGB2(245,245,245); return TRUE; }
break;
case L'y':
if ( color.Find( _T("yellow") ) >= 0) { m_nColor = RGB2(255,255,0); return TRUE; }
else if ( color.Find( _T("yellowGreen") ) >= 0) { m_nColor = RGB2(154,205,50); return TRUE; }
break;
}
if (DOCXDOCUTILS::GetFillColor (Color, m_nColor))
return TRUE;
return FALSE;
}
inline int Color()
{
return m_nColor;
}
private:
inline unsigned int RGB2 (unsigned char r, unsigned char g, unsigned char b, unsigned char a = 0xF) // TODO
{
return ( (b<<16) | (g<<8) | (r) );
}
private:
unsigned int m_nColor;
};
}
#ifdef _DEBUG
namespace DOCXDOCUTILS
{
inline void DebugStrPrint (std::wstring strMessage, const std::string& strSource)
{
OutputDebugStringW(strMessage.c_str());
OutputDebugStringA(strSource.c_str());
OutputDebugStringW(L"\n");
}
inline void DebugStrPrint (std::wstring strMessage, const std::wstring& strSource)
{
OutputDebugStringW(strMessage.c_str());
OutputDebugStringW(strSource.c_str());
OutputDebugStringW(L"\n");
}
}
#endif