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