diff options
Diffstat (limited to 'core/include/fxcrt')
-rw-r--r-- | core/include/fxcrt/fx_arb.h | 20 | ||||
-rw-r--r-- | core/include/fxcrt/fx_basic.h | 1642 | ||||
-rw-r--r-- | core/include/fxcrt/fx_coordinates.h | 900 | ||||
-rw-r--r-- | core/include/fxcrt/fx_ext.h | 103 | ||||
-rw-r--r-- | core/include/fxcrt/fx_memory.h | 300 | ||||
-rw-r--r-- | core/include/fxcrt/fx_stream.h | 200 | ||||
-rw-r--r-- | core/include/fxcrt/fx_string.h | 870 | ||||
-rw-r--r-- | core/include/fxcrt/fx_system.h | 279 | ||||
-rw-r--r-- | core/include/fxcrt/fx_ucd.h | 112 | ||||
-rw-r--r-- | core/include/fxcrt/fx_xml.h | 209 |
10 files changed, 4635 insertions, 0 deletions
diff --git a/core/include/fxcrt/fx_arb.h b/core/include/fxcrt/fx_arb.h new file mode 100644 index 0000000000..4950f81716 --- /dev/null +++ b/core/include/fxcrt/fx_arb.h @@ -0,0 +1,20 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _FX_ARABIC_ +#define _FX_ARABIC_ +class IFX_BidiChar +{ +public: + static IFX_BidiChar* Create(); + virtual void Release() = 0; + virtual void SetPolicy(FX_BOOL bSeparateNeutral = TRUE) = 0; + virtual FX_BOOL AppendChar(FX_WCHAR wch) = 0; + virtual FX_BOOL EndChar() = 0; + virtual FX_INT32 GetBidiInfo(FX_INT32 &iStart, FX_INT32 &iCount) = 0; + virtual void Reset() = 0; +}; +#endif diff --git a/core/include/fxcrt/fx_basic.h b/core/include/fxcrt/fx_basic.h new file mode 100644 index 0000000000..29bc221e5b --- /dev/null +++ b/core/include/fxcrt/fx_basic.h @@ -0,0 +1,1642 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_BASIC_H_
+#define _FX_BASIC_H_
+#ifndef _FX_SYSTEM_H_
+#include "fx_system.h"
+#endif
+#ifndef _FX_MEMORY_H_
+#include "fx_memory.h"
+#endif
+#ifndef _FX_STRING_H_
+#include "fx_string.h"
+#endif
+#ifndef _FX_STREAM_H_
+#include "fx_stream.h"
+#endif
+class CFX_BinaryBuf : public CFX_Object
+{
+public:
+
+ CFX_BinaryBuf(IFX_Allocator* pAllocator = NULL);
+
+ CFX_BinaryBuf(FX_STRSIZE size, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_BinaryBuf();
+
+ void Clear();
+
+ void EstimateSize(FX_STRSIZE size, FX_STRSIZE alloc_step = 0);
+
+ void AppendBlock(const void* pBuf, FX_STRSIZE size);
+
+ void AppendFill(FX_BYTE byte, FX_STRSIZE count);
+
+ void AppendString(FX_BSTR str)
+ {
+ AppendBlock(str.GetPtr(), str.GetLength());
+ }
+
+ inline void AppendByte(FX_BYTE byte)
+ {
+ if (m_AllocSize <= m_DataSize) {
+ ExpandBuf(1);
+ }
+ m_pBuffer[m_DataSize++] = byte;
+ }
+
+ void InsertBlock(FX_STRSIZE pos, const void* pBuf, FX_STRSIZE size);
+
+ void AttachData(void* pBuf, FX_STRSIZE size);
+
+ void CopyData(const void* pBuf, FX_STRSIZE size);
+
+ void TakeOver(CFX_BinaryBuf& other);
+
+ void Delete(int start_index, int count);
+
+ FX_LPBYTE GetBuffer() const
+ {
+ return m_pBuffer;
+ }
+
+ FX_STRSIZE GetSize() const
+ {
+ return m_DataSize;
+ }
+
+ CFX_ByteStringC GetByteString() const;
+ void GetByteStringL(CFX_ByteStringL &str) const;
+
+ void DetachBuffer();
+
+ IFX_Allocator* m_pAllocator;
+protected:
+
+ FX_STRSIZE m_AllocStep;
+
+ FX_LPBYTE m_pBuffer;
+
+ FX_STRSIZE m_DataSize;
+
+ FX_STRSIZE m_AllocSize;
+
+ void ExpandBuf(FX_STRSIZE size);
+};
+class CFX_ByteTextBuf : public CFX_BinaryBuf
+{
+public:
+
+ CFX_ByteTextBuf(IFX_Allocator* pAllocator = NULL) : CFX_BinaryBuf(pAllocator) {}
+
+ void operator = (FX_BSTR str);
+
+ void AppendChar(int ch)
+ {
+ AppendByte((FX_BYTE)ch);
+ }
+
+ CFX_ByteTextBuf& operator << (int i);
+
+ CFX_ByteTextBuf& operator << (FX_DWORD i);
+
+ CFX_ByteTextBuf& operator << (double f);
+
+ CFX_ByteTextBuf& operator << (FX_BSTR lpsz);
+
+ CFX_ByteTextBuf& operator << (const CFX_ByteTextBuf& buf);
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_DataSize;
+ }
+};
+class CFX_WideTextBuf : public CFX_BinaryBuf
+{
+public:
+
+ CFX_WideTextBuf(IFX_Allocator* pAllocator = NULL) : CFX_BinaryBuf(pAllocator) {}
+
+ void operator = (FX_LPCWSTR lpsz);
+
+ void operator = (FX_WSTR str);
+
+ void AppendChar(FX_WCHAR wch);
+
+ CFX_WideTextBuf& operator << (int i);
+
+ CFX_WideTextBuf& operator << (double f);
+
+ CFX_WideTextBuf& operator << (FX_LPCWSTR lpsz);
+
+ CFX_WideTextBuf& operator << (FX_WSTR str);
+ CFX_WideTextBuf& operator << (const CFX_WideString &str);
+
+ CFX_WideTextBuf& operator << (const CFX_WideTextBuf& buf);
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_DataSize / sizeof(FX_WCHAR);
+ }
+
+ FX_LPWSTR GetBuffer() const
+ {
+ return (FX_LPWSTR)m_pBuffer;
+ }
+
+ void Delete(int start_index, int count)
+ {
+ CFX_BinaryBuf::Delete(start_index * sizeof(FX_WCHAR), count * sizeof(FX_WCHAR));
+ }
+
+ CFX_WideStringC GetWideString() const;
+ void GetWideStringL(CFX_WideStringL& wideText) const;
+};
+class CFX_ArchiveSaver : public CFX_Object
+{
+public:
+
+ CFX_ArchiveSaver(IFX_Allocator* pAllocator = NULL) : m_SavingBuf(pAllocator), m_pStream(NULL) {}
+
+ CFX_ArchiveSaver& operator << (FX_BYTE i);
+
+ CFX_ArchiveSaver& operator << (int i);
+
+ CFX_ArchiveSaver& operator << (FX_DWORD i);
+
+ CFX_ArchiveSaver& operator << (FX_FLOAT i);
+
+ CFX_ArchiveSaver& operator << (double i);
+
+ CFX_ArchiveSaver& operator << (FX_BSTR bstr);
+
+ CFX_ArchiveSaver& operator << (FX_LPCWSTR bstr);
+
+ CFX_ArchiveSaver& operator << (const CFX_WideString& wstr);
+
+ void Write(const void* pData, FX_STRSIZE dwSize);
+
+ FX_INTPTR GetLength()
+ {
+ return m_SavingBuf.GetSize();
+ }
+
+ FX_LPCBYTE GetBuffer()
+ {
+ return m_SavingBuf.GetBuffer();
+ }
+
+ void SetStream(IFX_FileStream* pStream)
+ {
+ m_pStream = pStream;
+ }
+protected:
+
+ CFX_BinaryBuf m_SavingBuf;
+
+ IFX_FileStream* m_pStream;
+};
+class CFX_ArchiveLoader : public CFX_Object
+{
+public:
+
+ CFX_ArchiveLoader(FX_LPCBYTE pData, FX_DWORD dwSize);
+
+ CFX_ArchiveLoader& operator >> (FX_BYTE& i);
+
+ CFX_ArchiveLoader& operator >> (int& i);
+
+ CFX_ArchiveLoader& operator >> (FX_DWORD& i);
+
+ CFX_ArchiveLoader& operator >> (FX_FLOAT& i);
+
+ CFX_ArchiveLoader& operator >> (double& i);
+
+ CFX_ArchiveLoader& operator >> (CFX_ByteString& bstr);
+
+ CFX_ArchiveLoader& operator >> (CFX_WideString& wstr);
+
+ FX_BOOL IsEOF();
+
+ FX_BOOL Read(void* pBuf, FX_DWORD dwSize);
+protected:
+
+ FX_DWORD m_LoadingPos;
+
+ FX_LPCBYTE m_pLoadingBuf;
+
+ FX_DWORD m_LoadingSize;
+};
+class IFX_BufferArchive
+{
+public:
+
+ IFX_BufferArchive(FX_STRSIZE size, IFX_Allocator* pAllocator = NULL);
+
+
+ virtual void Clear();
+
+
+ FX_BOOL Flush();
+
+
+ FX_INT32 AppendBlock(const void* pBuf, size_t size);
+
+ FX_INT32 AppendByte(FX_BYTE byte);
+
+ FX_INT32 AppendDWord(FX_DWORD i);
+
+
+ FX_INT32 AppendString(FX_BSTR lpsz);
+
+protected:
+
+ virtual FX_BOOL DoWork(const void* pBuf, size_t size) = 0;
+
+
+ IFX_Allocator* m_pAllocator;
+
+ FX_STRSIZE m_BufSize;
+
+ FX_LPBYTE m_pBuffer;
+
+ FX_STRSIZE m_Length;
+};
+class CFX_FileBufferArchive : public IFX_BufferArchive, public CFX_Object
+{
+public:
+ CFX_FileBufferArchive(FX_STRSIZE size = 32768, IFX_Allocator* pAllocator = NULL);
+ ~CFX_FileBufferArchive();
+ virtual void Clear();
+
+ FX_BOOL AttachFile(IFX_StreamWrite *pFile, FX_BOOL bTakeover = FALSE);
+
+ FX_BOOL AttachFile(FX_LPCWSTR filename);
+
+ FX_BOOL AttachFile(FX_LPCSTR filename);
+private:
+
+ virtual FX_BOOL DoWork(const void* pBuf, size_t size);
+
+ IFX_StreamWrite *m_pFile;
+
+ FX_BOOL m_bTakeover;
+};
+struct CFX_CharMap {
+
+ static CFX_CharMap* GetDefaultMapper(FX_INT32 codepage = 0);
+
+
+ CFX_WideString (*m_GetWideString)(CFX_CharMap* pMap, const CFX_ByteString& bstr);
+
+ CFX_ByteString (*m_GetByteString)(CFX_CharMap* pMap, const CFX_WideString& wstr);
+
+ FX_INT32 (*m_GetCodePage)();
+};
+class CFX_UTF8Decoder
+{
+public:
+
+ CFX_UTF8Decoder(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator)
+ {
+ m_PendingBytes = 0;
+ }
+
+ void Clear();
+
+ void Input(FX_BYTE byte);
+
+ void AppendChar(FX_DWORD ch);
+
+ void ClearStatus()
+ {
+ m_PendingBytes = 0;
+ }
+
+ CFX_WideStringC GetResult() const
+ {
+ return m_Buffer.GetWideString();
+ }
+ void GetResult(CFX_WideStringL &result) const
+ {
+ m_Buffer.GetWideStringL(result);
+ }
+protected:
+
+ int m_PendingBytes;
+
+ FX_DWORD m_PendingChar;
+
+ CFX_WideTextBuf m_Buffer;
+};
+class CFX_UTF8Encoder
+{
+public:
+
+ CFX_UTF8Encoder(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator)
+ {
+ m_UTF16First = 0;
+ }
+
+ void Input(FX_WCHAR unicode);
+
+ void AppendStr(FX_BSTR str)
+ {
+ m_UTF16First = 0;
+ m_Buffer << str;
+ }
+
+ CFX_ByteStringC GetResult() const
+ {
+ return m_Buffer.GetByteString();
+ }
+ void GetResult(CFX_ByteStringL &result) const
+ {
+ m_Buffer.GetByteStringL(result);
+ }
+protected:
+
+ CFX_ByteTextBuf m_Buffer;
+
+ FX_DWORD m_UTF16First;
+};
+CFX_ByteString FX_UrlEncode(const CFX_WideString& wsUrl);
+CFX_WideString FX_UrlDecode(const CFX_ByteString& bsUrl);
+CFX_ByteString FX_EncodeURI(const CFX_WideString& wsURI);
+CFX_WideString FX_DecodeURI(const CFX_ByteString& bsURI);
+class CFX_BasicArray : public CFX_Object
+{
+public:
+
+ IFX_Allocator* m_pAllocator;
+protected:
+
+ CFX_BasicArray(int unit_size, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_BasicArray();
+
+ FX_BOOL SetSize(int nNewSize, int nGrowBy);
+
+ FX_BOOL Append(const CFX_BasicArray& src);
+
+ FX_BOOL Copy(const CFX_BasicArray& src);
+
+ FX_LPBYTE InsertSpaceAt(int nIndex, int nCount);
+
+ FX_BOOL RemoveAt(int nIndex, int nCount);
+
+ FX_BOOL InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray);
+
+ const void* GetDataPtr(int index) const;
+protected:
+
+ FX_LPBYTE m_pData;
+
+ int m_nSize;
+
+ int m_nMaxSize;
+
+ int m_nGrowBy;
+
+ int m_nUnitSize;
+};
+template<class TYPE>
+class CFX_ArrayTemplate : public CFX_BasicArray
+{
+public:
+
+ CFX_ArrayTemplate(IFX_Allocator* pAllocator = NULL) : CFX_BasicArray(sizeof(TYPE), pAllocator) {}
+
+ int GetSize() const
+ {
+ return m_nSize;
+ }
+
+ int GetUpperBound() const
+ {
+ return m_nSize - 1;
+ }
+
+ FX_BOOL SetSize(int nNewSize, int nGrowBy = -1)
+ {
+ return CFX_BasicArray::SetSize(nNewSize, nGrowBy);
+ }
+
+ void RemoveAll()
+ {
+ SetSize(0, -1);
+ }
+
+ const TYPE GetAt(int nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ return (const TYPE&)(*(volatile const TYPE*)NULL);
+ }
+ return ((const TYPE*)m_pData)[nIndex];
+ }
+
+ FX_BOOL SetAt(int nIndex, TYPE newElement)
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ return FALSE;
+ }
+ ((TYPE*)m_pData)[nIndex] = newElement;
+ return TRUE;
+ }
+
+ TYPE& ElementAt(int nIndex)
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ return *(TYPE*)NULL;
+ }
+ return ((TYPE*)m_pData)[nIndex];
+ }
+
+ const TYPE* GetData() const
+ {
+ return (const TYPE*)m_pData;
+ }
+
+ TYPE* GetData()
+ {
+ return (TYPE*)m_pData;
+ }
+
+ FX_BOOL SetAtGrow(int nIndex, TYPE newElement)
+ {
+ if (nIndex < 0) {
+ return FALSE;
+ }
+ if (nIndex >= m_nSize)
+ if (!SetSize(nIndex + 1, -1)) {
+ return FALSE;
+ }
+ ((TYPE*)m_pData)[nIndex] = newElement;
+ return TRUE;
+ }
+
+ FX_BOOL Add(TYPE newElement)
+ {
+ if (m_nSize < m_nMaxSize) {
+ m_nSize ++;
+ } else if (!SetSize(m_nSize + 1, -1)) {
+ return FALSE;
+ }
+ ((TYPE*)m_pData)[m_nSize - 1] = newElement;
+ return TRUE;
+ }
+
+ FX_BOOL Append(const CFX_ArrayTemplate& src)
+ {
+ return CFX_BasicArray::Append(src);
+ }
+
+ FX_BOOL Copy(const CFX_ArrayTemplate& src)
+ {
+ return CFX_BasicArray::Copy(src);
+ }
+
+ TYPE* GetDataPtr(int index)
+ {
+ return (TYPE*)CFX_BasicArray::GetDataPtr(index);
+ }
+
+ TYPE* AddSpace()
+ {
+ return (TYPE*)CFX_BasicArray::InsertSpaceAt(m_nSize, 1);
+ }
+
+ TYPE* InsertSpaceAt(int nIndex, int nCount)
+ {
+ return (TYPE*)CFX_BasicArray::InsertSpaceAt(nIndex, nCount);
+ }
+
+ const TYPE operator[](int nIndex) const
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ *(volatile char*)0 = '\0';
+ }
+ return ((const TYPE*)m_pData)[nIndex];
+ }
+
+ TYPE& operator[](int nIndex)
+ {
+ if (nIndex < 0 || nIndex >= m_nSize) {
+ *(volatile char*)0 = '\0';
+ }
+ return ((TYPE*)m_pData)[nIndex];
+ }
+
+ FX_BOOL InsertAt(int nIndex, TYPE newElement, int nCount = 1)
+ {
+ if (!InsertSpaceAt(nIndex, nCount)) {
+ return FALSE;
+ }
+ while (nCount--) {
+ ((TYPE*)m_pData)[nIndex++] = newElement;
+ }
+ return TRUE;
+ }
+
+ FX_BOOL RemoveAt(int nIndex, int nCount = 1)
+ {
+ return CFX_BasicArray::RemoveAt(nIndex, nCount);
+ }
+
+ FX_BOOL InsertAt(int nStartIndex, const CFX_BasicArray* pNewArray)
+ {
+ return CFX_BasicArray::InsertAt(nStartIndex, pNewArray);
+ }
+
+ int Find(TYPE data, int iStart = 0) const
+ {
+ if (iStart < 0) {
+ return -1;
+ }
+ for (; iStart < (int)m_nSize; iStart ++)
+ if (((TYPE*)m_pData)[iStart] == data) {
+ return iStart;
+ }
+ return -1;
+ }
+};
+typedef CFX_ArrayTemplate<FX_BYTE> CFX_ByteArray;
+typedef CFX_ArrayTemplate<FX_WORD> CFX_WordArray;
+typedef CFX_ArrayTemplate<FX_DWORD> CFX_DWordArray;
+typedef CFX_ArrayTemplate<void*> CFX_PtrArray;
+typedef CFX_ArrayTemplate<FX_FILESIZE> CFX_FileSizeArray;
+typedef CFX_ArrayTemplate<FX_FLOAT> CFX_FloatArray;
+typedef CFX_ArrayTemplate<FX_INT32> CFX_Int32Array;
+template <class ObjectClass>
+class CFX_ObjectArray : public CFX_BasicArray
+{
+public:
+
+ CFX_ObjectArray(IFX_Allocator* pAllocator = NULL) : CFX_BasicArray(sizeof(ObjectClass), pAllocator) {}
+
+ ~CFX_ObjectArray()
+ {
+ RemoveAll();
+ }
+
+ void Add(const ObjectClass& data)
+ {
+ new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass(data);
+ }
+
+ ObjectClass& Add()
+ {
+ return *(ObjectClass*) new ((void*)InsertSpaceAt(m_nSize, 1)) ObjectClass();
+ }
+
+ void* AddSpace()
+ {
+ return InsertSpaceAt(m_nSize, 1);
+ }
+
+ FX_INT32 Append(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)
+ {
+ if (nCount == 0) {
+ return 0;
+ }
+ FX_INT32 nSize = src.GetSize();
+ if (!nSize) {
+ return 0;
+ }
+ FXSYS_assert(nStart > -1 && nStart < nSize);
+ if (nCount < 0) {
+ nCount = nSize;
+ }
+ if (nStart + nCount > nSize) {
+ nCount = nSize - nStart;
+ }
+ if (nCount < 1) {
+ return 0;
+ }
+ nSize = m_nSize;
+ InsertSpaceAt(m_nSize, nCount);
+ ObjectClass* pStartObj = (ObjectClass*)GetDataPtr(nSize);
+ nSize = nStart + nCount;
+ for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {
+ new ((void*)pStartObj) ObjectClass(src[i]);
+ }
+ return nCount;
+ }
+
+ FX_INT32 Copy(const CFX_ObjectArray& src, FX_INT32 nStart = 0, FX_INT32 nCount = -1)
+ {
+ if (nCount == 0) {
+ return 0;
+ }
+ FX_INT32 nSize = src.GetSize();
+ if (!nSize) {
+ return 0;
+ }
+ FXSYS_assert(nStart > -1 && nStart < nSize);
+ if (nCount < 0) {
+ nCount = nSize;
+ }
+ if (nStart + nCount > nSize) {
+ nCount = nSize - nStart;
+ }
+ if (nCount < 1) {
+ return 0;
+ }
+ RemoveAll();
+ SetSize(nCount, -1);
+ ObjectClass* pStartObj = (ObjectClass*)m_pData;
+ nSize = nStart + nCount;
+ for (FX_INT32 i = nStart; i < nSize; i ++, pStartObj++) {
+ new ((void*)pStartObj) ObjectClass(src[i]);
+ }
+ return nCount;
+ }
+
+ int GetSize() const
+ {
+ return m_nSize;
+ }
+
+ ObjectClass& operator[] (int index) const
+ {
+ FXSYS_assert(index < m_nSize);
+ return *(ObjectClass*)CFX_BasicArray::GetDataPtr(index);
+ }
+
+ ObjectClass* GetDataPtr(int index)
+ {
+ return (ObjectClass*)CFX_BasicArray::GetDataPtr(index);
+ }
+
+ void RemoveAt(int index)
+ {
+ FXSYS_assert(index < m_nSize);
+ ((ObjectClass*)GetDataPtr(index))->~ObjectClass();
+ CFX_BasicArray::RemoveAt(index, 1);
+ }
+
+ void RemoveAll()
+ {
+ for (int i = 0; i < m_nSize; i ++) {
+ ((ObjectClass*)GetDataPtr(i))->~ObjectClass();
+ }
+ CFX_BasicArray::SetSize(0, -1);
+ }
+};
+typedef CFX_ObjectArray<CFX_ByteString> CFX_ByteStringArray;
+typedef CFX_ObjectArray<CFX_WideString> CFX_WideStringArray;
+class CFX_BaseSegmentedArray : public CFX_Object
+{
+public:
+
+ CFX_BaseSegmentedArray(int unit_size = 1, int segment_units = 512, int index_size = 8, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_BaseSegmentedArray();
+
+ void SetUnitSize(int unit_size, int segment_units, int index_size = 8);
+
+ void* Add();
+
+ void* GetAt(int index) const;
+
+ void RemoveAll();
+
+ void Delete(int index, int count = 1);
+
+ int GetSize() const
+ {
+ return m_DataSize;
+ }
+
+ int GetSegmentSize() const
+ {
+ return m_SegmentSize;
+ }
+
+ int GetUnitSize() const
+ {
+ return m_UnitSize;
+ }
+
+ void* Iterate(FX_BOOL (*callback)(void* param, void* pData), void* param) const;
+
+ IFX_Allocator* m_pAllocator;
+private:
+
+ int m_UnitSize;
+
+ short m_SegmentSize;
+
+ FX_BYTE m_IndexSize;
+
+ FX_BYTE m_IndexDepth;
+
+ int m_DataSize;
+
+ void* m_pIndex;
+ void** GetIndex(int seg_index) const;
+ void* IterateIndex(int level, int& start, void** pIndex, FX_BOOL (*callback)(void* param, void* pData), void* param) const;
+ void* IterateSegment(FX_LPCBYTE pSegment, int count, FX_BOOL (*callback)(void* param, void* pData), void* param) const;
+};
+template <class ElementType>
+class CFX_SegmentedArray : public CFX_BaseSegmentedArray
+{
+public:
+
+ CFX_SegmentedArray(int segment_units, int index_size = 8, IFX_Allocator* pAllocator = NULL)
+ : CFX_BaseSegmentedArray(sizeof(ElementType), segment_units, index_size, pAllocator)
+ {}
+
+ void Add(ElementType data)
+ {
+ *(ElementType*)CFX_BaseSegmentedArray::Add() = data;
+ }
+
+ ElementType& operator [] (int index)
+ {
+ return *(ElementType*)CFX_BaseSegmentedArray::GetAt(index);
+ }
+};
+template <class DataType, int FixedSize>
+class CFX_FixedBufGrow : public CFX_Object
+{
+public:
+ CFX_FixedBufGrow(IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pData(NULL)
+ {}
+ CFX_FixedBufGrow(int data_size, IFX_Allocator* pAllocator = NULL)
+ : m_pAllocator(pAllocator)
+ , m_pData(NULL)
+ {
+ if (data_size > FixedSize) {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, data_size);
+ } else {
+ FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);
+ }
+ }
+ void SetDataSize(int data_size)
+ {
+ if (m_pData) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ }
+ m_pData = NULL;
+ if (data_size > FixedSize) {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, data_size);
+ } else {
+ FXSYS_memset32(m_Data, 0, sizeof(DataType)*FixedSize);
+ }
+ }
+ ~CFX_FixedBufGrow()
+ {
+ if (m_pData) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ }
+ }
+ operator DataType*()
+ {
+ return m_pData ? m_pData : m_Data;
+ }
+private:
+ IFX_Allocator* m_pAllocator;
+ DataType m_Data[FixedSize];
+ DataType* m_pData;
+};
+template <class DataType>
+class CFX_TempBuf
+{
+public:
+ CFX_TempBuf(int size, IFX_Allocator* pAllocator = NULL) : m_pAllocator(pAllocator)
+ {
+ m_pData = FX_Allocator_Alloc(m_pAllocator, DataType, size);
+ }
+ ~CFX_TempBuf()
+ {
+ if (m_pData) {
+ FX_Allocator_Free(m_pAllocator, m_pData);
+ }
+ }
+ DataType& operator[](int i)
+ {
+ FXSYS_assert(m_pData != NULL);
+ return m_pData[i];
+ }
+ operator DataType*()
+ {
+ return m_pData;
+ }
+private:
+ IFX_Allocator* m_pAllocator;
+ DataType* m_pData;
+};
+class CFX_MapPtrToPtr : public CFX_Object
+{
+protected:
+
+ struct CAssoc {
+
+ CAssoc* pNext;
+
+ void* key;
+
+ void* value;
+ };
+public:
+
+ CFX_MapPtrToPtr(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_MapPtrToPtr();
+
+ int GetCount() const
+ {
+ return m_nCount;
+ }
+
+ FX_BOOL IsEmpty() const
+ {
+ return m_nCount == 0;
+ }
+
+ FX_BOOL Lookup(void* key, void*& rValue) const;
+
+ void* GetValueAt(void* key) const;
+
+ void*& operator[](void* key);
+
+ void SetAt(void* key, void* newValue)
+ {
+ (*this)[key] = newValue;
+ }
+
+ FX_BOOL RemoveKey(void* key);
+
+ void RemoveAll();
+
+ FX_POSITION GetStartPosition() const
+ {
+ return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;
+ }
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, void*& rKey, void*& rValue) const;
+
+ FX_DWORD GetHashTableSize() const
+ {
+ return m_nHashTableSize;
+ }
+
+ void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);
+protected:
+
+ IFX_Allocator* m_pAllocator;
+
+ CAssoc** m_pHashTable;
+
+ FX_DWORD m_nHashTableSize;
+
+ int m_nCount;
+
+ CAssoc* m_pFreeList;
+
+ struct CFX_Plex* m_pBlocks;
+
+ int m_nBlockSize;
+
+ FX_DWORD HashKey(void* key) const;
+
+ CAssoc* NewAssoc();
+
+ void FreeAssoc(CAssoc* pAssoc);
+
+ CAssoc* GetAssocAt(void* key, FX_DWORD& hash) const;
+};
+template <class KeyType, class ValueType>
+class CFX_MapPtrTemplate : public CFX_MapPtrToPtr
+{
+public:
+
+ CFX_MapPtrTemplate(IFX_Allocator* pAllocator = NULL) : CFX_MapPtrToPtr(10, pAllocator) {}
+
+ FX_BOOL Lookup(KeyType key, ValueType& rValue) const
+ {
+ FX_LPVOID pValue = NULL;
+ if (!CFX_MapPtrToPtr::Lookup((void*)(FX_UINTPTR)key, pValue)) {
+ return FALSE;
+ }
+ rValue = (ValueType)(FX_UINTPTR)pValue;
+ return TRUE;
+ }
+
+ ValueType& operator[](KeyType key)
+ {
+ return (ValueType&)CFX_MapPtrToPtr::operator []((void*)(FX_UINTPTR)key);
+ }
+
+ void SetAt(KeyType key, ValueType newValue)
+ {
+ CFX_MapPtrToPtr::SetAt((void*)(FX_UINTPTR)key, (void*)(FX_UINTPTR)newValue);
+ }
+
+ FX_BOOL RemoveKey(KeyType key)
+ {
+ return CFX_MapPtrToPtr::RemoveKey((void*)(FX_UINTPTR)key);
+ }
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, KeyType& rKey, ValueType& rValue) const
+ {
+ void* pKey = NULL;
+ void* pValue = NULL;
+ CFX_MapPtrToPtr::GetNextAssoc(rNextPosition, pKey, pValue);
+ rKey = (KeyType)(FX_UINTPTR)pKey;
+ rValue = (ValueType)(FX_UINTPTR)pValue;
+ }
+};
+class CFX_CMapDWordToDWord : public CFX_Object
+{
+public:
+
+ CFX_CMapDWordToDWord(IFX_Allocator* pAllocator = NULL) : m_Buffer(pAllocator) {}
+
+ FX_BOOL Lookup(FX_DWORD key, FX_DWORD& value) const;
+
+ void SetAt(FX_DWORD key, FX_DWORD value);
+
+ void EstimateSize(FX_DWORD size, FX_DWORD grow_by);
+
+ FX_POSITION GetStartPosition() const;
+
+ void GetNextAssoc(FX_POSITION& pos, FX_DWORD& key, FX_DWORD& value) const;
+protected:
+
+ CFX_BinaryBuf m_Buffer;
+};
+class CFX_MapByteStringToPtr : public CFX_Object
+{
+protected:
+
+ struct CAssoc {
+
+ CAssoc* pNext;
+
+ FX_DWORD nHashValue;
+
+ CFX_ByteString key;
+
+ void* value;
+ };
+public:
+
+ CFX_MapByteStringToPtr(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);
+
+ int GetCount() const
+ {
+ return m_nCount;
+ }
+
+ FX_BOOL IsEmpty() const
+ {
+ return m_nCount == 0;
+ }
+
+ FX_BOOL Lookup(FX_BSTR key, void*& rValue) const;
+
+ void*& operator[](FX_BSTR key);
+
+ void SetAt(FX_BSTR key, void* newValue)
+ {
+ (*this)[key] = newValue;
+ }
+
+ FX_BOOL RemoveKey(FX_BSTR key);
+
+ void RemoveAll();
+
+ FX_POSITION GetStartPosition() const
+ {
+ return (m_nCount == 0) ? NULL : (FX_POSITION) - 1;
+ }
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;
+
+ FX_LPVOID GetNextValue(FX_POSITION& rNextPosition) const;
+
+ FX_DWORD GetHashTableSize() const
+ {
+ return m_nHashTableSize;
+ }
+
+ void InitHashTable(FX_DWORD hashSize, FX_BOOL bAllocNow = TRUE);
+
+ FX_DWORD HashKey(FX_BSTR key) const;
+protected:
+
+ IFX_Allocator* m_pAllocator;
+
+ CAssoc** m_pHashTable;
+
+ FX_DWORD m_nHashTableSize;
+
+ int m_nCount;
+
+ CAssoc* m_pFreeList;
+
+ struct CFX_Plex* m_pBlocks;
+
+ int m_nBlockSize;
+
+ CAssoc* NewAssoc();
+
+ void FreeAssoc(CAssoc* pAssoc);
+
+ CAssoc* GetAssocAt(FX_BSTR key, FX_DWORD& hash) const;
+public:
+
+ ~CFX_MapByteStringToPtr();
+};
+class CFX_CMapByteStringToPtr : public CFX_Object
+{
+public:
+
+ CFX_CMapByteStringToPtr(IFX_Allocator* pAllocator = NULL);
+
+ ~CFX_CMapByteStringToPtr();
+
+ void RemoveAll();
+
+ FX_POSITION GetStartPosition() const;
+
+ void GetNextAssoc(FX_POSITION& rNextPosition, CFX_ByteString& rKey, void*& rValue) const;
+
+ FX_LPVOID GetNextValue(FX_POSITION& rNextPosition) const;
+
+ FX_BOOL Lookup(FX_BSTR key, void*& rValue) const;
+
+ void SetAt(FX_BSTR key, void* value);
+
+ void RemoveKey(FX_BSTR key);
+
+ int GetCount() const;
+
+ void AddValue(FX_BSTR key, void* pValue);
+private:
+
+ CFX_BaseSegmentedArray m_Buffer;
+};
+class CFX_PtrList : public CFX_Object
+{
+protected:
+
+ struct CNode {
+
+ CNode* pNext;
+
+ CNode* pPrev;
+
+ void* data;
+ };
+public:
+
+ CFX_PtrList(int nBlockSize = 10, IFX_Allocator* pAllocator = NULL);
+
+ FX_POSITION GetHeadPosition() const
+ {
+ return (FX_POSITION)m_pNodeHead;
+ }
+
+ FX_POSITION GetTailPosition() const
+ {
+ return (FX_POSITION)m_pNodeTail;
+ }
+
+ void* GetNext(FX_POSITION& rPosition) const
+ {
+ CNode* pNode = (CNode*) rPosition;
+ rPosition = (FX_POSITION) pNode->pNext;
+ return pNode->data;
+ }
+
+ void* GetPrev(FX_POSITION& rPosition) const
+ {
+ CNode* pNode = (CNode*) rPosition;
+ rPosition = (FX_POSITION) pNode->pPrev;
+ return pNode->data;
+ }
+
+ FX_POSITION GetNextPosition(FX_POSITION pos) const
+ {
+ return ((CNode*)pos)->pNext;
+ }
+
+ FX_POSITION GetPrevPosition(FX_POSITION pos) const
+ {
+ return ((CNode*)pos)->pPrev;
+ }
+
+ void* GetAt(FX_POSITION rPosition) const
+ {
+ CNode* pNode = (CNode*) rPosition;
+ return pNode->data;
+ }
+
+ int GetCount() const
+ {
+ return m_nCount;
+ }
+
+ FX_POSITION AddTail(void* newElement);
+
+ FX_POSITION AddHead(void* newElement);
+
+ void SetAt(FX_POSITION pos, void* newElement)
+ {
+ CNode* pNode = (CNode*) pos;
+ pNode->data = newElement;
+ }
+
+ FX_POSITION InsertAfter(FX_POSITION pos, void* newElement);
+
+ FX_POSITION Find(void* searchValue, FX_POSITION startAfter = NULL ) const;
+
+ FX_POSITION FindIndex(int index) const;
+
+ void RemoveAt(FX_POSITION pos);
+
+ void RemoveAll();
+protected:
+
+ IFX_Allocator* m_pAllocator;
+
+ CNode* m_pNodeHead;
+
+ CNode* m_pNodeTail;
+
+ int m_nCount;
+
+ CNode* m_pNodeFree;
+
+ struct CFX_Plex* m_pBlocks;
+
+ int m_nBlockSize;
+
+ CNode* NewNode(CNode* pPrev, CNode* pNext);
+
+ void FreeNode(CNode* pNode);
+public:
+
+ ~CFX_PtrList();
+};
+typedef void (*PD_CALLBACK_FREEDATA)(FX_LPVOID pData);
+struct FX_PRIVATEDATA {
+
+ void FreeData();
+
+ FX_LPVOID m_pModuleId;
+
+ FX_LPVOID m_pData;
+
+ PD_CALLBACK_FREEDATA m_pCallback;
+
+ FX_BOOL m_bSelfDestruct;
+};
+class CFX_PrivateData
+{
+public:
+
+ CFX_PrivateData(IFX_Allocator* pAllocator = NULL) : m_DataList(pAllocator) {}
+
+ ~CFX_PrivateData();
+
+ void ClearAll();
+
+ void SetPrivateData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback);
+
+ void SetPrivateObj(FX_LPVOID module_id, CFX_DestructObject* pObj);
+
+ FX_LPVOID GetPrivateData(FX_LPVOID module_id);
+
+ FX_BOOL LookupPrivateData(FX_LPVOID module_id, FX_LPVOID &pData) const
+ {
+ if (!module_id) {
+ return FALSE;
+ }
+ FX_DWORD nCount = m_DataList.GetSize();
+ for (FX_DWORD n = 0; n < nCount; n ++) {
+ if (m_DataList[n].m_pModuleId == module_id) {
+ pData = m_DataList[n].m_pData;
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+
+ FX_BOOL RemovePrivateData(FX_LPVOID module_id);
+protected:
+
+ CFX_ArrayTemplate<FX_PRIVATEDATA> m_DataList;
+
+ void AddData(FX_LPVOID module_id, FX_LPVOID pData, PD_CALLBACK_FREEDATA callback, FX_BOOL bSelfDestruct);
+};
+class CFX_BitStream : public CFX_Object
+{
+public:
+
+ void Init(FX_LPCBYTE pData, FX_DWORD dwSize);
+
+
+ FX_DWORD GetBits(FX_DWORD nBits);
+
+ void ByteAlign();
+
+ FX_BOOL IsEOF()
+ {
+ return m_BitPos >= m_BitSize;
+ }
+
+ void SkipBits(FX_DWORD nBits)
+ {
+ m_BitPos += nBits;
+ }
+
+ void Rewind()
+ {
+ m_BitPos = 0;
+ }
+protected:
+
+ FX_DWORD m_BitPos;
+
+ FX_DWORD m_BitSize;
+
+ FX_LPCBYTE m_pData;
+};
+template <class ObjClass> class CFX_CountRef : public CFX_Object
+{
+public:
+
+ typedef CFX_CountRef<ObjClass> Ref;
+
+ class CountedObj : public ObjClass
+ {
+ public:
+
+ CountedObj() {}
+
+ CountedObj(const CountedObj& src) : ObjClass(src) {}
+
+ int m_RefCount;
+ };
+
+ CFX_CountRef()
+ {
+ m_pObject = NULL;
+ }
+
+ CFX_CountRef(const Ref& ref)
+ {
+ m_pObject = ref.m_pObject;
+ if (m_pObject) {
+ m_pObject->m_RefCount ++;
+ }
+ }
+
+ ~CFX_CountRef()
+ {
+ if (!m_pObject) {
+ return;
+ }
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ }
+
+ ObjClass* New()
+ {
+ if (m_pObject) {
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ m_pObject = NULL;
+ }
+ m_pObject = FX_NEW CountedObj;
+ if (!m_pObject) {
+ return NULL;
+ }
+ m_pObject->m_RefCount = 1;
+ return m_pObject;
+ }
+
+ void operator = (const Ref& ref)
+ {
+ if (ref.m_pObject) {
+ ref.m_pObject->m_RefCount ++;
+ }
+ if (m_pObject) {
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ }
+ m_pObject = ref.m_pObject;
+ }
+
+ void operator = (void* p)
+ {
+ FXSYS_assert(p == 0);
+ if (m_pObject == NULL) {
+ return;
+ }
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ m_pObject = NULL;
+ }
+
+ const ObjClass* GetObject() const
+ {
+ return m_pObject;
+ }
+
+ operator const ObjClass*() const
+ {
+ return m_pObject;
+ }
+
+ FX_BOOL IsNull() const
+ {
+ return m_pObject == NULL;
+ }
+
+ FX_BOOL NotNull() const
+ {
+ return m_pObject != NULL;
+ }
+
+ ObjClass* GetModify()
+ {
+ if (m_pObject == NULL) {
+ m_pObject = FX_NEW CountedObj;
+ if (m_pObject) {
+ m_pObject->m_RefCount = 1;
+ }
+ } else if (m_pObject->m_RefCount > 1) {
+ m_pObject->m_RefCount --;
+ CountedObj* pOldObject = m_pObject;
+ m_pObject = NULL;
+ m_pObject = FX_NEW CountedObj(*pOldObject);
+ if (m_pObject) {
+ m_pObject->m_RefCount = 1;
+ }
+ }
+ return m_pObject;
+ }
+
+ void SetNull()
+ {
+ if (m_pObject == NULL) {
+ return;
+ }
+ m_pObject->m_RefCount --;
+ if (m_pObject->m_RefCount <= 0) {
+ delete m_pObject;
+ }
+ m_pObject = NULL;
+ }
+
+ FX_BOOL operator == (const Ref& ref) const
+ {
+ return m_pObject == ref.m_pObject;
+ }
+protected:
+
+ CountedObj* m_pObject;
+};
+class IFX_Pause
+{
+public:
+
+ virtual FX_BOOL NeedToPauseNow() = 0;
+};
+class CFX_DataFilter : public CFX_Object
+{
+public:
+
+ virtual ~CFX_DataFilter();
+
+ void SetDestFilter(CFX_DataFilter* pFilter);
+
+ FX_BOOL IsEOF() const
+ {
+ return m_bEOF;
+ }
+
+ FX_DWORD GetSrcPos()
+ {
+ return m_SrcPos;
+ }
+
+ void FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf);
+
+ void FilterFinish(CFX_BinaryBuf& dest_buf);
+protected:
+
+ CFX_DataFilter();
+ virtual void v_FilterIn(FX_LPCBYTE src_buf, FX_DWORD src_size, CFX_BinaryBuf& dest_buf) = 0;
+ virtual void v_FilterFinish(CFX_BinaryBuf& dest_buf) = 0;
+ void ReportEOF(FX_DWORD left_input);
+
+ FX_BOOL m_bEOF;
+
+ FX_DWORD m_SrcPos;
+
+ CFX_DataFilter* m_pDestFilter;
+};
+template <class T>
+class CFX_SmartPointer
+{
+public:
+ CFX_SmartPointer(T *pObj) : m_pObj(pObj) {}
+ ~CFX_SmartPointer()
+ {
+ m_pObj->Release();
+ }
+ operator T*(void)
+ {
+ return m_pObj;
+ }
+ T& operator *(void)
+ {
+ return *m_pObj;
+ }
+ T* operator ->(void)
+ {
+ return m_pObj;
+ }
+protected:
+ T *m_pObj;
+};
+#define FX_DATALIST_LENGTH 1024
+template<size_t unit>
+class CFX_SortListArray : public CFX_Object
+{
+protected:
+
+ struct DataList {
+
+ FX_INT32 start;
+
+ FX_INT32 count;
+ FX_LPBYTE data;
+ };
+public:
+
+ CFX_SortListArray(IFX_Allocator* pAllocator = NULL) : m_CurList(0), m_DataLists(pAllocator) {}
+
+ ~CFX_SortListArray()
+ {
+ Clear();
+ }
+
+
+ void Clear()
+ {
+ IFX_Allocator* pAllocator = m_DataLists.m_pAllocator;
+ for (FX_INT32 i = m_DataLists.GetUpperBound(); i >= 0; i--) {
+ DataList list = m_DataLists.ElementAt(i);
+ if (list.data) {
+ FX_Allocator_Free(pAllocator, list.data);
+ }
+ }
+ m_DataLists.RemoveAll();
+ m_CurList = 0;
+ }
+
+ void Append(FX_INT32 nStart, FX_INT32 nCount)
+ {
+ if (nStart < 0) {
+ return;
+ }
+ IFX_Allocator* pAllocator = m_DataLists.m_pAllocator;
+ while (nCount > 0) {
+ FX_INT32 temp_count = FX_MIN(nCount, FX_DATALIST_LENGTH);
+ DataList list;
+ list.data = FX_Allocator_Alloc(pAllocator, FX_BYTE, temp_count * unit);
+ if (!list.data) {
+ break;
+ }
+ FXSYS_memset32(list.data, 0, temp_count * unit);
+ list.start = nStart;
+ list.count = temp_count;
+ Append(list);
+ nCount -= temp_count;
+ nStart += temp_count;
+ }
+ }
+
+ FX_LPBYTE GetAt(FX_INT32 nIndex)
+ {
+ if (nIndex < 0) {
+ return NULL;
+ }
+ if (m_CurList < 0 || m_CurList >= m_DataLists.GetSize()) {
+ return NULL;
+ }
+ DataList *pCurList = m_DataLists.GetDataPtr(m_CurList);
+ if (!pCurList || nIndex < pCurList->start || nIndex >= pCurList->start + pCurList->count) {
+ pCurList = NULL;
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = m_DataLists.GetUpperBound();
+ FX_INT32 iMid = 0;
+ while (iStart <= iEnd) {
+ iMid = (iStart + iEnd) / 2;
+ DataList* list = m_DataLists.GetDataPtr(iMid);
+ if (nIndex < list->start) {
+ iEnd = iMid - 1;
+ } else if (nIndex >= list->start + list->count) {
+ iStart = iMid + 1;
+ } else {
+ pCurList = list;
+ m_CurList = iMid;
+ break;
+ }
+ }
+ }
+ return pCurList ? pCurList->data + (nIndex - pCurList->start) * unit : NULL;
+ }
+protected:
+ void Append(const DataList& list)
+ {
+ FX_INT32 iStart = 0;
+ FX_INT32 iEnd = m_DataLists.GetUpperBound();
+ FX_INT32 iFind = 0;
+ while (iStart <= iEnd) {
+ FX_INT32 iMid = (iStart + iEnd) / 2;
+ DataList* cur_list = m_DataLists.GetDataPtr(iMid);
+ if (list.start < cur_list->start + cur_list->count) {
+ iEnd = iMid - 1;
+ } else {
+ if (iMid == iEnd) {
+ iFind = iMid + 1;
+ break;
+ }
+ DataList* next_list = m_DataLists.GetDataPtr(iMid + 1);
+ if (list.start < next_list->start) {
+ iFind = iMid + 1;
+ break;
+ } else {
+ iStart = iMid + 1;
+ }
+ }
+ }
+ m_DataLists.InsertAt(iFind, list);
+ }
+ FX_INT32 m_CurList;
+ CFX_ArrayTemplate<DataList> m_DataLists;
+};
+template<typename T1, typename T2>
+class CFX_ListArrayTemplate : public CFX_Object
+{
+public:
+
+ void Clear()
+ {
+ m_Data.Clear();
+ }
+
+ void Add(FX_INT32 nStart, FX_INT32 nCount)
+ {
+ m_Data.Append(nStart, nCount);
+ }
+
+ T2& operator [] (FX_INT32 nIndex)
+ {
+ FX_LPBYTE data = m_Data.GetAt(nIndex);
+ FXSYS_assert(data != NULL);
+ return (T2&)(*(volatile T2*)data);
+ }
+
+ T2* GetPtrAt(FX_INT32 nIndex)
+ {
+ return (T2*)m_Data.GetAt(nIndex);
+ }
+protected:
+ T1 m_Data;
+};
+typedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_FILESIZE)>, FX_FILESIZE> CFX_FileSizeListArray;
+typedef CFX_ListArrayTemplate<CFX_SortListArray<sizeof(FX_DWORD)>, FX_DWORD> CFX_DWordListArray;
+typedef enum {
+ Ready,
+ ToBeContinued,
+ Found,
+ NotFound,
+ Failed,
+ Done
+} FX_ProgressiveStatus;
+#define ProgressiveStatus FX_ProgressiveStatus
+#define FX_NAMESPACE_DECLARE(namespace, type) namespace::type
+#endif
diff --git a/core/include/fxcrt/fx_coordinates.h b/core/include/fxcrt/fx_coordinates.h new file mode 100644 index 0000000000..eee0dfb260 --- /dev/null +++ b/core/include/fxcrt/fx_coordinates.h @@ -0,0 +1,900 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_COORDINATES_
+#define _FXCRT_COORDINATES_
+template<class baseType> class CFX_PSVTemplate;
+template<class baseType> class CFX_VTemplate;
+template<class baseType> class CFX_PRLTemplate;
+template<class baseType> class CFX_RTemplate;
+template<class baseType> class CFX_ETemplate;
+template<class baseType> class CFX_ATemplate;
+template<class baseType> class CFX_RRTemplate;
+class CFX_Matrix;
+template<class baseType>
+class CFX_PSVTemplate : public CFX_Object
+{
+public:
+ typedef CFX_PSVTemplate<baseType> FXT_PSV;
+ typedef CFX_PSVTemplate<baseType> FXT_POINT;
+ typedef CFX_PSVTemplate<baseType> FXT_SIZE;
+ void Set(baseType x, baseType y)
+ {
+ FXT_PSV::x = x, FXT_PSV::y = y;
+ }
+ void Set(const FXT_PSV &psv)
+ {
+ FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;
+ }
+ void Add(baseType x, baseType y)
+ {
+ FXT_PSV::x += x, FXT_PSV::y += y;
+ }
+ void Subtract(baseType x, baseType y)
+ {
+ FXT_PSV::x -= x, FXT_PSV::y -= y;
+ }
+ void Reset()
+ {
+ FXT_PSV::x = FXT_PSV::y = 0;
+ }
+ FXT_PSV& operator += (const FXT_PSV &obj)
+ {
+ x += obj.x;
+ y += obj.y;
+ return *this;
+ }
+ FXT_PSV& operator -= (const FXT_PSV &obj)
+ {
+ x -= obj.x;
+ y -= obj.y;
+ return *this;
+ }
+ FXT_PSV& operator *= (baseType lamda)
+ {
+ x *= lamda;
+ y *= lamda;
+ return *this;
+ }
+ FXT_PSV& operator /= (baseType lamda)
+ {
+ x /= lamda;
+ y /= lamda;
+ return *this;
+ }
+ friend FX_BOOL operator == (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ return obj1.x == obj2.x && obj1.y == obj2.y;
+ }
+ friend FX_BOOL operator != (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ return obj1.x != obj2.x || obj1.y != obj2.y;
+ }
+ friend FXT_PSV operator + (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ CFX_PSVTemplate obj;
+ obj.x = obj1.x + obj2.x;
+ obj.y = obj1.y + obj2.y;
+ return obj;
+ }
+ friend FXT_PSV operator - (const FXT_PSV &obj1, const FXT_PSV &obj2)
+ {
+ CFX_PSVTemplate obj;
+ obj.x = obj1.x - obj2.x;
+ obj.y = obj1.y - obj2.y;
+ return obj;
+ }
+ friend FXT_PSV operator * (const FXT_PSV &obj, baseType lamda)
+ {
+ CFX_PSVTemplate t;
+ t.x = obj.x * lamda;
+ t.y = obj.y * lamda;
+ return t;
+ }
+ friend FXT_PSV operator * (baseType lamda, const FXT_PSV &obj)
+ {
+ CFX_PSVTemplate t;
+ t.x = lamda * obj.x;
+ t.y = lamda * obj.y;
+ return t;
+ }
+ friend FXT_PSV operator / (const FXT_PSV &obj, baseType lamda)
+ {
+ CFX_PSVTemplate t;
+ t.x = obj.x / lamda;
+ t.y = obj.y / lamda;
+ return t;
+ }
+ baseType x, y;
+};
+typedef CFX_PSVTemplate<FX_INT32> CFX_Point;
+typedef CFX_PSVTemplate<FX_FLOAT> CFX_PointF;
+typedef CFX_PSVTemplate<FX_INT32> CFX_Size;
+typedef CFX_PSVTemplate<FX_FLOAT> CFX_SizeF;
+typedef CFX_ArrayTemplate<CFX_Point> CFX_Points;
+typedef CFX_ArrayTemplate<CFX_PointF> CFX_PointsF;
+typedef CFX_PSVTemplate<FX_INT32> * FX_LPPOINT;
+typedef CFX_PSVTemplate<FX_FLOAT> * FX_LPPOINTF;
+typedef CFX_PSVTemplate<FX_INT32> const * FX_LPCPOINT;
+typedef CFX_PSVTemplate<FX_FLOAT> const * FX_LPCPOINTF;
+#define CFX_FloatPoint CFX_PointF
+template<class baseType>
+class CFX_VTemplate: public CFX_PSVTemplate<baseType>
+{
+public:
+ typedef CFX_PSVTemplate<baseType> FXT_PSV;
+ typedef CFX_PSVTemplate<baseType> FXT_POINT;
+ typedef CFX_PSVTemplate<baseType> FXT_SIZE;
+ typedef CFX_VTemplate<baseType> FXT_VECTOR;
+ void Set(baseType x, baseType y)
+ {
+ FXT_PSV::x = x, FXT_PSV::y = y;
+ }
+ void Set(const FXT_PSV &psv)
+ {
+ FXT_PSV::x = psv.x, FXT_PSV::y = psv.y;
+ }
+ void Set(const FXT_POINT &p1, const FXT_POINT &p2)
+ {
+ FXT_PSV::x = p2.x - p1.x, FXT_PSV::y = p2.y - p1.y;
+ }
+ void Reset()
+ {
+ FXT_PSV::x = FXT_PSV::y = 0;
+ }
+ baseType SquareLength() const
+ {
+ return FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y;
+ }
+ baseType Length() const
+ {
+ return FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);
+ }
+ void Normalize()
+ {
+ FX_FLOAT fLen = FXSYS_sqrt(FXT_PSV::x * FXT_PSV::x + FXT_PSV::y * FXT_PSV::y);
+ FXSYS_assert(fLen >= 0.0001f);
+ FXT_PSV::x = ((baseType)FXT_PSV::x) / fLen;
+ FXT_PSV::y = ((baseType)FXT_PSV::y) / fLen;
+ }
+ baseType DotProduct(baseType x, baseType y) const
+ {
+ return FXT_PSV::x * x + FXT_PSV::y * y;
+ }
+ baseType DotProduct(const FXT_VECTOR &v) const
+ {
+ return FXT_PSV::x * v.x + FXT_PSV::y * v.y;
+ }
+ FX_BOOL IsParallel(baseType x, baseType y) const
+ {
+ baseType t = FXT_PSV::x * y - FXT_PSV::y * x;
+ return FXSYS_fabs(t) < 0x0001f;
+ }
+ FX_BOOL IsParallel(const FXT_VECTOR &v) const
+ {
+ return IsParallel(v.x, v.y);
+ }
+ FX_BOOL IsPerpendicular(baseType x, baseType y) const
+ {
+ baseType t = DotProduct(x, y);
+ return FXSYS_fabs(t) < 0x0001f;
+ }
+ FX_BOOL IsPerpendicular(const FXT_VECTOR &v) const
+ {
+ return IsPerpendicular(v.x, v.y);
+ }
+ void Translate(baseType dx, baseType dy)
+ {
+ FXT_PSV::x += dx, FXT_PSV::y += dy;
+ }
+ void Scale(baseType sx, baseType sy)
+ {
+ FXT_PSV::x *= sx, FXT_PSV::y *= sy;
+ }
+ void Rotate(FX_FLOAT fRadian)
+ {
+ FX_FLOAT xx = (FX_FLOAT)FXT_PSV::x;
+ FX_FLOAT yy = (FX_FLOAT)FXT_PSV::y;
+ FX_FLOAT cosValue = FXSYS_cos(fRadian);
+ FX_FLOAT sinValue = FXSYS_sin(fRadian);
+ FXT_PSV::x = xx * cosValue - yy * sinValue;
+ FXT_PSV::y = xx * sinValue + yy * cosValue;
+ }
+ friend FX_FLOAT Cosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)
+ {
+ FXSYS_assert(v1.SquareLength() != 0 && v2.SquareLength() != 0);
+ FX_FLOAT dotProduct = v1.DotProduct(v2);
+ return dotProduct / (FX_FLOAT)FXSYS_sqrt(v1.SquareLength() * v2.SquareLength());
+ }
+ friend FX_FLOAT ArcCosine(const FXT_VECTOR &v1, const FXT_VECTOR &v2)
+ {
+ return (FX_FLOAT)FXSYS_acos(Cosine(v1, v2));
+ }
+ friend FX_FLOAT SlopeAngle(const FXT_VECTOR &v)
+ {
+ CFX_VTemplate vx;
+ vx.Set(1, 0);
+ FX_FLOAT fSlope = ArcCosine(v, vx);
+ return v.y < 0 ? -fSlope : fSlope;
+ }
+};
+typedef CFX_VTemplate<FX_INT32> CFX_Vector;
+typedef CFX_VTemplate<FX_FLOAT> CFX_VectorF;
+template<class baseType>
+class CFX_RTemplate: public CFX_Object
+{
+public:
+ typedef CFX_PSVTemplate<baseType> FXT_POINT;
+ typedef CFX_PSVTemplate<baseType> FXT_SIZE;
+ typedef CFX_VTemplate<baseType> FXT_VECTOR;
+ typedef CFX_PRLTemplate<baseType> FXT_PARAL;
+ typedef CFX_RTemplate<baseType> FXT_RECT;
+ void Set(baseType left, baseType top, baseType width, baseType height)
+ {
+ FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::width = width, FXT_RECT::height = height;
+ }
+ void Set(baseType left, baseType top, const FXT_SIZE &size)
+ {
+ FXT_RECT::left = left, FXT_RECT::top = top, FXT_RECT::Size(size);
+ }
+ void Set(const FXT_POINT &p, baseType width, baseType height)
+ {
+ TopLeft(p), FXT_RECT::width = width, FXT_RECT::height = height;
+ }
+ void Set(const FXT_POINT &p1, const FXT_POINT &p2)
+ {
+ TopLeft(p1), FXT_RECT::width = p2.x - p1.x, FXT_RECT::height = p2.y - p1.y, FXT_RECT::Normalize();
+ }
+ void Set(const FXT_POINT &p, const FXT_VECTOR &v)
+ {
+ TopLeft(p), FXT_RECT::width = v.x, FXT_RECT::height = v.y, FXT_RECT::Normalize();
+ }
+ void Reset()
+ {
+ FXT_RECT::left = FXT_RECT::top = FXT_RECT::width = FXT_RECT::height = 0;
+ }
+ FXT_RECT& operator += (const FXT_POINT &p)
+ {
+ left += p.x, top += p.y;
+ return *this;
+ }
+ FXT_RECT& operator -= (const FXT_POINT &p)
+ {
+ left -= p.x, top -= p.y;
+ return *this;
+ }
+ baseType right() const
+ {
+ return left + width;
+ }
+ baseType bottom() const
+ {
+ return top + height;
+ }
+ void Normalize()
+ {
+ if (width < 0) {
+ left += width;
+ width = -width;
+ }
+ if (height < 0) {
+ top += height;
+ height = -height;
+ }
+ }
+ void Offset(baseType dx, baseType dy)
+ {
+ left += dx;
+ top += dy;
+ }
+ void Inflate(baseType x, baseType y)
+ {
+ left -= x;
+ width += x * 2;
+ top -= y;
+ height += y * 2;
+ }
+ void Inflate(const FXT_POINT &p)
+ {
+ Inflate(p.x, p.y);
+ }
+ void Inflate(baseType left, baseType top, baseType right, baseType bottom)
+ {
+ FXT_RECT::left -= left;
+ FXT_RECT::top -= top;
+ FXT_RECT::width += left + right;
+ FXT_RECT::height += top + bottom;
+ }
+ void Inflate(const FXT_RECT &rt)
+ {
+ Inflate(rt.left, rt.top, rt.left + rt.width, rt.top + rt.height);
+ }
+ void Deflate(baseType x, baseType y)
+ {
+ left += x;
+ width -= x * 2;
+ top += y;
+ height -= y * 2;
+ }
+ void Deflate(const FXT_POINT &p)
+ {
+ Deflate(p.x, p.y);
+ }
+ void Deflate(baseType left, baseType top, baseType right, baseType bottom)
+ {
+ FXT_RECT::left += left;
+ FXT_RECT::top += top;
+ FXT_RECT::width -= left + right;
+ FXT_RECT::height -= top + bottom;
+ }
+ void Deflate(const FXT_RECT &rt)
+ {
+ Deflate(rt.left, rt.top, rt.top + rt.width, rt.top + rt.height);
+ }
+ FX_BOOL IsEmpty() const
+ {
+ return width <= 0 || height <= 0;
+ }
+ FX_BOOL IsEmpty(FX_FLOAT fEpsilon) const
+ {
+ return width <= fEpsilon || height <= fEpsilon;
+ }
+ void Empty()
+ {
+ width = height = 0;
+ }
+ FX_BOOL Contains(baseType x, baseType y) const
+ {
+ return x >= left && x < left + width && y >= top && y < top + height;
+ }
+ FX_BOOL Contains(const FXT_POINT &p) const
+ {
+ return Contains(p.x, p.y);
+ }
+ FX_BOOL Contains(const FXT_RECT &rt) const
+ {
+ return rt.left >= left && rt.right() <= right() && rt.top >= top && rt.bottom() <= bottom();
+ }
+ baseType Width() const
+ {
+ return width;
+ }
+ baseType Height() const
+ {
+ return height;
+ }
+ FXT_SIZE Size() const
+ {
+ FXT_SIZE size;
+ size.Set(width, height);
+ return size;
+ }
+ void Size(FXT_SIZE s)
+ {
+ width = s.x, height = s.y;
+ }
+ FXT_POINT TopLeft() const
+ {
+ FXT_POINT p;
+ p.x = left;
+ p.y = top;
+ return p;
+ }
+ FXT_POINT TopRight() const
+ {
+ FXT_POINT p;
+ p.x = left + width;
+ p.y = top;
+ return p;
+ }
+ FXT_POINT BottomLeft() const
+ {
+ FXT_POINT p;
+ p.x = left;
+ p.y = top + height;
+ return p;
+ }
+ FXT_POINT BottomRight() const
+ {
+ FXT_POINT p;
+ p.x = left + width;
+ p.y = top + height;
+ return p;
+ }
+ void TopLeft(FXT_POINT tl)
+ {
+ left = tl.x;
+ top = tl.y;
+ }
+ void TopRight(FXT_POINT tr)
+ {
+ width = tr.x - left;
+ top = tr.y;
+ }
+ void BottomLeft(FXT_POINT bl)
+ {
+ left = bl.x;
+ height = bl.y - top;
+ }
+ void BottomRight(FXT_POINT br)
+ {
+ width = br.x - left;
+ height = br.y - top;
+ }
+ FXT_POINT Center() const
+ {
+ FXT_POINT p;
+ p.x = left + width / 2;
+ p.y = top + height / 2;
+ return p;
+ }
+ void GetParallelogram(FXT_PARAL &pg) const
+ {
+ pg.x = left, pg.y = top;
+ pg.x1 = width, pg.y1 = 0;
+ pg.x2 = 0, pg.y2 = height;
+ }
+ void Union(baseType x, baseType y)
+ {
+ baseType r = right(), b = bottom();
+ if (left > x) {
+ left = x;
+ }
+ if (r < x) {
+ r = x;
+ }
+ if (top > y) {
+ top = y;
+ }
+ if (b < y) {
+ b = y;
+ }
+ width = r - left;
+ height = b - top;
+ }
+ void Union(const FXT_POINT &p)
+ {
+ Union(p.x, p.y);
+ }
+ void Union(const FXT_RECT &rt)
+ {
+ baseType r = right(), b = bottom();
+ if (left > rt.left) {
+ left = rt.left;
+ }
+ if (r < rt.right()) {
+ r = rt.right();
+ }
+ if (top > rt.top) {
+ top = rt.top;
+ }
+ if (b < rt.bottom()) {
+ b = rt.bottom();
+ }
+ width = r - left;
+ height = b - top;
+ }
+ void Intersect(const FXT_RECT &rt)
+ {
+ baseType r = right(), b = bottom();
+ if (left < rt.left) {
+ left = rt.left;
+ }
+ if (r > rt.right()) {
+ r = rt.right();
+ }
+ if (top < rt.top) {
+ top = rt.top;
+ }
+ if (b > rt.bottom()) {
+ b = rt.bottom();
+ }
+ width = r - left;
+ height = b - top;
+ }
+ FX_BOOL IntersectWith(const FXT_RECT &rt) const
+ {
+ FXT_RECT rect = rt;
+ rect.Intersect(*this);
+ return !rect.IsEmpty();
+ }
+ FX_BOOL IntersectWith(const FXT_RECT &rt, FX_FLOAT fEpsilon) const
+ {
+ FXT_RECT rect = rt;
+ rect.Intersect(*this);
+ return !rect.IsEmpty(fEpsilon);
+ }
+ friend FX_BOOL operator == (const FXT_RECT &rc1, const FXT_RECT &rc2)
+ {
+ return rc1.left == rc2.left && rc1.top == rc2.top && rc1.width == rc2.width && rc1.height == rc2.height;
+ }
+ friend FX_BOOL operator != (const FXT_RECT &rc1, const FXT_RECT &rc2)
+ {
+ return rc1.left != rc2.left || rc1.top != rc2.top || rc1.width != rc2.width || rc1.height != rc2.height;
+ }
+ baseType left, top;
+ baseType width, height;
+};
+typedef CFX_RTemplate<FX_INT32> CFX_Rect;
+typedef CFX_RTemplate<FX_FLOAT> CFX_RectF;
+typedef CFX_RTemplate<FX_INT32> * FX_LPRECT;
+typedef CFX_RTemplate<FX_FLOAT> * FX_LPRECTF;
+typedef CFX_RTemplate<FX_INT32> const * FX_LPCRECT;
+typedef CFX_RTemplate<FX_FLOAT> const * FX_LPCRECTF;
+typedef CFX_ArrayTemplate<CFX_RectF> CFX_RectFArray;
+struct FX_RECT {
+
+ int left;
+
+ int top;
+
+ int right;
+
+ int bottom;
+
+ FX_RECT() {}
+
+ FX_RECT(int left1, int top1, int right1, int bottom1)
+ {
+ left = left1;
+ top = top1;
+ right = right1;
+ bottom = bottom1;
+ }
+
+ int Width() const
+ {
+ return right - left;
+ }
+
+ int Height() const
+ {
+ return bottom - top;
+ }
+
+ FX_BOOL IsEmpty() const
+ {
+ return right <= left || bottom <= top;
+ }
+
+ void Normalize();
+
+ void Intersect(const FX_RECT& src);
+
+ void Intersect(int left1, int top1, int right1, int bottom1)
+ {
+ Intersect(FX_RECT(left1, top1, right1, bottom1));
+ }
+
+ void Union(const FX_RECT& other_rect);
+
+ FX_BOOL operator == (const FX_RECT& src) const
+ {
+ return left == src.left && right == src.right && top == src.top && bottom == src.bottom;
+ }
+
+ void Offset(int dx, int dy)
+ {
+ left += dx;
+ right += dx;
+ top += dy;
+ bottom += dy;
+ }
+
+ FX_BOOL Contains(const FX_RECT& other_rect) const
+ {
+ return other_rect.left >= left && other_rect.right <= right && other_rect.top >= top && other_rect.bottom <= bottom;
+ }
+
+ FX_BOOL Contains(int x, int y) const
+ {
+ return x >= left && x < right && y >= top && y < bottom;
+ }
+};
+struct FX_SMALL_RECT {
+
+ FX_SHORT Left;
+
+ FX_SHORT Top;
+
+ FX_SHORT Right;
+
+ FX_SHORT Bottom;
+};
+class CFX_FloatRect : public CFX_Object
+{
+public:
+
+ CFX_FloatRect()
+ {
+ left = right = bottom = top = 0;
+ }
+
+ CFX_FloatRect(FX_FLOAT left1, FX_FLOAT bottom1, FX_FLOAT right1, FX_FLOAT top1)
+ {
+ left = left1;
+ bottom = bottom1;
+ right = right1;
+ top = top1;
+ }
+
+ CFX_FloatRect(const FX_FLOAT* pArray)
+ {
+ left = pArray[0];
+ bottom = pArray[1];
+ right = pArray[2];
+ top = pArray[3];
+ }
+
+ CFX_FloatRect(const FX_RECT& rect);
+
+ FX_BOOL IsEmpty() const
+ {
+ return left >= right || bottom >= top;
+ }
+
+ void Normalize();
+
+ void Reset()
+ {
+ left = right = bottom = top = 0;
+ }
+
+ FX_BOOL Contains(const CFX_FloatRect& other_rect) const;
+
+ FX_BOOL Contains(FX_FLOAT x, FX_FLOAT y) const;
+
+ void Transform(const CFX_Matrix* pMatrix);
+
+ void Intersect(const CFX_FloatRect& other_rect);
+
+ void Union(const CFX_FloatRect& other_rect);
+
+ FX_RECT GetInnerRect() const;
+
+ FX_RECT GetOutterRect() const;
+
+ FX_RECT GetClosestRect() const;
+
+ int Substract4(CFX_FloatRect& substract_rect, CFX_FloatRect* pRects);
+
+ void InitRect(FX_FLOAT x, FX_FLOAT y)
+ {
+ left = right = x;
+ bottom = top = y;
+ }
+
+ void UpdateRect(FX_FLOAT x, FX_FLOAT y);
+
+ FX_FLOAT Width() const
+ {
+ return right - left;
+ }
+
+ FX_FLOAT Height() const
+ {
+ return top - bottom;
+ }
+
+ void Inflate(FX_FLOAT x, FX_FLOAT y)
+ {
+ Normalize();
+ left -= x;
+ right += x;
+ bottom -= y;
+ top += y;
+ }
+
+ void Inflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+ {
+ Normalize();
+ this->left -= left;
+ this->bottom -= bottom;
+ this->right += right;
+ this->top += top;
+ }
+
+ void Inflate(const CFX_FloatRect &rt)
+ {
+ Inflate(rt.left, rt.bottom, rt.right, rt.top);
+ }
+
+ void Deflate(FX_FLOAT x, FX_FLOAT y)
+ {
+ Normalize();
+ left += x;
+ right -= x;
+ bottom += y;
+ top -= y;
+ }
+
+ void Deflate(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top)
+ {
+ Normalize();
+ this->left += left;
+ this->bottom += bottom;
+ this->right -= right;
+ this->top -= top;
+ }
+
+ void Deflate(const CFX_FloatRect &rt)
+ {
+ Deflate(rt.left, rt.bottom, rt.right, rt.top);
+ }
+
+ void Translate(FX_FLOAT e, FX_FLOAT f)
+ {
+ left += e;
+ right += e;
+ top += f;
+ bottom += f;
+ }
+
+ static CFX_FloatRect GetBBox(const CFX_FloatPoint* pPoints, int nPoints);
+
+ FX_FLOAT left;
+
+ FX_FLOAT right;
+
+ FX_FLOAT bottom;
+
+ FX_FLOAT top;
+};
+class CFX_Matrix : public CFX_Object
+{
+public:
+
+ CFX_Matrix()
+ {
+ a = d = 1;
+ b = c = e = f = 0;
+ }
+
+ CFX_Matrix(FX_FLOAT a1, FX_FLOAT b1, FX_FLOAT c1, FX_FLOAT d1, FX_FLOAT e1, FX_FLOAT f1)
+ {
+ a = a1;
+ b = b1;
+ c = c1;
+ d = d1;
+ e = e1;
+ f = f1;
+ }
+
+ void Set(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f);
+ void Set(const FX_FLOAT n[6]);
+
+ void SetIdentity()
+ {
+ a = d = 1;
+ b = c = e = f = 0;
+ }
+
+ void SetReverse(const CFX_Matrix &m);
+
+ void Concat(FX_FLOAT a, FX_FLOAT b, FX_FLOAT c, FX_FLOAT d, FX_FLOAT e, FX_FLOAT f, FX_BOOL bPrepended = FALSE);
+
+ void Concat(const CFX_Matrix &m, FX_BOOL bPrepended = FALSE);
+
+ void ConcatInverse(const CFX_Matrix& m, FX_BOOL bPrepended = FALSE);
+ void Reset()
+ {
+ SetIdentity();
+ }
+
+ void Copy(const CFX_Matrix& m)
+ {
+ *this = m;
+ }
+
+ FX_BOOL IsIdentity() const
+ {
+ return a == 1 && b == 0 && c == 0 && d == 1 && e == 0 && f == 0;
+ }
+ FX_BOOL IsInvertible() const;
+
+ FX_BOOL Is90Rotated() const;
+
+ FX_BOOL IsScaled() const;
+
+ void Translate(FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);
+
+ void TranslateI(FX_INT32 x, FX_INT32 y, FX_BOOL bPrepended = FALSE)
+ {
+ Translate((FX_FLOAT)x, (FX_FLOAT)y, bPrepended);
+ }
+
+ void Scale(FX_FLOAT sx, FX_FLOAT sy, FX_BOOL bPrepended = FALSE);
+
+ void Rotate(FX_FLOAT fRadian, FX_BOOL bPrepended = FALSE);
+
+ void RotateAt(FX_FLOAT fRadian, FX_FLOAT x, FX_FLOAT y, FX_BOOL bPrepended = FALSE);
+
+ void Shear(FX_FLOAT fAlphaRadian, FX_FLOAT fBetaRadian, FX_BOOL bPrepended = FALSE);
+
+ void MatchRect(const CFX_FloatRect &dest, const CFX_FloatRect &src);
+
+ FX_FLOAT GetXUnit() const;
+
+ FX_FLOAT GetYUnit() const;
+ void GetUnitRect(CFX_RectF &rect) const;
+
+ CFX_FloatRect GetUnitRect() const;
+
+ FX_FLOAT GetUnitArea() const;
+ FX_FLOAT TransformXDistance(FX_FLOAT dx) const;
+ FX_INT32 TransformXDistance(FX_INT32 dx) const;
+ FX_FLOAT TransformYDistance(FX_FLOAT dy) const;
+ FX_INT32 TransformYDistance(FX_INT32 dy) const;
+ FX_FLOAT TransformDistance(FX_FLOAT dx, FX_FLOAT dy) const;
+ FX_INT32 TransformDistance(FX_INT32 dx, FX_INT32 dy) const;
+
+ FX_FLOAT TransformDistance(FX_FLOAT distance) const;
+ void TransformPoint(FX_FLOAT &x, FX_FLOAT &y) const;
+ void TransformPoint(FX_INT32 &x, FX_INT32 &y) const;
+ void TransformPoints(CFX_PointF *points, FX_INT32 iCount) const;
+ void TransformPoints(CFX_Point *points, FX_INT32 iCount) const;
+
+ void Transform(FX_FLOAT& x, FX_FLOAT& y) const
+ {
+ TransformPoint(x, y);
+ }
+
+ void Transform(FX_FLOAT x, FX_FLOAT y, FX_FLOAT& x1, FX_FLOAT& y1) const
+ {
+ x1 = x, y1 = y;
+ TransformPoint(x1, y1);
+ }
+ void TransformVector(CFX_VectorF &v) const;
+ void TransformVector(CFX_Vector &v) const;
+ void TransformRect(CFX_RectF &rect) const;
+ void TransformRect(CFX_Rect &rect) const;
+
+ void TransformRect(FX_FLOAT& left, FX_FLOAT& right, FX_FLOAT& top, FX_FLOAT& bottom) const;
+
+ void TransformRect(CFX_FloatRect& rect) const
+ {
+ TransformRect(rect.left, rect.right, rect.top, rect.bottom);
+ }
+
+ FX_FLOAT GetA() const
+ {
+ return a;
+ }
+
+ FX_FLOAT GetB() const
+ {
+ return b;
+ }
+
+ FX_FLOAT GetC() const
+ {
+ return c;
+ }
+
+ FX_FLOAT GetD() const
+ {
+ return d;
+ }
+
+ FX_FLOAT GetE() const
+ {
+ return e;
+ }
+
+ FX_FLOAT GetF() const
+ {
+ return f;
+ }
+public:
+ FX_FLOAT a;
+ FX_FLOAT b;
+ FX_FLOAT c;
+ FX_FLOAT d;
+ FX_FLOAT e;
+ FX_FLOAT f;
+};
+#define CFX_AffineMatrix CFX_Matrix
+#endif
diff --git a/core/include/fxcrt/fx_ext.h b/core/include/fxcrt/fx_ext.h new file mode 100644 index 0000000000..7fdbfcd0af --- /dev/null +++ b/core/include/fxcrt/fx_ext.h @@ -0,0 +1,103 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FXCRT_EXTENSION_
+#define _FXCRT_EXTENSION_
+#ifndef _FX_BASIC_H_
+#include "fx_basic.h"
+#endif
+#ifndef _FXCRT_COORDINATES_
+#include "fx_coordinates.h"
+#endif
+#ifndef _FX_XML_H_
+#include "fx_xml.h"
+#endif
+#ifndef _FX_UNICODE_
+#include "fx_ucd.h"
+#endif
+#ifndef _FX_ARABIC_
+#include "fx_arb.h"
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+FX_FLOAT FXSYS_tan(FX_FLOAT a);
+FX_FLOAT FXSYS_logb(FX_FLOAT b, FX_FLOAT x);
+FX_FLOAT FXSYS_strtof(FX_LPCSTR pcsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);
+FX_FLOAT FXSYS_wcstof(FX_LPCWSTR pwsStr, FX_INT32 iLength = -1, FX_INT32 *pUsedLen = NULL);
+FX_LPWSTR FXSYS_wcsncpy(FX_LPWSTR dstStr, FX_LPCWSTR srcStr, size_t count);
+FX_INT32 FXSYS_wcsnicmp(FX_LPCWSTR s1, FX_LPCWSTR s2, size_t count);
+FX_INT32 FXSYS_strnicmp(FX_LPCSTR s1, FX_LPCSTR s2, size_t count);
+inline FX_BOOL FXSYS_islower(FX_INT32 ch)
+{
+ return ch >= 'a' && ch <= 'z';
+}
+inline FX_BOOL FXSYS_isupper(FX_INT32 ch)
+{
+ return ch >= 'A' && ch <= 'Z';
+}
+inline FX_INT32 FXSYS_tolower(FX_INT32 ch)
+{
+ return ch < 'A' || ch > 'Z' ? ch : (ch + 0x20);
+}
+inline FX_INT32 FXSYS_toupper(FX_INT32 ch)
+{
+ return ch < 'a' || ch > 'z' ? ch : (ch - 0x20);
+}
+
+
+
+FX_DWORD FX_HashCode_String_GetA(FX_LPCSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);
+FX_DWORD FX_HashCode_String_GetW(FX_LPCWSTR pStr, FX_INT32 iLength, FX_BOOL bIgnoreCase = FALSE);
+
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+FX_LPVOID FX_Random_MT_Start(FX_DWORD dwSeed);
+
+FX_DWORD FX_Random_MT_Generate(FX_LPVOID pContext);
+
+void FX_Random_MT_Close(FX_LPVOID pContext);
+
+void FX_Random_GenerateBase(FX_LPDWORD pBuffer, FX_INT32 iCount);
+
+void FX_Random_GenerateMT(FX_LPDWORD pBuffer, FX_INT32 iCount);
+
+void FX_Random_GenerateCrypto(FX_LPDWORD pBuffer, FX_INT32 iCount);
+#ifdef __cplusplus
+}
+#endif
+template<class baseType>
+class CFX_SSortTemplate
+{
+public:
+ void ShellSort(baseType *pArray, FX_INT32 iCount)
+ {
+ FXSYS_assert(pArray != NULL && iCount > 0);
+ FX_INT32 i, j, gap;
+ baseType v1, v2;
+ gap = iCount >> 1;
+ while (gap > 0) {
+ for (i = gap; i < iCount; i ++) {
+ j = i - gap;
+ v1 = pArray[i];
+ while (j > -1 && (v2 = pArray[j]) > v1) {
+ pArray[j + gap] = v2;
+ j -= gap;
+ }
+ pArray[j + gap] = v1;
+ }
+ gap >>= 1;
+ }
+ }
+};
+#endif
diff --git a/core/include/fxcrt/fx_memory.h b/core/include/fxcrt/fx_memory.h new file mode 100644 index 0000000000..b0c94c4c73 --- /dev/null +++ b/core/include/fxcrt/fx_memory.h @@ -0,0 +1,300 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_MEMORY_H_
+#define _FX_MEMORY_H_
+#ifndef _FX_SYSTEM_H_
+#include "fx_system.h"
+#endif
+#define FXMEM_NONLEAVE 1
+#define FXMEM_MOVABLE 2
+#define FXMEM_DISCARDABLE 4
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct _FXMEM_SystemMgr {
+
+ void* (*Alloc)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags);
+
+ void* (*AllocDebug)(struct _FXMEM_SystemMgr* pMgr, size_t size, int flags, FX_LPCSTR file, int line);
+
+ void* (*Realloc)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags);
+
+ void* (*ReallocDebug)(struct _FXMEM_SystemMgr* pMgr, void* pointer, size_t size, int flags, FX_LPCSTR file, int line);
+
+ void* (*Lock)(struct _FXMEM_SystemMgr* pMgr, void* handle);
+
+ void (*Unlock)(struct _FXMEM_SystemMgr* pMgr, void* handle);
+
+ void (*Free)(struct _FXMEM_SystemMgr* pMgr, void* pointer, int flags);
+
+ void (*Purge)(struct _FXMEM_SystemMgr* pMgr);
+
+ void (*CollectAll)(struct _FXMEM_SystemMgr* pMgr);
+
+
+ void* user;
+} FXMEM_SystemMgr;
+FX_DEFINEHANDLE(FXMEM_FoxitMgr)
+typedef struct _FXMEM_SystemMgr2 {
+
+ FX_BOOL (*More)(struct _FXMEM_SystemMgr2* pMgr, size_t alloc_size, void** new_memory, size_t* new_size);
+
+ void (*Free)(struct _FXMEM_SystemMgr2* pMgr, void* memory);
+} FXMEM_SystemMgr2;
+FXMEM_FoxitMgr* FXMEM_CreateMemoryMgr(size_t size, FX_BOOL extensible);
+void FXMEM_DestroyFoxitMgr(FXMEM_FoxitMgr* pFoxitMgr);
+void* FXMEM_DefaultAlloc(size_t byte_size, int flags);
+void* FXMEM_DefaultAlloc2(size_t units, size_t unit_size, int flags);
+void* FXMEM_DefaultRealloc(void* pointer, size_t new_size, int flags);
+void* FXMEM_DefaultRealloc2(void* pointer, size_t units, size_t unit_size, int flags);
+void FXMEM_DefaultFree(void* pointer, int flags);
+#define FX_Alloc(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), 0)
+#define FX_Realloc(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), 0)
+#define FX_AllocNL(type, size) (type*)FXMEM_DefaultAlloc2(size, sizeof(type), FXMEM_NONLEAVE)
+#define FX_ReallocNL(type, ptr, size) (type*)FXMEM_DefaultRealloc2(ptr, size, sizeof(type), FXMEM_NONLEAVE)
+#define FX_Free(pointer) FXMEM_DefaultFree(pointer, 0)
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+#if defined(_DEBUG)
+#define FX_NEW new(__FILE__, __LINE__)
+#else
+
+#define FX_NEW new
+#endif
+class CFX_Object
+{
+public:
+
+ void* operator new (size_t size, FX_LPCSTR file, int line);
+
+ void operator delete (void* p, FX_LPCSTR file, int line);
+
+ void* operator new (size_t size);
+
+ void operator delete (void* p);
+
+ void* operator new[] (size_t size, FX_LPCSTR file, int line);
+
+ void operator delete[] (void* p, FX_LPCSTR file, int line);
+
+ void* operator new[] (size_t size);
+
+ void operator delete[] (void* p);
+
+ void* operator new (size_t, void* buf)
+ {
+ return buf;
+ }
+
+ void operator delete (void*, void*) {}
+};
+#define FX_NEW_VECTOR(Pointer, Class, Count) \
+ { \
+ Pointer = FX_Alloc(Class, Count); \
+ if (Pointer) { \
+ for (int i = 0; i < (Count); i ++) new (Pointer + i) Class; \
+ } \
+ }
+#define FX_DELETE_VECTOR(Pointer, Class, Count) \
+ { \
+ for (int i = 0; i < (Count); i ++) Pointer[i].~Class(); \
+ FX_Free(Pointer); \
+ }
+class CFX_DestructObject : public CFX_Object
+{
+public:
+
+ virtual ~CFX_DestructObject() {}
+};
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef struct _IFX_Allocator {
+
+ void* (*m_AllocDebug)(struct _IFX_Allocator* pAllocator, size_t size, FX_LPCSTR file, int line);
+
+ void* (*m_Alloc)(struct _IFX_Allocator* pAllocator, size_t size);
+
+ void* (*m_ReallocDebug)(struct _IFX_Allocator* pAllocator, void* p, size_t size, FX_LPCSTR file, int line);
+
+ void* (*m_Realloc)(struct _IFX_Allocator* pAllocator, void* p, size_t size);
+
+ void (*m_Free)(struct _IFX_Allocator* pAllocator, void* p);
+} IFX_Allocator;
+IFX_Allocator* FXMEM_GetDefAllocator();
+#ifdef __cplusplus
+}
+#endif
+#ifdef _DEBUG
+
+#define FX_Allocator_Alloc(fxAllocator, type, size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_AllocDebug((fxAllocator), (size) * sizeof(type), __FILE__, __LINE__) : (FX_Alloc(type, size)))
+
+#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_ReallocDebug((fxAllocator), (ptr), (new_size) * sizeof(type), __FILE__, __LINE__) : (FX_Realloc(type, ptr, new_size)))
+#else
+
+#define FX_Allocator_Alloc(fxAllocator, type, size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_Alloc((fxAllocator), (size) * sizeof(type)) : (FX_Alloc(type, size)))
+
+#define FX_Allocator_Realloc(fxAllocator, type, ptr, new_size) \
+ ((fxAllocator) ? (type*)(fxAllocator)->m_Realloc((fxAllocator), (ptr), (new_size) * sizeof(type)) : (FX_Realloc(type, ptr, new_size)))
+#endif
+#define FX_Allocator_Free(fxAllocator, ptr) \
+ ((fxAllocator) ? (fxAllocator)->m_Free((fxAllocator), (ptr)) : (FX_Free(ptr)))
+inline void* operator new(size_t size, IFX_Allocator* fxAllocator)
+{
+ return (void*)FX_Allocator_Alloc(fxAllocator, FX_BYTE, size);
+}
+inline void operator delete(void* ptr, IFX_Allocator* fxAllocator)
+{
+}
+#define FX_NewAtAllocator(fxAllocator) \
+ ::new(fxAllocator)
+#define FX_DeleteAtAllocator(pointer, fxAllocator, __class__) \
+ (pointer)->~__class__(); \
+ FX_Allocator_Free(fxAllocator, pointer)
+class CFX_AllocObject
+{
+public:
+
+ void* operator new (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line);
+#endif
+
+ void* operator new (size_t size, IFX_Allocator* pAllocator);
+
+ void operator delete (void* p);
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete (void* p, IFX_Allocator* pAllocator);
+#endif
+
+ void* operator new (size_t, void* buf)
+ {
+ return buf;
+ }
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete (void*, void*) {}
+#endif
+
+ IFX_Allocator* GetAllocator() const
+ {
+ return m_pAllocator;
+ }
+private:
+
+ void* operator new[] (size_t size, IFX_Allocator* pAllocator, FX_LPCSTR file, int line)
+ {
+ return operator new(size, pAllocator, file, line);
+ }
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete[] (void* p, IFX_Allocator* pAllocator, FX_LPCSTR file, int line) {}
+#endif
+
+ void* operator new[] (size_t size, IFX_Allocator* pAllocator)
+ {
+ return operator new(size, pAllocator);
+ }
+
+ void operator delete[] (void* p) {}
+#ifndef _FX_NO_EXCEPTION_
+
+ void operator delete[] (void* p, IFX_Allocator* pAllocator) {}
+#endif
+protected:
+
+ IFX_Allocator* m_pAllocator;
+};
+#if defined(_DEBUG)
+#define FX_NEWAT(pAllocator) new(pAllocator, __FILE__, __LINE__)
+#else
+
+#define FX_NEWAT(pAllocator) new(pAllocator)
+#endif
+class CFX_GrowOnlyPool : public IFX_Allocator, public CFX_Object
+{
+public:
+
+ CFX_GrowOnlyPool(IFX_Allocator* pAllocator = NULL, size_t trunk_size = 16384);
+
+ ~CFX_GrowOnlyPool();
+
+ void SetAllocator(IFX_Allocator* pAllocator);
+
+ void SetTrunkSize(size_t trunk_size)
+ {
+ m_TrunkSize = trunk_size;
+ }
+
+ void* AllocDebug(size_t size, FX_LPCSTR file, int line)
+ {
+ return Alloc(size);
+ }
+
+ void* Alloc(size_t size);
+
+ void* ReallocDebug(void* p, size_t new_size, FX_LPCSTR file, int line)
+ {
+ return NULL;
+ }
+
+ void* Realloc(void* p, size_t new_size)
+ {
+ return NULL;
+ }
+
+ void Free(void*) {}
+
+ void FreeAll();
+private:
+
+ size_t m_TrunkSize;
+
+ void* m_pFirstTrunk;
+
+ IFX_Allocator* m_pAllocator;
+};
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define FX_FIXEDMEM_PAGESIZE (4096 * 16)
+#define FX_FIXEDMEM_MIDBLOCKSIZE (4096)
+typedef struct _FX_MEMCONFIG {
+
+ size_t nPageNum_Init8;
+
+ size_t nPageNum_Init16;
+
+ size_t nPageNum_Init32;
+
+ size_t nPageNum_More16;
+
+ size_t nPageNum_More32;
+
+ size_t nPageSize_Mid;
+
+ size_t nPageNum_InitMid;
+
+ size_t nPageNum_MoreMid;
+
+ size_t nPageSize_Large;
+
+ size_t nPageSize_Alone;
+} FX_MEMCONFIG;
+void FXMEM_SetConfig(const FX_MEMCONFIG* memConfig);
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/core/include/fxcrt/fx_stream.h b/core/include/fxcrt/fx_stream.h new file mode 100644 index 0000000000..cda5253365 --- /dev/null +++ b/core/include/fxcrt/fx_stream.h @@ -0,0 +1,200 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_STREAM_H_
+#define _FX_STREAM_H_
+#ifndef _FX_MEMORY_H_
+#include "fx_memory.h"
+#endif
+void* FX_OpenFolder(FX_LPCSTR path);
+void* FX_OpenFolder(FX_LPCWSTR path);
+FX_BOOL FX_GetNextFile(void* handle, CFX_ByteString& filename, FX_BOOL& bFolder);
+FX_BOOL FX_GetNextFile(void* handle, CFX_WideString& filename, FX_BOOL& bFolder);
+void FX_CloseFolder(void* handle);
+FX_WCHAR FX_GetFolderSeparator();
+FX_DEFINEHANDLE(FX_HFILE)
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FX_FILESIZE FX_INT32
+#else
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+#ifndef O_LARGEFILE
+#define O_LARGEFILE 0
+#endif
+#define FX_FILESIZE off_t
+#endif
+#define FX_GETBYTEOFFSET32(a) 0
+#define FX_GETBYTEOFFSET40(a) 0
+#define FX_GETBYTEOFFSET48(a) 0
+#define FX_GETBYTEOFFSET56(a) 0
+#define FX_GETBYTEOFFSET24(a) ((FX_BYTE)(a>>24))
+#define FX_GETBYTEOFFSET16(a) ((FX_BYTE)(a>>16))
+#define FX_GETBYTEOFFSET8(a) ((FX_BYTE)(a>>8))
+#define FX_GETBYTEOFFSET0(a) ((FX_BYTE)(a))
+#define FX_FILEMODE_Write 0
+#define FX_FILEMODE_ReadOnly 1
+#define FX_FILEMODE_Truncate 2
+FX_HFILE FX_File_Open(FX_BSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);
+FX_HFILE FX_File_Open(FX_WSTR fileName, FX_DWORD dwMode, IFX_Allocator* pAllocator = NULL);
+void FX_File_Close(FX_HFILE hFile, IFX_Allocator* pAllocator = NULL);
+FX_FILESIZE FX_File_GetSize(FX_HFILE hFile);
+FX_FILESIZE FX_File_GetPosition(FX_HFILE hFile);
+FX_FILESIZE FX_File_SetPosition(FX_HFILE hFile, FX_FILESIZE pos);
+size_t FX_File_Read(FX_HFILE hFile, void* pBuffer, size_t szBuffer);
+size_t FX_File_ReadPos(FX_HFILE hFile, void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+size_t FX_File_Write(FX_HFILE hFile, const void* pBuffer, size_t szBuffer);
+size_t FX_File_WritePos(FX_HFILE hFile, const void* pBuffer, size_t szBuffer, FX_FILESIZE pos);
+FX_BOOL FX_File_Flush(FX_HFILE hFile);
+FX_BOOL FX_File_Truncate(FX_HFILE hFile, FX_FILESIZE szFile);
+FX_BOOL FX_File_Exist(FX_BSTR fileName);
+FX_BOOL FX_File_Exist(FX_WSTR fileName);
+FX_BOOL FX_File_Delete(FX_BSTR fileName);
+FX_BOOL FX_File_Delete(FX_WSTR fileName);
+FX_BOOL FX_File_Copy(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);
+FX_BOOL FX_File_Copy(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);
+FX_BOOL FX_File_Move(FX_BSTR fileNameSrc, FX_BSTR fileNameDst);
+FX_BOOL FX_File_Move(FX_WSTR fileNameSrc, FX_WSTR fileNameDst);
+class IFX_StreamWrite
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_BOOL WriteBlock(const void* pData, size_t size) = 0;
+};
+class IFX_FileWrite : public IFX_StreamWrite
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_FILESIZE GetSize() = 0;
+
+ virtual FX_BOOL Flush() = 0;
+
+ virtual FX_BOOL WriteBlock(const void* pData, FX_FILESIZE offset, size_t size) = 0;
+ virtual FX_BOOL WriteBlock(const void* pData, size_t size)
+ {
+ return WriteBlock(pData, GetSize(), size);
+ }
+};
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);
+IFX_FileWrite* FX_CreateFileWrite(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);
+class IFX_StreamRead
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_BOOL IsEOF() = 0;
+
+ virtual FX_FILESIZE GetPosition() = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size) = 0;
+};
+class IFX_FileRead : IFX_StreamRead
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_FILESIZE GetSize() = 0;
+
+ virtual FX_BOOL IsEOF()
+ {
+ return FALSE;
+ }
+
+ virtual FX_FILESIZE GetPosition()
+ {
+ return 0;
+ }
+
+ virtual FX_BOOL SetRange(FX_FILESIZE offset, FX_FILESIZE size)
+ {
+ return FALSE;
+ }
+
+ virtual void ClearRange() {}
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size)
+ {
+ return 0;
+ }
+};
+IFX_FileRead* FX_CreateFileRead(FX_LPCSTR filename, IFX_Allocator* pAllocator = NULL);
+IFX_FileRead* FX_CreateFileRead(FX_LPCWSTR filename, IFX_Allocator* pAllocator = NULL);
+class IFX_FileStream : public IFX_FileRead, public IFX_FileWrite
+{
+public:
+
+ virtual IFX_FileStream* Retain() = 0;
+
+ virtual void Release() = 0;
+
+ virtual FX_FILESIZE GetSize() = 0;
+
+ virtual FX_BOOL IsEOF() = 0;
+
+ virtual FX_FILESIZE GetPosition() = 0;
+
+ virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size) = 0;
+
+ virtual FX_BOOL WriteBlock(const void* buffer, FX_FILESIZE offset, size_t size) = 0;
+ virtual FX_BOOL WriteBlock(const void* buffer, size_t size)
+ {
+ return WriteBlock(buffer, GetSize(), size);
+ }
+
+ virtual FX_BOOL Flush() = 0;
+};
+IFX_FileStream* FX_CreateFileStream(FX_LPCSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);
+IFX_FileStream* FX_CreateFileStream(FX_LPCWSTR filename, FX_DWORD dwModes, IFX_Allocator* pAllocator = NULL);
+class IFX_MemoryStream : public IFX_FileStream
+{
+public:
+
+ virtual FX_BOOL IsConsecutive() const = 0;
+
+ virtual void EstimateSize(size_t nInitSize, size_t nGrowSize) = 0;
+
+ virtual FX_LPBYTE GetBuffer() const = 0;
+
+ virtual void AttachBuffer(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE) = 0;
+
+ virtual void DetachBuffer() = 0;
+};
+IFX_MemoryStream* FX_CreateMemoryStream(FX_LPBYTE pBuffer, size_t nSize, FX_BOOL bTakeOver = FALSE, IFX_Allocator* pAllocator = NULL);
+IFX_MemoryStream* FX_CreateMemoryStream(FX_BOOL bConsecutive = FALSE, IFX_Allocator* pAllocator = NULL);
+class IFX_BufferRead : public IFX_StreamRead
+{
+public:
+
+ virtual void Release() = 0;
+
+ virtual FX_BOOL IsEOF() = 0;
+
+ virtual FX_FILESIZE GetPosition() = 0;
+
+ virtual size_t ReadBlock(void* buffer, size_t size) = 0;
+
+ virtual FX_BOOL ReadNextBlock(FX_BOOL bRestart = FALSE) = 0;
+
+ virtual FX_LPCBYTE GetBlockBuffer() = 0;
+
+ virtual size_t GetBlockSize() = 0;
+
+ virtual FX_FILESIZE GetBlockOffset() = 0;
+};
+#endif
diff --git a/core/include/fxcrt/fx_string.h b/core/include/fxcrt/fx_string.h new file mode 100644 index 0000000000..563964cdf7 --- /dev/null +++ b/core/include/fxcrt/fx_string.h @@ -0,0 +1,870 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_STRING_H_
+#define _FX_STRING_H_
+class CFX_ByteStringC;
+class CFX_ByteString;
+class CFX_WideStringC;
+class CFX_WideString;
+struct CFX_CharMap;
+class CFX_BinaryBuf;
+typedef int FX_STRSIZE;
+class CFX_ByteStringL;
+class CFX_WideStringL;
+class CFX_ByteStringC : public CFX_Object
+{
+public:
+
+ CFX_ByteStringC()
+ {
+ m_Ptr = NULL;
+ m_Length = 0;
+ }
+
+ CFX_ByteStringC(FX_LPCBYTE ptr, FX_STRSIZE size)
+ {
+ m_Ptr = ptr;
+ m_Length = size;
+ }
+
+ CFX_ByteStringC(FX_LPCSTR ptr)
+ {
+ m_Ptr = (FX_LPCBYTE)ptr;
+ m_Length = ptr ? (FX_STRSIZE)FXSYS_strlen(ptr) : 0;
+ }
+
+ CFX_ByteStringC(FX_CHAR& ch)
+ {
+ m_Ptr = (FX_LPCBYTE)&ch;
+ m_Length = 1;
+ }
+
+ CFX_ByteStringC(FX_LPCSTR ptr, FX_STRSIZE len)
+ {
+ m_Ptr = (FX_LPCBYTE)ptr;
+ if (len == -1) {
+ m_Length = (FX_STRSIZE)FXSYS_strlen(ptr);
+ } else {
+ m_Length = len;
+ }
+ }
+
+ CFX_ByteStringC(const CFX_ByteStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ }
+
+ CFX_ByteStringC(const CFX_ByteString& src);
+
+ CFX_ByteStringC& operator = (FX_LPCSTR src)
+ {
+ m_Ptr = (FX_LPCBYTE)src;
+ m_Length = (FX_STRSIZE)FXSYS_strlen(src);
+ return *this;
+ }
+
+ CFX_ByteStringC& operator = (const CFX_ByteStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ return *this;
+ }
+
+ CFX_ByteStringC& operator = (const CFX_ByteString& src);
+
+ bool operator == (const CFX_ByteStringC& str) const
+ {
+ return str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) == 0;
+ }
+
+ bool operator != (const CFX_ByteStringC& str) const
+ {
+ return str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length) != 0;
+ }
+#define FXBSTR_ID(c1, c2, c3, c4) ((c1 << 24) | (c2 << 16) | (c3 << 8) | (c4))
+
+ FX_DWORD GetID(FX_STRSIZE start_pos = 0) const;
+
+ FX_LPCBYTE GetPtr() const
+ {
+ return m_Ptr;
+ }
+
+ FX_LPCSTR GetCStr() const
+ {
+ return (FX_LPCSTR)m_Ptr;
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_Length;
+ }
+
+ bool IsEmpty() const
+ {
+ return m_Length == 0;
+ }
+
+ operator FX_LPCBYTE() const
+ {
+ return m_Ptr;
+ }
+
+ FX_BYTE GetAt(FX_STRSIZE index) const
+ {
+ return m_Ptr[index];
+ }
+
+ CFX_ByteStringC Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
+ {
+ if (index < 0) {
+ index = 0;
+ }
+ if (index > m_Length) {
+ return CFX_ByteStringC();
+ }
+ if (count < 0 || count > m_Length - index) {
+ count = m_Length - index;
+ }
+ return CFX_ByteStringC(m_Ptr + index, count);
+ }
+protected:
+
+ FX_LPCBYTE m_Ptr;
+
+ FX_STRSIZE m_Length;
+private:
+
+ void* operator new (size_t) throw()
+ {
+ return NULL;
+ }
+};
+typedef const CFX_ByteStringC& FX_BSTR;
+#define FX_BSTRC(str) CFX_ByteStringC(str, sizeof str-1)
+struct CFX_StringData {
+
+ long m_nRefs;
+
+ FX_STRSIZE m_nDataLength;
+
+ FX_STRSIZE m_nAllocLength;
+
+ FX_CHAR m_String[1];
+};
+class CFX_ByteString : public CFX_Object
+{
+public:
+
+ CFX_ByteString()
+ {
+ m_pData = NULL;
+ }
+
+ CFX_ByteString(const CFX_ByteString& str);
+
+ CFX_ByteString(char ch);
+
+ CFX_ByteString(FX_LPCSTR ptr, FX_STRSIZE len = -1);
+
+ CFX_ByteString(FX_LPCBYTE ptr, FX_STRSIZE len);
+
+ CFX_ByteString(FX_BSTR bstrc);
+
+ CFX_ByteString(FX_BSTR bstrc1, FX_BSTR bstrc2);
+
+ ~CFX_ByteString();
+
+ static CFX_ByteString FromUnicode(FX_LPCWSTR ptr, FX_STRSIZE len = -1);
+
+ static CFX_ByteString FromUnicode(const CFX_WideString& str);
+
+ operator FX_LPCSTR() const
+ {
+ return m_pData ? m_pData->m_String : "";
+ }
+
+ operator FX_LPCBYTE() const
+ {
+ return m_pData ? (FX_LPCBYTE)m_pData->m_String : NULL;
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_pData ? m_pData->m_nDataLength : 0;
+ }
+
+ bool IsEmpty() const
+ {
+ return !GetLength();
+ }
+
+ int Compare(FX_BSTR str) const;
+
+
+ bool Equal(FX_BSTR str) const;
+
+
+ bool EqualNoCase(FX_BSTR str) const;
+
+ bool operator == (FX_LPCSTR str) const
+ {
+ return Equal(str);
+ }
+
+ bool operator == (FX_BSTR str) const
+ {
+ return Equal(str);
+ }
+
+ bool operator == (const CFX_ByteString& str) const;
+
+ bool operator != (FX_LPCSTR str) const
+ {
+ return !Equal(str);
+ }
+
+ bool operator != (FX_BSTR str) const
+ {
+ return !Equal(str);
+ }
+
+ bool operator != (const CFX_ByteString& str) const
+ {
+ return !operator==(str);
+ }
+
+ void Empty();
+
+ const CFX_ByteString& operator = (FX_LPCSTR str);
+
+ const CFX_ByteString& operator = (FX_BSTR bstrc);
+
+ const CFX_ByteString& operator = (const CFX_ByteString& stringSrc);
+
+ const CFX_ByteString& operator = (const CFX_BinaryBuf& buf);
+
+ void Load(FX_LPCBYTE str, FX_STRSIZE len);
+
+ const CFX_ByteString& operator += (FX_CHAR ch);
+
+ const CFX_ByteString& operator += (FX_LPCSTR str);
+
+ const CFX_ByteString& operator += (const CFX_ByteString& str);
+
+ const CFX_ByteString& operator += (FX_BSTR bstrc);
+
+ FX_BYTE GetAt(FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ FX_BYTE operator[](FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ void SetAt(FX_STRSIZE nIndex, FX_CHAR ch);
+
+ FX_STRSIZE Insert(FX_STRSIZE index, FX_CHAR ch);
+
+ FX_STRSIZE Delete(FX_STRSIZE index, FX_STRSIZE count = 1);
+
+
+ void Format(FX_LPCSTR lpszFormat, ... );
+
+ void FormatV(FX_LPCSTR lpszFormat, va_list argList);
+
+
+ void Reserve(FX_STRSIZE len);
+
+ FX_LPSTR GetBuffer(FX_STRSIZE len);
+
+ FX_LPSTR LockBuffer();
+
+ void ReleaseBuffer(FX_STRSIZE len = -1);
+
+ CFX_ByteString Mid(FX_STRSIZE first) const;
+
+ CFX_ByteString Mid(FX_STRSIZE first, FX_STRSIZE count) const;
+
+ CFX_ByteString Left(FX_STRSIZE count) const;
+
+ CFX_ByteString Right(FX_STRSIZE count) const;
+
+ FX_STRSIZE Find(FX_BSTR lpszSub, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE Find(FX_CHAR ch, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE ReverseFind(FX_CHAR ch) const;
+
+ void MakeLower();
+
+ void MakeUpper();
+
+ void TrimRight();
+
+ void TrimRight(FX_CHAR chTarget);
+
+ void TrimRight(FX_BSTR lpszTargets);
+
+ void TrimLeft();
+
+ void TrimLeft(FX_CHAR chTarget);
+
+ void TrimLeft(FX_BSTR lpszTargets);
+
+ FX_STRSIZE Replace(FX_BSTR lpszOld, FX_BSTR lpszNew);
+
+ FX_STRSIZE Remove(FX_CHAR ch);
+
+ CFX_WideString UTF8Decode() const;
+
+ void ConvertFrom(const CFX_WideString& str, CFX_CharMap* pCharMap = NULL);
+
+ FX_DWORD GetID(FX_STRSIZE start_pos = 0) const;
+
+ static CFX_ByteString LoadFromFile(FX_BSTR file_path);
+#define FXFORMAT_SIGNED 1
+#define FXFORMAT_HEX 2
+#define FXFORMAT_CAPITAL 4
+
+ static CFX_ByteString FormatInteger(int i, FX_DWORD flags = 0);
+
+ static CFX_ByteString FormatFloat(FX_FLOAT f, int precision = 0);
+protected:
+
+ struct CFX_StringData* m_pData;
+ void AllocCopy(CFX_ByteString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;
+ void AssignCopy(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);
+ void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCSTR lpszSrc2Data);
+ void ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCSTR lpszSrcData);
+ void CopyBeforeWrite();
+ void AllocBeforeWrite(FX_STRSIZE nLen);
+};
+inline CFX_ByteStringC::CFX_ByteStringC(const CFX_ByteString& src)
+{
+ m_Ptr = (FX_LPCBYTE)src;
+ m_Length = src.GetLength();
+}
+inline CFX_ByteStringC& CFX_ByteStringC::operator = (const CFX_ByteString& src)
+{
+ m_Ptr = (FX_LPCBYTE)src;
+ m_Length = src.GetLength();
+ return *this;
+}
+
+inline CFX_ByteString operator + (FX_BSTR str1, FX_BSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_BSTR str1, FX_LPCSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_LPCSTR str1, FX_BSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_BSTR str1, FX_CHAR ch)
+{
+ return CFX_ByteString(str1, CFX_ByteStringC(ch));
+}
+inline CFX_ByteString operator + (FX_CHAR ch, FX_BSTR str2)
+{
+ return CFX_ByteString(ch, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_CHAR ch)
+{
+ return CFX_ByteString(str1, CFX_ByteStringC(ch));
+}
+inline CFX_ByteString operator + (FX_CHAR ch, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(ch, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_LPCSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_LPCSTR str1, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (const CFX_ByteString& str1, FX_BSTR str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+inline CFX_ByteString operator + (FX_BSTR str1, const CFX_ByteString& str2)
+{
+ return CFX_ByteString(str1, str2);
+}
+class CFX_StringBufBase : public CFX_Object
+{
+public:
+
+ CFX_StringBufBase(FX_STRSIZE limit)
+ {
+ m_Size = 0;
+ m_Limit = limit;
+ }
+
+ FX_CHAR* GetPtr() const
+ {
+ return (FX_CHAR*)(this + 1);
+ }
+
+ FX_STRSIZE GetSize() const
+ {
+ return m_Size;
+ }
+
+ void Empty()
+ {
+ m_Size = 0;
+ }
+
+ void Copy(FX_BSTR str);
+
+ void Append(FX_BSTR str);
+
+ void Append(int i, FX_DWORD flags = 0);
+
+ CFX_ByteStringC GetStringC() const
+ {
+ return CFX_ByteStringC((FX_CHAR*)(this + 1), m_Size);
+ }
+
+ CFX_ByteString GetString() const
+ {
+ return CFX_ByteString((FX_CHAR*)(this + 1), m_Size);
+ }
+protected:
+
+ FX_STRSIZE m_Limit;
+
+ FX_STRSIZE m_Size;
+};
+template<FX_STRSIZE limit>
+class CFX_StringBufTemplate : public CFX_StringBufBase
+{
+public:
+
+ CFX_StringBufTemplate() : CFX_StringBufBase(limit) {}
+
+ FX_CHAR m_Buffer[limit];
+};
+typedef CFX_StringBufTemplate<256> CFX_StringBuf256;
+class CFX_WideStringC : public CFX_Object
+{
+public:
+
+ CFX_WideStringC()
+ {
+ m_Ptr = NULL;
+ m_Length = 0;
+ }
+
+ CFX_WideStringC(FX_LPCWSTR ptr)
+ {
+ m_Ptr = ptr;
+ m_Length = ptr ? (FX_STRSIZE)FXSYS_wcslen(ptr) : 0;
+ }
+
+ CFX_WideStringC(FX_WCHAR& ch)
+ {
+ m_Ptr = &ch;
+ m_Length = 1;
+ }
+
+ CFX_WideStringC(FX_LPCWSTR ptr, FX_STRSIZE len)
+ {
+ m_Ptr = ptr;
+ if (len == -1) {
+ m_Length = (FX_STRSIZE)FXSYS_wcslen(ptr);
+ } else {
+ m_Length = len;
+ }
+ }
+
+ CFX_WideStringC(const CFX_WideStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ }
+
+ CFX_WideStringC(const CFX_WideString& src);
+
+ CFX_WideStringC& operator = (FX_LPCWSTR src)
+ {
+ m_Ptr = src;
+ m_Length = (FX_STRSIZE)FXSYS_wcslen(src);
+ return *this;
+ }
+
+ CFX_WideStringC& operator = (const CFX_WideStringC& src)
+ {
+ m_Ptr = src.m_Ptr;
+ m_Length = src.m_Length;
+ return *this;
+ }
+
+ CFX_WideStringC& operator = (const CFX_WideString& src);
+
+ bool operator == (const CFX_WideStringC& str) const
+ {
+ return str.m_Length == m_Length && FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) == 0;
+ }
+
+ bool operator != (const CFX_WideStringC& str) const
+ {
+ return str.m_Length != m_Length || FXSYS_memcmp32(str.m_Ptr, m_Ptr, m_Length * sizeof(FX_WCHAR)) != 0;
+ }
+
+ FX_LPCWSTR GetPtr() const
+ {
+ return m_Ptr;
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_Length;
+ }
+
+ bool IsEmpty() const
+ {
+ return m_Length == 0;
+ }
+
+ FX_WCHAR GetAt(FX_STRSIZE index) const
+ {
+ return m_Ptr[index];
+ }
+
+ CFX_WideStringC Left(FX_STRSIZE count) const
+ {
+ if (count < 1) {
+ return CFX_WideStringC();
+ }
+ if (count > m_Length) {
+ count = m_Length;
+ }
+ return CFX_WideStringC(m_Ptr, count);
+ }
+
+ CFX_WideStringC Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const
+ {
+ if (index < 0) {
+ index = 0;
+ }
+ if (index > m_Length) {
+ return CFX_WideStringC();
+ }
+ if (count < 0 || count > m_Length - index) {
+ count = m_Length - index;
+ }
+ return CFX_WideStringC(m_Ptr + index, count);
+ }
+
+ CFX_WideStringC Right(FX_STRSIZE count) const
+ {
+ if (count < 1) {
+ return CFX_WideStringC();
+ }
+ if (count > m_Length) {
+ count = m_Length;
+ }
+ return CFX_WideStringC(m_Ptr + m_Length - count, count);
+ }
+protected:
+
+ FX_LPCWSTR m_Ptr;
+
+ FX_STRSIZE m_Length;
+private:
+
+ void* operator new (size_t) throw()
+ {
+ return NULL;
+ }
+};
+typedef const CFX_WideStringC& FX_WSTR;
+#define FX_WSTRC(wstr) CFX_WideStringC((FX_LPCWSTR)wstr, sizeof(wstr) / sizeof(FX_WCHAR) - 1)
+struct CFX_StringDataW {
+
+ long m_nRefs;
+
+ FX_STRSIZE m_nDataLength;
+
+ FX_STRSIZE m_nAllocLength;
+
+ FX_WCHAR m_String[1];
+};
+class CFX_WideString : public CFX_Object
+{
+public:
+
+ CFX_WideString()
+ {
+ m_pData = NULL;
+ }
+
+ CFX_WideString(const CFX_WideString& str);
+
+ CFX_WideString(FX_LPCWSTR ptr, FX_STRSIZE len = -1)
+ {
+ InitStr(ptr, len);
+ }
+
+ CFX_WideString(FX_WCHAR ch);
+
+ CFX_WideString(const CFX_WideStringC& str);
+
+ CFX_WideString(const CFX_WideStringC& str1, const CFX_WideStringC& str2);
+
+ ~CFX_WideString();
+
+ static CFX_WideString FromLocal(const char* str, FX_STRSIZE len = -1);
+
+ static CFX_WideString FromUTF8(const char* str, FX_STRSIZE len = -1);
+
+ static CFX_WideString FromUTF16LE(const unsigned short* str, FX_STRSIZE len = -1);
+
+ operator FX_LPCWSTR() const
+ {
+ return m_pData ? m_pData->m_String : (FX_WCHAR*)L"";
+ }
+
+ void Empty();
+
+
+ FX_BOOL IsEmpty() const
+ {
+ return !GetLength();
+ }
+
+ FX_STRSIZE GetLength() const
+ {
+ return m_pData ? m_pData->m_nDataLength : 0;
+ }
+
+ const CFX_WideString& operator = (FX_LPCWSTR str);
+
+ const CFX_WideString& operator =(const CFX_WideString& stringSrc);
+
+ const CFX_WideString& operator =(const CFX_WideStringC& stringSrc);
+
+ const CFX_WideString& operator += (FX_LPCWSTR str);
+
+ const CFX_WideString& operator += (FX_WCHAR ch);
+
+ const CFX_WideString& operator += (const CFX_WideString& str);
+
+ const CFX_WideString& operator += (const CFX_WideStringC& str);
+
+ FX_WCHAR GetAt(FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ FX_WCHAR operator[](FX_STRSIZE nIndex) const
+ {
+ return m_pData ? m_pData->m_String[nIndex] : 0;
+ }
+
+ void SetAt(FX_STRSIZE nIndex, FX_WCHAR ch);
+
+ int Compare(FX_LPCWSTR str) const;
+
+ int Compare(const CFX_WideString& str) const;
+
+ int CompareNoCase(FX_LPCWSTR str) const;
+
+ bool Equal(const CFX_WideStringC& str) const;
+
+ CFX_WideString Mid(FX_STRSIZE first) const;
+
+ CFX_WideString Mid(FX_STRSIZE first, FX_STRSIZE count) const;
+
+ CFX_WideString Left(FX_STRSIZE count) const;
+
+ CFX_WideString Right(FX_STRSIZE count) const;
+
+ FX_STRSIZE Insert(FX_STRSIZE index, FX_WCHAR ch);
+
+ FX_STRSIZE Delete(FX_STRSIZE index, FX_STRSIZE count = 1);
+
+ void Format(FX_LPCWSTR lpszFormat, ... );
+
+ void FormatV(FX_LPCWSTR lpszFormat, va_list argList);
+
+ void MakeLower();
+
+ void MakeUpper();
+
+ void TrimRight();
+
+ void TrimRight(FX_WCHAR chTarget);
+
+ void TrimRight(FX_LPCWSTR lpszTargets);
+
+ void TrimLeft();
+
+ void TrimLeft(FX_WCHAR chTarget);
+
+ void TrimLeft(FX_LPCWSTR lpszTargets);
+
+ void Reserve(FX_STRSIZE len);
+
+ FX_LPWSTR GetBuffer(FX_STRSIZE len);
+
+ FX_LPWSTR LockBuffer();
+
+ void ReleaseBuffer(FX_STRSIZE len = -1);
+
+ int GetInteger() const;
+
+ FX_FLOAT GetFloat() const;
+
+ FX_STRSIZE Find(FX_LPCWSTR lpszSub, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE Find(FX_WCHAR ch, FX_STRSIZE start = 0) const;
+
+ FX_STRSIZE Replace(FX_LPCWSTR lpszOld, FX_LPCWSTR lpszNew);
+
+ FX_STRSIZE Remove(FX_WCHAR ch);
+
+ CFX_ByteString UTF8Encode() const;
+
+ CFX_ByteString UTF16LE_Encode(FX_BOOL bTerminate = TRUE) const;
+
+ void ConvertFrom(const CFX_ByteString& str, CFX_CharMap* pCharMap = NULL);
+protected:
+ void InitStr(FX_LPCWSTR ptr, int len);
+
+ CFX_StringDataW* m_pData;
+ void CopyBeforeWrite();
+ void AllocBeforeWrite(FX_STRSIZE nLen);
+ void ConcatInPlace(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);
+ void ConcatCopy(FX_STRSIZE nSrc1Len, FX_LPCWSTR lpszSrc1Data, FX_STRSIZE nSrc2Len, FX_LPCWSTR lpszSrc2Data);
+ void AssignCopy(FX_STRSIZE nSrcLen, FX_LPCWSTR lpszSrcData);
+ void AllocCopy(CFX_WideString& dest, FX_STRSIZE nCopyLen, FX_STRSIZE nCopyIndex, FX_STRSIZE nExtraLen) const;
+};
+inline CFX_WideStringC::CFX_WideStringC(const CFX_WideString& src)
+{
+ m_Ptr = (FX_LPCWSTR)src;
+ m_Length = src.GetLength();
+}
+inline CFX_WideStringC& CFX_WideStringC::operator = (const CFX_WideString& src)
+{
+ m_Ptr = (FX_LPCWSTR)src;
+ m_Length = src.GetLength();
+ return *this;
+}
+
+inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_LPCWSTR str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideStringC& str1, FX_WCHAR ch)
+{
+ return CFX_WideString(str1, CFX_WideStringC(ch));
+}
+inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(ch, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideString& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, FX_WCHAR ch)
+{
+ return CFX_WideString(str1, CFX_WideStringC(ch));
+}
+inline CFX_WideString operator + (FX_WCHAR ch, const CFX_WideString& str2)
+{
+ return CFX_WideString(ch, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, FX_LPCWSTR str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (FX_LPCWSTR str1, const CFX_WideString& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideString& str1, const CFX_WideStringC& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+inline CFX_WideString operator + (const CFX_WideStringC& str1, const CFX_WideString& str2)
+{
+ return CFX_WideString(str1, str2);
+}
+
+bool operator==(const CFX_WideString& s1, const CFX_WideString& s2);
+bool operator==(const CFX_WideString& s1, const CFX_WideStringC& s2);
+bool operator==(const CFX_WideStringC& s1, const CFX_WideString& s2);
+bool operator== (const CFX_WideString& s1, FX_LPCWSTR s2);
+bool operator==(FX_LPCWSTR s1, const CFX_WideString& s2);
+bool operator!=(const CFX_WideString& s1, const CFX_WideString& s2);
+bool operator!=(const CFX_WideString& s1, const CFX_WideStringC& s2);
+bool operator!=(const CFX_WideStringC& s1, const CFX_WideString& s2);
+bool operator!= (const CFX_WideString& s1, FX_LPCWSTR s2);
+bool operator!=(FX_LPCWSTR s1, const CFX_WideString& s2);
+FX_FLOAT FX_atof(FX_BSTR str);
+void FX_atonum(FX_BSTR str, FX_BOOL& bInteger, void* pData);
+FX_STRSIZE FX_ftoa(FX_FLOAT f, FX_LPSTR buf);
+CFX_ByteString FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len);
+inline CFX_ByteString FX_UTF8Encode(FX_WSTR wsStr)
+{
+ return FX_UTF8Encode(wsStr.GetPtr(), wsStr.GetLength());
+}
+inline CFX_ByteString FX_UTF8Encode(const CFX_WideString &wsStr)
+{
+ return FX_UTF8Encode((FX_LPCWSTR)wsStr, wsStr.GetLength());
+}
+class CFX_ByteStringL : public CFX_ByteStringC
+{
+public:
+ CFX_ByteStringL() : CFX_ByteStringC() {}
+ ~CFX_ByteStringL() {}
+
+ void Empty(IFX_Allocator* pAllocator);
+ FX_LPSTR AllocBuffer(FX_STRSIZE length, IFX_Allocator* pAllocator);
+
+ void Set(FX_BSTR src, IFX_Allocator* pAllocator);
+};
+class CFX_WideStringL : public CFX_WideStringC
+{
+public:
+ CFX_WideStringL() : CFX_WideStringC() {}
+ ~CFX_WideStringL() {}
+
+ void Empty(IFX_Allocator* pAllocator);
+ void Set(FX_WSTR src, IFX_Allocator* pAllocator);
+
+ int GetInteger() const;
+ FX_FLOAT GetFloat() const;
+
+ void TrimRight(FX_LPCWSTR lpszTargets);
+};
+void FX_UTF8Encode(FX_LPCWSTR pwsStr, FX_STRSIZE len, CFX_ByteStringL &utf8Str, IFX_Allocator* pAllocator = NULL);
+#endif
diff --git a/core/include/fxcrt/fx_system.h b/core/include/fxcrt/fx_system.h new file mode 100644 index 0000000000..f72be0ffcb --- /dev/null +++ b/core/include/fxcrt/fx_system.h @@ -0,0 +1,279 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_SYSTEM_H_
+#define _FX_SYSTEM_H_
+#define _FX_WIN32_DESKTOP_ 1
+#define _FX_LINUX_DESKTOP_ 4
+#define _FX_MACOSX_ 7
+#define _FX_ANDROID_ 12
+#define _FXM_PLATFORM_WINDOWS_ 1
+#define _FXM_PLATFORM_LINUX_ 2
+#define _FXM_PLATFORM_APPLE_ 3
+#define _FXM_PLATFORM_ANDROID_ 4
+#ifndef _FX_OS_
+#if defined(__ANDROID__)
+#define _FX_OS_ _FX_ANDROID_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_ANDROID_
+#elif defined(_WIN32) || defined(_WIN64)
+#define _FX_OS_ _FX_WIN32_DESKTOP_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_WINDOWS_
+#elif defined(__linux__)
+#define _FX_OS_ _FX_LINUX_DESKTOP_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_LINUX_
+#elif defined(__APPLE__)
+#define _FX_OS_ _FX_MACOSX_
+#define _FXM_PLATFORM_ _FXM_PLATFORM_APPLE_
+#endif
+#endif
+#if !defined(_FX_OS_) || _FX_OS_ == 0
+#error Sorry, can not figure out what OS you are targeting to. Please specify _FX_OS_ macro.
+#endif
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define _CRT_SECURE_NO_WARNINGS
+#include <windows.h>
+#endif
+#define _FX_W32_ 1
+#define _FX_W64_ 2
+#ifndef _FX_WORDSIZE_
+#if defined(_WIN64) || defined(__arm64) || defined(__arm64__) || defined(_M_AMD64) || defined(_M_X64) || defined(_M_IA64) || defined(__powerpc64__) || defined(__x86_64__) || __WORDSIZE == 64
+#define _FX_WORDSIZE_ _FX_W64_
+#else
+#define _FX_WORDSIZE_ _FX_W32_
+#endif
+#endif
+#include <stddef.h>
+#include <stdarg.h>
+#include <setjmp.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <wchar.h>
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
+#include <libkern/OSAtomic.h>
+#if _FX_OS_ == _FX_MACOSX_
+#include <Carbon/Carbon.h>
+#elif _FX_OS_ == _FX_IOS_
+#include <CoreText/CoreText.h>
+#include <CoreGraphics/CoreGraphics.h>
+#endif
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+typedef void* FX_LPVOID;
+typedef void const* FX_LPCVOID;
+typedef void* FX_POSITION;
+typedef signed char FX_INT8;
+typedef unsigned char FX_UINT8;
+typedef unsigned char FX_BYTE;
+typedef unsigned char* FX_LPBYTE;
+typedef unsigned char const* FX_LPCBYTE;
+typedef short FX_INT16;
+typedef unsigned short FX_UINT16;
+typedef short FX_SHORT;
+typedef unsigned short FX_WORD;
+typedef unsigned short* FX_LPWORD;
+typedef unsigned short const* FX_LPCWORD;
+typedef int FX_INT32;
+typedef float FX_FLOAT;
+typedef int FX_BOOL;
+typedef int FX_ERR;
+#define FX_SUCCEEDED(Status) ((FX_ERR)(Status) >= 0)
+#define FX_FAILED(Status) ((FX_ERR)(Status) < 0)
+typedef char FX_CHAR;
+typedef char* FX_LPSTR;
+typedef char const* FX_LPCSTR;
+typedef unsigned int FX_DWORD;
+typedef unsigned int* FX_LPDWORD;
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+typedef __int64 FX_INT64;
+typedef unsigned __int64 FX_UINT64;
+#else
+typedef long long int FX_INT64;
+typedef unsigned long long FX_UINT64;
+#endif
+#if _FX_WORDSIZE_ == _FX_W64_
+typedef FX_INT64 FX_INTPTR;
+typedef FX_UINT64 FX_UINTPTR;
+#else
+typedef int FX_INTPTR;
+typedef unsigned int FX_UINTPTR;
+#endif
+typedef wchar_t FX_WCHAR;
+typedef wchar_t* FX_LPWSTR;
+typedef wchar_t const* FX_LPCWSTR;
+typedef FX_DWORD FX_UINT32;
+typedef FX_UINT64 FX_QWORD;
+#define FX_DEFINEHANDLE(name) typedef struct _##name {FX_LPVOID pData;} * name;
+#if defined(DEBUG) && !defined(_DEBUG)
+#define _DEBUG
+#endif
+#ifndef TRUE
+
+#define TRUE 1
+#endif
+#ifndef FALSE
+
+#define FALSE 0
+#endif
+#ifndef NULL
+
+#define NULL 0
+#endif
+#define FXSYS_assert assert
+#ifndef ASSERT
+#ifdef _DEBUG
+#define ASSERT FXSYS_assert
+#else
+
+#define ASSERT(a)
+#endif
+#endif
+#define FX_MAX(a, b) (((a) > (b)) ? (a) : (b))
+#define FX_MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define FX_PI 3.1415926535897932384626433832795f
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FXSYS_snprintf _snprintf
+#else
+#define FXSYS_snprintf snprintf
+#endif
+#define FXSYS_sprintf sprintf
+#define FXSYS_vsprintf vsprintf
+#define FXSYS_strchr strchr
+#define FXSYS_strlen strlen
+#define FXSYS_strncmp strncmp
+#define FXSYS_strcmp strcmp
+#define FXSYS_strcpy strcpy
+#define FXSYS_strncpy strncpy
+#define FXSYS_strstr strstr
+#define FXSYS_FILE FILE
+#define FXSYS_fopen fopen
+#define FXSYS_fclose fclose
+#define FXSYS_SEEK_END SEEK_END
+#define FXSYS_SEEK_SET SEEK_SET
+#define FXSYS_fseek fseek
+#define FXSYS_ftell ftell
+#define FXSYS_fread fread
+#define FXSYS_fwrite fwrite
+#define FXSYS_fprintf fprintf
+#define FXSYS_fflush fflush
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#ifdef _NATIVE_WCHAR_T_DEFINED
+#define FXSYS_wfopen(f, m) _wfopen((const wchar_t*)(f), (const wchar_t*)(m))
+#else
+#define FXSYS_wfopen _wfopen
+#endif
+#else
+FXSYS_FILE* FXSYS_wfopen(FX_LPCWSTR filename, FX_LPCWSTR mode);
+#endif
+
+#define FXSYS_wcslen wcslen
+#define FXSYS_wcscmp wcscmp
+#define FXSYS_wcschr wcschr
+#define FXSYS_wcsstr wcsstr
+#define FXSYS_wcsncmp wcsncmp
+#define FXSYS_vswprintf vswprintf
+#define FXSYS_mbstowcs mbstowcs
+#define FXSYS_wcstombs wcstombs
+#define FXSYS_memcmp memcmp
+#define FXSYS_memcpy memcpy
+#define FXSYS_memmove memmove
+#define FXSYS_memset memset
+#define FXSYS_memchr memchr
+#define FXSYS_qsort qsort
+#define FXSYS_bsearch bsearch
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FXSYS_GetACP GetACP
+#define FXSYS_itoa _itoa
+#define FXSYS_strlwr _strlwr
+#define FXSYS_strupr _strupr
+#define FXSYS_stricmp _stricmp
+#ifdef _NATIVE_WCHAR_T_DEFINED
+#define FXSYS_wcsicmp(str1, str2) _wcsicmp((wchar_t*)(str1), (wchar_t*)(str2))
+#define FXSYS_WideCharToMultiByte(p1, p2, p3, p4, p5, p6, p7, p8) WideCharToMultiByte(p1, p2, (const wchar_t*)(p3), p4, p5, p6, p7, p8)
+#define FXSYS_MultiByteToWideChar(p1, p2, p3, p4, p5, p6) MultiByteToWideChar(p1, p2, p3, p4, (wchar_t*)(p5), p6)
+#define FXSYS_wcslwr(str) _wcslwr((wchar_t*)(str))
+#define FXSYS_wcsupr(str) _wcsupr((wchar_t*)(str))
+#else
+#define FXSYS_wcsicmp _wcsicmp
+#define FXSYS_WideCharToMultiByte WideCharToMultiByte
+#define FXSYS_MultiByteToWideChar MultiByteToWideChar
+#define FXSYS_wcslwr _wcslwr
+#define FXSYS_wcsupr _wcsupr
+#endif
+#define FXSYS_GetFullPathName GetFullPathName
+#define FXSYS_GetModuleFileName GetModuleFileName
+#else
+int FXSYS_GetACP(void);
+char* FXSYS_itoa(int value, char* string, int radix);
+int FXSYS_WideCharToMultiByte(FX_DWORD codepage, FX_DWORD dwFlags, const wchar_t* wstr, int wlen,
+ char* buf, int buflen, const char* default_str, int* pUseDefault);
+int FXSYS_MultiByteToWideChar(FX_DWORD codepage, FX_DWORD dwFlags, const char* bstr, int blen,
+ wchar_t* buf, int buflen);
+FX_DWORD FXSYS_GetFullPathName(const char* filename, FX_DWORD buflen, char* buf, char** filepart);
+FX_DWORD FXSYS_GetModuleFileName(void* hModule, char* buf, FX_DWORD bufsize);
+char* FXSYS_strlwr(char* str);
+char* FXSYS_strupr(char* str);
+int FXSYS_stricmp(const char*, const char*);
+int FXSYS_wcsicmp(const wchar_t *string1, const wchar_t *string2);
+wchar_t* FXSYS_wcslwr(wchar_t* str);
+wchar_t* FXSYS_wcsupr(wchar_t* str);
+#endif
+#define FXSYS_memcpy32 FXSYS_memcpy
+#define FXSYS_memcmp32 FXSYS_memcmp
+#define FXSYS_memset32 FXSYS_memset
+#define FXSYS_memset8 FXSYS_memset
+#define FXSYS_memmove32 FXSYS_memmove
+#ifdef __cplusplus
+}
+#endif
+#include <math.h>
+#if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
+#define FXSYS_pow(a, b) (FX_FLOAT)powf(a, b)
+#else
+#define FXSYS_pow(a, b) (FX_FLOAT)pow(a, b)
+#endif
+#define FXSYS_sqrt(a) (FX_FLOAT)sqrt(a)
+#define FXSYS_fabs(a) (FX_FLOAT)fabs(a)
+#define FXSYS_atan2(a, b) (FX_FLOAT)atan2(a, b)
+#define FXSYS_ceil(a) (FX_FLOAT)ceil(a)
+#define FXSYS_floor(a) (FX_FLOAT)floor(a)
+#define FXSYS_cos(a) (FX_FLOAT)cos(a)
+#define FXSYS_acos(a) (FX_FLOAT)acos(a)
+#define FXSYS_sin(a) (FX_FLOAT)sin(a)
+#define FXSYS_log(a) (FX_FLOAT)log(a)
+#define FXSYS_log10(a) (FX_FLOAT)log10(a)
+#define FXSYS_fmod(a, b) (FX_FLOAT)fmod(a, b)
+#define FXSYS_abs abs
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define _FX_LSB_FIRST_
+#define FXDWORD_FROM_LSBFIRST(i) (i)
+#define FXDWORD_FROM_MSBFIRST(i) (((FX_BYTE)(i) << 24) | ((FX_BYTE)((i) >> 8) << 16) | ((FX_BYTE)((i) >> 16) << 8) | (FX_BYTE)((i) >> 24))
+#define FXDWORD_GET_LSBFIRST(p) ((((FX_LPBYTE)(p))[3] << 24) | (((FX_LPBYTE)(p))[2] << 16) | (((FX_LPBYTE)(p))[1] << 8) | (((FX_LPBYTE)(p))[0]))
+#define FXDWORD_GET_MSBFIRST(p) ((((FX_LPBYTE)(p))[0] << 24) | (((FX_LPBYTE)(p))[1] << 16) | (((FX_LPBYTE)(p))[2] << 8) | (((FX_LPBYTE)(p))[3]))
+#define FXSYS_HIBYTE(word) ((FX_BYTE)((word) >> 8))
+#define FXSYS_LOBYTE(word) ((FX_BYTE)(word))
+#define FXSYS_HIWORD(dword) ((FX_WORD)((dword) >> 16))
+#define FXSYS_LOWORD(dword) ((FX_WORD)(dword))
+FX_INT32 FXSYS_atoi(FX_LPCSTR str);
+FX_INT32 FXSYS_wtoi(FX_LPCWSTR str);
+FX_INT64 FXSYS_atoi64(FX_LPCSTR str);
+FX_INT64 FXSYS_wtoi64(FX_LPCWSTR str);
+FX_LPCSTR FXSYS_i64toa(FX_INT64 value, FX_LPSTR str, int radix);
+FX_LPCWSTR FXSYS_i64tow(FX_INT64 value, FX_LPWSTR str, int radix);
+int FXSYS_round(FX_FLOAT f);
+#define FXSYS_Mul(a, b) ((a) * (b))
+#define FXSYS_Div(a, b) ((a) / (b))
+#define FXSYS_MulDiv(a, b, c) ((a) * (b) / (c))
+#define FXSYS_sqrt2(a, b) (FX_FLOAT)FXSYS_sqrt((a)*(a) + (b)*(b))
+#ifdef __cplusplus
+};
+#endif
+#endif
diff --git a/core/include/fxcrt/fx_ucd.h b/core/include/fxcrt/fx_ucd.h new file mode 100644 index 0000000000..447d555a4b --- /dev/null +++ b/core/include/fxcrt/fx_ucd.h @@ -0,0 +1,112 @@ +// Copyright 2014 PDFium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com + +#ifndef _FX_UNICODE_ +#define _FX_UNICODE_ +enum FX_CHARBREAKPROP { + FX_CBP_OP = 0, + FX_CBP_CL = 1, + FX_CBP_QU = 2, + FX_CBP_GL = 3, + FX_CBP_NS = 4, + FX_CBP_EX = 5, + FX_CBP_SY = 6, + FX_CBP_IS = 7, + FX_CBP_PR = 8, + FX_CBP_PO = 9, + FX_CBP_NU = 10, + FX_CBP_AL = 11, + FX_CBP_ID = 12, + FX_CBP_IN = 13, + FX_CBP_HY = 14, + FX_CBP_BA = 15, + FX_CBP_BB = 16, + FX_CBP_B2 = 17, + FX_CBP_ZW = 18, + FX_CBP_CM = 19, + FX_CBP_WJ = 20, + FX_CBP_H2 = 21, + FX_CBP_H3 = 22, + FX_CBP_JL = 23, + FX_CBP_JV = 24, + FX_CBP_JT = 25, + + FX_CBP_BK = 26, + FX_CBP_CR = 27, + FX_CBP_LF = 28, + FX_CBP_NL = 29, + FX_CBP_SA = 30, + FX_CBP_SG = 31, + FX_CBP_CB = 32, + FX_CBP_XX = 33, + FX_CBP_AI = 34, + FX_CBP_SP = 35, + FX_CBP_TB = 37, + FX_CBP_NONE = 36, +}; +#define FX_BIDICLASSBITS 6 +#define FX_BIDICLASSBITSMASK (31 << FX_BIDICLASSBITS) +enum FX_BIDICLASS { + FX_BIDICLASS_ON = 0, + FX_BIDICLASS_L = 1, + FX_BIDICLASS_R = 2, + FX_BIDICLASS_AN = 3, + FX_BIDICLASS_EN = 4, + FX_BIDICLASS_AL = 5, + FX_BIDICLASS_NSM = 6, + FX_BIDICLASS_CS = 7, + FX_BIDICLASS_ES = 8, + FX_BIDICLASS_ET = 9, + FX_BIDICLASS_BN = 10, + FX_BIDICLASS_S = 11, + FX_BIDICLASS_WS = 12, + FX_BIDICLASS_B = 13, + FX_BIDICLASS_RLO = 14, + FX_BIDICLASS_RLE = 15, + FX_BIDICLASS_LRO = 16, + FX_BIDICLASS_LRE = 17, + FX_BIDICLASS_PDF = 18, + FX_BIDICLASS_N = FX_BIDICLASS_ON, +}; +#define FX_CHARTYPEBITS 11 +#define FX_CHARTYPEBITSMASK (15 << FX_CHARTYPEBITS) +enum FX_CHARTYPE { + FX_CHARTYPE_Unknown = 0, + FX_CHARTYPE_Tab = (1 << FX_CHARTYPEBITS), + FX_CHARTYPE_Space = (2 << FX_CHARTYPEBITS), + FX_CHARTYPE_Control = (3 << FX_CHARTYPEBITS), + FX_CHARTYPE_Combination = (4 << FX_CHARTYPEBITS), + FX_CHARTYPE_Numeric = (5 << FX_CHARTYPEBITS), + FX_CHARTYPE_Normal = (6 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicAlef = (7 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicSpecial = (8 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicDistortion = (9 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicNormal = (10 << FX_CHARTYPEBITS), + FX_CHARTYPE_ArabicForm = (11 << FX_CHARTYPEBITS), + FX_CHARTYPE_Arabic = (12 << FX_CHARTYPEBITS), +}; +typedef struct _FX_CHARPROPERTIES { + union { + struct { + FX_DWORD dwBreakType : 6; + FX_DWORD dwBidiClass : 5; + FX_DWORD dwCharType : 4; + FX_DWORD dwRotation : 1; + FX_DWORD dwCJKSpecial : 1; + FX_DWORD dwVertIndex : 6; + FX_DWORD dwBidiIndex : 9; + }; + FX_DWORD dwCharProps; + }; +} FX_CHARPROPERTIES; +FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch); +FX_BOOL FX_IsCtrlCode(FX_WCHAR ch); +FX_BOOL FX_IsRotationCode(FX_WCHAR ch); +FX_BOOL FX_IsCombinationChar(FX_WCHAR wch); +FX_BOOL FX_IsBidiChar(FX_WCHAR wch); +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical); +FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical); +#endif diff --git a/core/include/fxcrt/fx_xml.h b/core/include/fxcrt/fx_xml.h new file mode 100644 index 0000000000..1217677740 --- /dev/null +++ b/core/include/fxcrt/fx_xml.h @@ -0,0 +1,209 @@ +// Copyright 2014 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef _FX_XML_H_
+#define _FX_XML_H_
+#ifndef _FX_BASIC_H_
+#include "fx_basic.h"
+#endif
+class CXML_AttrItem : public CFX_Object
+{
+public:
+ CFX_ByteStringL m_QSpaceName;
+ CFX_ByteStringL m_AttrName;
+ CFX_WideStringL m_Value;
+
+ void Empty(IFX_Allocator* pAllocator = NULL)
+ {
+ m_QSpaceName.Empty(pAllocator);
+ m_AttrName.Empty(pAllocator);
+ m_Value.Empty(pAllocator);
+ }
+};
+class CXML_AttrMap : public CFX_Object
+{
+public:
+ CXML_AttrMap()
+ {
+ m_pMap = NULL;
+ }
+ ~CXML_AttrMap()
+ {
+ RemoveAll(NULL);
+ }
+ const CFX_WideStringL* Lookup(FX_BSTR space, FX_BSTR name) const;
+ void SetAt(FX_BSTR space, FX_BSTR name, FX_WSTR value, IFX_Allocator* pAllocator = NULL);
+ void RemoveAt(FX_BSTR space, FX_BSTR name, IFX_Allocator* pAllocator = NULL);
+ void RemoveAll(IFX_Allocator* pAllocator = NULL);
+ int GetSize() const;
+ CXML_AttrItem& GetAt(int index) const;
+ CFX_ObjectArray<CXML_AttrItem>* m_pMap;
+};
+class CXML_Content : public CFX_Object
+{
+public:
+ CXML_Content() : m_bCDATA(FALSE), m_Content() {}
+ ~CXML_Content()
+ {
+ Empty(NULL);
+ }
+ void Empty(IFX_Allocator* pAllocator = NULL)
+ {
+ m_Content.Empty(pAllocator);
+ }
+ void Set(FX_BOOL bCDATA, FX_WSTR content, IFX_Allocator* pAllocator = NULL)
+ {
+ m_bCDATA = bCDATA;
+ m_Content.Set(content, pAllocator);
+ }
+ FX_BOOL m_bCDATA;
+ CFX_WideStringL m_Content;
+};
+class CXML_Element : public CFX_Object
+{
+public:
+
+ static CXML_Element* Parse(const void* pBuffer, size_t size, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);
+
+ static CXML_Element* Parse(IFX_FileRead *pFile, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);
+
+ static CXML_Element* Parse(IFX_BufferRead *pBuffer, FX_BOOL bSaveSpaceChars = FALSE, FX_FILESIZE* pParsedSize = NULL, IFX_Allocator* pAllocator = NULL);
+
+ CXML_Element(FX_BSTR qSpace, FX_BSTR tagName, IFX_Allocator* pAllocator = NULL);
+
+ CXML_Element(FX_BSTR qTagName, IFX_Allocator* pAllocator = NULL);
+
+ CXML_Element(IFX_Allocator* pAllocator = NULL);
+
+ ~CXML_Element();
+
+ void Empty();
+
+
+
+ CFX_ByteString GetTagName(FX_BOOL bQualified = FALSE) const;
+ void GetTagName(CFX_ByteStringL &tagName, FX_BOOL bQualified = FALSE) const;
+
+ CFX_ByteString GetNamespace(FX_BOOL bQualified = FALSE) const;
+ void GetNamespace(CFX_ByteStringL &nameSpace, FX_BOOL bQualified = FALSE) const;
+
+ CFX_ByteString GetNamespaceURI(FX_BSTR qName) const;
+ void GetNamespaceURI(FX_BSTR qName, CFX_ByteStringL &uri) const;
+
+ CXML_Element* GetParent() const
+ {
+ return m_pParent;
+ }
+
+ FX_DWORD CountAttrs() const
+ {
+ return m_AttrMap.GetSize();
+ }
+
+ void GetAttrByIndex(int index, CFX_ByteString &space, CFX_ByteString &name, CFX_WideString &value) const;
+ void GetAttrByIndex(int index, CFX_ByteStringL &space, CFX_ByteStringL &name, CFX_WideStringL &value) const;
+
+ FX_BOOL HasAttr(FX_BSTR qName) const;
+
+ FX_BOOL GetAttrValue(FX_BSTR name, CFX_WideString& attribute) const;
+ CFX_WideString GetAttrValue(FX_BSTR name) const
+ {
+ CFX_WideString attr;
+ GetAttrValue(name, attr);
+ return attr;
+ }
+ const CFX_WideStringL* GetAttrValuePtr(FX_BSTR name) const;
+
+ FX_BOOL GetAttrValue(FX_BSTR space, FX_BSTR name, CFX_WideString& attribute) const;
+ CFX_WideString GetAttrValue(FX_BSTR space, FX_BSTR name) const
+ {
+ CFX_WideString attr;
+ GetAttrValue(space, name, attr);
+ return attr;
+ }
+ const CFX_WideStringL* GetAttrValuePtr(FX_BSTR space, FX_BSTR name) const;
+
+ FX_BOOL GetAttrInteger(FX_BSTR name, int& attribute) const;
+ int GetAttrInteger(FX_BSTR name) const
+ {
+ int attr = 0;
+ GetAttrInteger(name, attr);
+ return attr;
+ }
+
+ FX_BOOL GetAttrInteger(FX_BSTR space, FX_BSTR name, int& attribute) const;
+ int GetAttrInteger(FX_BSTR space, FX_BSTR name) const
+ {
+ int attr = 0;
+ GetAttrInteger(space, name, attr);
+ return attr;
+ }
+
+ FX_BOOL GetAttrFloat(FX_BSTR name, FX_FLOAT& attribute) const;
+ FX_FLOAT GetAttrFloat(FX_BSTR name) const
+ {
+ FX_FLOAT attr = 0;
+ GetAttrFloat(name, attr);
+ return attr;
+ }
+
+ FX_BOOL GetAttrFloat(FX_BSTR space, FX_BSTR name, FX_FLOAT& attribute) const;
+ FX_FLOAT GetAttrFloat(FX_BSTR space, FX_BSTR name) const
+ {
+ FX_FLOAT attr = 0;
+ GetAttrFloat(space, name, attr);
+ return attr;
+ }
+
+ FX_DWORD CountChildren() const;
+
+ enum ChildType { Invalid, Element, Content};
+
+ ChildType GetChildType(FX_DWORD index) const;
+
+ CFX_WideString GetContent(FX_DWORD index) const;
+ const CFX_WideStringL* GetContentPtr(FX_DWORD index) const;
+
+ CXML_Element* GetElement(FX_DWORD index) const;
+
+ CXML_Element* GetElement(FX_BSTR space, FX_BSTR tag) const
+ {
+ return GetElement(space, tag, 0);
+ }
+
+ FX_DWORD CountElements(FX_BSTR space, FX_BSTR tag) const;
+
+ CXML_Element* GetElement(FX_BSTR space, FX_BSTR tag, int index) const;
+
+ FX_DWORD FindElement(CXML_Element *pChild) const;
+
+
+
+
+ void SetTag(FX_BSTR qSpace, FX_BSTR tagname);
+
+ void SetTag(FX_BSTR qTagName);
+
+ void RemoveChildren();
+
+ void RemoveChild(FX_DWORD index);
+
+
+protected:
+
+ CXML_Element* m_pParent;
+
+ CFX_ByteStringL m_QSpaceName;
+
+ CFX_ByteStringL m_TagName;
+
+ CXML_AttrMap m_AttrMap;
+
+ CFX_PtrArray m_Children;
+ friend class CXML_Parser;
+ friend class CXML_Composer;
+};
+#endif
|