mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 01:11:43 +08:00
Реализовано чтение чисел с мантиссой. Реализованы градиенты. Реализован нормальный механизм работы с "брашами", теперь браш читается и из ресурсов.
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63537 954022d7-b5bf-4e40-9824-e11837661b57
This commit is contained in:
committed by
Alexander Trofimov
parent
a1c8d4d0dd
commit
1a7f397c49
229
XpsFile/XpsLib/WString.cpp
Normal file
229
XpsFile/XpsLib/WString.cpp
Normal file
@ -0,0 +1,229 @@
|
||||
#include "WString.h"
|
||||
#include "Utils.h"
|
||||
|
||||
#include "../../DesktopEditor/common/String.h"
|
||||
#include "../../DesktopEditor/common/Types.h"
|
||||
|
||||
#define MAX_STRING_LEN 2147483648
|
||||
|
||||
namespace XPS
|
||||
{
|
||||
class CWStringBuffer
|
||||
{
|
||||
public:
|
||||
|
||||
CWStringBuffer(const wchar_t* wsString, unsigned int unLen)
|
||||
{
|
||||
if (unLen)
|
||||
{
|
||||
m_pBuffer = new wchar_t[unLen + 1];
|
||||
m_pBuffer[unLen] = 0x00;
|
||||
memcpy(m_pBuffer, wsString, sizeof(wchar_t) * unLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pBuffer = NULL;
|
||||
}
|
||||
|
||||
m_nRefCount = 1;
|
||||
}
|
||||
void AddRef()
|
||||
{
|
||||
m_nRefCount++;
|
||||
}
|
||||
int Release()
|
||||
{
|
||||
return --m_nRefCount;
|
||||
}
|
||||
void Free()
|
||||
{
|
||||
RELEASEARRAYOBJECTS(m_pBuffer);
|
||||
}
|
||||
wchar_t operator[](const unsigned int& unIndex) const
|
||||
{
|
||||
return m_pBuffer[unIndex];
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
wchar_t* m_pBuffer;
|
||||
int m_nRefCount;
|
||||
|
||||
friend class CWString;
|
||||
};
|
||||
CWString::CWString()
|
||||
{
|
||||
m_bOwnBuffer = false;
|
||||
m_pBuffer = NULL;
|
||||
m_unLen = 0;
|
||||
}
|
||||
CWString::CWString(const wchar_t* wsString)
|
||||
{
|
||||
m_bOwnBuffer = false;
|
||||
m_pBuffer = NULL;
|
||||
m_unLen = 0;
|
||||
create(wsString, false);
|
||||
}
|
||||
CWString::CWString(wchar_t* wsString, bool bCopy, int nLen)
|
||||
{
|
||||
m_bOwnBuffer = false;
|
||||
m_pBuffer = NULL;
|
||||
m_unLen = 0;
|
||||
create(wsString, bCopy, nLen);
|
||||
}
|
||||
CWString::CWString(const CWString& wsString)
|
||||
{
|
||||
m_unLen = wsString.m_unLen;
|
||||
m_bOwnBuffer = wsString.m_bOwnBuffer;
|
||||
m_pBuffer = wsString.m_pBuffer;
|
||||
if (m_bOwnBuffer && m_pBuffer)
|
||||
((CWStringBuffer*)m_pBuffer)->AddRef();
|
||||
}
|
||||
CWString::~CWString()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
void CWString::create(const wchar_t* wsString, bool bCopy, int nLen)
|
||||
{
|
||||
clear();
|
||||
unsigned int unLen = -1 == nLen ? min(wcslen(wsString), MAX_STRING_LEN) : (unsigned int)nLen;
|
||||
m_unLen = unLen;
|
||||
if (bCopy)
|
||||
{
|
||||
if (unLen)
|
||||
{
|
||||
m_pBuffer = (void*)(new CWStringBuffer(wsString, m_unLen));
|
||||
m_bOwnBuffer = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_pBuffer = (void*)wsString;
|
||||
m_bOwnBuffer = false;
|
||||
}
|
||||
}
|
||||
void CWString::clear()
|
||||
{
|
||||
if (m_bOwnBuffer)
|
||||
{
|
||||
CWStringBuffer* pWStringBuffer = (CWStringBuffer*)m_pBuffer;
|
||||
if (pWStringBuffer && !pWStringBuffer->Release())
|
||||
delete pWStringBuffer;
|
||||
}
|
||||
|
||||
m_bOwnBuffer = false;
|
||||
m_pBuffer = NULL;
|
||||
m_unLen = 0;
|
||||
}
|
||||
void CWString::operator=(const wchar_t* wsString)
|
||||
{
|
||||
clear();
|
||||
create(wsString, false);
|
||||
}
|
||||
void CWString::operator=(const CWString& wsString)
|
||||
{
|
||||
clear();
|
||||
m_unLen = wsString.m_unLen;
|
||||
m_bOwnBuffer = wsString.m_bOwnBuffer;
|
||||
m_pBuffer = wsString.m_pBuffer;
|
||||
if (m_bOwnBuffer && m_pBuffer)
|
||||
((CWStringBuffer*)m_pBuffer)->AddRef();
|
||||
}
|
||||
const wchar_t* CWString::c_str() const
|
||||
{
|
||||
if (m_bOwnBuffer)
|
||||
{
|
||||
CWStringBuffer* pWStringBuffer = (CWStringBuffer*)m_pBuffer;
|
||||
if (pWStringBuffer)
|
||||
return pWStringBuffer->m_pBuffer;
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (const wchar_t*)m_pBuffer;
|
||||
}
|
||||
bool CWString::operator<(const CWString& wsString) const
|
||||
{
|
||||
const wchar_t* wsLeft = this->c_str();
|
||||
const wchar_t* wsRight = wsString.c_str();
|
||||
|
||||
unsigned int unLen = min(m_unLen, wsString.m_unLen);
|
||||
for (unsigned int unPos = 0; unPos < unLen; unPos++)
|
||||
{
|
||||
if (wsLeft[unPos] < wsRight[unPos])
|
||||
return true;
|
||||
else if (wsLeft[unPos] > wsRight[unPos])
|
||||
return false;
|
||||
}
|
||||
|
||||
return (m_unLen > wsString.m_unLen);
|
||||
}
|
||||
bool CWString::operator>(const CWString& wsString) const
|
||||
{
|
||||
return !operator<(wsString);
|
||||
}
|
||||
bool CWString::operator==(const CWString& wsString) const
|
||||
{
|
||||
const wchar_t* wsLeft = this->c_str();
|
||||
const wchar_t* wsRight = wsString.c_str();
|
||||
|
||||
if (m_unLen != wsString.m_unLen)
|
||||
return false;
|
||||
|
||||
for (unsigned int unPos = 0; unPos < m_unLen; unPos++)
|
||||
{
|
||||
if (wsLeft[unPos] != wsRight[unPos])
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
bool CWString::operator==(const wchar_t* wsString) const
|
||||
{
|
||||
const wchar_t* wsLeft = this->c_str();
|
||||
unsigned unLen = min(wcslen(wsString), MAX_STRING_LEN);
|
||||
|
||||
if (m_unLen != unLen)
|
||||
return false;
|
||||
|
||||
for (unsigned int unPos = 0; unPos < m_unLen; unPos++)
|
||||
{
|
||||
if (wsLeft[unPos] != wsString[unPos])
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
unsigned int CWString::size() const
|
||||
{
|
||||
return m_unLen;
|
||||
}
|
||||
wchar_t CWString::operator[](const unsigned int& unIndex) const
|
||||
{
|
||||
return this->c_str()[unIndex];
|
||||
}
|
||||
bool CWString::empty() const
|
||||
{
|
||||
return 0 == m_unLen;
|
||||
}
|
||||
std::vector<CWString> CWString::split(wchar_t wChar, bool bCopy)
|
||||
{
|
||||
std::vector<CWString> vResult;
|
||||
|
||||
int nPos = 0;
|
||||
int nLen = size();
|
||||
int nCharPos = nPos;
|
||||
while (nPos < nLen)
|
||||
{
|
||||
int nCharPos = nPos;
|
||||
while (nCharPos < nLen && operator[](nCharPos) != wChar)
|
||||
nCharPos++;
|
||||
|
||||
CWString wsElement;
|
||||
wsElement.create(this->c_str() + nPos, bCopy, nCharPos - nPos);
|
||||
vResult.push_back(wsElement);
|
||||
nPos = nCharPos + 1;
|
||||
}
|
||||
return vResult;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user