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 "../../../include/fxge/fx_ge.h" | 7 #include "../../../include/fxge/fx_ge.h" |
8 #include "../../../include/fxcodec/fx_codec.h" | 8 #include "../../../include/fxcodec/fx_codec.h" |
9 #include "../../../include/fpdfapi/fpdf_module.h" | 9 #include "../../../include/fpdfapi/fpdf_module.h" |
10 #include "../../../include/fpdfapi/fpdf_render.h" | 10 #include "../../../include/fpdfapi/fpdf_render.h" |
11 #include "../../../include/fpdfapi/fpdf_pageobj.h" | 11 #include "../../../include/fpdfapi/fpdf_pageobj.h" |
12 #include "../fpdf_page/pageint.h" | 12 #include "../fpdf_page/pageint.h" |
13 #include "render_int.h" | 13 #include "render_int.h" |
14 FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_A
ffineMatrix* pObj2Device) | 14 FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, const CFX_A
ffineMatrix* pObj2Device) |
15 { | 15 { |
16 CPDF_ImageRenderer render; | 16 CPDF_ImageRenderer render; |
17 if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { | 17 if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { |
18 render.Continue(NULL); | 18 render.Continue(NULL); |
19 } | 19 } |
20 #ifdef _FPDFAPI_MINI_ | |
21 if (m_DitherBits) { | |
22 DitherObjectArea(pImageObj, pObj2Device); | |
23 } | |
24 #endif | |
25 return render.m_Result; | 20 return render.m_Result; |
26 } | 21 } |
27 #if defined(_FPDFAPI_MINI_) | |
28 FX_BOOL CPDF_RenderStatus::ProcessInlines(CPDF_InlineImages* pInlines, const CFX
_AffineMatrix* pObj2Device) | |
29 { | |
30 int bitmap_alpha = 255; | |
31 if (!pInlines->m_GeneralState.IsNull()) { | |
32 bitmap_alpha = FXSYS_round(pInlines->m_GeneralState.GetObject()->m_FillA
lpha * 255); | |
33 } | |
34 if (pInlines->m_pStream) { | |
35 CPDF_DIBSource dibsrc; | |
36 if (!dibsrc.Load(m_pContext->m_pDocument, pInlines->m_pStream, NULL, NUL
L, NULL, NULL)) { | |
37 return TRUE; | |
38 } | |
39 pInlines->m_pBitmap = dibsrc.Clone(); | |
40 pInlines->m_pStream->Release(); | |
41 pInlines->m_pStream = NULL; | |
42 } | |
43 if (pInlines->m_pBitmap == NULL) { | |
44 return TRUE; | |
45 } | |
46 FX_ARGB fill_argb = 0; | |
47 if (pInlines->m_pBitmap->IsAlphaMask()) { | |
48 fill_argb = GetFillArgb(pInlines); | |
49 } | |
50 int flags = 0; | |
51 if (m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { | |
52 flags |= RENDER_FORCE_DOWNSAMPLE; | |
53 } else if (m_Options.m_Flags & RENDER_FORCE_HALFTONE) { | |
54 flags = 0; | |
55 } | |
56 for (int i = 0; i < pInlines->m_Matrices.GetSize(); i ++) { | |
57 CFX_AffineMatrix image_matrix = pInlines->m_Matrices.GetAt(i); | |
58 image_matrix.Concat(*pObj2Device); | |
59 CPDF_ImageRenderer renderer; | |
60 if (renderer.Start(this, pInlines->m_pBitmap, fill_argb, bitmap_alpha, &
image_matrix, flags, FALSE, m_curBlend)) { | |
61 renderer.Continue(NULL); | |
62 } | |
63 } | |
64 return TRUE; | |
65 } | |
66 #endif | |
67 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int
top, FX_ARGB mask_argb, | 22 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, int left, int
top, FX_ARGB mask_argb, |
68 int bitmap_alpha, int blend_mode, int Transparency) | 23 int bitmap_alpha, int blend_mode, int Transparency) |
69 { | 24 { |
70 if (pDIBitmap == NULL) { | 25 if (pDIBitmap == NULL) { |
71 return; | 26 return; |
72 } | 27 } |
73 FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED; | 28 FX_BOOL bIsolated = Transparency & PDFTRANS_ISOLATED; |
74 FX_BOOL bGroup = Transparency & PDFTRANS_GROUP; | 29 FX_BOOL bGroup = Transparency & PDFTRANS_GROUP; |
75 if (blend_mode == FXDIB_BLEND_NORMAL) { | 30 if (blend_mode == FXDIB_BLEND_NORMAL) { |
76 if (!pDIBitmap->IsAlphaMask()) { | 31 if (!pDIBitmap->IsAlphaMask()) { |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 } | 340 } |
386 m_BitmapAlpha = 255; | 341 m_BitmapAlpha = 255; |
387 const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState; | 342 const CPDF_GeneralStateData* pGeneralState = m_pImageObject->m_GeneralState; |
388 if (pGeneralState) { | 343 if (pGeneralState) { |
389 m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255); | 344 m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255); |
390 } | 345 } |
391 m_pDIBSource = m_Loader.m_pBitmap; | 346 m_pDIBSource = m_Loader.m_pBitmap; |
392 if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader
.m_pMask == NULL) { | 347 if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && m_Loader
.m_pMask == NULL) { |
393 return StartBitmapAlpha(); | 348 return StartBitmapAlpha(); |
394 } | 349 } |
395 #ifndef _FPDFAPI_MINI_ | |
396 if (pGeneralState && pGeneralState->m_pTR) { | 350 if (pGeneralState && pGeneralState->m_pTR) { |
397 if (!pGeneralState->m_pTransferFunc) { | 351 if (!pGeneralState->m_pTransferFunc) { |
398 ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRender
Status->GetTransferFunc(pGeneralState->m_pTR); | 352 ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = m_pRender
Status->GetTransferFunc(pGeneralState->m_pTR); |
399 } | 353 } |
400 if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m
_bIdentity) { | 354 if (pGeneralState->m_pTransferFunc && !pGeneralState->m_pTransferFunc->m
_bIdentity) { |
401 m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->
TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached); | 355 m_pDIBSource = m_Loader.m_pBitmap = pGeneralState->m_pTransferFunc->
TranslateImage(m_Loader.m_pBitmap, !m_Loader.m_bCached); |
402 if (m_Loader.m_bCached && m_Loader.m_pMask) { | 356 if (m_Loader.m_bCached && m_Loader.m_pMask) { |
403 m_Loader.m_pMask = m_Loader.m_pMask->Clone(); | 357 m_Loader.m_pMask = m_Loader.m_pMask->Clone(); |
404 } | 358 } |
405 m_Loader.m_bCached = FALSE; | 359 m_Loader.m_bCached = FALSE; |
406 } | 360 } |
407 } | 361 } |
408 #endif | |
409 m_FillArgb = 0; | 362 m_FillArgb = 0; |
410 m_bPatternColor = FALSE; | 363 m_bPatternColor = FALSE; |
411 m_pPattern = NULL; | 364 m_pPattern = NULL; |
412 if (m_pDIBSource->IsAlphaMask()) { | 365 if (m_pDIBSource->IsAlphaMask()) { |
413 CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); | 366 CPDF_Color* pColor = m_pImageObject->m_ColorState.GetFillColor(); |
414 if (pColor && pColor->IsPattern()) { | 367 if (pColor && pColor->IsPattern()) { |
415 m_pPattern = pColor->GetPattern(); | 368 m_pPattern = pColor->GetPattern(); |
416 if (m_pPattern != NULL) { | 369 if (m_pPattern != NULL) { |
417 m_bPatternColor = TRUE; | 370 m_bPatternColor = TRUE; |
418 } | 371 } |
419 } | 372 } |
420 m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); | 373 m_FillArgb = m_pRenderStatus->GetFillArgb(m_pImageObject); |
421 } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { | 374 } else if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_GRAY) { |
422 m_pClone = m_pDIBSource->Clone(); | 375 m_pClone = m_pDIBSource->Clone(); |
423 m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pR
enderStatus->m_Options.m_ForeColor); | 376 m_pClone->ConvertColorScale(m_pRenderStatus->m_Options.m_BackColor, m_pR
enderStatus->m_Options.m_ForeColor); |
424 m_pDIBSource = m_pClone; | 377 m_pDIBSource = m_pClone; |
425 } | 378 } |
426 m_Flags = 0; | 379 m_Flags = 0; |
427 #if !defined(_FPDFAPI_MINI_) | |
428 if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { | 380 if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_DOWNSAMPLE) { |
429 m_Flags |= RENDER_FORCE_DOWNSAMPLE; | 381 m_Flags |= RENDER_FORCE_DOWNSAMPLE; |
430 } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) { | 382 } else if (m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE) { |
431 m_Flags |= RENDER_FORCE_HALFTONE; | 383 m_Flags |= RENDER_FORCE_HALFTONE; |
432 } | 384 } |
433 #else | |
434 if (!(m_pRenderStatus->m_Options.m_Flags & RENDER_FORCE_HALFTONE)) { | |
435 if (m_pRenderStatus->m_HalftoneLimit) { | |
436 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); | |
437 FX_RECT image_rect = image_rect_f.GetOutterRect(); | |
438 FX_RECT image_clip = image_rect; | |
439 image_rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); | |
440 if (image_rect.Width() && image_rect.Height()) { | |
441 if ((image_clip.Width() * m_pDIBSource->GetWidth() / image_rect.
Width()) * | |
442 (image_clip.Height() * m_pDIBSource->GetHeight() / image
_rect.Height()) > | |
443 m_pRenderStatus->m_HalftoneLimit) { | |
444 m_Flags |= RENDER_FORCE_DOWNSAMPLE; | |
445 } | |
446 } | |
447 } else { | |
448 m_Flags |= RENDER_FORCE_DOWNSAMPLE; | |
449 } | |
450 } | |
451 #endif | |
452 #ifndef _FPDFAPI_MINI_ | |
453 if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { | 385 if (m_pRenderStatus->m_pDevice->GetDeviceClass() != FXDC_DISPLAY) { |
454 CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()
->GetElementValue(FX_BSTRC("Filter")); | 386 CPDF_Object* pFilters = m_pImageObject->m_pImage->GetStream()->GetDict()
->GetElementValue(FX_BSTRC("Filter")); |
455 if (pFilters) { | 387 if (pFilters) { |
456 if (pFilters->GetType() == PDFOBJ_NAME) { | 388 if (pFilters->GetType() == PDFOBJ_NAME) { |
457 CFX_ByteStringC bsDecodeType = pFilters->GetConstString(); | 389 CFX_ByteStringC bsDecodeType = pFilters->GetConstString(); |
458 if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_
BSTRC("JPXDecode")) { | 390 if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType == FX_
BSTRC("JPXDecode")) { |
459 m_Flags |= FXRENDER_IMAGE_LOSSY; | 391 m_Flags |= FXRENDER_IMAGE_LOSSY; |
460 } | 392 } |
461 } else if (pFilters->GetType() == PDFOBJ_ARRAY) { | 393 } else if (pFilters->GetType() == PDFOBJ_ARRAY) { |
462 CPDF_Array* pArray = (CPDF_Array*)pFilters; | 394 CPDF_Array* pArray = (CPDF_Array*)pFilters; |
463 for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { | 395 for (FX_DWORD i = 0; i < pArray->GetCount(); i ++) { |
464 CFX_ByteStringC bsDecodeType = pArray->GetConstString(i); | 396 CFX_ByteStringC bsDecodeType = pArray->GetConstString(i); |
465 if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType ==
FX_BSTRC("JPXDecode")) { | 397 if (bsDecodeType == FX_BSTRC("DCTDecode") || bsDecodeType ==
FX_BSTRC("JPXDecode")) { |
466 m_Flags |= FXRENDER_IMAGE_LOSSY; | 398 m_Flags |= FXRENDER_IMAGE_LOSSY; |
467 break; | 399 break; |
468 } | 400 } |
469 } | 401 } |
470 } | 402 } |
471 } | 403 } |
472 } | 404 } |
473 if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) { | 405 if (m_pRenderStatus->m_Options.m_Flags & RENDER_NOIMAGESMOOTH) { |
474 m_Flags |= FXDIB_NOSMOOTH; | 406 m_Flags |= FXDIB_NOSMOOTH; |
475 } else if (m_pImageObject->m_pImage->IsInterpol()) { | 407 } else if (m_pImageObject->m_pImage->IsInterpol()) { |
476 m_Flags |= FXDIB_INTERPOL; | 408 m_Flags |= FXDIB_INTERPOL; |
477 } | 409 } |
478 #endif | |
479 if (m_Loader.m_pMask) { | 410 if (m_Loader.m_pMask) { |
480 return DrawMaskedImage(); | 411 return DrawMaskedImage(); |
481 } | 412 } |
482 if (m_bPatternColor) { | 413 if (m_bPatternColor) { |
483 return DrawPatternImage(m_pObj2Device); | 414 return DrawPatternImage(m_pObj2Device); |
484 } | 415 } |
485 #if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) | |
486 if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP && | 416 if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP && |
487 pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_
BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha
== 1) { | 417 pGeneralState->m_OPMode == 0 && pGeneralState->m_BlendType == FXDIB_
BLEND_NORMAL && pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha
== 1) { |
488 CPDF_Document* pDocument = NULL; | 418 CPDF_Document* pDocument = NULL; |
489 CPDF_Page* pPage = NULL; | 419 CPDF_Page* pPage = NULL; |
490 if (m_pRenderStatus->m_pContext->m_pPageCache) { | 420 if (m_pRenderStatus->m_pContext->m_pPageCache) { |
491 pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage(); | 421 pPage = m_pRenderStatus->m_pContext->m_pPageCache->GetPage(); |
492 pDocument = pPage->m_pDocument; | 422 pDocument = pPage->m_pDocument; |
493 } else { | 423 } else { |
494 pDocument = m_pImageObject->m_pImage->GetDocument(); | 424 pDocument = m_pImageObject->m_pImage->GetDocument(); |
495 } | 425 } |
496 CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL
; | 426 CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : NULL
; |
497 CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->
GetElementValue(FX_BSTRC("ColorSpace")); | 427 CPDF_Object* pCSObj = m_pImageObject->m_pImage->GetStream()->GetDict()->
GetElementValue(FX_BSTRC("ColorSpace")); |
498 CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageRe
sources); | 428 CPDF_ColorSpace* pColorSpace = pDocument->LoadColorSpace(pCSObj, pPageRe
sources); |
499 if (pColorSpace) { | 429 if (pColorSpace) { |
500 int format = pColorSpace->GetFamily(); | 430 int format = pColorSpace->GetFamily(); |
501 if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || form
at == PDFCS_DEVICEN) { | 431 if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || form
at == PDFCS_DEVICEN) { |
502 m_BlendType = FXDIB_BLEND_DARKEN; | 432 m_BlendType = FXDIB_BLEND_DARKEN; |
503 } | 433 } |
504 pDocument->GetPageData()->ReleaseColorSpace(pCSObj); | 434 pDocument->GetPageData()->ReleaseColorSpace(pCSObj); |
505 } | 435 } |
506 } | 436 } |
507 #endif | |
508 return StartDIBSource(); | 437 return StartDIBSource(); |
509 } | 438 } |
510 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObj
ect* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType) | 439 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CPDF_PageObj
ect* pObj, const CFX_AffineMatrix* pObj2Device, FX_BOOL bStdCS, int blendType) |
511 { | 440 { |
512 m_pRenderStatus = pStatus; | 441 m_pRenderStatus = pStatus; |
513 m_bStdCS = bStdCS; | 442 m_bStdCS = bStdCS; |
514 m_pImageObject = (CPDF_ImageObject*)pObj; | 443 m_pImageObject = (CPDF_ImageObject*)pObj; |
515 m_BlendType = blendType; | 444 m_BlendType = blendType; |
516 m_pObj2Device = pObj2Device; | 445 m_pObj2Device = pObj2Device; |
517 #ifndef _FPDFAPI_MINI_ | |
518 CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC(); | 446 CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC(); |
519 if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Op
tions.m_pOCContext->CheckOCGVisible(pOC)) { | 447 if (pOC && m_pRenderStatus->m_Options.m_pOCContext && !m_pRenderStatus->m_Op
tions.m_pOCContext->CheckOCGVisible(pOC)) { |
520 return FALSE; | 448 return FALSE; |
521 } | 449 } |
522 #endif | |
523 m_ImageMatrix = m_pImageObject->m_Matrix; | 450 m_ImageMatrix = m_pImageObject->m_Matrix; |
524 m_ImageMatrix.Concat(*pObj2Device); | 451 m_ImageMatrix.Concat(*pObj2Device); |
525 if (StartLoadDIBSource()) { | 452 if (StartLoadDIBSource()) { |
526 return TRUE; | 453 return TRUE; |
527 } | 454 } |
528 return StartRenderDIBSource(); | 455 return StartRenderDIBSource(); |
529 } | 456 } |
530 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSourc
e* pDIBSource, FX_ARGB bitmap_argb, | 457 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, const CFX_DIBSourc
e* pDIBSource, FX_ARGB bitmap_argb, |
531 int bitmap_alpha, const CFX_AffineMatrix* pIma
ge2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType) | 458 int bitmap_alpha, const CFX_AffineMatrix* pIma
ge2Device, FX_DWORD flags, FX_BOOL bStdCS, int blendType) |
532 { | 459 { |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); | 641 bitmap_device1.GetBitmap()->MultiplyAlpha(bitmap_device2.GetBitmap()); |
715 if (m_BitmapAlpha < 255) { | 642 if (m_BitmapAlpha < 255) { |
716 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); | 643 bitmap_device1.GetBitmap()->MultiplyAlpha(m_BitmapAlpha); |
717 } | 644 } |
718 } | 645 } |
719 m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left,
rect.top, m_BlendType); | 646 m_pRenderStatus->m_pDevice->SetDIBits(bitmap_device1.GetBitmap(), rect.left,
rect.top, m_BlendType); |
720 return FALSE; | 647 return FALSE; |
721 } | 648 } |
722 FX_BOOL CPDF_ImageRenderer::StartDIBSource() | 649 FX_BOOL CPDF_ImageRenderer::StartDIBSource() |
723 { | 650 { |
724 #if !defined(_FPDFAPI_MINI_) | |
725 if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { | 651 if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { |
726 int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() *
m_pDIBSource->GetHeight(); | 652 int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() *
m_pDIBSource->GetHeight(); |
727 if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTO
NE)) { | 653 if (image_size > FPDF_HUGE_IMAGE_SIZE && !(m_Flags & RENDER_FORCE_HALFTO
NE)) { |
728 m_Flags |= RENDER_FORCE_DOWNSAMPLE; | 654 m_Flags |= RENDER_FORCE_DOWNSAMPLE; |
729 } | 655 } |
730 } | 656 } |
731 #endif | |
732 if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_F
illArgb, | 657 if (m_pRenderStatus->m_pDevice->StartDIBits(m_pDIBSource, m_BitmapAlpha, m_F
illArgb, |
733 &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) { | 658 &m_ImageMatrix, m_Flags, m_DeviceHandle, 0, NULL, m_BlendType)) { |
734 if (m_DeviceHandle != NULL) { | 659 if (m_DeviceHandle != NULL) { |
735 m_Status = 3; | 660 m_Status = 3; |
736 return TRUE; | 661 return TRUE; |
737 } | 662 } |
738 return FALSE; | 663 return FALSE; |
739 } | 664 } |
740 #if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) | |
741 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); | 665 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); |
742 FX_RECT image_rect = image_rect_f.GetOutterRect(); | 666 FX_RECT image_rect = image_rect_f.GetOutterRect(); |
743 int dest_width = image_rect.Width(); | 667 int dest_width = image_rect.Width(); |
744 int dest_height = image_rect.Height(); | 668 int dest_height = image_rect.Height(); |
745 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || | 669 if ((FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || m_ImageMatrix.a == 0) || |
746 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) { | 670 (FXSYS_fabs(m_ImageMatrix.c) >= 0.5f || m_ImageMatrix.d == 0) ) { |
747 if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRender
Caps() & FXRC_BLEND_MODE)) { | 671 if (m_pRenderStatus->m_bPrint && !(m_pRenderStatus->m_pDevice->GetRender
Caps() & FXRC_BLEND_MODE)) { |
748 m_Result = FALSE; | 672 m_Result = FALSE; |
749 return FALSE; | 673 return FALSE; |
750 } | 674 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 dest_rect.Intersect(image_rect); | 711 dest_rect.Intersect(image_rect); |
788 FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_re
ct.top, | 712 FX_RECT dest_clip(dest_rect.left - image_rect.left, dest_rect.top - image_re
ct.top, |
789 dest_rect.right - image_rect.left, dest_rect.bottom - imag
e_rect.top); | 713 dest_rect.right - image_rect.left, dest_rect.bottom - imag
e_rect.top); |
790 CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height,
m_Flags, &dest_clip); | 714 CFX_DIBitmap* pStretched = m_pDIBSource->StretchTo(dest_width, dest_height,
m_Flags, &dest_clip); |
791 if (pStretched) { | 715 if (pStretched) { |
792 m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect
.top, m_FillArgb, | 716 m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect
.top, m_FillArgb, |
793 m_BitmapAlpha, m_BlendType, FALSE); | 717 m_BitmapAlpha, m_BlendType, FALSE); |
794 delete pStretched; | 718 delete pStretched; |
795 pStretched = NULL; | 719 pStretched = NULL; |
796 } | 720 } |
797 #endif | |
798 return FALSE; | 721 return FALSE; |
799 } | 722 } |
800 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() | 723 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() |
801 { | 724 { |
802 #ifndef _FPDFAPI_MINI_ | |
803 if (m_pDIBSource->IsOpaqueImage()) { | 725 if (m_pDIBSource->IsOpaqueImage()) { |
804 CFX_PathData path; | 726 CFX_PathData path; |
805 path.AppendRect(0, 0, 1, 1); | 727 path.AppendRect(0, 0, 1, 1); |
806 path.Transform(&m_ImageMatrix); | 728 path.Transform(&m_ImageMatrix); |
807 FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_B
itmapAlpha); | 729 FX_DWORD fill_color = ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_B
itmapAlpha); |
808 m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, F
XFILL_WINDING); | 730 m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, F
XFILL_WINDING); |
809 } else { | 731 } else { |
810 const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSo
urce : m_pDIBSource->GetAlphaMask(); | 732 const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() ? m_pDIBSo
urce : m_pDIBSource->GetAlphaMask(); |
811 if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >
= 0.5f) { | 733 if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || FXSYS_fabs(m_ImageMatrix.c) >
= 0.5f) { |
812 int left, top; | 734 int left, top; |
(...skipping 10 matching lines...) Expand all Loading... |
823 int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image
_rect.Height(); | 745 int dest_height = m_ImageMatrix.d > 0 ? -image_rect.Height() : image
_rect.Height(); |
824 int left = dest_width > 0 ? image_rect.left : image_rect.right; | 746 int left = dest_width > 0 ? image_rect.left : image_rect.right; |
825 int top = dest_height > 0 ? image_rect.top : image_rect.bottom; | 747 int top = dest_height > 0 ? image_rect.top : image_rect.bottom; |
826 m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, de
st_width, dest_height, | 748 m_pRenderStatus->m_pDevice->StretchBitMask(pAlphaMask, left, top, de
st_width, dest_height, |
827 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha
)); | 749 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha
)); |
828 } | 750 } |
829 if (m_pDIBSource != pAlphaMask) { | 751 if (m_pDIBSource != pAlphaMask) { |
830 delete pAlphaMask; | 752 delete pAlphaMask; |
831 } | 753 } |
832 } | 754 } |
833 #endif | |
834 return FALSE; | 755 return FALSE; |
835 } | 756 } |
836 FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) | 757 FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) |
837 { | 758 { |
838 if (m_Status == 1) { | 759 if (m_Status == 1) { |
839 #ifndef _FPDFAPI_MINI_ | |
840 if (m_pQuickStretcher->Continue(pPause)) { | 760 if (m_pQuickStretcher->Continue(pPause)) { |
841 return TRUE; | 761 return TRUE; |
842 } | 762 } |
843 if (m_pQuickStretcher->m_pBitmap->IsAlphaMask()) | 763 if (m_pQuickStretcher->m_pBitmap->IsAlphaMask()) |
844 m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap,
m_pQuickStretcher->m_ResultLeft, | 764 m_pRenderStatus->m_pDevice->SetBitMask(m_pQuickStretcher->m_pBitmap,
m_pQuickStretcher->m_ResultLeft, |
845 m_pQuickStretcher->m_ResultTo
p, m_FillArgb); | 765 m_pQuickStretcher->m_ResultTo
p, m_FillArgb); |
846 else | 766 else |
847 m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap,
m_pQuickStretcher->m_ResultLeft, | 767 m_pRenderStatus->m_pDevice->SetDIBits(m_pQuickStretcher->m_pBitmap,
m_pQuickStretcher->m_ResultLeft, |
848 m_pQuickStretcher->m_ResultTop
, m_BlendType); | 768 m_pQuickStretcher->m_ResultTop
, m_BlendType); |
849 return FALSE; | 769 return FALSE; |
850 #endif | |
851 } else if (m_Status == 2) { | 770 } else if (m_Status == 2) { |
852 #if !defined(_FPDFAPI_MINI_) || defined(_FXCORE_FEATURE_ALL_) | |
853 if (m_pTransformer->Continue(pPause)) { | 771 if (m_pTransformer->Continue(pPause)) { |
854 return TRUE; | 772 return TRUE; |
855 } | 773 } |
856 CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach(); | 774 CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach(); |
857 if (pBitmap == NULL) { | 775 if (pBitmap == NULL) { |
858 return FALSE; | 776 return FALSE; |
859 } | 777 } |
860 if (pBitmap->IsAlphaMask()) { | 778 if (pBitmap->IsAlphaMask()) { |
861 if (m_BitmapAlpha != 255) { | 779 if (m_BitmapAlpha != 255) { |
862 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); | 780 m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); |
863 } | 781 } |
864 m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap, | 782 m_Result = m_pRenderStatus->m_pDevice->SetBitMask(pBitmap, |
865 m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop
, m_FillArgb); | 783 m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop
, m_FillArgb); |
866 } else { | 784 } else { |
867 if (m_BitmapAlpha != 255) { | 785 if (m_BitmapAlpha != 255) { |
868 pBitmap->MultiplyAlpha(m_BitmapAlpha); | 786 pBitmap->MultiplyAlpha(m_BitmapAlpha); |
869 } | 787 } |
870 m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap, | 788 m_Result = m_pRenderStatus->m_pDevice->SetDIBits(pBitmap, |
871 m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop
, m_BlendType); | 789 m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop
, m_BlendType); |
872 } | 790 } |
873 delete pBitmap; | 791 delete pBitmap; |
874 return FALSE; | 792 return FALSE; |
875 #endif | |
876 } else if (m_Status == 3) { | 793 } else if (m_Status == 3) { |
877 return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause
); | 794 return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause
); |
878 } else if (m_Status == 4) { | 795 } else if (m_Status == 4) { |
879 if (m_Loader.Continue(m_LoadHandle, pPause)) { | 796 if (m_Loader.Continue(m_LoadHandle, pPause)) { |
880 return TRUE; | 797 return TRUE; |
881 } | 798 } |
882 if (StartRenderDIBSource()) { | 799 if (StartRenderDIBSource()) { |
883 return Continue(pPause); | 800 return Continue(pPause); |
884 } | 801 } |
885 return FALSE; | 802 return FALSE; |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1160 } | 1077 } |
1161 } else { | 1078 } else { |
1162 FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height); | 1079 FXSYS_memcpy32(dest_buf, src_buf, dest_pitch * height); |
1163 } | 1080 } |
1164 if (pFunc) { | 1081 if (pFunc) { |
1165 delete pFunc; | 1082 delete pFunc; |
1166 } | 1083 } |
1167 FX_Free(pTransfer); | 1084 FX_Free(pTransfer); |
1168 return pMask; | 1085 return pMask; |
1169 } | 1086 } |
OLD | NEW |