// 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 CORE_INCLUDE_FPDFDOC_FPDF_VT_H_
#define CORE_INCLUDE_FPDFDOC_FPDF_VT_H_
#include "core/include/fpdfapi/fpdf_parser.h"
#include "core/include/fxge/fx_dib.h"
class IPDF_VariableText;
class IPDF_VariableText_Iterator;
class IPDF_VariableText_Provider;
struct CPVT_Line;
struct CPVT_Section;
struct CPVT_Word;
struct CPVT_WordPlace;
struct CPVT_WordRange;
struct CPVT_WordPlace {
CPVT_WordPlace() : nSecIndex(-1), nLineIndex(-1), nWordIndex(-1) {}
CPVT_WordPlace(int32_t other_nSecIndex,
int32_t other_nLineIndex,
int32_t other_nWordIndex) {
nSecIndex = other_nSecIndex;
nLineIndex = other_nLineIndex;
nWordIndex = other_nWordIndex;
}
void Default() { nSecIndex = nLineIndex = nWordIndex = -1; }
FX_BOOL operator==(const CPVT_WordPlace& wp) const {
return wp.nSecIndex == nSecIndex && wp.nLineIndex == nLineIndex &&
wp.nWordIndex == nWordIndex;
}
FX_BOOL operator!=(const CPVT_WordPlace& wp) const {
return wp.nSecIndex != nSecIndex || wp.nLineIndex != nLineIndex ||
wp.nWordIndex != nWordIndex;
}
inline int32_t WordCmp(const CPVT_WordPlace& wp) const {
if (nSecIndex > wp.nSecIndex) {
return 1;
}
if (nSecIndex < wp.nSecIndex) {
return -1;
}
if (nLineIndex > wp.nLineIndex) {
return 1;
}
if (nLineIndex < wp.nLineIndex) {
return -1;
}
if (nWordIndex > wp.nWordIndex) {
return 1;
}
if (nWordIndex < wp.nWordIndex) {
return -1;
}
return 0;
}
inline int32_t LineCmp(const CPVT_WordPlace& wp) const {
if (nSecIndex > wp.nSecIndex) {
return 1;
}
if (nSecIndex < wp.nSecIndex) {
return -1;
}
if (nLineIndex > wp.nLineIndex) {
return 1;
}
if (nLineIndex < wp.nLineIndex) {
return -1;
}
return 0;
}
inline int32_t SecCmp(const CPVT_WordPlace& wp) const {
if (nSecIndex > wp.nSecIndex) {
return 1;
}
if (nSecIndex < wp.nSecIndex) {
return -1;
}
return 0;
}
int32_t nSecIndex;
int32_t nLineIndex;
int32_t nWordIndex;
};
struct CPVT_WordRange {
CPVT_WordRange() {}
CPVT_WordRange(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
Set(begin, end);
}
void Default() {
BeginPos.Default();
EndPos.Default();
}
void Set(const CPVT_WordPlace& begin, const CPVT_WordPlace& end) {
BeginPos = begin;
EndPos = end;
SwapWordPlace();
}
void SetBeginPos(const CPVT_WordPlace& begin) {
BeginPos = begin;
SwapWordPlace();
}
void SetEndPos(const CPVT_WordPlace& end) {
EndPos = end;
SwapWordPlace();
}
FX_BOOL IsExist() const { return BeginPos != EndPos; }
FX_BOOL operator!=(const CPVT_WordRange& wr) const {
return wr.BeginPos != BeginPos || wr.EndPos != EndPos;
}
void SwapWordPlace() {
if (BeginPos.WordCmp(EndPos) > 0) {
CPVT_WordPlace place = EndPos;
EndPos = BeginPos;
BeginPos = place;
}
}
CPVT_WordPlace BeginPos;
CPVT_WordPlace EndPos;
};
struct CPVT_SecProps {
CPVT_SecProps() : fLineLeading(0.0f), fLineIndent(0.0f), nAlignment(0) {}
CPVT_SecProps(FX_FLOAT lineLeading, FX_FLOAT lineIndent, int32_t alignment)
: fLineLeading(lineLeading),
fLineIndent(lineIndent),
nAlignment(alignment) {}
CPVT_SecProps(const CPVT_SecProps& other)
: fLineLeading(other.fLineLeading),
fLineIndent(other.fLineIndent),
nAlignment(other.nAlignment) {}
FX_FLOAT fLineLeading;
FX_FLOAT fLineIndent;
int32_t nAlignment;
};
struct CPVT_WordProps {
CPVT_WordProps()
: nFontIndex(-1),
fFontSize(0.0f),
dwWordColor(0),
nScriptType(0),
nWordStyle(0),
fCharSpace(0.0f),
nHorzScale(0) {}
CPVT_WordProps(int32_t fontIndex,
FX_FLOAT fontSize,
FX_COLORREF wordColor = 0,
int32_t scriptType = 0,
int32_t wordStyle = 0,
FX_FLOAT charSpace = 0,
int32_t horzScale = 100)
: nFontIndex(fontIndex),
fFontSize(fontSize),
dwWordColor(wordColor),
nScriptType(scriptType),
nWordStyle(wordStyle),
fCharSpace(charSpace),
nHorzScale(horzScale) {}
CPVT_WordProps(const CPVT_WordProps& other)
: nFontIndex(other.nFontIndex),
fFontSize(other.fFontSize),
dwWordColor(other.dwWordColor),
nScriptType(other.nScriptType),
nWordStyle(other.nWordStyle),
fCharSpace(other.fCharSpace),
nHorzScale(other.nHorzScale) {}
int32_t nFontIndex;
FX_FLOAT fFontSize;
FX_COLORREF dwWordColor;
int32_t nScriptType;
int32_t nWordStyle;
FX_FLOAT fCharSpace;
int32_t nHorzScale;
};
struct CPVT_Word {
CPVT_Word()
: Word(0),
nCharset(0),
ptWord(0, 0),
fAscent(0.0f),
fDescent(0.0f),
fWidth(0.0f),
fFontSize(0),
WordProps() {}
FX_WORD Word;
int32_t nCharset;
CPVT_WordPlace WordPlace;
CPDF_Point ptWord;
FX_FLOAT fAscent;
FX_FLOAT fDescent;
FX_FLOAT fWidth;
int32_t nFontIndex;
FX_FLOAT fFontSize;
CPVT_WordProps WordProps;
};
struct CPVT_Line {
CPVT_Line()
: ptLine(0, 0), fLineWidth(0.0f), fLineAscent(0.0f), fLineDescent(0.0f) {}
CPVT_WordPlace lineplace;
CPVT_WordPlace lineEnd;
CPDF_Point ptLine;
FX_FLOAT fLineWidth;
FX_FLOAT fLineAscent;
FX_FLOAT fLineDescent;
};
struct CPVT_Section {
CPVT_WordPlace secplace;
CPDF_Rect rcSection;
CPVT_SecProps SecProps;
CPVT_WordProps WordProps;
};
class IPDF_VariableText_Provider {
public:
virtual ~IPDF_VariableText_Provider() {}
virtual int32_t GetCharWidth(int32_t nFontIndex,
FX_WORD word,
int32_t nWordStyle) = 0;
virtual int32_t GetTypeAscent(int32_t nFontIndex) = 0;
virtual int32_t GetTypeDescent(int32_t nFontIndex) = 0;
virtual int32_t GetWordFontIndex(FX_WORD word,
int32_t charset,
int32_t nFontIndex) = 0;
virtual FX_BOOL IsLatinWord(FX_WORD word) = 0;
virtual int32_t GetDefaultFontIndex() = 0;
};
class IPDF_VariableText_Iterator {
public:
virtual ~IPDF_VariableText_Iterator() {}
virtual FX_BOOL NextWord() = 0;
virtual FX_BOOL PrevWord() = 0;
virtual FX_BOOL NextLine() = 0;
virtual FX_BOOL PrevLine() = 0;
virtual FX_BOOL NextSection() = 0;
virtual FX_BOOL PrevSection() = 0;
virtual FX_BOOL GetWord(CPVT_Word& word) const = 0;
virtual FX_BOOL SetWord(const CPVT_Word& word) = 0;
virtual FX_BOOL GetLine(CPVT_Line& line) const = 0;
virtual FX_BOOL GetSection(CPVT_Section& section) const = 0;
virtual FX_BOOL SetSection(const CPVT_Section& section) = 0;
virtual void SetAt(int32_t nWordIndex) = 0;
virtual void SetAt(const CPVT_WordPlace& place) = 0;
virtual const CPVT_WordPlace& GetAt() const = 0;
};
class IPDF_VariableText {
public:
static IPDF_VariableText* NewVariableText();
static void DelVariableText(IPDF_VariableText* pVT);
virtual IPDF_VariableText_Provider* SetProvider(
IPDF_VariableText_Provider* pProvider) = 0;
virtual IPDF_VariableText_Iterator* GetIterator() = 0;
virtual void SetPlateRect(const CPDF_Rect& rect) = 0;
virtual void SetAlignment(int32_t nFormat = 0) = 0;
virtual void SetPasswordChar(FX_WORD wSubWord = '*') = 0;
virtual void SetLimitChar(int32_t nLimitChar = 0) = 0;
virtual void SetCharArray(int32_t nCharArray = 0) = 0;
virtual void SetCharSpace(FX_FLOAT fCharSpace = 0.0f) = 0;
virtual void SetHorzScale(int32_t nHorzScale = 100) = 0;
virtual void SetMultiLine(FX_BOOL bMultiLine = TRUE) = 0;
virtual void SetAutoReturn(FX_BOOL bAuto = TRUE) = 0;
virtual void SetAutoFontSize(FX_BOOL bAuto = TRUE) = 0;
virtual void SetFontSize(FX_FLOAT fFontSize) = 0;
virtual void SetLineLeading(FX_FLOAT fLineLeading) = 0;
virtual void SetRichText(FX_BOOL bRichText) = 0;
virtual void Initialize() = 0;
virtual FX_BOOL IsValid() const = 0;
virtual FX_BOOL IsRichText() const = 0;
virtual void RearrangeAll() = 0;
virtual void RearrangePart(const CPVT_WordRange& PlaceRange) = 0;
virtual void ResetAll() = 0;
virtual void SetText(const FX_WCHAR* text,
int32_t charset = 1,
const CPVT_SecProps* pSecProps = NULL,
const CPVT_WordProps* pWordProps = NULL) = 0;
virtual CPVT_WordPlace InsertWord(
const CPVT_WordPlace& place,
FX_WORD word,
int32_t charset = 1,
const CPVT_WordProps* pWordProps = NULL) = 0;
virtual CPVT_WordPlace InsertSection(
const CPVT_WordPlace& place,
const CPVT_SecProps* pSecProps = NULL,
const CPVT_WordProps* pWordProps = NULL) = 0;
virtual CPVT_WordPlace InsertText(
const CPVT_WordPlace& place,
const FX_WCHAR* text,
int32_t charset = 1,
const CPVT_SecProps* pSecProps = NULL,
const CPVT_WordProps* pWordProps = NULL) = 0;
virtual CPVT_WordPlace DeleteWords(const CPVT_WordRange& PlaceRange) = 0;
virtual CPVT_WordPlace DeleteWord(const CPVT_WordPlace& place) = 0;
virtual CPVT_WordPlace BackSpaceWord(const CPVT_WordPlace& place) = 0;
virtual const CPDF_Rect& GetPlateRect() const = 0;
virtual CPDF_Rect GetContentRect() const = 0;
virtual int32_t GetTotalWords() const = 0;
virtual FX_FLOAT GetFontSize() const = 0;
virtual int32_t GetAlignment() const = 0;
virtual FX_WORD GetPasswordChar() const = 0;
virtual int32_t GetCharArray() const = 0;
virtual int32_t GetLimitChar() const = 0;
virtual FX_BOOL IsMultiLine() const = 0;
virtual int32_t GetHorzScale() const = 0;
virtual FX_FLOAT GetCharSpace() const = 0;
virtual CPVT_WordPlace GetBeginWordPlace() const = 0;
virtual CPVT_WordPlace GetEndWordPlace() const = 0;
virtual CPVT_WordPlace GetPrevWordPlace(
const CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace GetNextWordPlace(
const CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace SearchWordPlace(const CPDF_Point& point) const = 0;
virtual CPVT_WordPlace GetUpWordPlace(const CPVT_WordPlace& place,
const CPDF_Point& point) const = 0;
virtual CPVT_WordPlace GetDownWordPlace(const CPVT_WordPlace& place,
const CPDF_Point& point) const = 0;
virtual CPVT_WordPlace GetLineBeginPlace(
const CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace GetLineEndPlace(const CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace GetSectionBeginPlace(
const CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace GetSectionEndPlace(
const CPVT_WordPlace& place) const = 0;
virtual void UpdateWordPlace(CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace AdjustLineHeader(const CPVT_WordPlace& place,
FX_BOOL bPrevOrNext) const = 0;
virtual int32_t WordPlaceToWordIndex(const CPVT_WordPlace& place) const = 0;
virtual CPVT_WordPlace WordIndexToWordPlace(int32_t index) const = 0;
protected:
~IPDF_VariableText() {}
};
#endif // CORE_INCLUDE_FPDFDOC_FPDF_VT_H_