| OLD | NEW |
| 1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | 6 |
| 7 #include "render_int.h" | 7 #include "render_int.h" |
| 8 | 8 |
| 9 #include "core/include/fpdfapi/fpdf_module.h" | 9 #include "core/include/fpdfapi/fpdf_module.h" |
| 10 #include "core/include/fpdfapi/fpdf_render.h" | 10 #include "core/include/fpdfapi/fpdf_render.h" |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 m_bLoadMask(FALSE), | 174 m_bLoadMask(FALSE), |
| 175 m_pType3Char(nullptr), | 175 m_pType3Char(nullptr), |
| 176 m_T3FillColor(0), | 176 m_T3FillColor(0), |
| 177 m_curBlend(FXDIB_BLEND_NORMAL) {} | 177 m_curBlend(FXDIB_BLEND_NORMAL) {} |
| 178 | 178 |
| 179 CPDF_RenderStatus::~CPDF_RenderStatus() { | 179 CPDF_RenderStatus::~CPDF_RenderStatus() { |
| 180 } | 180 } |
| 181 | 181 |
| 182 FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext, | 182 FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext, |
| 183 CFX_RenderDevice* pDevice, | 183 CFX_RenderDevice* pDevice, |
| 184 const CFX_AffineMatrix* pDeviceMatrix, | 184 const CFX_Matrix* pDeviceMatrix, |
| 185 const CPDF_PageObject* pStopObj, | 185 const CPDF_PageObject* pStopObj, |
| 186 const CPDF_RenderStatus* pParentState, | 186 const CPDF_RenderStatus* pParentState, |
| 187 const CPDF_GraphicStates* pInitialStates, | 187 const CPDF_GraphicStates* pInitialStates, |
| 188 const CPDF_RenderOptions* pOptions, | 188 const CPDF_RenderOptions* pOptions, |
| 189 int transparency, | 189 int transparency, |
| 190 FX_BOOL bDropObjects, | 190 FX_BOOL bDropObjects, |
| 191 CPDF_Dictionary* pFormResource, | 191 CPDF_Dictionary* pFormResource, |
| 192 FX_BOOL bStdCS, | 192 FX_BOOL bStdCS, |
| 193 CPDF_Type3Char* pType3Char, | 193 CPDF_Type3Char* pType3Char, |
| 194 FX_ARGB fill_color, | 194 FX_ARGB fill_color, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 } else { | 236 } else { |
| 237 m_InitialStates.DefaultStates(); | 237 m_InitialStates.DefaultStates(); |
| 238 } | 238 } |
| 239 m_pObjectRenderer.reset(); | 239 m_pObjectRenderer.reset(); |
| 240 m_Transparency = transparency; | 240 m_Transparency = transparency; |
| 241 return TRUE; | 241 return TRUE; |
| 242 } | 242 } |
| 243 void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, | 243 void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs, |
| 244 const CFX_AffineMatrix* pObj2Device) { | 244 const CFX_Matrix* pObj2Device) { |
| 245 CFX_FloatRect clip_rect = m_pDevice->GetClipBox(); | 245 CFX_FloatRect clip_rect = m_pDevice->GetClipBox(); |
| 246 CFX_AffineMatrix device2object; | 246 CFX_Matrix device2object; |
| 247 device2object.SetReverse(*pObj2Device); | 247 device2object.SetReverse(*pObj2Device); |
| 248 device2object.TransformRect(clip_rect); | 248 device2object.TransformRect(clip_rect); |
| 249 int index = 0; | 249 int index = 0; |
| 250 FX_POSITION pos = pObjs->GetFirstObjectPosition(); | 250 FX_POSITION pos = pObjs->GetFirstObjectPosition(); |
| 251 while (pos) { | 251 while (pos) { |
| 252 index++; | 252 index++; |
| 253 CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos); | 253 CPDF_PageObject* pCurObj = pObjs->GetNextObject(pos); |
| 254 if (pCurObj == m_pStopObj) { | 254 if (pCurObj == m_pStopObj) { |
| 255 m_bStopped = TRUE; | 255 m_bStopped = TRUE; |
| 256 return; | 256 return; |
| 257 } | 257 } |
| 258 if (!pCurObj) { | 258 if (!pCurObj) { |
| 259 continue; | 259 continue; |
| 260 } | 260 } |
| 261 if (pCurObj == NULL || pCurObj->m_Left > clip_rect.right || | 261 if (pCurObj == NULL || pCurObj->m_Left > clip_rect.right || |
| 262 pCurObj->m_Right < clip_rect.left || | 262 pCurObj->m_Right < clip_rect.left || |
| 263 pCurObj->m_Bottom > clip_rect.top || | 263 pCurObj->m_Bottom > clip_rect.top || |
| 264 pCurObj->m_Top < clip_rect.bottom) { | 264 pCurObj->m_Top < clip_rect.bottom) { |
| 265 continue; | 265 continue; |
| 266 } | 266 } |
| 267 RenderSingleObject(pCurObj, pObj2Device); | 267 RenderSingleObject(pCurObj, pObj2Device); |
| 268 if (m_bStopped) { | 268 if (m_bStopped) { |
| 269 return; | 269 return; |
| 270 } | 270 } |
| 271 } | 271 } |
| 272 } | 272 } |
| 273 void CPDF_RenderStatus::RenderSingleObject( | 273 void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj, |
| 274 const CPDF_PageObject* pObj, | 274 const CFX_Matrix* pObj2Device) { |
| 275 const CFX_AffineMatrix* pObj2Device) { | |
| 276 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); | 275 CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth); |
| 277 if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) { | 276 if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) { |
| 278 return; | 277 return; |
| 279 } | 278 } |
| 280 m_pCurObj = pObj; | 279 m_pCurObj = pObj; |
| 281 if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull()) { | 280 if (m_Options.m_pOCContext && pObj->m_ContentMark.NotNull()) { |
| 282 if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) { | 281 if (!m_Options.m_pOCContext->CheckObjectVisible(pObj)) { |
| 283 return; | 282 return; |
| 284 } | 283 } |
| 285 } | 284 } |
| 286 ProcessClipPath(pObj->m_ClipPath, pObj2Device); | 285 ProcessClipPath(pObj->m_ClipPath, pObj2Device); |
| 287 if (ProcessTransparency(pObj, pObj2Device)) { | 286 if (ProcessTransparency(pObj, pObj2Device)) { |
| 288 return; | 287 return; |
| 289 } | 288 } |
| 290 ProcessObjectNoClip(pObj, pObj2Device); | 289 ProcessObjectNoClip(pObj, pObj2Device); |
| 291 } | 290 } |
| 292 | 291 |
| 293 FX_BOOL CPDF_RenderStatus::ContinueSingleObject( | 292 FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj, |
| 294 const CPDF_PageObject* pObj, | 293 const CFX_Matrix* pObj2Device, |
| 295 const CFX_AffineMatrix* pObj2Device, | 294 IFX_Pause* pPause) { |
| 296 IFX_Pause* pPause) { | |
| 297 if (m_pObjectRenderer) { | 295 if (m_pObjectRenderer) { |
| 298 if (m_pObjectRenderer->Continue(pPause)) | 296 if (m_pObjectRenderer->Continue(pPause)) |
| 299 return TRUE; | 297 return TRUE; |
| 300 | 298 |
| 301 if (!m_pObjectRenderer->m_Result) | 299 if (!m_pObjectRenderer->m_Result) |
| 302 DrawObjWithBackground(pObj, pObj2Device); | 300 DrawObjWithBackground(pObj, pObj2Device); |
| 303 m_pObjectRenderer.reset(); | 301 m_pObjectRenderer.reset(); |
| 304 return FALSE; | 302 return FALSE; |
| 305 } | 303 } |
| 306 | 304 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 328 ProcessObjectNoClip(pObj, pObj2Device); | 326 ProcessObjectNoClip(pObj, pObj2Device); |
| 329 return FALSE; | 327 return FALSE; |
| 330 } | 328 } |
| 331 | 329 |
| 332 IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type) { | 330 IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type) { |
| 333 if (type != PDFPAGE_IMAGE) { | 331 if (type != PDFPAGE_IMAGE) { |
| 334 return NULL; | 332 return NULL; |
| 335 } | 333 } |
| 336 return new CPDF_ImageRenderer; | 334 return new CPDF_ImageRenderer; |
| 337 } | 335 } |
| 338 FX_BOOL CPDF_RenderStatus::GetObjectClippedRect( | 336 FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj, |
| 339 const CPDF_PageObject* pObj, | 337 const CFX_Matrix* pObj2Device, |
| 340 const CFX_AffineMatrix* pObj2Device, | 338 FX_BOOL bLogical, |
| 341 FX_BOOL bLogical, | 339 FX_RECT& rect) const { |
| 342 FX_RECT& rect) const { | |
| 343 rect = pObj->GetBBox(pObj2Device); | 340 rect = pObj->GetBBox(pObj2Device); |
| 344 FX_RECT rtClip = m_pDevice->GetClipBox(); | 341 FX_RECT rtClip = m_pDevice->GetClipBox(); |
| 345 if (!bLogical) { | 342 if (!bLogical) { |
| 346 CFX_Matrix dCTM = m_pDevice->GetCTM(); | 343 CFX_Matrix dCTM = m_pDevice->GetCTM(); |
| 347 FX_FLOAT a = FXSYS_fabs(dCTM.a); | 344 FX_FLOAT a = FXSYS_fabs(dCTM.a); |
| 348 FX_FLOAT d = FXSYS_fabs(dCTM.d); | 345 FX_FLOAT d = FXSYS_fabs(dCTM.d); |
| 349 if (a != 1.0f || d != 1.0f) { | 346 if (a != 1.0f || d != 1.0f) { |
| 350 rect.right = rect.left + (int32_t)FXSYS_ceil((FX_FLOAT)rect.Width() * a); | 347 rect.right = rect.left + (int32_t)FXSYS_ceil((FX_FLOAT)rect.Width() * a); |
| 351 rect.bottom = rect.top + (int32_t)FXSYS_ceil((FX_FLOAT)rect.Height() * d); | 348 rect.bottom = rect.top + (int32_t)FXSYS_ceil((FX_FLOAT)rect.Height() * d); |
| 352 rtClip.right = | 349 rtClip.right = |
| 353 rtClip.left + (int32_t)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a); | 350 rtClip.left + (int32_t)FXSYS_ceil((FX_FLOAT)rtClip.Width() * a); |
| 354 rtClip.bottom = | 351 rtClip.bottom = |
| 355 rtClip.top + (int32_t)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d); | 352 rtClip.top + (int32_t)FXSYS_ceil((FX_FLOAT)rtClip.Height() * d); |
| 356 } | 353 } |
| 357 } | 354 } |
| 358 rect.Intersect(rtClip); | 355 rect.Intersect(rtClip); |
| 359 return rect.IsEmpty(); | 356 return rect.IsEmpty(); |
| 360 } | 357 } |
| 361 void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, | 358 void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj, |
| 362 const CFX_AffineMatrix* pObj2Device) { | 359 const CFX_Matrix* pObj2Device) { |
| 363 CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap(); | 360 CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap(); |
| 364 if (pBitmap == NULL) { | 361 if (pBitmap == NULL) { |
| 365 return; | 362 return; |
| 366 } | 363 } |
| 367 FX_RECT rect; | 364 FX_RECT rect; |
| 368 if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) { | 365 if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) { |
| 369 return; | 366 return; |
| 370 } | 367 } |
| 371 if (m_DitherBits == 2) { | 368 if (m_DitherBits == 2) { |
| 372 static FX_ARGB pal[4] = {0, 85, 170, 255}; | 369 static FX_ARGB pal[4] = {0, 85, 170, 255}; |
| 373 pBitmap->DitherFS(pal, 4, &rect); | 370 pBitmap->DitherFS(pal, 4, &rect); |
| 374 } else if (m_DitherBits == 3) { | 371 } else if (m_DitherBits == 3) { |
| 375 static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255}; | 372 static FX_ARGB pal[8] = {0, 36, 73, 109, 146, 182, 219, 255}; |
| 376 pBitmap->DitherFS(pal, 8, &rect); | 373 pBitmap->DitherFS(pal, 8, &rect); |
| 377 } else if (m_DitherBits == 4) { | 374 } else if (m_DitherBits == 4) { |
| 378 static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, | 375 static FX_ARGB pal[16] = {0, 17, 34, 51, 68, 85, 102, 119, |
| 379 136, 153, 170, 187, 204, 221, 238, 255}; | 376 136, 153, 170, 187, 204, 221, 238, 255}; |
| 380 pBitmap->DitherFS(pal, 16, &rect); | 377 pBitmap->DitherFS(pal, 16, &rect); |
| 381 } | 378 } |
| 382 } | 379 } |
| 383 void CPDF_RenderStatus::ProcessObjectNoClip( | 380 void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj, |
| 384 const CPDF_PageObject* pObj, | 381 const CFX_Matrix* pObj2Device) { |
| 385 const CFX_AffineMatrix* pObj2Device) { | |
| 386 FX_BOOL bRet = FALSE; | 382 FX_BOOL bRet = FALSE; |
| 387 switch (pObj->m_Type) { | 383 switch (pObj->m_Type) { |
| 388 case PDFPAGE_TEXT: | 384 case PDFPAGE_TEXT: |
| 389 bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL); | 385 bRet = ProcessText((CPDF_TextObject*)pObj, pObj2Device, NULL); |
| 390 break; | 386 break; |
| 391 case PDFPAGE_PATH: | 387 case PDFPAGE_PATH: |
| 392 bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device); | 388 bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device); |
| 393 break; | 389 break; |
| 394 case PDFPAGE_IMAGE: | 390 case PDFPAGE_IMAGE: |
| 395 bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device); | 391 bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device); |
| 396 break; | 392 break; |
| 397 case PDFPAGE_SHADING: | 393 case PDFPAGE_SHADING: |
| 398 bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device); | 394 bRet = ProcessShading((CPDF_ShadingObject*)pObj, pObj2Device); |
| 399 break; | 395 break; |
| 400 case PDFPAGE_FORM: | 396 case PDFPAGE_FORM: |
| 401 bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device); | 397 bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device); |
| 402 break; | 398 break; |
| 403 } | 399 } |
| 404 if (!bRet) { | 400 if (!bRet) { |
| 405 DrawObjWithBackground(pObj, pObj2Device); | 401 DrawObjWithBackground(pObj, pObj2Device); |
| 406 } | 402 } |
| 407 } | 403 } |
| 408 FX_BOOL CPDF_RenderStatus::DrawObjWithBlend( | 404 FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj, |
| 409 const CPDF_PageObject* pObj, | 405 const CFX_Matrix* pObj2Device) { |
| 410 const CFX_AffineMatrix* pObj2Device) { | |
| 411 FX_BOOL bRet = FALSE; | 406 FX_BOOL bRet = FALSE; |
| 412 switch (pObj->m_Type) { | 407 switch (pObj->m_Type) { |
| 413 case PDFPAGE_PATH: | 408 case PDFPAGE_PATH: |
| 414 bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device); | 409 bRet = ProcessPath((CPDF_PathObject*)pObj, pObj2Device); |
| 415 break; | 410 break; |
| 416 case PDFPAGE_IMAGE: | 411 case PDFPAGE_IMAGE: |
| 417 bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device); | 412 bRet = ProcessImage((CPDF_ImageObject*)pObj, pObj2Device); |
| 418 break; | 413 break; |
| 419 case PDFPAGE_FORM: | 414 case PDFPAGE_FORM: |
| 420 bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device); | 415 bRet = ProcessForm((CPDF_FormObject*)pObj, pObj2Device); |
| 421 break; | 416 break; |
| 422 } | 417 } |
| 423 return bRet; | 418 return bRet; |
| 424 } | 419 } |
| 425 void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix& matrix) const { | 420 void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix& matrix) const { |
| 426 CFX_Matrix dCTM = m_pDevice->GetCTM(); | 421 CFX_Matrix dCTM = m_pDevice->GetCTM(); |
| 427 matrix.a *= FXSYS_fabs(dCTM.a); | 422 matrix.a *= FXSYS_fabs(dCTM.a); |
| 428 matrix.d *= FXSYS_fabs(dCTM.d); | 423 matrix.d *= FXSYS_fabs(dCTM.d); |
| 429 } | 424 } |
| 430 void CPDF_RenderStatus::DrawObjWithBackground( | 425 void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj, |
| 431 const CPDF_PageObject* pObj, | 426 const CFX_Matrix* pObj2Device) { |
| 432 const CFX_AffineMatrix* pObj2Device) { | |
| 433 FX_RECT rect; | 427 FX_RECT rect; |
| 434 if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) { | 428 if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) { |
| 435 return; | 429 return; |
| 436 } | 430 } |
| 437 int res = 300; | 431 int res = 300; |
| 438 if (pObj->m_Type == PDFPAGE_IMAGE && | 432 if (pObj->m_Type == PDFPAGE_IMAGE && |
| 439 m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) { | 433 m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) { |
| 440 res = 0; | 434 res = 0; |
| 441 } | 435 } |
| 442 CPDF_ScaledRenderBuffer buffer; | 436 CPDF_ScaledRenderBuffer buffer; |
| 443 if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) { | 437 if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) { |
| 444 return; | 438 return; |
| 445 } | 439 } |
| 446 CFX_AffineMatrix matrix = *pObj2Device; | 440 CFX_Matrix matrix = *pObj2Device; |
| 447 matrix.Concat(*buffer.GetMatrix()); | 441 matrix.Concat(*buffer.GetMatrix()); |
| 448 GetScaledMatrix(matrix); | 442 GetScaledMatrix(matrix); |
| 449 CPDF_Dictionary* pFormResource = NULL; | 443 CPDF_Dictionary* pFormResource = NULL; |
| 450 if (pObj->m_Type == PDFPAGE_FORM) { | 444 if (pObj->m_Type == PDFPAGE_FORM) { |
| 451 CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj; | 445 CPDF_FormObject* pFormObj = (CPDF_FormObject*)pObj; |
| 452 if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) { | 446 if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) { |
| 453 pFormResource = | 447 pFormResource = |
| 454 pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources")); | 448 pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources")); |
| 455 } | 449 } |
| 456 } | 450 } |
| 457 CPDF_RenderStatus status; | 451 CPDF_RenderStatus status; |
| 458 status.Initialize(m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, | 452 status.Initialize(m_pContext, buffer.GetDevice(), buffer.GetMatrix(), NULL, |
| 459 NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, | 453 NULL, NULL, &m_Options, m_Transparency, m_bDropObjects, |
| 460 pFormResource); | 454 pFormResource); |
| 461 status.RenderSingleObject(pObj, &matrix); | 455 status.RenderSingleObject(pObj, &matrix); |
| 462 buffer.OutputToDevice(); | 456 buffer.OutputToDevice(); |
| 463 } | 457 } |
| 464 FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, | 458 FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj, |
| 465 const CFX_AffineMatrix* pObj2Device) { | 459 const CFX_Matrix* pObj2Device) { |
| 466 CPDF_Dictionary* pOC = | 460 CPDF_Dictionary* pOC = |
| 467 pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC")); | 461 pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC")); |
| 468 if (pOC && m_Options.m_pOCContext && | 462 if (pOC && m_Options.m_pOCContext && |
| 469 !m_Options.m_pOCContext->CheckOCGVisible(pOC)) { | 463 !m_Options.m_pOCContext->CheckOCGVisible(pOC)) { |
| 470 return TRUE; | 464 return TRUE; |
| 471 } | 465 } |
| 472 CFX_AffineMatrix matrix = pFormObj->m_FormMatrix; | 466 CFX_Matrix matrix = pFormObj->m_FormMatrix; |
| 473 matrix.Concat(*pObj2Device); | 467 matrix.Concat(*pObj2Device); |
| 474 CPDF_Dictionary* pResources = NULL; | 468 CPDF_Dictionary* pResources = NULL; |
| 475 if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) { | 469 if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) { |
| 476 pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources")); | 470 pResources = pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("Resources")); |
| 477 } | 471 } |
| 478 CPDF_RenderStatus status; | 472 CPDF_RenderStatus status; |
| 479 status.Initialize(m_pContext, m_pDevice, NULL, m_pStopObj, this, pFormObj, | 473 status.Initialize(m_pContext, m_pDevice, NULL, m_pStopObj, this, pFormObj, |
| 480 &m_Options, m_Transparency, m_bDropObjects, pResources, | 474 &m_Options, m_Transparency, m_bDropObjects, pResources, |
| 481 FALSE); | 475 FALSE); |
| 482 status.m_curBlend = m_curBlend; | 476 status.m_curBlend = m_curBlend; |
| 483 m_pDevice->SaveState(); | 477 m_pDevice->SaveState(); |
| 484 status.RenderObjectList(pFormObj->m_pForm, &matrix); | 478 status.RenderObjectList(pFormObj->m_pForm, &matrix); |
| 485 m_bStopped = status.m_bStopped; | 479 m_bStopped = status.m_bStopped; |
| 486 m_pDevice->RestoreState(); | 480 m_pDevice->RestoreState(); |
| 487 return TRUE; | 481 return TRUE; |
| 488 } | 482 } |
| 489 FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix) { | 483 FX_BOOL IsAvailableMatrix(const CFX_Matrix& matrix) { |
| 490 if (matrix.a == 0 || matrix.d == 0) { | 484 if (matrix.a == 0 || matrix.d == 0) { |
| 491 return matrix.b != 0 && matrix.c != 0; | 485 return matrix.b != 0 && matrix.c != 0; |
| 492 } | 486 } |
| 493 if (matrix.b == 0 || matrix.c == 0) { | 487 if (matrix.b == 0 || matrix.c == 0) { |
| 494 return matrix.a != 0 && matrix.d != 0; | 488 return matrix.a != 0 && matrix.d != 0; |
| 495 } | 489 } |
| 496 return TRUE; | 490 return TRUE; |
| 497 } | 491 } |
| 498 FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, | 492 FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj, |
| 499 const CFX_AffineMatrix* pObj2Device) { | 493 const CFX_Matrix* pObj2Device) { |
| 500 int FillType = pPathObj->m_FillType; | 494 int FillType = pPathObj->m_FillType; |
| 501 FX_BOOL bStroke = pPathObj->m_bStroke; | 495 FX_BOOL bStroke = pPathObj->m_bStroke; |
| 502 ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke); | 496 ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke); |
| 503 if (FillType == 0 && !bStroke) { | 497 if (FillType == 0 && !bStroke) { |
| 504 return TRUE; | 498 return TRUE; |
| 505 } | 499 } |
| 506 FX_DWORD fill_argb = 0; | 500 FX_DWORD fill_argb = 0; |
| 507 if (FillType) { | 501 if (FillType) { |
| 508 fill_argb = GetFillArgb(pPathObj); | 502 fill_argb = GetFillArgb(pPathObj); |
| 509 } | 503 } |
| 510 FX_DWORD stroke_argb = 0; | 504 FX_DWORD stroke_argb = 0; |
| 511 if (bStroke) { | 505 if (bStroke) { |
| 512 stroke_argb = GetStrokeArgb(pPathObj); | 506 stroke_argb = GetStrokeArgb(pPathObj); |
| 513 } | 507 } |
| 514 CFX_AffineMatrix path_matrix = pPathObj->m_Matrix; | 508 CFX_Matrix path_matrix = pPathObj->m_Matrix; |
| 515 path_matrix.Concat(*pObj2Device); | 509 path_matrix.Concat(*pObj2Device); |
| 516 if (!IsAvailableMatrix(path_matrix)) { | 510 if (!IsAvailableMatrix(path_matrix)) { |
| 517 return TRUE; | 511 return TRUE; |
| 518 } | 512 } |
| 519 if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) { | 513 if (FillType && (m_Options.m_Flags & RENDER_RECT_AA)) { |
| 520 FillType |= FXFILL_RECT_AA; | 514 FillType |= FXFILL_RECT_AA; |
| 521 } | 515 } |
| 522 if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) { | 516 if (m_Options.m_Flags & RENDER_FILL_FULLCOVER) { |
| 523 FillType |= FXFILL_FULLCOVER; | 517 FillType |= FXFILL_FULLCOVER; |
| 524 } | 518 } |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 if (pGeneralData->m_pTransferFunc) { | 610 if (pGeneralData->m_pTransferFunc) { |
| 617 rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb); | 611 rgb = pGeneralData->m_pTransferFunc->TranslateColor(rgb); |
| 618 } | 612 } |
| 619 } | 613 } |
| 620 } else { | 614 } else { |
| 621 alpha = 255; | 615 alpha = 255; |
| 622 } | 616 } |
| 623 return m_Options.TranslateColor(ArgbEncode(alpha, rgb)); | 617 return m_Options.TranslateColor(ArgbEncode(alpha, rgb)); |
| 624 } | 618 } |
| 625 void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, | 619 void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath, |
| 626 const CFX_AffineMatrix* pObj2Device) { | 620 const CFX_Matrix* pObj2Device) { |
| 627 if (ClipPath.IsNull()) { | 621 if (ClipPath.IsNull()) { |
| 628 if (!m_LastClipPath.IsNull()) { | 622 if (!m_LastClipPath.IsNull()) { |
| 629 m_pDevice->RestoreState(TRUE); | 623 m_pDevice->RestoreState(TRUE); |
| 630 m_LastClipPath.SetNull(); | 624 m_LastClipPath.SetNull(); |
| 631 } | 625 } |
| 632 return; | 626 return; |
| 633 } | 627 } |
| 634 if (m_LastClipPath == ClipPath) | 628 if (m_LastClipPath == ClipPath) |
| 635 return; | 629 return; |
| 636 | 630 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 | 670 |
| 677 int fill_mode = FXFILL_WINDING; | 671 int fill_mode = FXFILL_WINDING; |
| 678 if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) | 672 if (m_Options.m_Flags & RENDER_NOTEXTSMOOTH) |
| 679 fill_mode |= FXFILL_NOPATHSMOOTH; | 673 fill_mode |= FXFILL_NOPATHSMOOTH; |
| 680 m_pDevice->SetClip_PathFill(pTextClippingPath.get(), nullptr, fill_mode); | 674 m_pDevice->SetClip_PathFill(pTextClippingPath.get(), nullptr, fill_mode); |
| 681 pTextClippingPath.reset(); | 675 pTextClippingPath.reset(); |
| 682 } | 676 } |
| 683 } | 677 } |
| 684 | 678 |
| 685 void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, | 679 void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath, |
| 686 const CFX_AffineMatrix* pObj2Device) { | 680 const CFX_Matrix* pObj2Device) { |
| 687 if (ClipPath.IsNull()) { | 681 if (ClipPath.IsNull()) { |
| 688 return; | 682 return; |
| 689 } | 683 } |
| 690 int fill_mode = 0; | 684 int fill_mode = 0; |
| 691 if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) { | 685 if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) { |
| 692 fill_mode |= FXFILL_NOPATHSMOOTH; | 686 fill_mode |= FXFILL_NOPATHSMOOTH; |
| 693 } | 687 } |
| 694 int nClipPath = ClipPath.GetPathCount(); | 688 int nClipPath = ClipPath.GetPathCount(); |
| 695 int i; | 689 int i; |
| 696 for (i = 0; i < nClipPath; i++) { | 690 for (i = 0; i < nClipPath; i++) { |
| 697 const CFX_PathData* pPathData = ClipPath.GetPath(i); | 691 const CFX_PathData* pPathData = ClipPath.GetPath(i); |
| 698 if (pPathData == NULL) { | 692 if (pPathData == NULL) { |
| 699 continue; | 693 continue; |
| 700 } | 694 } |
| 701 CFX_GraphStateData stroke_state; | 695 CFX_GraphStateData stroke_state; |
| 702 if (m_Options.m_Flags & RENDER_THINLINE) { | 696 if (m_Options.m_Flags & RENDER_THINLINE) { |
| 703 stroke_state.m_LineWidth = 0; | 697 stroke_state.m_LineWidth = 0; |
| 704 } | 698 } |
| 705 m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, | 699 m_pDevice->DrawPath(pPathData, pObj2Device, &stroke_state, 0, 0xffff0000, |
| 706 fill_mode); | 700 fill_mode); |
| 707 } | 701 } |
| 708 } | 702 } |
| 709 FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, | 703 FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj, |
| 710 const CFX_AffineMatrix* pObj2Device, | 704 const CFX_Matrix* pObj2Device, |
| 711 FX_BOOL bStroke) { | 705 FX_BOOL bStroke) { |
| 712 CFX_AffineMatrix path_matrix = pPathObj->m_Matrix; | 706 CFX_Matrix path_matrix = pPathObj->m_Matrix; |
| 713 path_matrix.Concat(*pObj2Device); | 707 path_matrix.Concat(*pObj2Device); |
| 714 if (bStroke) { | 708 if (bStroke) { |
| 715 CFX_GraphStateData graphState(*pPathObj->m_GraphState); | 709 CFX_GraphStateData graphState(*pPathObj->m_GraphState); |
| 716 if (m_Options.m_Flags & RENDER_THINLINE) { | 710 if (m_Options.m_Flags & RENDER_THINLINE) { |
| 717 graphState.m_LineWidth = 0; | 711 graphState.m_LineWidth = 0; |
| 718 } | 712 } |
| 719 return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, | 713 return m_pDevice->SetClip_PathStroke(pPathObj->m_Path, &path_matrix, |
| 720 &graphState); | 714 &graphState); |
| 721 } | 715 } |
| 722 int fill_mode = pPathObj->m_FillType; | 716 int fill_mode = pPathObj->m_FillType; |
| 723 if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) { | 717 if (m_Options.m_Flags & RENDER_NOPATHSMOOTH) { |
| 724 fill_mode |= FXFILL_NOPATHSMOOTH; | 718 fill_mode |= FXFILL_NOPATHSMOOTH; |
| 725 } | 719 } |
| 726 return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode); | 720 return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode); |
| 727 } | 721 } |
| 728 FX_BOOL CPDF_RenderStatus::ProcessTransparency( | 722 FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj, |
| 729 const CPDF_PageObject* pPageObj, | 723 const CFX_Matrix* pObj2Device) { |
| 730 const CFX_AffineMatrix* pObj2Device) { | |
| 731 const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState; | 724 const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState; |
| 732 int blend_type = | 725 int blend_type = |
| 733 pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL; | 726 pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL; |
| 734 if (blend_type == FXDIB_BLEND_UNSUPPORTED) { | 727 if (blend_type == FXDIB_BLEND_UNSUPPORTED) { |
| 735 return TRUE; | 728 return TRUE; |
| 736 } | 729 } |
| 737 CPDF_Dictionary* pSMaskDict = | 730 CPDF_Dictionary* pSMaskDict = |
| 738 pGeneralState ? ToDictionary(pGeneralState->m_pSoftMask) : NULL; | 731 pGeneralState ? ToDictionary(pGeneralState->m_pSoftMask) : NULL; |
| 739 if (pSMaskDict) { | 732 if (pSMaskDict) { |
| 740 if (pPageObj->m_Type == PDFPAGE_IMAGE && | 733 if (pPageObj->m_Type == PDFPAGE_IMAGE && |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height)) | 824 if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height)) |
| 832 return TRUE; | 825 return TRUE; |
| 833 | 826 |
| 834 m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top); | 827 m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top); |
| 835 } | 828 } |
| 836 if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice.get())) | 829 if (!bitmap_device.Create(width, height, FXDIB_Argb, 0, oriDevice.get())) |
| 837 return TRUE; | 830 return TRUE; |
| 838 | 831 |
| 839 CFX_DIBitmap* bitmap = bitmap_device.GetBitmap(); | 832 CFX_DIBitmap* bitmap = bitmap_device.GetBitmap(); |
| 840 bitmap->Clear(0); | 833 bitmap->Clear(0); |
| 841 CFX_AffineMatrix new_matrix = *pObj2Device; | 834 CFX_Matrix new_matrix = *pObj2Device; |
| 842 new_matrix.TranslateI(-rect.left, -rect.top); | 835 new_matrix.TranslateI(-rect.left, -rect.top); |
| 843 new_matrix.Scale(scaleX, scaleY); | 836 new_matrix.Scale(scaleX, scaleY); |
| 844 nonstd::unique_ptr<CFX_DIBitmap> pTextMask; | 837 nonstd::unique_ptr<CFX_DIBitmap> pTextMask; |
| 845 if (bTextClip) { | 838 if (bTextClip) { |
| 846 pTextMask.reset(new CFX_DIBitmap); | 839 pTextMask.reset(new CFX_DIBitmap); |
| 847 if (!pTextMask->Create(width, height, FXDIB_8bppMask)) | 840 if (!pTextMask->Create(width, height, FXDIB_8bppMask)) |
| 848 return TRUE; | 841 return TRUE; |
| 849 | 842 |
| 850 pTextMask->Clear(0); | 843 pTextMask->Clear(0); |
| 851 CFX_FxgeDevice text_device; | 844 CFX_FxgeDevice text_device; |
| 852 text_device.Attach(pTextMask.get()); | 845 text_device.Attach(pTextMask.get()); |
| 853 for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i++) { | 846 for (FX_DWORD i = 0; i < pPageObj->m_ClipPath.GetTextCount(); i++) { |
| 854 CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i); | 847 CPDF_TextObject* textobj = pPageObj->m_ClipPath.GetText(i); |
| 855 if (textobj == NULL) { | 848 if (textobj == NULL) { |
| 856 break; | 849 break; |
| 857 } | 850 } |
| 858 CFX_AffineMatrix text_matrix; | 851 CFX_Matrix text_matrix; |
| 859 textobj->GetTextMatrix(&text_matrix); | 852 textobj->GetTextMatrix(&text_matrix); |
| 860 CPDF_TextRenderer::DrawTextPath( | 853 CPDF_TextRenderer::DrawTextPath( |
| 861 &text_device, textobj->m_nChars, textobj->m_pCharCodes, | 854 &text_device, textobj->m_nChars, textobj->m_pCharCodes, |
| 862 textobj->m_pCharPos, textobj->m_TextState.GetFont(), | 855 textobj->m_pCharPos, textobj->m_TextState.GetFont(), |
| 863 textobj->m_TextState.GetFontSize(), &text_matrix, &new_matrix, | 856 textobj->m_TextState.GetFontSize(), &text_matrix, &new_matrix, |
| 864 textobj->m_GraphState, (FX_ARGB)-1, 0, NULL); | 857 textobj->m_GraphState, (FX_ARGB)-1, 0, NULL); |
| 865 } | 858 } |
| 866 } | 859 } |
| 867 CPDF_RenderStatus bitmap_render; | 860 CPDF_RenderStatus bitmap_render; |
| 868 bitmap_render.Initialize(m_pContext, &bitmap_device, NULL, m_pStopObj, NULL, | 861 bitmap_render.Initialize(m_pContext, &bitmap_device, NULL, m_pStopObj, NULL, |
| 869 NULL, &m_Options, 0, m_bDropObjects, pFormResource, | 862 NULL, &m_Options, 0, m_bDropObjects, pFormResource, |
| 870 TRUE); | 863 TRUE); |
| 871 bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix); | 864 bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix); |
| 872 m_bStopped = bitmap_render.m_bStopped; | 865 m_bStopped = bitmap_render.m_bStopped; |
| 873 if (pSMaskDict) { | 866 if (pSMaskDict) { |
| 874 CFX_AffineMatrix smask_matrix; | 867 CFX_Matrix smask_matrix; |
| 875 FXSYS_memcpy(&smask_matrix, pGeneralState->m_SMaskMatrix, | 868 FXSYS_memcpy(&smask_matrix, pGeneralState->m_SMaskMatrix, |
| 876 sizeof smask_matrix); | 869 sizeof smask_matrix); |
| 877 smask_matrix.Concat(*pObj2Device); | 870 smask_matrix.Concat(*pObj2Device); |
| 878 nonstd::unique_ptr<CFX_DIBSource> pSMaskSource( | 871 nonstd::unique_ptr<CFX_DIBSource> pSMaskSource( |
| 879 LoadSMask(pSMaskDict, &rect, &smask_matrix)); | 872 LoadSMask(pSMaskDict, &rect, &smask_matrix)); |
| 880 if (pSMaskSource) | 873 if (pSMaskSource) |
| 881 bitmap->MultiplyAlpha(pSMaskSource.get()); | 874 bitmap->MultiplyAlpha(pSMaskSource.get()); |
| 882 } | 875 } |
| 883 if (pTextMask) { | 876 if (pTextMask) { |
| 884 bitmap->MultiplyAlpha(pTextMask.get()); | 877 bitmap->MultiplyAlpha(pTextMask.get()); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 if (pBackdrop->HasAlpha()) | 916 if (pBackdrop->HasAlpha()) |
| 924 bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT); | 917 bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_ALPHA_OUTPUT); |
| 925 else | 918 else |
| 926 bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS); | 919 bNeedDraw = !(m_pDevice->GetRenderCaps() & FXRC_GET_BITS); |
| 927 | 920 |
| 928 if (!bNeedDraw) { | 921 if (!bNeedDraw) { |
| 929 m_pDevice->GetDIBits(pBackdrop.get(), left, top); | 922 m_pDevice->GetDIBits(pBackdrop.get(), left, top); |
| 930 return pBackdrop.release(); | 923 return pBackdrop.release(); |
| 931 } | 924 } |
| 932 | 925 |
| 933 CFX_AffineMatrix FinalMatrix = m_DeviceMatrix; | 926 CFX_Matrix FinalMatrix = m_DeviceMatrix; |
| 934 FinalMatrix.TranslateI(-left, -top); | 927 FinalMatrix.TranslateI(-left, -top); |
| 935 FinalMatrix.Scale(scaleX, scaleY); | 928 FinalMatrix.Scale(scaleX, scaleY); |
| 936 pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff); | 929 pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff); |
| 937 CFX_FxgeDevice device; | 930 CFX_FxgeDevice device; |
| 938 device.Attach(pBackdrop.get()); | 931 device.Attach(pBackdrop.get()); |
| 939 m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix); | 932 m_pContext->Render(&device, pObj, &m_Options, &FinalMatrix); |
| 940 return pBackdrop.release(); | 933 return pBackdrop.release(); |
| 941 } | 934 } |
| 942 | 935 |
| 943 void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, | 936 void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer, |
| 944 const CPDF_PageObject* pObj, | 937 const CPDF_PageObject* pObj, |
| 945 const CPDF_RenderOptions* pOptions, | 938 const CPDF_RenderOptions* pOptions, |
| 946 CFX_AffineMatrix* pFinalMatrix) { | 939 CFX_Matrix* pFinalMatrix) { |
| 947 CFX_FxgeDevice device; | 940 CFX_FxgeDevice device; |
| 948 device.Attach(pBuffer); | 941 device.Attach(pBuffer); |
| 949 | 942 |
| 950 FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight()); | 943 FX_RECT rect(0, 0, device.GetWidth(), device.GetHeight()); |
| 951 device.FillRect(&rect, 0xffffffff); | 944 device.FillRect(&rect, 0xffffffff); |
| 952 Render(&device, pObj, pOptions, pFinalMatrix); | 945 Render(&device, pObj, pOptions, pFinalMatrix); |
| 953 } | 946 } |
| 954 CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates( | 947 CPDF_GraphicStates* CPDF_RenderStatus::CloneObjStates( |
| 955 const CPDF_GraphicStates* pSrcStates, | 948 const CPDF_GraphicStates* pSrcStates, |
| 956 FX_BOOL bStroke) { | 949 FX_BOOL bStroke) { |
| (...skipping 30 matching lines...) Expand all Loading... |
| 987 m_bFirstLayer = bFirstLayer; | 980 m_bFirstLayer = bFirstLayer; |
| 988 } | 981 } |
| 989 CPDF_RenderContext::~CPDF_RenderContext() {} | 982 CPDF_RenderContext::~CPDF_RenderContext() {} |
| 990 void CPDF_RenderContext::Clear() { | 983 void CPDF_RenderContext::Clear() { |
| 991 m_pDocument = NULL; | 984 m_pDocument = NULL; |
| 992 m_pPageResources = NULL; | 985 m_pPageResources = NULL; |
| 993 m_pPageCache = NULL; | 986 m_pPageCache = NULL; |
| 994 m_bFirstLayer = TRUE; | 987 m_bFirstLayer = TRUE; |
| 995 m_ContentList.RemoveAll(); | 988 m_ContentList.RemoveAll(); |
| 996 } | 989 } |
| 997 void CPDF_RenderContext::AppendObjectList( | 990 void CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs, |
| 998 CPDF_PageObjects* pObjs, | 991 const CFX_Matrix* pObject2Device) { |
| 999 const CFX_AffineMatrix* pObject2Device) { | |
| 1000 _PDF_RenderItem* pItem = m_ContentList.AddSpace(); | 992 _PDF_RenderItem* pItem = m_ContentList.AddSpace(); |
| 1001 pItem->m_pObjectList = pObjs; | 993 pItem->m_pObjectList = pObjs; |
| 1002 if (pObject2Device) { | 994 if (pObject2Device) { |
| 1003 pItem->m_Matrix = *pObject2Device; | 995 pItem->m_Matrix = *pObject2Device; |
| 1004 } else { | 996 } else { |
| 1005 pItem->m_Matrix.SetIdentity(); | 997 pItem->m_Matrix.SetIdentity(); |
| 1006 } | 998 } |
| 1007 } | 999 } |
| 1008 void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, | 1000 void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, |
| 1009 const CPDF_RenderOptions* pOptions, | 1001 const CPDF_RenderOptions* pOptions, |
| 1010 const CFX_AffineMatrix* pLastMatrix) { | 1002 const CFX_Matrix* pLastMatrix) { |
| 1011 Render(pDevice, NULL, pOptions, pLastMatrix); | 1003 Render(pDevice, NULL, pOptions, pLastMatrix); |
| 1012 } | 1004 } |
| 1013 void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, | 1005 void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice, |
| 1014 const CPDF_PageObject* pStopObj, | 1006 const CPDF_PageObject* pStopObj, |
| 1015 const CPDF_RenderOptions* pOptions, | 1007 const CPDF_RenderOptions* pOptions, |
| 1016 const CFX_AffineMatrix* pLastMatrix) { | 1008 const CFX_Matrix* pLastMatrix) { |
| 1017 int count = m_ContentList.GetSize(); | 1009 int count = m_ContentList.GetSize(); |
| 1018 for (int j = 0; j < count; j++) { | 1010 for (int j = 0; j < count; j++) { |
| 1019 pDevice->SaveState(); | 1011 pDevice->SaveState(); |
| 1020 _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j); | 1012 _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j); |
| 1021 if (pLastMatrix) { | 1013 if (pLastMatrix) { |
| 1022 CFX_AffineMatrix FinalMatrix = pItem->m_Matrix; | 1014 CFX_Matrix FinalMatrix = pItem->m_Matrix; |
| 1023 FinalMatrix.Concat(*pLastMatrix); | 1015 FinalMatrix.Concat(*pLastMatrix); |
| 1024 CPDF_RenderStatus status; | 1016 CPDF_RenderStatus status; |
| 1025 status.Initialize(this, pDevice, pLastMatrix, pStopObj, NULL, NULL, | 1017 status.Initialize(this, pDevice, pLastMatrix, pStopObj, NULL, NULL, |
| 1026 pOptions, pItem->m_pObjectList->m_Transparency, FALSE, | 1018 pOptions, pItem->m_pObjectList->m_Transparency, FALSE, |
| 1027 NULL); | 1019 NULL); |
| 1028 status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix); | 1020 status.RenderObjectList(pItem->m_pObjectList, &FinalMatrix); |
| 1029 if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { | 1021 if (status.m_Options.m_Flags & RENDER_LIMITEDIMAGECACHE) { |
| 1030 m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize); | 1022 m_pPageCache->CacheOptimization(status.m_Options.m_dwLimitCacheSize); |
| 1031 } | 1023 } |
| 1032 if (status.m_bStopped) { | 1024 if (status.m_bStopped) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1044 if (status.m_bStopped) { | 1036 if (status.m_bStopped) { |
| 1045 pDevice->RestoreState(); | 1037 pDevice->RestoreState(); |
| 1046 break; | 1038 break; |
| 1047 } | 1039 } |
| 1048 } | 1040 } |
| 1049 pDevice->RestoreState(); | 1041 pDevice->RestoreState(); |
| 1050 } | 1042 } |
| 1051 } | 1043 } |
| 1052 void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, | 1044 void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice, |
| 1053 CPDF_PageObjects* pObjs, | 1045 CPDF_PageObjects* pObjs, |
| 1054 const CFX_AffineMatrix* pObject2Device, | 1046 const CFX_Matrix* pObject2Device, |
| 1055 const CPDF_RenderOptions* pOptions) { | 1047 const CPDF_RenderOptions* pOptions) { |
| 1056 AppendObjectList(pObjs, pObject2Device); | 1048 AppendObjectList(pObjs, pObject2Device); |
| 1057 Render(pDevice, pOptions); | 1049 Render(pDevice, pOptions); |
| 1058 } | 1050 } |
| 1059 | 1051 |
| 1060 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( | 1052 CPDF_ProgressiveRenderer::CPDF_ProgressiveRenderer( |
| 1061 CPDF_RenderContext* pContext, | 1053 CPDF_RenderContext* pContext, |
| 1062 CFX_RenderDevice* pDevice, | 1054 CFX_RenderDevice* pDevice, |
| 1063 const CPDF_RenderOptions* pOptions) | 1055 const CPDF_RenderOptions* pOptions) |
| 1064 : m_Status(Ready), | 1056 : m_Status(Ready), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 } | 1115 } |
| 1124 if (!m_pRenderStatus) { | 1116 if (!m_pRenderStatus) { |
| 1125 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition(); | 1117 m_ObjectPos = pItem->m_pObjectList->GetFirstObjectPosition(); |
| 1126 m_ObjectIndex = 0; | 1118 m_ObjectIndex = 0; |
| 1127 m_pRenderStatus.reset(new CPDF_RenderStatus()); | 1119 m_pRenderStatus.reset(new CPDF_RenderStatus()); |
| 1128 m_pRenderStatus->Initialize( | 1120 m_pRenderStatus->Initialize( |
| 1129 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions, | 1121 m_pContext, m_pDevice, NULL, NULL, NULL, NULL, m_pOptions, |
| 1130 pItem->m_pObjectList->m_Transparency, FALSE, NULL); | 1122 pItem->m_pObjectList->m_Transparency, FALSE, NULL); |
| 1131 m_pDevice->SaveState(); | 1123 m_pDevice->SaveState(); |
| 1132 m_ClipRect = m_pDevice->GetClipBox(); | 1124 m_ClipRect = m_pDevice->GetClipBox(); |
| 1133 CFX_AffineMatrix device2object; | 1125 CFX_Matrix device2object; |
| 1134 device2object.SetReverse(pItem->m_Matrix); | 1126 device2object.SetReverse(pItem->m_Matrix); |
| 1135 device2object.TransformRect(m_ClipRect); | 1127 device2object.TransformRect(m_ClipRect); |
| 1136 } | 1128 } |
| 1137 int objs_to_go = CPDF_ModuleMgr::Get() | 1129 int objs_to_go = CPDF_ModuleMgr::Get() |
| 1138 ->GetRenderModule() | 1130 ->GetRenderModule() |
| 1139 ->GetConfig() | 1131 ->GetConfig() |
| 1140 ->m_RenderStepLimit; | 1132 ->m_RenderStepLimit; |
| 1141 while (m_ObjectPos) { | 1133 while (m_ObjectPos) { |
| 1142 CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos); | 1134 CPDF_PageObject* pCurObj = pItem->m_pObjectList->GetObjectAt(m_ObjectPos); |
| 1143 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && | 1135 if (pCurObj && pCurObj->m_Left <= m_ClipRect.right && |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1426 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) { | 1418 item.GetParamType() == CPDF_ContentMarkItem::PropertiesDict) { |
| 1427 CPDF_Dictionary* pOCG = | 1419 CPDF_Dictionary* pOCG = |
| 1428 ToDictionary(static_cast<CPDF_Object*>(item.GetParam())); | 1420 ToDictionary(static_cast<CPDF_Object*>(item.GetParam())); |
| 1429 if (!CheckOCGVisible(pOCG)) { | 1421 if (!CheckOCGVisible(pOCG)) { |
| 1430 return FALSE; | 1422 return FALSE; |
| 1431 } | 1423 } |
| 1432 } | 1424 } |
| 1433 } | 1425 } |
| 1434 return TRUE; | 1426 return TRUE; |
| 1435 } | 1427 } |
| OLD | NEW |