| Index: fpdfsdk/src/fxedit/fxet_pageobjs.cpp
|
| diff --git a/fpdfsdk/src/fxedit/fxet_pageobjs.cpp b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp
|
| index 1c0269b68262a1db31f9c700abe304a12332782c..1fb669bb578f359898c55b802052235b4480fb5c 100644
|
| --- a/fpdfsdk/src/fxedit/fxet_pageobjs.cpp
|
| +++ b/fpdfsdk/src/fxedit/fxet_pageobjs.cpp
|
| @@ -8,634 +8,665 @@
|
| #include "../../include/fxedit/fx_edit.h"
|
| #include "../../include/fxedit/fxet_edit.h"
|
|
|
| -#define FX_EDIT_UNDERLINEHALFWIDTH 0.5f
|
| -#define FX_EDIT_CROSSOUTHALFWIDTH 0.5f
|
| -
|
| -extern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap * pFontMap, int32_t nFontIndex, FX_WORD Word, FX_WORD SubWord);
|
| -
|
| -CPDF_Rect GetUnderLineRect(const CPVT_Word& word)
|
| -{
|
| - return CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,
|
| - word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.25f);
|
| +#define FX_EDIT_UNDERLINEHALFWIDTH 0.5f
|
| +#define FX_EDIT_CROSSOUTHALFWIDTH 0.5f
|
| +
|
| +extern CFX_ByteString GetPDFWordString(IFX_Edit_FontMap* pFontMap,
|
| + int32_t nFontIndex,
|
| + FX_WORD Word,
|
| + FX_WORD SubWord);
|
| +
|
| +CPDF_Rect GetUnderLineRect(const CPVT_Word& word) {
|
| + return CPDF_Rect(word.ptWord.x, word.ptWord.y + word.fDescent * 0.5f,
|
| + word.ptWord.x + word.fWidth,
|
| + word.ptWord.y + word.fDescent * 0.25f);
|
| }
|
|
|
| -CPDF_Rect GetCrossoutRect(const CPVT_Word& word)
|
| -{
|
| - return CPDF_Rect(word.ptWord.x, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f + word.fDescent * 0.25f,
|
| - word.ptWord.x + word.fWidth, word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f);
|
| +CPDF_Rect GetCrossoutRect(const CPVT_Word& word) {
|
| + return CPDF_Rect(word.ptWord.x,
|
| + word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f +
|
| + word.fDescent * 0.25f,
|
| + word.ptWord.x + word.fWidth,
|
| + word.ptWord.y + (word.fAscent + word.fDescent) * 0.5f);
|
| }
|
|
|
| -static void DrawTextString(CFX_RenderDevice* pDevice, const CPDF_Point& pt, CPDF_Font* pFont, FX_FLOAT fFontSize, CPDF_Matrix* pUser2Device,
|
| - const CFX_ByteString& str, FX_ARGB crTextFill, FX_ARGB crTextStroke, int32_t nHorzScale)
|
| -{
|
| - FX_FLOAT x = pt.x, y = pt.y;
|
| - pUser2Device->Transform(x, y);
|
| -
|
| - if (pFont)
|
| - {
|
| - if (nHorzScale != 100)
|
| - {
|
| - CPDF_Matrix mt(nHorzScale/100.0f,0,0,1,0,0);
|
| - mt.Concat(*pUser2Device);
|
| -
|
| - CPDF_RenderOptions ro;
|
| - ro.m_Flags = RENDER_CLEARTYPE;
|
| - ro.m_ColorMode = RENDER_COLOR_NORMAL;
|
| -
|
| - if (crTextStroke != 0)
|
| - {
|
| - CPDF_Point pt1(0,0), pt2(1,0);
|
| - pUser2Device->Transform(pt1.x, pt1.y);
|
| - pUser2Device->Transform(pt2.x, pt2.y);
|
| - CFX_GraphStateData gsd;
|
| - gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
|
| -
|
| - CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, crTextStroke, &gsd, &ro);
|
| - }
|
| - else
|
| - CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, &mt, str, crTextFill, 0, NULL, &ro);
|
| - }
|
| - else
|
| - {
|
| - CPDF_RenderOptions ro;
|
| - ro.m_Flags = RENDER_CLEARTYPE;
|
| - ro.m_ColorMode = RENDER_COLOR_NORMAL;
|
| -
|
| - if (crTextStroke != 0)
|
| - {
|
| - CPDF_Point pt1(0,0), pt2(1,0);
|
| - pUser2Device->Transform(pt1.x, pt1.y);
|
| - pUser2Device->Transform(pt2.x, pt2.y);
|
| - CFX_GraphStateData gsd;
|
| - gsd.m_LineWidth = (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
|
| -
|
| - CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, crTextStroke, &gsd, &ro);
|
| - }
|
| - else
|
| - CPDF_TextRenderer::DrawTextString(pDevice,x, y, pFont, fFontSize, pUser2Device, str, crTextFill, 0, NULL, &ro);
|
| - }
|
| - }
|
| +static void DrawTextString(CFX_RenderDevice* pDevice,
|
| + const CPDF_Point& pt,
|
| + CPDF_Font* pFont,
|
| + FX_FLOAT fFontSize,
|
| + CPDF_Matrix* pUser2Device,
|
| + const CFX_ByteString& str,
|
| + FX_ARGB crTextFill,
|
| + FX_ARGB crTextStroke,
|
| + int32_t nHorzScale) {
|
| + FX_FLOAT x = pt.x, y = pt.y;
|
| + pUser2Device->Transform(x, y);
|
| +
|
| + if (pFont) {
|
| + if (nHorzScale != 100) {
|
| + CPDF_Matrix mt(nHorzScale / 100.0f, 0, 0, 1, 0, 0);
|
| + mt.Concat(*pUser2Device);
|
| +
|
| + CPDF_RenderOptions ro;
|
| + ro.m_Flags = RENDER_CLEARTYPE;
|
| + ro.m_ColorMode = RENDER_COLOR_NORMAL;
|
| +
|
| + if (crTextStroke != 0) {
|
| + CPDF_Point pt1(0, 0), pt2(1, 0);
|
| + pUser2Device->Transform(pt1.x, pt1.y);
|
| + pUser2Device->Transform(pt2.x, pt2.y);
|
| + CFX_GraphStateData gsd;
|
| + gsd.m_LineWidth =
|
| + (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
|
| +
|
| + CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize, &mt,
|
| + str, crTextFill, crTextStroke, &gsd,
|
| + &ro);
|
| + } else
|
| + CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize, &mt,
|
| + str, crTextFill, 0, NULL, &ro);
|
| + } else {
|
| + CPDF_RenderOptions ro;
|
| + ro.m_Flags = RENDER_CLEARTYPE;
|
| + ro.m_ColorMode = RENDER_COLOR_NORMAL;
|
| +
|
| + if (crTextStroke != 0) {
|
| + CPDF_Point pt1(0, 0), pt2(1, 0);
|
| + pUser2Device->Transform(pt1.x, pt1.y);
|
| + pUser2Device->Transform(pt2.x, pt2.y);
|
| + CFX_GraphStateData gsd;
|
| + gsd.m_LineWidth =
|
| + (FX_FLOAT)FXSYS_fabs((pt2.x + pt2.y) - (pt1.x + pt1.y));
|
| +
|
| + CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize,
|
| + pUser2Device, str, crTextFill,
|
| + crTextStroke, &gsd, &ro);
|
| + } else
|
| + CPDF_TextRenderer::DrawTextString(pDevice, x, y, pFont, fFontSize,
|
| + pUser2Device, str, crTextFill, 0,
|
| + NULL, &ro);
|
| + }
|
| + }
|
| }
|
|
|
| -void IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF color,
|
| - const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
|
| -{
|
| - pDevice->SaveState();
|
| -
|
| - if (!rcClip.IsEmpty())
|
| - {
|
| - CPDF_Rect rcTemp = rcClip;
|
| - pUser2Device->TransformRect(rcTemp);
|
| - FX_RECT rcDevClip;
|
| - rcDevClip.left = (int32_t)rcTemp.left;
|
| - rcDevClip.right = (int32_t)rcTemp.right;
|
| - rcDevClip.top = (int32_t)rcTemp.top;
|
| - rcDevClip.bottom = (int32_t)rcTemp.bottom;
|
| - pDevice->SetClip_Rect(&rcDevClip);
|
| - }
|
| -
|
| - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
|
| - {
|
| - if (pEdit->GetFontMap())
|
| - {
|
| - if (pRange)
|
| - pIterator->SetAt(pRange->BeginPos);
|
| - else
|
| - pIterator->SetAt(0);
|
| -
|
| - while (pIterator->NextWord())
|
| - {
|
| - CPVT_WordPlace place = pIterator->GetAt();
|
| - if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
|
| -
|
| - CPVT_Word word;
|
| - if (pIterator->GetWord(word))
|
| - {
|
| - CFX_PathData pathUnderline;
|
| - CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| - rcUnderline.left += ptOffset.x;
|
| - rcUnderline.right += ptOffset.x;
|
| - rcUnderline.top += ptOffset.y;
|
| - rcUnderline.bottom += ptOffset.y;
|
| - pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);
|
| -
|
| - pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0, FXFILL_WINDING);
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| - pDevice->RestoreState();
|
| +void IFX_Edit::DrawUnderline(CFX_RenderDevice* pDevice,
|
| + CPDF_Matrix* pUser2Device,
|
| + IFX_Edit* pEdit,
|
| + FX_COLORREF color,
|
| + const CPDF_Rect& rcClip,
|
| + const CPDF_Point& ptOffset,
|
| + const CPVT_WordRange* pRange) {
|
| + pDevice->SaveState();
|
| +
|
| + if (!rcClip.IsEmpty()) {
|
| + CPDF_Rect rcTemp = rcClip;
|
| + pUser2Device->TransformRect(rcTemp);
|
| + FX_RECT rcDevClip;
|
| + rcDevClip.left = (int32_t)rcTemp.left;
|
| + rcDevClip.right = (int32_t)rcTemp.right;
|
| + rcDevClip.top = (int32_t)rcTemp.top;
|
| + rcDevClip.bottom = (int32_t)rcTemp.bottom;
|
| + pDevice->SetClip_Rect(&rcDevClip);
|
| + }
|
| +
|
| + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
|
| + if (pEdit->GetFontMap()) {
|
| + if (pRange)
|
| + pIterator->SetAt(pRange->BeginPos);
|
| + else
|
| + pIterator->SetAt(0);
|
| +
|
| + while (pIterator->NextWord()) {
|
| + CPVT_WordPlace place = pIterator->GetAt();
|
| + if (pRange && place.WordCmp(pRange->EndPos) > 0)
|
| + break;
|
| +
|
| + CPVT_Word word;
|
| + if (pIterator->GetWord(word)) {
|
| + CFX_PathData pathUnderline;
|
| + CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| + rcUnderline.left += ptOffset.x;
|
| + rcUnderline.right += ptOffset.x;
|
| + rcUnderline.top += ptOffset.y;
|
| + rcUnderline.bottom += ptOffset.y;
|
| + pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom,
|
| + rcUnderline.right, rcUnderline.top);
|
| +
|
| + pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, color, 0,
|
| + FXFILL_WINDING);
|
| + }
|
| + }
|
| + }
|
| + }
|
| +
|
| + pDevice->RestoreState();
|
| }
|
|
|
| -void IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit, FX_COLORREF crTextFill, FX_COLORREF crTextStroke,
|
| - const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, IFX_SystemHandler* pSystemHandler, void* pFFLData)
|
| -{
|
| -
|
| - FX_BOOL bContinuous = pEdit->GetCharArray() == 0;
|
| - if (pEdit->GetCharSpace() > 0.0f)
|
| - bContinuous = FALSE;
|
| -
|
| - FX_WORD SubWord = pEdit->GetPasswordChar();
|
| - FX_FLOAT fFontSize = pEdit->GetFontSize();
|
| - CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
|
| - int32_t nHorzScale = pEdit->GetHorzScale();
|
| -
|
| - FX_COLORREF crCurFill = crTextFill;
|
| - FX_COLORREF crOldFill = crCurFill;
|
| -
|
| - FX_BOOL bSelect = FALSE;
|
| - const FX_COLORREF crWhite = ArgbEncode(255,255,255,255);
|
| - const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);
|
| -
|
| - CFX_ByteTextBuf sTextBuf;
|
| - int32_t nFontIndex = -1;
|
| - CPDF_Point ptBT(0.0f,0.0f);
|
| -
|
| - pDevice->SaveState();
|
| -
|
| - if (!rcClip.IsEmpty())
|
| - {
|
| - CPDF_Rect rcTemp = rcClip;
|
| - pUser2Device->TransformRect(rcTemp);
|
| - FX_RECT rcDevClip;
|
| - rcDevClip.left = (int32_t)rcTemp.left;
|
| - rcDevClip.right = (int32_t)rcTemp.right;
|
| - rcDevClip.top = (int32_t)rcTemp.top;
|
| - rcDevClip.bottom = (int32_t)rcTemp.bottom;
|
| - pDevice->SetClip_Rect(&rcDevClip);
|
| - }
|
| -
|
| - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
|
| - {
|
| - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
|
| - {
|
| - if (pRange)
|
| - pIterator->SetAt(pRange->BeginPos);
|
| - else
|
| - pIterator->SetAt(0);
|
| -
|
| - CPVT_WordPlace oldplace;
|
| -
|
| - while (pIterator->NextWord())
|
| - {
|
| - CPVT_WordPlace place = pIterator->GetAt();
|
| - if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
|
| -
|
| - if (wrSelect.IsExist())
|
| - {
|
| - bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;
|
| - if (bSelect)
|
| - {
|
| - crCurFill = crWhite;
|
| - }
|
| - else
|
| - {
|
| - crCurFill = crTextFill;
|
| - }
|
| - }
|
| - if(pSystemHandler && pSystemHandler->IsSelectionImplemented())
|
| - {
|
| - crCurFill = crTextFill;
|
| - crOldFill = crCurFill;
|
| - }
|
| - CPVT_Word word;
|
| - if (pIterator->GetWord(word))
|
| - {
|
| -
|
| - if (bSelect)
|
| - {
|
| -
|
| - CPVT_Line line;
|
| - pIterator->GetLine(line);
|
| -
|
| - if(pSystemHandler && pSystemHandler->IsSelectionImplemented())
|
| - {
|
| - CPDF_Rect rc(word.ptWord.x,line.ptLine.y + line.fLineDescent,
|
| - word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
|
| - rc.Intersect(rcClip);
|
| - //CFX_Edit* pEt = (CFX_Edit*)pEdit;
|
| - //CPDF_Rect rcEdit = pEt->VTToEdit(rc);
|
| - pSystemHandler->OutputSelectedRect(pFFLData,rc);
|
| - }
|
| - else
|
| - {
|
| - CFX_PathData pathSelBK;
|
| - pathSelBK.AppendRect(word.ptWord.x,line.ptLine.y + line.fLineDescent,
|
| - word.ptWord.x+word.fWidth,line.ptLine.y + line.fLineAscent);
|
| -
|
| - pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
|
| - }
|
| - }
|
| -
|
| - if (bContinuous)
|
| - {
|
| - if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex ||
|
| - crOldFill != crCurFill)
|
| - {
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),
|
| - fFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
|
| -
|
| - sTextBuf.Clear();
|
| - }
|
| - nFontIndex = word.nFontIndex;
|
| - ptBT = word.ptWord;
|
| - crOldFill = crCurFill;
|
| - }
|
| -
|
| - sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord);
|
| - }
|
| - else
|
| - {
|
| - DrawTextString(pDevice,CPDF_Point(word.ptWord.x+ptOffset.x, word.ptWord.y+ptOffset.y), pFontMap->GetPDFFont(word.nFontIndex),
|
| - fFontSize, pUser2Device, GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord), crCurFill, crTextStroke, nHorzScale);
|
| -
|
| - }
|
| - oldplace = place;
|
| -
|
| -
|
| - }
|
| - }
|
| -
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(nFontIndex),
|
| - fFontSize, pUser2Device, sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
|
| - }
|
| - }
|
| - }
|
| -
|
| - pDevice->RestoreState();
|
| +void IFX_Edit::DrawEdit(CFX_RenderDevice* pDevice,
|
| + CPDF_Matrix* pUser2Device,
|
| + IFX_Edit* pEdit,
|
| + FX_COLORREF crTextFill,
|
| + FX_COLORREF crTextStroke,
|
| + const CPDF_Rect& rcClip,
|
| + const CPDF_Point& ptOffset,
|
| + const CPVT_WordRange* pRange,
|
| + IFX_SystemHandler* pSystemHandler,
|
| + void* pFFLData) {
|
| + FX_BOOL bContinuous = pEdit->GetCharArray() == 0;
|
| + if (pEdit->GetCharSpace() > 0.0f)
|
| + bContinuous = FALSE;
|
| +
|
| + FX_WORD SubWord = pEdit->GetPasswordChar();
|
| + FX_FLOAT fFontSize = pEdit->GetFontSize();
|
| + CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
|
| + int32_t nHorzScale = pEdit->GetHorzScale();
|
| +
|
| + FX_COLORREF crCurFill = crTextFill;
|
| + FX_COLORREF crOldFill = crCurFill;
|
| +
|
| + FX_BOOL bSelect = FALSE;
|
| + const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255);
|
| + const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113);
|
| +
|
| + CFX_ByteTextBuf sTextBuf;
|
| + int32_t nFontIndex = -1;
|
| + CPDF_Point ptBT(0.0f, 0.0f);
|
| +
|
| + pDevice->SaveState();
|
| +
|
| + if (!rcClip.IsEmpty()) {
|
| + CPDF_Rect rcTemp = rcClip;
|
| + pUser2Device->TransformRect(rcTemp);
|
| + FX_RECT rcDevClip;
|
| + rcDevClip.left = (int32_t)rcTemp.left;
|
| + rcDevClip.right = (int32_t)rcTemp.right;
|
| + rcDevClip.top = (int32_t)rcTemp.top;
|
| + rcDevClip.bottom = (int32_t)rcTemp.bottom;
|
| + pDevice->SetClip_Rect(&rcDevClip);
|
| + }
|
| +
|
| + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
|
| + if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) {
|
| + if (pRange)
|
| + pIterator->SetAt(pRange->BeginPos);
|
| + else
|
| + pIterator->SetAt(0);
|
| +
|
| + CPVT_WordPlace oldplace;
|
| +
|
| + while (pIterator->NextWord()) {
|
| + CPVT_WordPlace place = pIterator->GetAt();
|
| + if (pRange && place.WordCmp(pRange->EndPos) > 0)
|
| + break;
|
| +
|
| + if (wrSelect.IsExist()) {
|
| + bSelect = place.WordCmp(wrSelect.BeginPos) > 0 &&
|
| + place.WordCmp(wrSelect.EndPos) <= 0;
|
| + if (bSelect) {
|
| + crCurFill = crWhite;
|
| + } else {
|
| + crCurFill = crTextFill;
|
| + }
|
| + }
|
| + if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) {
|
| + crCurFill = crTextFill;
|
| + crOldFill = crCurFill;
|
| + }
|
| + CPVT_Word word;
|
| + if (pIterator->GetWord(word)) {
|
| + if (bSelect) {
|
| + CPVT_Line line;
|
| + pIterator->GetLine(line);
|
| +
|
| + if (pSystemHandler && pSystemHandler->IsSelectionImplemented()) {
|
| + CPDF_Rect rc(word.ptWord.x, line.ptLine.y + line.fLineDescent,
|
| + word.ptWord.x + word.fWidth,
|
| + line.ptLine.y + line.fLineAscent);
|
| + rc.Intersect(rcClip);
|
| + // CFX_Edit* pEt = (CFX_Edit*)pEdit;
|
| + // CPDF_Rect rcEdit = pEt->VTToEdit(rc);
|
| + pSystemHandler->OutputSelectedRect(pFFLData, rc);
|
| + } else {
|
| + CFX_PathData pathSelBK;
|
| + pathSelBK.AppendRect(word.ptWord.x,
|
| + line.ptLine.y + line.fLineDescent,
|
| + word.ptWord.x + word.fWidth,
|
| + line.ptLine.y + line.fLineAscent);
|
| +
|
| + pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0,
|
| + FXFILL_WINDING);
|
| + }
|
| + }
|
| +
|
| + if (bContinuous) {
|
| + if (place.LineCmp(oldplace) != 0 || word.nFontIndex != nFontIndex ||
|
| + crOldFill != crCurFill) {
|
| + if (sTextBuf.GetLength() > 0) {
|
| + DrawTextString(pDevice, CPDF_Point(ptBT.x + ptOffset.x,
|
| + ptBT.y + ptOffset.y),
|
| + pFontMap->GetPDFFont(nFontIndex), fFontSize,
|
| + pUser2Device, sTextBuf.GetByteString(),
|
| + crOldFill, crTextStroke, nHorzScale);
|
| +
|
| + sTextBuf.Clear();
|
| + }
|
| + nFontIndex = word.nFontIndex;
|
| + ptBT = word.ptWord;
|
| + crOldFill = crCurFill;
|
| + }
|
| +
|
| + sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word,
|
| + SubWord);
|
| + } else {
|
| + DrawTextString(
|
| + pDevice, CPDF_Point(word.ptWord.x + ptOffset.x,
|
| + word.ptWord.y + ptOffset.y),
|
| + pFontMap->GetPDFFont(word.nFontIndex), fFontSize, pUser2Device,
|
| + GetPDFWordString(pFontMap, word.nFontIndex, word.Word, SubWord),
|
| + crCurFill, crTextStroke, nHorzScale);
|
| + }
|
| + oldplace = place;
|
| + }
|
| + }
|
| +
|
| + if (sTextBuf.GetLength() > 0) {
|
| + DrawTextString(
|
| + pDevice, CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + pFontMap->GetPDFFont(nFontIndex), fFontSize, pUser2Device,
|
| + sTextBuf.GetByteString(), crOldFill, crTextStroke, nHorzScale);
|
| + }
|
| + }
|
| + }
|
| +
|
| + pDevice->RestoreState();
|
| }
|
|
|
| -void IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice, CPDF_Matrix* pUser2Device, IFX_Edit* pEdit,
|
| - const CPDF_Rect& rcClip, const CPDF_Point& ptOffset, const CPVT_WordRange* pRange)
|
| -{
|
| - //FX_FLOAT fFontSize = pEdit->GetFontSize();
|
| - CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
|
| -
|
| - FX_COLORREF crCurText = ArgbEncode(255, 0,0,0);
|
| - FX_COLORREF crOld = crCurText;
|
| - FX_BOOL bSelect = FALSE;
|
| - const FX_COLORREF crWhite = ArgbEncode(255,255,255,255);
|
| - const FX_COLORREF crSelBK = ArgbEncode(255,0,51,113);
|
| -
|
| - CFX_ByteTextBuf sTextBuf;
|
| - CPVT_WordProps wp;
|
| - CPDF_Point ptBT(0.0f,0.0f);
|
| -
|
| - pDevice->SaveState();
|
| -
|
| - if (!rcClip.IsEmpty())
|
| - {
|
| - CPDF_Rect rcTemp = rcClip;
|
| - pUser2Device->TransformRect(rcTemp);
|
| - FX_RECT rcDevClip;
|
| - rcDevClip.left = (int32_t)rcTemp.left;
|
| - rcDevClip.right = (int32_t)rcTemp.right;
|
| - rcDevClip.top = (int32_t)rcTemp.top;
|
| - rcDevClip.bottom = (int32_t)rcTemp.bottom;
|
| - pDevice->SetClip_Rect(&rcDevClip);
|
| - }
|
| -
|
| - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
|
| - {
|
| - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
|
| - {
|
| - if (pRange)
|
| - pIterator->SetAt(pRange->BeginPos);
|
| - else
|
| - pIterator->SetAt(0);
|
| -
|
| - CPVT_WordPlace oldplace;
|
| -
|
| - while (pIterator->NextWord())
|
| - {
|
| - CPVT_WordPlace place = pIterator->GetAt();
|
| - if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
|
| -
|
| - CPVT_Word word;
|
| - if (pIterator->GetWord(word))
|
| - {
|
| - word.WordProps.fFontSize = word.fFontSize;
|
| -
|
| - crCurText = ArgbEncode(255,word.WordProps.dwWordColor);
|
| -
|
| - if (wrSelect.IsExist())
|
| - {
|
| - bSelect = place.WordCmp(wrSelect.BeginPos) > 0 && place.WordCmp(wrSelect.EndPos) <= 0;
|
| - if (bSelect)
|
| - {
|
| - crCurText = crWhite;
|
| - }
|
| - }
|
| -
|
| - if (bSelect)
|
| - {
|
| - CPVT_Line line;
|
| - pIterator->GetLine(line);
|
| -
|
| - CFX_PathData pathSelBK;
|
| - pathSelBK.AppendRect(word.ptWord.x + ptOffset.x,
|
| - line.ptLine.y + line.fLineDescent + ptOffset.y,
|
| - word.ptWord.x+word.fWidth + ptOffset.x,
|
| - line.ptLine.y + line.fLineAscent + ptOffset.y);
|
| -
|
| - pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0, FXFILL_WINDING);
|
| - }
|
| -
|
| - if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 ||
|
| - FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
|
| - crOld != crCurText)
|
| - {
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),
|
| - wp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
|
| -
|
| - sTextBuf.Clear();
|
| - }
|
| - wp = word.WordProps;
|
| - ptBT = word.ptWord;
|
| - crOld = crCurText;
|
| - }
|
| -
|
| - sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);
|
| -
|
| - if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)
|
| - {
|
| - CFX_PathData pathUnderline;
|
| - CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| - pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom, rcUnderline.right, rcUnderline.top);
|
| -
|
| - pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);
|
| - }
|
| -
|
| - if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
|
| - {
|
| - CFX_PathData pathCrossout;
|
| - CPDF_Rect rcCrossout = GetCrossoutRect(word);
|
| - pathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom, rcCrossout.right, rcCrossout.top);
|
| -
|
| - pDevice->DrawPath(&pathCrossout, pUser2Device, NULL, crCurText, 0, FXFILL_WINDING);
|
| - }
|
| -
|
| - oldplace = place;
|
| - }
|
| - }
|
| -
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - DrawTextString(pDevice, CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), pFontMap->GetPDFFont(wp.nFontIndex),
|
| - wp.fFontSize, pUser2Device, sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
|
| - }
|
| - }
|
| - }
|
| -
|
| - pDevice->RestoreState();
|
| +void IFX_Edit::DrawRichEdit(CFX_RenderDevice* pDevice,
|
| + CPDF_Matrix* pUser2Device,
|
| + IFX_Edit* pEdit,
|
| + const CPDF_Rect& rcClip,
|
| + const CPDF_Point& ptOffset,
|
| + const CPVT_WordRange* pRange) {
|
| + // FX_FLOAT fFontSize = pEdit->GetFontSize();
|
| + CPVT_WordRange wrSelect = pEdit->GetSelectWordRange();
|
| +
|
| + FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
|
| + FX_COLORREF crOld = crCurText;
|
| + FX_BOOL bSelect = FALSE;
|
| + const FX_COLORREF crWhite = ArgbEncode(255, 255, 255, 255);
|
| + const FX_COLORREF crSelBK = ArgbEncode(255, 0, 51, 113);
|
| +
|
| + CFX_ByteTextBuf sTextBuf;
|
| + CPVT_WordProps wp;
|
| + CPDF_Point ptBT(0.0f, 0.0f);
|
| +
|
| + pDevice->SaveState();
|
| +
|
| + if (!rcClip.IsEmpty()) {
|
| + CPDF_Rect rcTemp = rcClip;
|
| + pUser2Device->TransformRect(rcTemp);
|
| + FX_RECT rcDevClip;
|
| + rcDevClip.left = (int32_t)rcTemp.left;
|
| + rcDevClip.right = (int32_t)rcTemp.right;
|
| + rcDevClip.top = (int32_t)rcTemp.top;
|
| + rcDevClip.bottom = (int32_t)rcTemp.bottom;
|
| + pDevice->SetClip_Rect(&rcDevClip);
|
| + }
|
| +
|
| + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
|
| + if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) {
|
| + if (pRange)
|
| + pIterator->SetAt(pRange->BeginPos);
|
| + else
|
| + pIterator->SetAt(0);
|
| +
|
| + CPVT_WordPlace oldplace;
|
| +
|
| + while (pIterator->NextWord()) {
|
| + CPVT_WordPlace place = pIterator->GetAt();
|
| + if (pRange && place.WordCmp(pRange->EndPos) > 0)
|
| + break;
|
| +
|
| + CPVT_Word word;
|
| + if (pIterator->GetWord(word)) {
|
| + word.WordProps.fFontSize = word.fFontSize;
|
| +
|
| + crCurText = ArgbEncode(255, word.WordProps.dwWordColor);
|
| +
|
| + if (wrSelect.IsExist()) {
|
| + bSelect = place.WordCmp(wrSelect.BeginPos) > 0 &&
|
| + place.WordCmp(wrSelect.EndPos) <= 0;
|
| + if (bSelect) {
|
| + crCurText = crWhite;
|
| + }
|
| + }
|
| +
|
| + if (bSelect) {
|
| + CPVT_Line line;
|
| + pIterator->GetLine(line);
|
| +
|
| + CFX_PathData pathSelBK;
|
| + pathSelBK.AppendRect(word.ptWord.x + ptOffset.x,
|
| + line.ptLine.y + line.fLineDescent + ptOffset.y,
|
| + word.ptWord.x + word.fWidth + ptOffset.x,
|
| + line.ptLine.y + line.fLineAscent + ptOffset.y);
|
| +
|
| + pDevice->DrawPath(&pathSelBK, pUser2Device, NULL, crSelBK, 0,
|
| + FXFILL_WINDING);
|
| + }
|
| +
|
| + if (place.LineCmp(oldplace) != 0 ||
|
| + word.WordProps.fCharSpace > 0.0f ||
|
| + word.WordProps.nHorzScale != 100 ||
|
| + FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
|
| + crOld != crCurText) {
|
| + if (sTextBuf.GetLength() > 0) {
|
| + DrawTextString(
|
| + pDevice, CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize,
|
| + pUser2Device, sTextBuf.GetByteString(), crOld, 0,
|
| + wp.nHorzScale);
|
| +
|
| + sTextBuf.Clear();
|
| + }
|
| + wp = word.WordProps;
|
| + ptBT = word.ptWord;
|
| + crOld = crCurText;
|
| + }
|
| +
|
| + sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex,
|
| + word.Word, 0);
|
| +
|
| + if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE) {
|
| + CFX_PathData pathUnderline;
|
| + CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| + pathUnderline.AppendRect(rcUnderline.left, rcUnderline.bottom,
|
| + rcUnderline.right, rcUnderline.top);
|
| +
|
| + pDevice->DrawPath(&pathUnderline, pUser2Device, NULL, crCurText, 0,
|
| + FXFILL_WINDING);
|
| + }
|
| +
|
| + if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) {
|
| + CFX_PathData pathCrossout;
|
| + CPDF_Rect rcCrossout = GetCrossoutRect(word);
|
| + pathCrossout.AppendRect(rcCrossout.left, rcCrossout.bottom,
|
| + rcCrossout.right, rcCrossout.top);
|
| +
|
| + pDevice->DrawPath(&pathCrossout, pUser2Device, NULL, crCurText, 0,
|
| + FXFILL_WINDING);
|
| + }
|
| +
|
| + oldplace = place;
|
| + }
|
| + }
|
| +
|
| + if (sTextBuf.GetLength() > 0) {
|
| + DrawTextString(
|
| + pDevice, CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, pUser2Device,
|
| + sTextBuf.GetByteString(), crOld, 0, wp.nHorzScale);
|
| + }
|
| + }
|
| + }
|
| +
|
| + pDevice->RestoreState();
|
| }
|
|
|
| -static void AddRectToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crFill, const CPDF_Rect& rcFill)
|
| -{
|
| - CPDF_PathObject* pPathObj = new CPDF_PathObject;
|
| - CPDF_PathData* pPathData = pPathObj->m_Path.GetModify();
|
| - pPathData->AppendRect(rcFill.left,rcFill.bottom,rcFill.right,rcFill.top);
|
| +static void AddRectToPageObjects(CPDF_PageObjects* pPageObjs,
|
| + FX_COLORREF crFill,
|
| + const CPDF_Rect& rcFill) {
|
| + CPDF_PathObject* pPathObj = new CPDF_PathObject;
|
| + CPDF_PathData* pPathData = pPathObj->m_Path.GetModify();
|
| + pPathData->AppendRect(rcFill.left, rcFill.bottom, rcFill.right, rcFill.top);
|
|
|
| - FX_FLOAT rgb[3];
|
| - rgb[0] = FXARGB_R(crFill) / 255.0f ;
|
| - rgb[1] = FXARGB_G(crFill) / 255.0f;
|
| - rgb[2] = FXARGB_B(crFill) / 255.0f;
|
| - pPathObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
|
| + FX_FLOAT rgb[3];
|
| + rgb[0] = FXARGB_R(crFill) / 255.0f;
|
| + rgb[1] = FXARGB_G(crFill) / 255.0f;
|
| + rgb[2] = FXARGB_B(crFill) / 255.0f;
|
| + pPathObj->m_ColorState.SetFillColor(
|
| + CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
|
|
|
| - pPathObj->m_FillType = FXFILL_ALTERNATE;
|
| - pPathObj->m_bStroke = FALSE;
|
| + pPathObj->m_FillType = FXFILL_ALTERNATE;
|
| + pPathObj->m_bStroke = FALSE;
|
|
|
| - pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pPathObj);
|
| + pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(), pPathObj);
|
| }
|
|
|
| -static CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs, FX_COLORREF crText,
|
| - CPDF_Font* pFont, FX_FLOAT fFontSize, FX_FLOAT fCharSpace, int32_t nHorzScale,
|
| - const CPDF_Point& point, const CFX_ByteString& text)
|
| -{
|
| - CPDF_TextObject* pTxtObj = new CPDF_TextObject;
|
| -
|
| - CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify();
|
| - pTextStateData->m_pFont = pFont;
|
| - pTextStateData->m_FontSize = fFontSize;
|
| - pTextStateData->m_CharSpace = fCharSpace;
|
| - pTextStateData->m_WordSpace = 0;
|
| - pTextStateData->m_TextMode = 0;
|
| - pTextStateData->m_Matrix[0] = nHorzScale / 100.0f;
|
| - pTextStateData->m_Matrix[1] = 0;
|
| - pTextStateData->m_Matrix[2] = 0;
|
| - pTextStateData->m_Matrix[3] = 1;
|
| -
|
| - FX_FLOAT rgb[3];
|
| - rgb[0] = FXARGB_R(crText) / 255.0f ;
|
| - rgb[1] = FXARGB_G(crText) / 255.0f;
|
| - rgb[2] = FXARGB_B(crText) / 255.0f;
|
| - pTxtObj->m_ColorState.SetFillColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);
|
| - pTxtObj->m_ColorState.SetStrokeColor(CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB),rgb, 3);
|
| -
|
| - pTxtObj->SetPosition(point.x,point.y);
|
| - pTxtObj->SetText(text);
|
| -
|
| - pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(),pTxtObj);
|
| -
|
| - return pTxtObj;
|
| +static CPDF_TextObject* AddTextObjToPageObjects(CPDF_PageObjects* pPageObjs,
|
| + FX_COLORREF crText,
|
| + CPDF_Font* pFont,
|
| + FX_FLOAT fFontSize,
|
| + FX_FLOAT fCharSpace,
|
| + int32_t nHorzScale,
|
| + const CPDF_Point& point,
|
| + const CFX_ByteString& text) {
|
| + CPDF_TextObject* pTxtObj = new CPDF_TextObject;
|
| +
|
| + CPDF_TextStateData* pTextStateData = pTxtObj->m_TextState.GetModify();
|
| + pTextStateData->m_pFont = pFont;
|
| + pTextStateData->m_FontSize = fFontSize;
|
| + pTextStateData->m_CharSpace = fCharSpace;
|
| + pTextStateData->m_WordSpace = 0;
|
| + pTextStateData->m_TextMode = 0;
|
| + pTextStateData->m_Matrix[0] = nHorzScale / 100.0f;
|
| + pTextStateData->m_Matrix[1] = 0;
|
| + pTextStateData->m_Matrix[2] = 0;
|
| + pTextStateData->m_Matrix[3] = 1;
|
| +
|
| + FX_FLOAT rgb[3];
|
| + rgb[0] = FXARGB_R(crText) / 255.0f;
|
| + rgb[1] = FXARGB_G(crText) / 255.0f;
|
| + rgb[2] = FXARGB_B(crText) / 255.0f;
|
| + pTxtObj->m_ColorState.SetFillColor(
|
| + CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
|
| + pTxtObj->m_ColorState.SetStrokeColor(
|
| + CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
|
| +
|
| + pTxtObj->SetPosition(point.x, point.y);
|
| + pTxtObj->SetText(text);
|
| +
|
| + pPageObjs->InsertObject(pPageObjs->GetLastObjectPosition(), pTxtObj);
|
| +
|
| + return pTxtObj;
|
| }
|
|
|
| -void IFX_Edit::GeneratePageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
|
| - const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF crText, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
|
| -{
|
| - FX_FLOAT fFontSize = pEdit->GetFontSize();
|
| -
|
| - int32_t nOldFontIndex = -1;
|
| -
|
| - CFX_ByteTextBuf sTextBuf;
|
| - CPDF_Point ptBT(0.0f,0.0f);
|
| -
|
| - ObjArray.RemoveAll();
|
| -
|
| - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
|
| - {
|
| - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
|
| - {
|
| - if (pRange)
|
| - pIterator->SetAt(pRange->BeginPos);
|
| - else
|
| - pIterator->SetAt(0);
|
| -
|
| - CPVT_WordPlace oldplace;
|
| -
|
| - while (pIterator->NextWord())
|
| - {
|
| - CPVT_WordPlace place = pIterator->GetAt();
|
| - if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
|
| -
|
| - CPVT_Word word;
|
| - if (pIterator->GetWord(word))
|
| - {
|
| - if (place.LineCmp(oldplace) != 0 || nOldFontIndex != word.nFontIndex)
|
| - {
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
|
| - CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
|
| -
|
| - sTextBuf.Clear();
|
| - }
|
| -
|
| - ptBT = word.ptWord;
|
| - nOldFontIndex = word.nFontIndex;
|
| - }
|
| -
|
| - sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0);
|
| - oldplace = place;
|
| - }
|
| - }
|
| -
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex), fFontSize, 0.0f, 100,
|
| - CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
|
| - }
|
| - }
|
| - }
|
| +void IFX_Edit::GeneratePageObjects(
|
| + CPDF_PageObjects* pPageObjects,
|
| + IFX_Edit* pEdit,
|
| + const CPDF_Point& ptOffset,
|
| + const CPVT_WordRange* pRange,
|
| + FX_COLORREF crText,
|
| + CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) {
|
| + FX_FLOAT fFontSize = pEdit->GetFontSize();
|
| +
|
| + int32_t nOldFontIndex = -1;
|
| +
|
| + CFX_ByteTextBuf sTextBuf;
|
| + CPDF_Point ptBT(0.0f, 0.0f);
|
| +
|
| + ObjArray.RemoveAll();
|
| +
|
| + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
|
| + if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) {
|
| + if (pRange)
|
| + pIterator->SetAt(pRange->BeginPos);
|
| + else
|
| + pIterator->SetAt(0);
|
| +
|
| + CPVT_WordPlace oldplace;
|
| +
|
| + while (pIterator->NextWord()) {
|
| + CPVT_WordPlace place = pIterator->GetAt();
|
| + if (pRange && place.WordCmp(pRange->EndPos) > 0)
|
| + break;
|
| +
|
| + CPVT_Word word;
|
| + if (pIterator->GetWord(word)) {
|
| + if (place.LineCmp(oldplace) != 0 ||
|
| + nOldFontIndex != word.nFontIndex) {
|
| + if (sTextBuf.GetLength() > 0) {
|
| + ObjArray.Add(AddTextObjToPageObjects(
|
| + pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex),
|
| + fFontSize, 0.0f, 100,
|
| + CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + sTextBuf.GetByteString()));
|
| +
|
| + sTextBuf.Clear();
|
| + }
|
| +
|
| + ptBT = word.ptWord;
|
| + nOldFontIndex = word.nFontIndex;
|
| + }
|
| +
|
| + sTextBuf << GetPDFWordString(pFontMap, word.nFontIndex, word.Word, 0);
|
| + oldplace = place;
|
| + }
|
| + }
|
| +
|
| + if (sTextBuf.GetLength() > 0) {
|
| + ObjArray.Add(AddTextObjToPageObjects(
|
| + pPageObjects, crText, pFontMap->GetPDFFont(nOldFontIndex),
|
| + fFontSize, 0.0f, 100,
|
| + CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + sTextBuf.GetByteString()));
|
| + }
|
| + }
|
| + }
|
| }
|
|
|
| -void IFX_Edit::GenerateRichPageObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
|
| - const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray)
|
| -{
|
| -
|
| -
|
| - FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
|
| - FX_COLORREF crOld = crCurText;
|
| -
|
| -
|
| - CFX_ByteTextBuf sTextBuf;
|
| - CPVT_WordProps wp;
|
| - CPDF_Point ptBT(0.0f,0.0f);
|
| -
|
| - ObjArray.RemoveAll();
|
| -
|
| - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
|
| - {
|
| - if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap())
|
| - {
|
| - if (pRange)
|
| - pIterator->SetAt(pRange->BeginPos);
|
| - else
|
| - pIterator->SetAt(0);
|
| -
|
| - CPVT_WordPlace oldplace;
|
| -
|
| - while (pIterator->NextWord())
|
| - {
|
| - CPVT_WordPlace place = pIterator->GetAt();
|
| - if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
|
| -
|
| - CPVT_Word word;
|
| - if (pIterator->GetWord(word))
|
| - {
|
| - word.WordProps.fFontSize = word.fFontSize;
|
| -
|
| - crCurText = ArgbEncode(255,word.WordProps.dwWordColor);
|
| -
|
| - if (place.LineCmp(oldplace) != 0 || word.WordProps.fCharSpace > 0.0f || word.WordProps.nHorzScale != 100 ||
|
| - FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
|
| - crOld != crCurText)
|
| - {
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
|
| - CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
|
| -
|
| - sTextBuf.Clear();
|
| - }
|
| -
|
| - wp = word.WordProps;
|
| - ptBT = word.ptWord;
|
| - crOld = crCurText;
|
| -
|
| - }
|
| -
|
| - sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex, word.Word, 0);
|
| -
|
| - if (word.WordProps.nWordStyle & PVTWORD_STYLE_UNDERLINE)
|
| - {/*
|
| - AddLineToPageObjects(pPageObjects, crCurText,
|
| - CPDF_Point(word.ptWord.x, word.ptWord.y + word.fDescent * 0.4f),
|
| - CPDF_Point(word.ptWord.x + word.fWidth, word.ptWord.y + word.fDescent * 0.4f));
|
| +void IFX_Edit::GenerateRichPageObjects(
|
| + CPDF_PageObjects* pPageObjects,
|
| + IFX_Edit* pEdit,
|
| + const CPDF_Point& ptOffset,
|
| + const CPVT_WordRange* pRange,
|
| + CFX_ArrayTemplate<CPDF_TextObject*>& ObjArray) {
|
| + FX_COLORREF crCurText = ArgbEncode(255, 0, 0, 0);
|
| + FX_COLORREF crOld = crCurText;
|
| +
|
| + CFX_ByteTextBuf sTextBuf;
|
| + CPVT_WordProps wp;
|
| + CPDF_Point ptBT(0.0f, 0.0f);
|
| +
|
| + ObjArray.RemoveAll();
|
| +
|
| + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
|
| + if (IFX_Edit_FontMap* pFontMap = pEdit->GetFontMap()) {
|
| + if (pRange)
|
| + pIterator->SetAt(pRange->BeginPos);
|
| + else
|
| + pIterator->SetAt(0);
|
| +
|
| + CPVT_WordPlace oldplace;
|
| +
|
| + while (pIterator->NextWord()) {
|
| + CPVT_WordPlace place = pIterator->GetAt();
|
| + if (pRange && place.WordCmp(pRange->EndPos) > 0)
|
| + break;
|
| +
|
| + CPVT_Word word;
|
| + if (pIterator->GetWord(word)) {
|
| + word.WordProps.fFontSize = word.fFontSize;
|
| +
|
| + crCurText = ArgbEncode(255, word.WordProps.dwWordColor);
|
| +
|
| + if (place.LineCmp(oldplace) != 0 ||
|
| + word.WordProps.fCharSpace > 0.0f ||
|
| + word.WordProps.nHorzScale != 100 ||
|
| + FXSYS_memcmp(&word.WordProps, &wp, sizeof(CPVT_WordProps)) != 0 ||
|
| + crOld != crCurText) {
|
| + if (sTextBuf.GetLength() > 0) {
|
| + ObjArray.Add(AddTextObjToPageObjects(
|
| + pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex),
|
| + wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
|
| + CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + sTextBuf.GetByteString()));
|
| +
|
| + sTextBuf.Clear();
|
| + }
|
| +
|
| + wp = word.WordProps;
|
| + ptBT = word.ptWord;
|
| + crOld = crCurText;
|
| + }
|
| +
|
| + sTextBuf << GetPDFWordString(pFontMap, word.WordProps.nFontIndex,
|
| + word.Word, 0);
|
| +
|
| + if (word.WordProps.nWordStyle &
|
| + PVTWORD_STYLE_UNDERLINE) { /*
|
| + AddLineToPageObjects(pPageObjects,
|
| + crCurText,
|
| + CPDF_Point(word.ptWord.x,
|
| + word.ptWord.y + word.fDescent *
|
| + 0.4f),
|
| + CPDF_Point(word.ptWord.x
|
| + + word.fWidth, word.ptWord.y +
|
| + word.fDescent * 0.4f));
|
| */
|
| - CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| - rcUnderline.left += ptOffset.x;
|
| - rcUnderline.right += ptOffset.x;
|
| - rcUnderline.top += ptOffset.y;
|
| - rcUnderline.bottom += ptOffset.y;
|
| -
|
| - AddRectToPageObjects(pPageObjects, crCurText, rcUnderline);
|
| - }
|
| -
|
| - if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT)
|
| - {
|
| - CPDF_Rect rcCrossout = GetCrossoutRect(word);
|
| - rcCrossout.left += ptOffset.x;
|
| - rcCrossout.right += ptOffset.x;
|
| - rcCrossout.top += ptOffset.y;
|
| - rcCrossout.bottom += ptOffset.y;
|
| -
|
| - AddRectToPageObjects(pPageObjects, crCurText, rcCrossout);
|
| - }
|
| -
|
| - oldplace = place;
|
| - }
|
| - }
|
| -
|
| - if (sTextBuf.GetLength() > 0)
|
| - {
|
| - ObjArray.Add(AddTextObjToPageObjects(pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex), wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
|
| - CPDF_Point(ptBT.x+ptOffset.x, ptBT.y+ptOffset.y), sTextBuf.GetByteString()));
|
| - }
|
| - }
|
| - }
|
| + CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| + rcUnderline.left += ptOffset.x;
|
| + rcUnderline.right += ptOffset.x;
|
| + rcUnderline.top += ptOffset.y;
|
| + rcUnderline.bottom += ptOffset.y;
|
| +
|
| + AddRectToPageObjects(pPageObjects, crCurText, rcUnderline);
|
| + }
|
| +
|
| + if (word.WordProps.nWordStyle & PVTWORD_STYLE_CROSSOUT) {
|
| + CPDF_Rect rcCrossout = GetCrossoutRect(word);
|
| + rcCrossout.left += ptOffset.x;
|
| + rcCrossout.right += ptOffset.x;
|
| + rcCrossout.top += ptOffset.y;
|
| + rcCrossout.bottom += ptOffset.y;
|
| +
|
| + AddRectToPageObjects(pPageObjects, crCurText, rcCrossout);
|
| + }
|
| +
|
| + oldplace = place;
|
| + }
|
| + }
|
| +
|
| + if (sTextBuf.GetLength() > 0) {
|
| + ObjArray.Add(AddTextObjToPageObjects(
|
| + pPageObjects, crOld, pFontMap->GetPDFFont(wp.nFontIndex),
|
| + wp.fFontSize, wp.fCharSpace, wp.nHorzScale,
|
| + CPDF_Point(ptBT.x + ptOffset.x, ptBT.y + ptOffset.y),
|
| + sTextBuf.GetByteString()));
|
| + }
|
| + }
|
| + }
|
| }
|
|
|
| -void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects, IFX_Edit* pEdit,
|
| - const CPDF_Point& ptOffset, const CPVT_WordRange* pRange, FX_COLORREF color)
|
| -{
|
| -
|
| -
|
| - if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator())
|
| - {
|
| - if (pEdit->GetFontMap())
|
| - {
|
| - if (pRange)
|
| - pIterator->SetAt(pRange->BeginPos);
|
| - else
|
| - pIterator->SetAt(0);
|
| -
|
| - CPVT_WordPlace oldplace;
|
| -
|
| - while (pIterator->NextWord())
|
| - {
|
| - CPVT_WordPlace place = pIterator->GetAt();
|
| - if (pRange && place.WordCmp(pRange->EndPos) > 0) break;
|
| -
|
| - CPVT_Word word;
|
| - if (pIterator->GetWord(word))
|
| - {
|
| - CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| - rcUnderline.left += ptOffset.x;
|
| - rcUnderline.right += ptOffset.x;
|
| - rcUnderline.top += ptOffset.y;
|
| - rcUnderline.bottom += ptOffset.y;
|
| - AddRectToPageObjects(pPageObjects, color, rcUnderline);
|
| - }
|
| - }
|
| - }
|
| - }
|
| +void IFX_Edit::GenerateUnderlineObjects(CPDF_PageObjects* pPageObjects,
|
| + IFX_Edit* pEdit,
|
| + const CPDF_Point& ptOffset,
|
| + const CPVT_WordRange* pRange,
|
| + FX_COLORREF color) {
|
| + if (IFX_Edit_Iterator* pIterator = pEdit->GetIterator()) {
|
| + if (pEdit->GetFontMap()) {
|
| + if (pRange)
|
| + pIterator->SetAt(pRange->BeginPos);
|
| + else
|
| + pIterator->SetAt(0);
|
| +
|
| + CPVT_WordPlace oldplace;
|
| +
|
| + while (pIterator->NextWord()) {
|
| + CPVT_WordPlace place = pIterator->GetAt();
|
| + if (pRange && place.WordCmp(pRange->EndPos) > 0)
|
| + break;
|
| +
|
| + CPVT_Word word;
|
| + if (pIterator->GetWord(word)) {
|
| + CPDF_Rect rcUnderline = GetUnderLineRect(word);
|
| + rcUnderline.left += ptOffset.x;
|
| + rcUnderline.right += ptOffset.x;
|
| + rcUnderline.top += ptOffset.y;
|
| + rcUnderline.bottom += ptOffset.y;
|
| + AddRectToPageObjects(pPageObjects, color, rcUnderline);
|
| + }
|
| + }
|
| + }
|
| + }
|
| }
|
| -
|
|
|