1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Copyright 2014 PDFium Authors. All rights reserved. 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Use of this source code is governed by a BSD-style license that can be 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// found in the LICENSE file. 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "../../include/reflow/reflowengine.h" 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "reflowedpage.h" 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "layoutprovider_taggedpdf.h" 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovIPDF_LayoutProcessor* IPDF_LayoutProcessor::Create_LayoutProcessor_Reflow(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, void* pReflowedPage, int flags, FX_FLOAT lineSpace ) 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pReflowedPage == NULL || fWidth <= 20) { 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_LayoutProcessor_Reflow* pReflowEngine = FX_NEW CPDF_LayoutProcessor_Reflow(); 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == pReflowEngine) { 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pReflowEngine->Init(TopIndent, fWidth, fHeight, (CPDF_ReflowedPage*)pReflowedPage, flags, lineSpace); 20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pReflowEngine; 21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 22ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_LayoutProcessor_Reflow::CPDF_LayoutProcessor_Reflow() 23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPause = NULL; 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLayoutElement = NULL; 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fRefWidth = 0; 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fRefWidth = 0; 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth = 0; 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight = 0; 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bIllustration = FALSE; 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPreObj = NULL; 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrLine = FX_NEW CRF_DataPtrArray(50); 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine = FX_NEW CRF_DataPtrArray(50); 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StartIndent = 0; 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PausePosition = 0; 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCPDF_LayoutProcessor_Reflow::~CPDF_LayoutProcessor_Reflow() 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pCurrLine) { 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrLine->RemoveAll(); 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pCurrLine; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrLine = NULL; 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTempLine) { 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine->RemoveAll(); 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete m_pTempLine; 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine = NULL; 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::Init(FX_FLOAT TopIndent, FX_FLOAT fWidth, FX_FLOAT fHeight, CPDF_ReflowedPage* pReflowedPage, int flags, FX_FLOAT lineSpace) 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLayoutElement = NULL; 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TopIndent = TopIndent; 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = LayoutReady; 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_flags = flags; 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage = pReflowedPage; 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fScreenHeight = fHeight; 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fRefWidth = fWidth; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight = 0; 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth = 0; 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fLineSpace = lineSpace; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pReflowedPage->m_PageWidth = fWidth; 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pReflowedPage->m_PageHeight = TopIndent; 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::FitPageMode() 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_flags & RF_PARSER_PAGEMODE && m_fScreenHeight > 20) { 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov float fitPageHeight = m_fScreenHeight; 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ReflowedPage* pRFPage = m_pReflowedPage; 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pRFPage->m_pReflowed->GetSize(); 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WordArray dy; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dy.Add(0); 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pos = 0; 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int screenCount = 1; 75ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT h = pRFPage->GetPageHeight(); 76ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (h > screenCount * fitPageHeight) { 77ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT tempPageHeight = screenCount * fitPageHeight; 78ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int j = 0; 79ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT tempDy = 0; 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < count; i++) { 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*pRFPage->m_pReflowed)[i]; 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT posY; 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov posY = pData->m_PosY; 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(posY) > tempPageHeight && 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_fabs(posY + pData->m_Height) < tempPageHeight) { 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(j == 0) { 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov j = i; 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->m_Height > fitPageHeight) { 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT zoom; 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT spaceh = screenCount * fitPageHeight + posY + pData->m_Height; 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(spaceh < fitPageHeight / 3 * 2) { 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov spaceh = fitPageHeight; 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov zoom = spaceh / pData->m_Height; 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempDy = spaceh - pData->m_Height; 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Height = spaceh; 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Width *= zoom; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dy = pData->m_PosY + pData->m_Height + tempPageHeight; 102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(dy > tempDy) { 103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempDy = dy; 104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(FXSYS_fabs(posY + pData->m_Height) > tempPageHeight) { 106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(; j < count; j++) { 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*pRFPage->m_pReflowed)[j]; 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT posY; 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov posY = pData->m_PosY; 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(posY) > tempPageHeight ) { 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_PosY -= tempDy; 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->m_Height >= fitPageHeight) { 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Height = fitPageHeight - 1; 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->GetType() == CRF_Data::Text) { 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pCharData = (CRF_CharData*)pData; 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCharData->m_pCharState->m_fFontSize = pData->m_Height; 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFPage->m_PageHeight += tempDy; 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov h += tempDy; 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov screenCount++; 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 130ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLayoutStatus CPDF_LayoutProcessor_Reflow::StartProcess(IPDF_LayoutElement* pElement, IFX_Pause* pPause, const CFX_AffineMatrix* pPDFMatrix) 131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pElement) { 133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LayoutError; 134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPause = pPause; 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PDFMatrix = *pPDFMatrix; 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pRootElement = pElement; 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessElement(m_pRootElement, m_fRefWidth); 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_Status == LayoutToBeContinued) { 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LayoutToBeContinued; 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = LayoutFinished; 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FitPageMode(); 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return LayoutFinished; 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovLayoutStatus CPDF_LayoutProcessor_Reflow::Continue() 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = m_pReflowedPage->m_pReflowed->GetSize(); 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessElement(m_pRootElement, m_CurrRefWidth); 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = m_pReflowedPage->m_pReflowed->GetSize(); 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_Status == LayoutReady) { 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = LayoutFinished; 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FitPageMode(); 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_Status; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_LayoutProcessor_Reflow::GetPosition() 158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return m_PausePosition; 160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 161ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_LayoutProcessor_Reflow::IsCanBreakAfter(FX_DWORD unicode) 162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(unicode == -1) { 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(unicode) { 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 40: 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 91: 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 123: 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(unicode >= 256) { 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(unicode >= 48 && unicode <= 57) { 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(unicode >= 64 && unicode <= 90) { 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(unicode >= 97 && unicode <= 122) { 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_LayoutProcessor_Reflow::IsCanBreakBefore(FX_DWORD unicode) 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(unicode == -1) { 186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(unicode) { 189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 33: 190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 41: 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 44: 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 46: 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 59: 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 63: 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 93: 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 125: 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(unicode >= 256) { 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(unicode >= 48 && unicode <= 57) { 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(unicode >= 64 && unicode <= 90) { 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(unicode >= 97 && unicode <= 122) { 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessTable(FX_FLOAT dx) 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pReflowedPage->m_pReflowed->GetSize() == 0) { 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int rowCount = pTable->m_nCell.GetSize(); 217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int n = 0; 218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* dyRow = FX_Alloc(FX_FLOAT, rowCount + 1); 219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(dyRow, 0, sizeof(FX_FLOAT) * (rowCount + 1)); 220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dyRow[0] = 0 ; 221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dyRow[0] = - pTable->m_ReflowPageHeight; 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int tableColCount = 0; 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < rowCount; i++) { 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int colCount = pTable->m_nCell.GetAt(i); 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(colCount > tableColCount) { 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tableColCount = colCount; 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int cellCount = tableColCount * rowCount; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_TableCell** pVirtualTable = FX_Alloc(RF_TableCell*, cellCount); 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(pVirtualTable, 0, sizeof(RF_TableCell*) * cellCount); 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < rowCount; i++) { 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int colCount = pTable->m_nCell.GetAt(i); 235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT rowWidth = 0; 236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int j = 0; 237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int s = pTable->m_pCellArray.GetSize(); 238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(j = 0; j < colCount; j++) { 239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++); 240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pCell->m_EndPos < pCell->m_BeginPos) { 241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pos = i * tableColCount; 244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while(pos < cellCount && pVirtualTable[pos] != NULL) { 245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos++; 246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pos >= (i + 1) * tableColCount) { 248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos = i * tableColCount + j; 249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int RowSpan = pCell->m_RowSpan; 251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ColSpan = pCell->m_ColSpan; 252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(RowSpan + i > rowCount) { 253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RowSpan = rowCount - i; 254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(ColSpan + j > colCount) { 256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ColSpan = colCount - j; 257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int m = 0; m < RowSpan; m++) { 259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int nn = 0; nn < ColSpan; nn++) { 260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pos + nn >= cellCount) { 261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pVirtualTable[pos + nn] = pCell; 264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos += tableColCount; 266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dxCell = dx; 268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(pos = i * tableColCount; pVirtualTable[pos] != pCell && pos < cellCount; pos++) { 269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dxCell += (pVirtualTable[pos])->m_MaxWidth; 270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos]; 272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dy = dyRow[i] - pData->m_Height - pData->m_PosY; 273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, dxCell, dy); 274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1); 275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pCell->m_RowSpan + i <= rowCount) { 276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(dyRow[pCell->m_RowSpan + i]) < FXSYS_fabs(dyRow[i] - pCell->m_CellHeight)) { 277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dyRow[pCell->m_RowSpan + i] = dyRow[i] - pCell->m_CellHeight; 278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov n = 0; 283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < rowCount; i++) { 284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int colCount = pTable->m_nCell.GetAt(i); 285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int j = 0; j < colCount; j++) { 286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_TableCell* pCell = (RF_TableCell*)pTable->m_pCellArray.GetAt(n++); 287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(pCell->m_BlockAlign) { 288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutAfter: { 289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dy = dyRow[i + pCell->m_RowSpan] - pCell->m_CellHeight - dyRow[i]; 290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy); 291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1); 292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutMiddle: 295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutJustify: { 296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dy = (dyRow[i + pCell->m_RowSpan] + pCell->m_CellHeight - dyRow[i]) / 2; 297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, 0, dy); 298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pReflowedPage->m_pReflowed, pCell->m_BeginPos, pCell->m_EndPos - pCell->m_BeginPos + 1); 299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 304ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[m_pReflowedPage->m_pReflowed->GetSize() - 1]; 307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_PageHeight = - dyRow[rowCount] + pData->m_Height; 308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pVirtualTable); 309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(dyRow); 310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = pTable->m_pCellArray.GetSize(); 311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < size; i++) { 312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_TableCell* pCell = pTable->m_pCellArray.GetAt(i); 313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_Free(pCell); 314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_pCellArray.RemoveAll(); 316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_nCell.RemoveAll(); 317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int s = sizeof(CRF_Table); 318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pTable; 319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TableArray.RemoveAt(m_TableArray.GetSize() - 1); 320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 321ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCFX_FloatRect CPDF_LayoutProcessor_Reflow::GetElmBBox(IPDF_LayoutElement* pElement) 322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rect; 324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int objCount = pElement->CountObjects(); 325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pElement->CountChildren(); 326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(objCount == 0 && count == 0) { 327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return rect; 328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix; 330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i; 331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < objCount; i++) { 332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj = pElement->GetObject(0); 333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pObj) { 334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( rect.Height() == 0 ) { 337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect = pObj->GetBBox(&matrix); 338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Union(pObj->GetBBox(&matrix)); 340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < count; i++) { 343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutElement* pChildElement = pElement->GetChild(i); 344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( rect.Height() == 0 ) { 345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect = GetElmBBox(pChildElement); 346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Union(GetElmBBox(pChildElement)); 348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return rect; 351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 352ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_LayoutProcessor_Reflow::GetElmWidth(IPDF_LayoutElement* pElement) 353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pElement) { 355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutType layoutType = pElement->GetType(); 358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT width = 0; 359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(layoutType == LayoutTable || layoutType == LayoutTableDataCell || layoutType == LayoutTableHeaderCell) { 360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width = pElement->GetNumberAttr(LayoutWidth); 361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(width > 0) { 362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return width; 363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if( layoutType == LayoutTableRow) { 365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pElement->CountChildren(); 366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < count; i++) { 367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutElement* pElm = pElement->GetChild(i); 368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov width += pElm->GetNumberAttr(LayoutWidth); 369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(width > 0) { 371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return width; 372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rect = GetElmBBox(pElement); 375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return rect.Width(); 376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 377ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL GetIntersection(FX_FLOAT low1, FX_FLOAT high1, FX_FLOAT low2, FX_FLOAT high2, 378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT& interlow, FX_FLOAT& interhigh); 379ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL IsSameLine(FX_BOOL bHorizontal, CFX_FloatRect Rect1, CFX_FloatRect Rect2) 380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(bHorizontal) { 382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT inter_top, inter_bottom; 383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!GetIntersection(Rect1.bottom, Rect1.top, Rect2.bottom, Rect2.top, 384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov inter_bottom, inter_top)) { 385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT lineHeight = Rect1.top - Rect1.bottom; 388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(lineHeight > 20 && lineHeight > Rect2.Height() * 2) { 389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(lineHeight > 5 && Rect2.Height() / 2 > lineHeight) { 392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT inter_h = inter_top - inter_bottom; 395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (inter_h < (lineHeight) / 2 && inter_h < Rect2.Height() / 2) { 396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT inter_left, inter_right; 400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!GetIntersection(Rect1.left, Rect1.right, Rect2.left, Rect2.right, inter_left, inter_right)) { 401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT inter_w = inter_right - inter_left; 404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (inter_w < (Rect1.right - Rect1.left) / 2 && inter_w < (Rect2.right - Rect2.left) / 2) { 405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 410ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 IsCanMergeParagraph(IPDF_LayoutElement* pPrevElement, IPDF_LayoutElement* pNextElement) 411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 analogial = 100; 413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nPrevObj = pPrevElement->CountObjects(), i; 414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pPrevObj = NULL; 415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect prevRect, rect; 416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray prevLine, line; 417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bParagraphStart = FALSE; 418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < nPrevObj; i++) { 419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj = pPrevElement->GetObject(i); 420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pPrevObj) { 421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPrevObj = pObj; 422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); 423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.Add(pObj); 424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); 427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IsSameLine(TRUE, rect, objRect)) { 428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.Add(pObj); 429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Union(objRect); 430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevLine.RemoveAll(); 432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevLine.Append(line); 433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevRect = rect; 434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.RemoveAll(); 435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.Add(pObj); 436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect = objRect; 437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!bParagraphStart) { 438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (prevRect.left > rect.left + rect.Height() * 1.5) { 439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bParagraphStart = TRUE; 440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(prevLine.GetSize()) { 445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(rect.right - prevRect.right) > rect.Height()) { 446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov analogial -= 50; 447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj = pPrevElement->GetObject(nPrevObj - 1); 450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObj->m_Type == PDFPAGE_TEXT) { 451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* pText = (CPDF_TextObject*)pObj; 452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nItem = pText->CountItems(); 453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem item; 454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pText->GetItemInfo(nItem - 1, &item); 455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wStr = pText->GetFont()->UnicodeFromCharCode(item.m_CharCode); 456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(wStr.IsEmpty()) { 457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov wStr = (FX_WCHAR)item.m_CharCode; 458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR wch = wStr.GetAt(wStr.GetLength() - 1); 460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(wch) { 461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case '.': 462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 12290: 463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 65311: 464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 63: 465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 33: 466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case 65281: 467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov analogial -= 50; 468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevLine.RemoveAll(); 472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevLine.Append(line); 473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.RemoveAll(); 474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 nNextObj = pNextElement->CountObjects(); 475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPrevObj = NULL; 476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bFirst = TRUE; 477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = 0; i < nNextObj; i++) { 478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj = pNextElement->GetObject(i); 479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pPrevObj) { 480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPrevObj = pObj; 481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); 482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.Add(pObj); 483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect objRect = CFX_FloatRect(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); 486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IsSameLine(TRUE, rect, objRect)) { 487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.Add(pObj); 488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect.Union(objRect); 489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(rect.right - prevRect.right) < rect.Height() && FXSYS_fabs(rect.left - prevRect.left) < rect.Height()) { 491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov analogial += 50; 492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevLine.RemoveAll(); 494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevLine.Append(line); 495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prevRect = rect; 496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.RemoveAll(); 497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov line.Add(pObj); 498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rect = objRect; 499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!bFirst) { 500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bFirst = FALSE; 503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(prevLine.GetSize()) { 506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(bParagraphStart) { 507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(prevRect.left - rect.left > rect.Height() && prevRect.left - rect.left < rect.Height() * 3) { 508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov analogial -= 50; 509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(prevRect.left - rect.left) < rect.Height()) { 512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov analogial -= 50; 513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return analogial; 517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessElement(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth) 519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pElement == NULL) { 521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_Status == LayoutReady) { 524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutType layoutType = pElement->GetType(); 525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 ElementType = GetElementTypes(layoutType); 526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(ElementType) { 527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case SST_IE: 528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bIllustration = TRUE; 529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case SST_BLSE: 531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT StartIndent = 0; 533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IPDF_LayoutElement* pParent = pElement->GetParent()) { 534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StartIndent = pParent->GetNumberAttr(LayoutStartIndent); 535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent); 537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StartIndent = ConverWidth(currStartIndent); 538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT width = reflowWidth; 539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(StartIndent != currStartIndent) { 540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reflowWidth -= m_StartIndent; 541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT spaceBefore = pElement->GetNumberAttr(LayoutSpaceBefore); 543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_PageHeight += spaceBefore; 544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TextAlign = pElement->GetEnumAttr(LayoutTextAlign); 545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IPDF_LayoutElement* pParent = pElement->GetParent()) { 546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StartIndent = pParent->GetNumberAttr(LayoutEndIndent); 547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT currEndIndent = pElement->GetNumberAttr(LayoutEndIndent); 548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(StartIndent != currStartIndent) { 549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reflowWidth -= ConverWidth(currEndIndent); 550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(reflowWidth * 2 < width) { 553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reflowWidth = width; 554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_StartIndent = 0; 555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(layoutType) { 559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTable: { 560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = FX_NEW CRF_Table; 561ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == pTable) { 562ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 563ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 564ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TableArray.Add(pTable); 565ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_ReflowPageHeight = m_pReflowedPage->m_PageHeight; 566ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_TableWidth = GetElmWidth(pElement); 567ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 568ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 569ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableRow: { 570ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!m_TableArray.GetSize()) { 571ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 572ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 573ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pElement->CountChildren(); 574ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); 575ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int f = 0; 576ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < count; i++) { 577ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutElement* pChildElement = pElement->GetChild(i); 578ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutType type = pChildElement->GetType(); 579ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(type == LayoutTableDataCell || type == LayoutTableHeaderCell) { 580ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f++; 581ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 582ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 583ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_nCell.Add(f); 584ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 585ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 586ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableDataCell: 587ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableHeaderCell: { 588ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!m_TableArray.GetSize()) { 589ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 590ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 591ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_TableCell* pCell = FX_Alloc(RF_TableCell, 1); 592ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FXSYS_memset32(pCell, 0 , sizeof(RF_TableCell)); 593ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); 594ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pos = pTable->m_nCell.GetSize() - 1; 595ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_BeginPos = m_pReflowedPage->m_pReflowed->GetSize(); 596ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT cellWidth = pElement->GetNumberAttr(LayoutWidth); 597ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(cellWidth == 0 || pCell->m_MaxWidth > pTable->m_TableWidth) { 598ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); 599ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_MaxWidth = reflowWidth / pTable->m_nCell.GetAt(pTable->m_nCell.GetSize() - 1); 600ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 601ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_MaxWidth = pElement->GetNumberAttr(LayoutWidth) * reflowWidth / pTable->m_TableWidth; 602ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 603ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_ColSpan = (int)(pElement->GetNumberAttr(LayoutColSpan)); 604ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_RowSpan = (int)(pElement->GetNumberAttr(LayoutRowSpan)); 605ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pCell->m_ColSpan) { 606ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_ColSpan = 1; 607ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 608ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pCell->m_RowSpan ) { 609ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_RowSpan = 1; 610ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 611ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_BlockAlign = pElement->GetEnumAttr(LayoutBlockAlign); 612ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_TextAlign = pElement->GetEnumAttr(LayoutInlineAlign); 613ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_PosX = 0; 614ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_PosY = 0; 615ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reflowWidth = pCell->m_MaxWidth; 616ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_pCellArray.Add(pCell); 617ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 618ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 619ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 620ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 621ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 622ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fLineHeight = pElement->GetNumberAttr(LayoutLineHeight); 623ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize(); 624ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pElement->CountObjects()) { 625ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessObjs(pElement, reflowWidth); 626ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 627ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 628ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pElement->CountChildren(); 629ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < count; i++) { 630ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov IPDF_LayoutElement* pChildElement = pElement->GetChild(i); 631ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessElement(pChildElement, reflowWidth); 632ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pPause && m_pRootElement == pElement && m_Status != LayoutToBeContinued ) { 633ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pPause->NeedToPauseNow()) { 634ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pLayoutElement = pChildElement; 635ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = LayoutToBeContinued; 636ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_CurrRefWidth = reflowWidth; 637ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PausePosition = (i + 1) * 100 / (count + 1); 638ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return ; 639ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 640ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 641ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_Status == LayoutToBeContinued && m_pLayoutElement == pChildElement) { 642ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_Status = LayoutReady; 643ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 644ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 645ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_Status == LayoutReady) { 646ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dx = 0; 647ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov LayoutType layoutType = pElement->GetType(); 648ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 ElementType = GetElementTypes(layoutType); 649ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(ElementType) { 650ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case SST_IE: 651ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_bIllustration = FALSE; 652ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 653ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 654ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case SST_BLSE: 655ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 656ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT StartIndent = 0; 657ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IPDF_LayoutElement* pParent = pElement->GetParent()) { 658ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov StartIndent = pParent->GetNumberAttr(LayoutStartIndent); 659ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 660ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT currStartIndent = pElement->GetNumberAttr(LayoutStartIndent); 661ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(StartIndent != currStartIndent) { 662ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov reflowWidth += ConverWidth(currStartIndent); 663ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dx += ConverWidth(currStartIndent); 664ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 665ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT spaceAfter = pElement->GetNumberAttr(LayoutSpaceAfter); 666ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_PageHeight += spaceAfter; 667ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 668ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 669ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(layoutType) { 670ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableDataCell: 671ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableHeaderCell: { 672ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!m_TableArray.GetSize()) { 673ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 674ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 675ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); 676ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov RF_TableCell* pCell = pTable->m_pCellArray.GetAt(pTable->m_pCellArray.GetSize() - 1); 677ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_EndPos = m_pReflowedPage->m_pReflowed->GetSize() - 1; 678ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pCell->m_EndPos < pCell->m_BeginPos) { 679ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_CellHeight = 0; 680ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 681ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pBeginData = (*m_pReflowedPage->m_pReflowed)[pCell->m_BeginPos]; 682ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pEndData = (*m_pReflowedPage->m_pReflowed)[pCell->m_EndPos]; 683ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_CellHeight = pBeginData->m_Height > pEndData->m_Height ? pBeginData->m_Height : pEndData->m_Height; 684ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCell->m_CellHeight -= pEndData->m_PosY - pBeginData->m_PosY; 685ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 686ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 687ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 688ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableRow: { 689ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!m_TableArray.GetSize()) { 690ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 691ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 692ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Table* pTable = m_TableArray.GetAt(m_TableArray.GetSize() - 1); 693ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pTable->m_nCol == 0) { 694ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTable->m_nCol = pTable->m_pCellArray.GetSize(); 695ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 696ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 697ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 698ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTable: { 699ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessTable(dx); 700ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 701ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 702ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 703ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(dx) { 704ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, dx, 0); 705ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ReflowedSize = m_pReflowedPage->m_pReflowed->GetSize(); 706ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pReflowedPage->m_pReflowed, ReflowedSize, m_pReflowedPage->m_pReflowed->GetSize() - ReflowedSize); 707ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 708ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 709ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 710ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pRootElement == pElement) { 711ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_PausePosition = 100; 712ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 713ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 714ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_LayoutProcessor_Reflow::GetElementTypes(LayoutType layoutType) 715ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 716ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(layoutType) { 717ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutParagraph: 718ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading: 719ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading1: 720ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading2: 721ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading3: 722ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading4: 723ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading5: 724ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutHeading6: 725ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutList: 726ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutListItem: 727ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutListLabel: 728ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutListBody: 729ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTable: 730ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableHeaderCell: 731ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableDataCell: 732ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableRow: 733ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableHeaderGroup: 734ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableBodyGroup: 735ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTableFootGroup: 736ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutTOCI: 737ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutCaption: 738ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return SST_BLSE; 739ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutFigure: 740ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutFormula: 741ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutForm: 742ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return SST_IE; 743ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutSpan: 744ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutQuote: 745ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutNote: 746ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutReference: 747ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutBibEntry: 748ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutCode: 749ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutLink: 750ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutAnnot: 751ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutRuby: 752ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutWarichu: 753ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return SST_ILSE; 754ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 755ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return SST_GE; 756ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 757ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 758ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 759ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_LayoutProcessor_Reflow::ConverWidth(FX_FLOAT width) 760ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 761ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return width; 762ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 763ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessObject(CPDF_PageObject* pObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix) 764ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 765ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pObj) { 766ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 767ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 768ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObj->m_Type == PDFPAGE_TEXT) { 769ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessTextObject( (CPDF_TextObject *)pObj, reflowWidth, objMatrix); 770ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(pObj->m_Type == PDFPAGE_IMAGE) { 771ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!(m_flags & RF_PARSER_IMAGE)) { 772ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 773ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 774ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObjects* pObjs = FX_NEW CPDF_PageObjects(FALSE); 775ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == pObjs) { 776ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 777ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 778ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = pObjs->GetLastObjectPosition(); 779ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pos = pObjs->InsertObject(pos, pObj); 780ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix; 781ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect = pObj->GetBBox(&matrix); 782ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageObject* ImageObj = (CPDF_ImageObject*)pObj; 783ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessUnitaryObjs(pObjs, reflowWidth, objMatrix); 784ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pObjs; 785ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(pObj->m_Type == PDFPAGE_PATH) { 786ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(pObj->m_Type == PDFPAGE_FORM) { 787ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_FormObject* pForm = (CPDF_FormObject*)pObj; 788ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = pForm->m_pForm->GetFirstObjectPosition(); 789ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objMatrix.Concat(pForm->m_FormMatrix); 790ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (pos) { 791ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj1 = pForm->m_pForm->GetNextObject(pos); 792ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessObject(pObj1, reflowWidth, objMatrix); 793ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 794ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 795ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 796ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessObjs(IPDF_LayoutElement* pElement, FX_FLOAT reflowWidth) 797ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 798ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrMaxWidth = reflowWidth; 799ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ObjCount = pElement->CountObjects(); 800ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < ObjCount; i++) { 801ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj = pElement->GetObject(i); 802ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ProcessObject(pObj, reflowWidth, m_PDFMatrix); 803ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 804ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 805ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 806ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::AddTemp2CurrLine(int begin, int count) 807ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 808ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(begin < 0 || count <= 0 || !m_pReflowedPage || !m_pReflowedPage->m_pReflowed || !m_pTempLine) { 809ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 810ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 811ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count += begin; 812ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 813ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = m_pReflowedPage->m_pReflowed->GetSize(); 814ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int temps = m_pTempLine->GetSize(); 815ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = begin; i < count; i++) { 816ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pTempLine)[i]; 817ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddData2CurrLine(pData); 818ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 819ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 820ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::AddData2CurrLine(CRF_Data* pData) 821ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 822ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData == NULL || m_pCurrLine == NULL) { 823ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 824ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 825ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrLine->Add(pData); 826ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth = pData->m_PosX + pData->m_Width; 827ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->m_Height > m_fCurrLineHeight) { 828ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight = pData->m_Height; 829ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 830ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 831ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::UpdateCurrLine() 832ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 833ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 834ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_DataPtrArray* pDataArray, int beginPos, int count) 835ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 836ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pDataArray) { 837ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 838ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 839ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(count == 0) { 840ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count = pDataArray->GetSize(); 841ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 842ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count += beginPos; 843ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 844ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = beginPos; i < count; i++) { 845ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*pDataArray)[i]; 846ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(pMatrix, pData); 847ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 848ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 849ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::Transform(const CFX_AffineMatrix* pMatrix, CRF_Data* pData) 850ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 851ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->GetType() == CRF_Data::Path) { 852ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_PathData* pPathData = (CRF_PathData*)pData; 853ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPathData->m_pPath2Device.Concat(*pMatrix); 854ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 855ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMatrix->Transform(pData->m_PosX, pData->m_PosY, pData->m_PosX, pData->m_PosY); 856ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 857ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_LayoutProcessor_Reflow::FinishedCurrLine() 858ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 859ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pCurrLine) { 860ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 861ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 862ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = m_pCurrLine->GetSize(); 863ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(count == 0) { 864ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 865ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 866ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_fLineHeight > m_fCurrLineHeight) { 867ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight = m_fLineHeight; 868ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 869ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight += 2; 870ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 871ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pReflowedPage->m_pReflowed->GetSize() > 0) { 872ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight += m_fLineSpace; 873ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 874ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT height = m_pReflowedPage->m_PageHeight + m_fCurrLineHeight; 875ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT lineHeight = m_fLineHeight; 876ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(lineHeight == 0) { 877ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov lineHeight = m_fCurrLineHeight; 878ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 879ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dx = 0; 880ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov switch(m_TextAlign) { 881ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutCenter: 882ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dx = (m_fCurrMaxWidth - m_fCurrLineWidth) / 2; 883ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 884ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutEnd: 885ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dx = m_fCurrMaxWidth - m_fCurrLineWidth; 886ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 887ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov case LayoutJustify: 888ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 889ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov default: 890ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 891ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 892ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dy = - height; 893ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int refedSize = m_pReflowedPage->m_pReflowed->GetSize(); 894ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(count == 13) { 895ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int a = 0; 896ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 897ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = 0; i < count; i++) { 898ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pCurrLine)[i]; 899ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_pReflowed->Add(pData); 900ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x = m_StartIndent + dx * (m_TextAlign == LayoutJustify ? i + 1 : 1); 901ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, x, dy); 902ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, pData); 903ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 904ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrLine->RemoveAll(); 905ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth = 0; 906ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_PageHeight += m_fCurrLineHeight; 907ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineHeight = 0; 908ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 909ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 910ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovCRF_CharState* CPDF_LayoutProcessor_Reflow::GetCharState(CPDF_TextObject* pObj, CPDF_Font* pFont, FX_FLOAT fHeight, FX_ARGB color) 911ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 912ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pReflowedPage->m_pCharState) { 913ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return NULL; 914ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 915ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = m_pReflowedPage->m_pCharState->GetSize(); 916ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = count - 1; i >= 0; i--) { 917ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharState* pState = (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(i); 918ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pState->m_Color == color && pState->m_fFontSize == fHeight && pState->m_pFont == pFont && pState->m_pTextObj == pObj) { 919ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pState; 920ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 921ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 922ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharState pState; 923ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_pTextObj = pObj; 924ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_Color = color; 925ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_pFont = pFont; 926ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_fFontSize = fHeight; 927ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int ascent = pFont->GetTypeAscent(); 928ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int descent = pFont->GetTypeDescent(); 929ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_fAscent = ascent * fHeight / (ascent - descent); 930ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(descent == 0) { 931ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_fDescent = 0; 932ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 933ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_fDescent = descent * fHeight / (ascent - descent); 934ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 935ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_bVert = FALSE; 936ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_CIDFont *pCIDFont = pFont->GetCIDFont(); 937ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pCIDFont) { 938ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pState.m_bVert = pCIDFont->IsVertWriting(); 939ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 940ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_pCharState->Add(pState); 941ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return (CRF_CharState*)m_pReflowedPage->m_pCharState->GetAt(count); 942ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 943ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_LayoutProcessor_Reflow::GetCharWidth(FX_DWORD charCode, CPDF_Font* pFont) const 944ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 945ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(charCode == -1) { 946ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 947ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 948ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int w = pFont->GetCharWidthF(charCode); 949ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(w == 0) { 950ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str; 951ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont->AppendChar(str, charCode); 952ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov w = pFont->GetStringWidth(str, 1); 953ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(w == 0) { 954ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT BBox; 955ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pFont->GetCharBBox(charCode, BBox); 956ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov w = BBox.right - BBox.left; 957ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 958ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 959ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return w; 960ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 961ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::CreateRFData(CPDF_PageObject* pObj, CFX_AffineMatrix* pObjMatrix) 962ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 963ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pReflowedPage->m_pMemoryPool) { 964ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 965ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 966ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObj->m_Type == PDFPAGE_TEXT) { 967ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* pTextObj = (CPDF_TextObject* )pObj; 968ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = pTextObj->CountItems(); 969ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!count) { 970ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 971ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 972ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(count == 1) { 973ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem Item; 974ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTextObj->GetItemInfo(0, &Item); 975ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(Item.m_CharCode == 49) { 976ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int a = 0; 977ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 978ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 979ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Font * pFont = pTextObj->GetFont(); 980ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT fs = pTextObj->GetFontSize(); 981ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix(); 982ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT matrix1 = pmatrix[1]; 983ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pmatrix[2] == 0) { 984ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix1 = 0; 985ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 986ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix textMatrix(pmatrix[0], matrix1, pmatrix[2], pmatrix[3], 0, 0); 987ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT height = FXSYS_fabs(textMatrix.TransformDistance(fs)); 988ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObjMatrix) { 989ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov height = FXSYS_fabs(pObjMatrix->TransformDistance(height)); 990ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 991ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int r = 0, g = 0, b = 0; 992ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTextObj->m_ColorState.GetFillColor()->GetRGB(r, g, b); 993ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_ARGB col = r * 0x10000; 994ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov col += g * 0x100; 995ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov col += b; 996ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharState* pState = GetCharState(pTextObj, pFont, height, col); 997ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT dx = 0, dy = 0; 998ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT ObjBBox; 999ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObjMatrix) { 1000ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ObjBBox = pTextObj->GetBBox(pObjMatrix); 1001ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dx = (float)ObjBBox.left; 1002ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dy = (float)ObjBBox.bottom; 1003ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1004ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix; 1005ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ObjBBox = pTextObj->GetBBox(&matrix); 1006ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1007ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT objWidth = 0; 1008ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_ByteString str; 1009ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bOrder = TRUE; 1010ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_PtrArray tempArray; 1011ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = 0; 1012ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem Item; 1013ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTextObj->GetItemInfo(i, &Item); 1014ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dx = Item.m_OriginX; 1015ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov dy = Item.m_OriginY; 1016ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, dx, dy); 1017ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pLastData = NULL; 1018ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT horzScale = pTextObj->m_TextState.GetFontSizeV() / pTextObj->m_TextState.GetFontSizeH(); 1019ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while(i < count) { 1020ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTextObj->GetItemInfo(i, &Item); 1021ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(Item.m_CharCode == -1) { 1022ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i++; 1023ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1024ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1025ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT OriginX, OriginY; 1026ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov textMatrix.Transform(Item.m_OriginX, Item.m_OriginY, OriginX, OriginY); 1027ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData = (CRF_CharData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_CharData)); 1028ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == pData) { 1029ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1030ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1031ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Type = CRF_Data::Text; 1032ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(OriginY - dy) > FXSYS_fabs(OriginX - dx)) { 1033ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_PosY = dy; 1034ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_PosX = pLastData->m_PosX + pLastData->m_Width + textMatrix.TransformDistance(pTextObj->m_TextState.GetObject()->m_CharSpace); 1035ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1036ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_PosY = OriginY; 1037ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_PosX = OriginX; 1038ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1039ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = tempArray.GetSize(); 1040ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(size && pData->m_PosX < pLastData->m_PosX ) { 1041ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int j = 0; j < size; j++) { 1042ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData1 = (CRF_CharData*)tempArray.GetAt(j); 1043ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData1->m_PosX > pData->m_PosX) { 1044ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempArray.InsertAt(j, pData); 1045ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1046ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1047ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1048ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1049ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempArray.Add(pData); 1050ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1051ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pLastData = pData; 1052ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_CharCode = Item.m_CharCode; 1053ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Height = FXSYS_fabs(height); 1054ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int w = GetCharWidth(Item.m_CharCode, pFont); 1055ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Width = FXSYS_fabs(fs * textMatrix.TransformDistance((FX_FLOAT)w) / 1000); 1056ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(horzScale) { 1057ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Width /= horzScale; 1058ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1059ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_pCharState = pState; 1060ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i++; 1061ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1062ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov count = tempArray.GetSize(); 1063ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int j = 0; j < count; j++) { 1064ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData = (CRF_CharData*)tempArray.GetAt(j); 1065ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTempLine) { 1066ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine->Add(pData); 1067ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1068ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1069ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempArray.RemoveAll(); 1070ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(pObj->m_Type == PDFPAGE_IMAGE) { 1071ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_ImageObject* pImageObj = (CPDF_ImageObject* )pObj; 1072ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_ImageData* pRFImage = (CRF_ImageData*)m_pReflowedPage->m_pMemoryPool->Alloc(sizeof(CRF_ImageData)); 1073ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == pRFImage) { 1074ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1075ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1076ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_pBitmap = NULL; 1077ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_Type = CRF_Data::Image; 1078ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTempLine) { 1079ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine->Add(pRFImage); 1080ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1081ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_Image *pImage = pImageObj->m_pImage; 1082ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pImage->m_pDIBSource || !pImage->m_pMask) { 1083ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pImage->StartLoadDIBSource(m_pReflowedPage->GetFormResDict(pImageObj), m_pReflowedPage->m_pPDFPage->m_pResources, 0, 0, TRUE)) { 1084ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pImage->Continue(NULL); 1085ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1086ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1087ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBSource* pDibSource = pImage->DetachBitmap(); 1088ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pDibSource) { 1089ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_pBitmap = pDibSource->Clone(); 1090ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pDibSource; 1091ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1092ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBSource* pMask = pImage->DetachMask(); 1093ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pMask) { 1094ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pMask->IsAlphaMask()) { 1095ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_DIBitmap* pMaskBmp = pMask->Clone(); 1096ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pMaskBmp->ConvertFormat(FXDIB_8bppMask); 1097ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_pBitmap->MultiplyAlpha(pMaskBmp); 1098ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pMaskBmp; 1099ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_pBitmap->MultiplyAlpha(pMask); 1101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1102ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov delete pMask; 1103ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1104ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect ObjBBox; 1105ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObjMatrix) { 1106ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ObjBBox = pImageObj->GetBBox(pObjMatrix); 1107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix; 1109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ObjBBox = pImageObj->GetBBox(&matrix); 1110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_Width = ObjBBox.Width(); 1112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_Height = ObjBBox.Height(); 1113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_PosX = 0; 1114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_PosY = 0; 1115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, -1, 0, 0); 1116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.Concat(pImageObj->m_Matrix); 1117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.Concat(*pObjMatrix); 1118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pRFImage->m_Matrix.Set(matrix.a == 0 ? 0 : matrix.a / FXSYS_fabs(matrix.a), 1119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.b == 0 ? 0 : matrix.b / FXSYS_fabs(matrix.b), 1120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.c == 0 ? 0 : matrix.c / FXSYS_fabs(matrix.c), 1121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.d == 0 ? 0 : matrix.d / FXSYS_fabs(matrix.d), 0, 0); 1122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(pObj->m_Type == PDFPAGE_PATH) { 1123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1125ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_FLOAT CPDF_LayoutProcessor_Reflow:: GetDatasWidth(int beginPos, int endpos) 1126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(endpos < beginPos || !m_pTempLine) { 1128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1130ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(endpos > m_pTempLine->GetSize() - 1) { 1131ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov endpos = m_pTempLine->GetSize() - 1; 1132ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1133ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pBeginData = (*m_pTempLine)[beginPos]; 1134ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pEndData = (*m_pTempLine)[endpos]; 1135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return pEndData->m_PosX - pBeginData->m_PosX + pEndData->m_Width; 1136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1137ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_WCHAR CPDF_LayoutProcessor_Reflow::GetPreChar() 1138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (NULL == m_pCurrLine) { 1140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int index = m_pCurrLine->GetSize() - 1; 1143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pCharData = NULL; 1144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (index >= 0 && !pCharData) { 1145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pCurrLine)[index]; 1146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->GetType() == CRF_Data::Text) { 1147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCharData = (CRF_CharData*)pData; 1148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index --; 1152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pReflowedPage) { 1154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index = m_pReflowedPage->m_pReflowed->GetSize() - 1; 1155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while(!pCharData && index >= 0) { 1157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pReflowedPage->m_pReflowed)[index]; 1158ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->GetType() == CRF_Data::Text) { 1159ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCharData = (CRF_CharData*)pData; 1160ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1161ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1162ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov index --; 1164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pCharData) { 1166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString str = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode); 1167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return str.GetAt(0); 1168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return -1; 1170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint CPDF_LayoutProcessor_Reflow::ProcessInsertObject(CPDF_TextObject* pObj, CFX_AffineMatrix formMatrix) 1172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pObj || !m_pPreObj || !m_pCurrLine) { 1174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(m_pCurrLine->GetSize() == 0) { 1177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem item; 1180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nItem = m_pPreObj->CountItems(); 1181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPreObj->GetItemInfo(nItem - 1, &item); 1182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT last_pos = item.m_OriginX; 1183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT last_width = GetCharWidth(item.m_CharCode, m_pPreObj->GetFont()) * m_pPreObj->GetFontSize() / 1000; 1184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_width = FXSYS_fabs(last_width); 1185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->GetItemInfo(0, &item); 1186ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT this_width = GetCharWidth(item.m_CharCode, pObj->GetFont()) * pObj->GetFontSize() / 1000; 1187ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov this_width = FXSYS_fabs(this_width); 1188ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4; 1189ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix prev_matrix, prev_reverse; 1190ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPreObj->GetTextMatrix(&prev_matrix); 1191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_matrix.Concat(m_perMatrix); 1192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_reverse.SetReverse(prev_matrix); 1193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY(); 1194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov formMatrix.Transform(x, y); 1195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_reverse.Transform(x, y); 1196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR preChar = GetPreChar(); 1197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); 1198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR curChar = wstrItem.GetAt(0); 1199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_fabs(y) > threshold * 2) { 1200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (preChar == L'-') { 1201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 3; 1202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (preChar != L' ') { 1204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 1205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ((x - last_pos - last_width) > threshold && curChar != L' ' && preChar != L' ') { 1209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 1210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1213ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_INT32 CPDF_LayoutProcessor_Reflow::LogicPreObj(CPDF_TextObject* pObj) 1214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* pPreObj = m_pPreObj; 1216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPreObj = pObj; 1217ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pObj || !pPreObj) { 1218ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1219ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1220ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem item; 1221ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPreObj->GetItemInfo(pPreObj->CountItems() - 1, &item); 1222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT last_pos = item.m_OriginX; 1223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT last_width = pPreObj->GetFont()->GetCharWidthF(item.m_CharCode) * pPreObj->GetFontSize() / 1000; 1224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov last_width = FXSYS_fabs(last_width); 1225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pObj->GetItemInfo(0, &item); 1226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT this_width = pObj->GetFont()->GetCharWidthF(item.m_CharCode) * pObj->GetFontSize() / 1000; 1227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov this_width = FXSYS_fabs(this_width); 1228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT threshold = last_width > this_width ? last_width / 4 : this_width / 4; 1229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix prev_matrix, prev_reverse; 1230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPreObj->GetTextMatrix(&prev_matrix); 1231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_reverse.SetReverse(prev_matrix); 1232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT x = pObj->GetPosX(), y = pObj->GetPosY(); 1233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov prev_reverse.Transform(x, y); 1234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString wstrItem = pObj->GetFont()->UnicodeFromCharCode(item.m_CharCode); 1235ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR curChar = wstrItem.GetAt(0); 1236ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_fabs(y) > threshold * 2) { 1237ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1238ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1239ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR preChar = 0; 1240ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_fabs(last_pos + last_width - x) > threshold && curChar != L' ') { 1241ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 1242ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1243ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1244ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPreObj = pObj; 1245ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pPreObj) { 1246ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1247ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1248ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pPreObj->m_Type != pObj->m_Type) { 1249ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1250ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1251ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rcCurObj(pObj->m_Left, pObj->m_Bottom, pObj->m_Right, pObj->m_Top); 1252ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rcPreObj(pPreObj->m_Left, pPreObj->m_Bottom, pPreObj->m_Right, pPreObj->m_Top); 1253ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObj->m_Type == PDFPAGE_IMAGE) { 1254ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(rcPreObj.Contains(rcCurObj)) { 1255ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1256ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1257ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(rcCurObj.Contains(rcPreObj)) { 1258ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1259ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1260ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1261ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1262ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObj->m_Type == PDFPAGE_TEXT) { 1263ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!((rcPreObj.bottom > rcCurObj.top) || (rcPreObj.top < rcCurObj.bottom))) { 1264ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT height = FX_MIN(rcPreObj.Height(), rcCurObj.Height()); 1265ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if((rcCurObj.left - rcPreObj.right) > height / 3) { 1266ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 3; 1267ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1268ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1269ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) >= 2 || FXSYS_fabs(rcPreObj.Height() - rcCurObj.Height()) >= 2 ) { 1270ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1271ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1272ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* pPreTextObj = (CPDF_TextObject*)pPreObj; 1273ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObject* pCurTextObj = (CPDF_TextObject*)pObj; 1274ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nPreCount = pPreTextObj->CountItems(); 1275ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCurCount = pCurTextObj->CountItems(); 1276ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nPreCount != nCurCount) { 1277ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1278ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1279ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_BOOL bSame = TRUE; 1280ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nPreCount; i++) { 1281ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem itemPer, itemCur; 1282ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pPreTextObj->GetItemInfo(i, &itemPer); 1283ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pCurTextObj->GetItemInfo(i, &itemCur); 1284ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (itemCur.m_CharCode != itemPer.m_CharCode) { 1285ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1286ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1287ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (itemCur.m_OriginX != itemPer.m_OriginX) { 1288ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bSame = FALSE; 1289ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1290ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (itemCur.m_OriginY != itemPer.m_OriginY) { 1291ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov bSame = FALSE; 1292ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1293ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1294ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(rcPreObj.left == rcCurObj.left && rcPreObj.top == rcCurObj.top) { 1295ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 1; 1296ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1297ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(FXSYS_fabs(rcPreObj.left - rcCurObj.left) < rcPreObj.Width() / 3 1298ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov && FXSYS_fabs(rcPreObj.top - rcCurObj.top) < rcPreObj.Height() / 3) { 1299ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 2; 1300ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1301ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1302ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return 0; 1303ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1304ee451cb395940862dad63c85adfe8f2fd55e864cSvet GanovFX_BOOL CPDF_LayoutProcessor_Reflow::IsSameTextObject(CPDF_TextObject* pTextObj1, CPDF_TextObject* pTextObj2) 1305ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1306ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!pTextObj1 || !pTextObj2) { 1307ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1308ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1309ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rcPreObj(pTextObj2->m_Left, pTextObj2->m_Bottom, pTextObj2->m_Right, pTextObj2->m_Top); 1310ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect rcCurObj(pTextObj1->m_Left, pTextObj1->m_Bottom, pTextObj1->m_Right, pTextObj1->m_Top); 1311ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rcPreObj.IsEmpty() && rcCurObj.IsEmpty()) { 1312ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1313ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1314ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (!rcPreObj.IsEmpty() || !rcCurObj.IsEmpty()) { 1315ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov rcPreObj.Intersect(rcCurObj); 1316ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (rcPreObj.IsEmpty()) { 1317ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1318ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1319ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (FXSYS_fabs(rcPreObj.Width() - rcCurObj.Width()) > rcCurObj.Width() / 2) { 1320ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1321ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1322ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (pTextObj2->GetFontSize() != pTextObj1->GetFontSize()) { 1323ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1324ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1325ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1326ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nPreCount = pTextObj2->CountItems(); 1327ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int nCurCount = pTextObj1->CountItems(); 1328ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (nPreCount != nCurCount) { 1329ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1330ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1331ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for (int i = 0; i < nPreCount; i++) { 1332ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_TextObjectItem itemPer, itemCur; 1333ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTextObj2->GetItemInfo(i, &itemPer); 1334ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pTextObj1->GetItemInfo(i, &itemCur); 1335ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (itemCur.m_CharCode != itemPer.m_CharCode) { 1336ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FALSE; 1337ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1338ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1339ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return TRUE; 1340ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1341ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessTextObject(CPDF_TextObject *pTextObj, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix) 1342ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1343ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(reflowWidth < 0 || !m_pCurrLine || !m_pTempLine) { 1344ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1345ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1346ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IsSameTextObject(pTextObj, m_pPreObj)) { 1347ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1348ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1349ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pPreObj = m_pPreObj; 1350ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 logic = ProcessInsertObject(pTextObj, objMatrix); 1351ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pPreObj = pTextObj; 1352ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_perMatrix.Copy(objMatrix); 1353ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int size = m_pTempLine->GetSize(); 1354ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int curs = m_pCurrLine->GetSize(); 1355ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CreateRFData(pTextObj); 1356ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov size = m_pTempLine->GetSize(); 1357ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int reds = m_pReflowedPage->m_pReflowed->GetSize(); 1358ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(size == 0) { 1359ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1360ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1361ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(logic == 1) { 1362ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3; 1363ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(logic == 3 && curs) { 1364ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth -= (*m_pCurrLine)[curs - 1]->m_Width; 1365ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pCurrLine->Delete(curs - 1); 1366ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1367ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int beginPos = 0, endPos = m_pTempLine->GetSize() - 1; 1368ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while(beginPos <= endPos) { 1369ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int tempBeginPos = beginPos; 1370ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int tempEndPos = endPos; 1371ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT all_width = GetDatasWidth( beginPos, endPos); 1372ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(all_width < reflowWidth - m_fCurrLineWidth) { 1373ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos]; 1374ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY); 1375ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pTempLine, beginPos, endPos - beginPos + 1); 1376ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddTemp2CurrLine(beginPos, endPos - beginPos + 1); 1377ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine->RemoveAll(); 1378ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1379ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1380ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int midPos ; 1381ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(tempBeginPos >= tempEndPos && tempEndPos != 0) { 1382ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov midPos = tempEndPos; 1383ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1384ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while (tempBeginPos < tempEndPos ) { 1385ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov midPos = (tempEndPos - tempBeginPos) / 2 + tempBeginPos; 1386ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(midPos == tempBeginPos || midPos == tempEndPos) { 1387ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1388ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1389ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT w = GetDatasWidth( beginPos, midPos); 1390ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(w < reflowWidth - m_fCurrLineWidth) { 1391ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempBeginPos = midPos; 1392ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1393ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov tempEndPos = midPos; 1394ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1395ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1396ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov midPos = tempBeginPos; 1397ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(midPos == 0) { 1398ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT w = GetDatasWidth( beginPos, 1); 1399ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(w > reflowWidth - m_fCurrLineWidth) { 1400ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov midPos = -1; 1401ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1402ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1403ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1404ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(midPos == -1) { 1405ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = m_pCurrLine->GetSize(); 1406ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(count == 0) { 1407ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov midPos = 0; 1408ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1409ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1410ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int f = -1; 1411ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int i = 0; 1412ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(i = midPos; i >= beginPos; i--) { 1413ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[i]; 1414ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString Wstr = pData->m_pCharState->m_pFont->UnicodeFromCharCode(pData->m_CharCode); 1415ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR cha = Wstr.GetAt(0); 1416ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(i < m_pTempLine->GetSize() - 1) { 1417ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pNextData = (CRF_CharData*)(*m_pTempLine)[i + 1]; 1418ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pNextData->m_PosX - (pData->m_PosX + pData->m_Width) >= pData->m_Height / 4) { 1419ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = i; 1420ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i++; 1421ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1422ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1423ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f == -1) { 1424ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IsCanBreakAfter((FX_DWORD)cha)) { 1425ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = i; 1426ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i++; 1427ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(IsCanBreakBefore((FX_DWORD)cha)) { 1428ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = i - 1; 1429ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f < beginPos) { 1430ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = -1; 1431ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1432ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1433ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1434ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f != -1) { 1435ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pBeginData = (CRF_CharData*)(*m_pTempLine)[beginPos]; 1436ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, -pBeginData->m_PosX + m_fCurrLineWidth, -pBeginData->m_PosY); 1437ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pTempLine, beginPos, f - beginPos + 1); 1438ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pTempLine)[0]; 1439ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddTemp2CurrLine(beginPos, f - beginPos + 1); 1440ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov beginPos = i; 1441ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 1442ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = 1; 1443ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1444ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1445ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1446ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f == -1 && i < beginPos) { 1447ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if( m_pCurrLine->GetSize()) { 1448ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int count = m_pCurrLine->GetSize(); 1449ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = -1; 1450ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int i = count - 1; i >= 0; i--) { 1451ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_Data* pData = (*m_pCurrLine)[i]; 1452ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pData->GetType() != CRF_Data::Text) { 1453ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = i + 1; 1454ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1455ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pCharData = (CRF_CharData*)pData; 1456ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_WideString Wstr = pCharData->m_pCharState->m_pFont->UnicodeFromCharCode(pCharData->m_CharCode); 1457ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_WCHAR cha = Wstr.GetAt(0); 1458ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(IsCanBreakAfter(cha)) { 1459ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = i + 1; 1460ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov i++; 1461ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(IsCanBreakBefore(cha)) { 1462ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = i; 1463ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1464ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f == 0) { 1465ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov f = -1; 1466ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1467ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1468ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f != -1) { 1469ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 1470ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f < count) { 1471ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int reflowdCount = m_pReflowedPage->m_pReflowed->GetSize(); 1472ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov int pos = reflowdCount + f - count; 1473ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData = (CRF_CharData*)(*m_pReflowedPage->m_pReflowed)[pos]; 1474ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY); 1475ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, m_pReflowedPage->m_pReflowed, pos, reflowdCount - pos); 1476ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int j = pos; j < reflowdCount; j++) { 1477ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddData2CurrLine((*m_pReflowedPage->m_pReflowed)[j]); 1478ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1479ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pReflowedPage->m_pReflowed->Delete(pos, count - f); 1480ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(logic == 3) { 1481ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_fCurrLineWidth += pTextObj->GetBBox(&objMatrix).Height() / 3; 1482ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1483ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1484ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov break; 1485ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1486ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1487ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1488ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(f == -1) { 1489ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[beginPos]; 1490ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix(1, 0, 0, 1, -pData->m_PosX + m_fCurrLineWidth, -pData->m_PosY); 1491ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(beginPos == midPos) { 1492ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, pData); 1493ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_RECT rect; 1494ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_pCharState->m_pFont->GetFontBBox(rect); 1495ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT* pmatrix = pTextObj->m_TextState.GetMatrix(); 1496ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix textMatrix(pmatrix[0], pmatrix[1], pmatrix[2], pmatrix[3], 0, 0); 1497ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT width = pData->m_Height * (rect.right - rect.left) / 1000; 1498ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f = (reflowWidth - m_fCurrLineWidth) / width; 1499ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_PosY *= f; 1500ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Width *= f; 1501ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_Height *= f; 1502ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov pData->m_pCharState = GetCharState(pData->m_pCharState->m_pTextObj, pData->m_pCharState->m_pFont, pData->m_Height, pData->m_pCharState->m_Color); 1503ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddData2CurrLine(pData); 1504ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1505ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov for(int m = beginPos; m <= midPos; m++) { 1506ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CRF_CharData* pData = (CRF_CharData*)(*m_pTempLine)[m]; 1507ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&matrix, pData); 1508ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddData2CurrLine(pData); 1509ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1510ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1511ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 1512ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov beginPos = midPos + 1; 1513ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1514ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1515ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1516ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine->RemoveAll(); 1517ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1518ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1519ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessUnitaryObjs(CPDF_PageObjects *pObjs, FX_FLOAT reflowWidth, CFX_AffineMatrix objMatrix) 1520ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1521ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(!pObjs) { 1522ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return; 1523ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1524ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_FloatRect ObjBBox = pObjs->CalcBoundingBox(); 1525ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov objMatrix.TransformRect(ObjBBox); 1526ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT ObjWidth = ObjBBox.Width(); 1527ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT ObjHeight = ObjBBox.Height(); 1528ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix matrix; 1529ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(ObjWidth <= reflowWidth - m_fCurrLineWidth) { 1530ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.Set(1, 0, 0, 1, m_fCurrLineWidth , 0); 1531ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else if(ObjWidth <= reflowWidth) { 1532ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 1533ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.Set(1, 0, 0, 1, 0, 0); 1534ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } else { 1535ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FinishedCurrLine(); 1536ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_FLOAT f = reflowWidth / ObjWidth ; 1537ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.Set(f, 0, 0, f, 0, 0); 1538ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1539ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CFX_AffineMatrix tempMatrix = matrix; 1540ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov matrix.Concat(objMatrix); 1541ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_POSITION pos = pObjs->GetFirstObjectPosition(); 1542ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov while(pos) { 1543ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CPDF_PageObject* pObj = pObjs->GetNextObject(pos); 1544ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(pObj->m_Type == PDFPAGE_TEXT) { 1545ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FX_INT32 ret = LogicPreObj((CPDF_TextObject*)pObj); 1546ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if(ret == 1 || ret == 2) { 1547ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov continue; 1548ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1549ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1550ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov CreateRFData(pObj, &matrix); 1551ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1552ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if (m_pTempLine) { 1553ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov Transform(&tempMatrix, m_pTempLine, 0, m_pTempLine->GetSize()); 1554ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov AddTemp2CurrLine(0, m_pTempLine->GetSize()); 1555ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov m_pTempLine->RemoveAll(); 1556ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 1557ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1558ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovvoid CPDF_LayoutProcessor_Reflow::ProcessPathObject(CPDF_PathObject *pObj, FX_FLOAT reflowWidth) 1559ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{ 1560ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov} 1561