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/fpdfapi/fpdf_render.h" | 7 #include "../../../include/fpdfapi/fpdf_render.h" |
8 #include "../../../include/fpdfapi/fpdf_pageobj.h" | 8 #include "../../../include/fpdfapi/fpdf_pageobj.h" |
9 #include "../../../include/fxge/fx_ge.h" | 9 #include "../../../include/fxge/fx_ge.h" |
10 #include "../fpdf_page/pageint.h" | 10 #include "../fpdf_page/pageint.h" |
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
401 R += r_unit; | 401 R += r_unit; |
402 G += g_unit; | 402 G += g_unit; |
403 B += b_unit; | 403 B += b_unit; |
404 FXARGB_SETDIB(dib_buf, | 404 FXARGB_SETDIB(dib_buf, |
405 FXARGB_MAKE(alpha, (int32_t)(R * 255), (int32_t)(G * 255), | 405 FXARGB_MAKE(alpha, (int32_t)(R * 255), (int32_t)(G * 255), |
406 (int32_t)(B * 255))); | 406 (int32_t)(B * 255))); |
407 dib_buf += 4; | 407 dib_buf += 4; |
408 } | 408 } |
409 } | 409 } |
410 } | 410 } |
411 static void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, | 411 static void _DrawFreeGouraudShading(CFX_DIBitmap* pBitmap, |
Tom Sepez
2015/10/22 17:16:45
nit: as long as you're mucking with this, can we l
dsinclair
2015/10/22 17:42:56
Done.
| |
412 CFX_AffineMatrix* pObject2Bitmap, | 412 CFX_AffineMatrix* pObject2Bitmap, |
413 CPDF_Stream* pShadingStream, | 413 CPDF_Stream* pShadingStream, |
414 CPDF_Function** pFuncs, | 414 CPDF_Function** pFuncs, |
415 int nFuncs, | 415 int nFuncs, |
416 CPDF_ColorSpace* pCS, | 416 CPDF_ColorSpace* pCS, |
417 int alpha) { | 417 int alpha) { |
418 ASSERT(pBitmap->GetFormat() == FXDIB_Argb); | 418 ASSERT(pBitmap->GetFormat() == FXDIB_Argb); |
419 if (pShadingStream->GetType() != PDFOBJ_STREAM) { | 419 if (!pShadingStream->IsStream()) |
Tom Sepez
2015/10/22 17:16:45
Can a stream be not IsStream() ? Either this shou
dsinclair
2015/10/22 17:42:56
Done. Probably bad casts in the past.
| |
420 return; | 420 return; |
421 } | 421 |
422 CPDF_MeshStream stream; | 422 CPDF_MeshStream stream; |
423 if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) { | 423 if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) |
424 return; | 424 return; |
425 } | 425 |
426 CPDF_MeshVertex triangle[3]; | 426 CPDF_MeshVertex triangle[3]; |
427 FXSYS_memset(triangle, 0, sizeof(triangle)); | 427 FXSYS_memset(triangle, 0, sizeof(triangle)); |
428 | 428 |
429 while (!stream.m_BitStream.IsEOF()) { | 429 while (!stream.m_BitStream.IsEOF()) { |
430 CPDF_MeshVertex vertex; | 430 CPDF_MeshVertex vertex; |
431 FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap); | 431 FX_DWORD flag = stream.GetVertex(vertex, pObject2Bitmap); |
432 if (flag == 0) { | 432 if (flag == 0) { |
433 triangle[0] = vertex; | 433 triangle[0] = vertex; |
434 for (int j = 1; j < 3; j++) { | 434 for (int j = 1; j < 3; j++) { |
435 stream.GetVertex(triangle[j], pObject2Bitmap); | 435 stream.GetVertex(triangle[j], pObject2Bitmap); |
436 } | 436 } |
437 } else { | 437 } else { |
438 if (flag == 1) { | 438 if (flag == 1) { |
439 triangle[0] = triangle[1]; | 439 triangle[0] = triangle[1]; |
440 } | 440 } |
441 triangle[1] = triangle[2]; | 441 triangle[1] = triangle[2]; |
442 triangle[2] = vertex; | 442 triangle[2] = vertex; |
443 } | 443 } |
444 _DrawGouraud(pBitmap, alpha, triangle); | 444 _DrawGouraud(pBitmap, alpha, triangle); |
445 } | 445 } |
446 } | 446 } |
447 static void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, | 447 static void _DrawLatticeGouraudShading(CFX_DIBitmap* pBitmap, |
448 CFX_AffineMatrix* pObject2Bitmap, | 448 CFX_AffineMatrix* pObject2Bitmap, |
449 CPDF_Stream* pShadingStream, | 449 CPDF_Stream* pShadingStream, |
450 CPDF_Function** pFuncs, | 450 CPDF_Function** pFuncs, |
451 int nFuncs, | 451 int nFuncs, |
452 CPDF_ColorSpace* pCS, | 452 CPDF_ColorSpace* pCS, |
453 int alpha) { | 453 int alpha) { |
454 ASSERT(pBitmap->GetFormat() == FXDIB_Argb); | 454 ASSERT(pBitmap->GetFormat() == FXDIB_Argb); |
455 if (pShadingStream->GetType() != PDFOBJ_STREAM) { | 455 if (!pShadingStream->IsStream()) |
Tom Sepez
2015/10/22 17:16:45
ditto
dsinclair
2015/10/22 17:42:56
Done.
| |
456 return; | 456 return; |
457 } | 457 |
458 int row_verts = pShadingStream->GetDict()->GetInteger("VerticesPerRow"); | 458 int row_verts = pShadingStream->GetDict()->GetInteger("VerticesPerRow"); |
459 if (row_verts < 2) { | 459 if (row_verts < 2) |
460 return; | 460 return; |
461 } | 461 |
462 CPDF_MeshStream stream; | 462 CPDF_MeshStream stream; |
463 if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) { | 463 if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) |
464 return; | 464 return; |
465 } | 465 |
466 CPDF_MeshVertex* vertex = FX_Alloc2D(CPDF_MeshVertex, row_verts, 2); | 466 CPDF_MeshVertex* vertex = FX_Alloc2D(CPDF_MeshVertex, row_verts, 2); |
467 if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) { | 467 if (!stream.GetVertexRow(vertex, row_verts, pObject2Bitmap)) { |
468 FX_Free(vertex); | 468 FX_Free(vertex); |
469 return; | 469 return; |
470 } | 470 } |
471 int last_index = 0; | 471 int last_index = 0; |
472 while (1) { | 472 while (1) { |
473 CPDF_MeshVertex* last_row = vertex + last_index * row_verts; | 473 CPDF_MeshVertex* last_row = vertex + last_index * row_verts; |
474 CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts; | 474 CPDF_MeshVertex* this_row = vertex + (1 - last_index) * row_verts; |
475 if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) { | 475 if (!stream.GetVertexRow(this_row, row_verts, pObject2Bitmap)) { |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
751 static void _DrawCoonPatchMeshes(FX_BOOL bTensor, | 751 static void _DrawCoonPatchMeshes(FX_BOOL bTensor, |
752 CFX_DIBitmap* pBitmap, | 752 CFX_DIBitmap* pBitmap, |
753 CFX_AffineMatrix* pObject2Bitmap, | 753 CFX_AffineMatrix* pObject2Bitmap, |
754 CPDF_Stream* pShadingStream, | 754 CPDF_Stream* pShadingStream, |
755 CPDF_Function** pFuncs, | 755 CPDF_Function** pFuncs, |
756 int nFuncs, | 756 int nFuncs, |
757 CPDF_ColorSpace* pCS, | 757 CPDF_ColorSpace* pCS, |
758 int fill_mode, | 758 int fill_mode, |
759 int alpha) { | 759 int alpha) { |
760 ASSERT(pBitmap->GetFormat() == FXDIB_Argb); | 760 ASSERT(pBitmap->GetFormat() == FXDIB_Argb); |
761 if (pShadingStream->GetType() != PDFOBJ_STREAM) { | 761 if (!pShadingStream->IsStream()) |
Tom Sepez
2015/10/22 17:16:45
ditto ditto
dsinclair
2015/10/22 17:42:56
Done.
| |
762 return; | 762 return; |
763 } | 763 |
764 CFX_FxgeDevice device; | 764 CFX_FxgeDevice device; |
765 device.Attach(pBitmap); | 765 device.Attach(pBitmap); |
766 CPDF_MeshStream stream; | 766 CPDF_MeshStream stream; |
767 if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) { | 767 if (!stream.Load(pShadingStream, pFuncs, nFuncs, pCS)) |
768 return; | 768 return; |
769 } | 769 if (!_CheckCoonTensorPara(stream)) |
770 | |
771 if (!_CheckCoonTensorPara(stream)) { | |
772 return; | 770 return; |
773 } | |
774 | 771 |
775 CPDF_PatchDrawer patch; | 772 CPDF_PatchDrawer patch; |
776 patch.alpha = alpha; | 773 patch.alpha = alpha; |
777 patch.pDevice = &device; | 774 patch.pDevice = &device; |
778 patch.fill_mode = fill_mode; | 775 patch.fill_mode = fill_mode; |
779 patch.path.SetPointCount(13); | 776 patch.path.SetPointCount(13); |
780 FX_PATHPOINT* pPoints = patch.path.GetPoints(); | 777 FX_PATHPOINT* pPoints = patch.path.GetPoints(); |
781 pPoints[0].m_Flag = FXPT_MOVETO; | 778 pPoints[0].m_Flag = FXPT_MOVETO; |
782 for (int i = 1; i < 13; i++) { | 779 for (int i = 1; i < 13; i++) { |
783 pPoints[i].m_Flag = FXPT_BEZIERTO; | 780 pPoints[i].m_Flag = FXPT_BEZIERTO; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
884 case 2: | 881 case 2: |
885 _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, | 882 _DrawAxialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, |
886 pColorSpace, alpha); | 883 pColorSpace, alpha); |
887 break; | 884 break; |
888 case 3: | 885 case 3: |
889 _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, | 886 _DrawRadialShading(pBitmap, &FinalMatrix, pDict, pFuncs, nFuncs, |
890 pColorSpace, alpha); | 887 pColorSpace, alpha); |
891 break; | 888 break; |
892 case 4: { | 889 case 4: { |
893 _DrawFreeGouraudShading(pBitmap, &FinalMatrix, | 890 _DrawFreeGouraudShading(pBitmap, &FinalMatrix, |
894 (CPDF_Stream*)pPattern->m_pShadingObj, pFuncs, | 891 ToStream(pPattern->m_pShadingObj), pFuncs, nFuncs, |
895 nFuncs, pColorSpace, alpha); | 892 pColorSpace, alpha); |
896 } break; | 893 } break; |
897 case 5: { | 894 case 5: { |
898 _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, | 895 _DrawLatticeGouraudShading(pBitmap, &FinalMatrix, |
899 (CPDF_Stream*)pPattern->m_pShadingObj, pFuncs, | 896 ToStream(pPattern->m_pShadingObj), pFuncs, |
900 nFuncs, pColorSpace, alpha); | 897 nFuncs, pColorSpace, alpha); |
901 } break; | 898 } break; |
902 case 6: | 899 case 6: |
903 case 7: { | 900 case 7: { |
904 _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, | 901 _DrawCoonPatchMeshes(pPattern->m_ShadingType - 6, pBitmap, &FinalMatrix, |
905 (CPDF_Stream*)pPattern->m_pShadingObj, pFuncs, | 902 ToStream(pPattern->m_pShadingObj), pFuncs, nFuncs, |
906 nFuncs, pColorSpace, fill_mode, alpha); | 903 pColorSpace, fill_mode, alpha); |
907 } break; | 904 } break; |
908 } | 905 } |
909 if (bAlphaMode) { | 906 if (bAlphaMode) { |
910 pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha); | 907 pBitmap->LoadChannel(FXDIB_Red, pBitmap, FXDIB_Alpha); |
911 } | 908 } |
912 if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) { | 909 if (m_Options.m_ColorMode == RENDER_COLOR_GRAY) { |
913 pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor); | 910 pBitmap->ConvertColorScale(m_Options.m_ForeColor, m_Options.m_BackColor); |
914 } | 911 } |
915 buffer.OutputToDevice(); | 912 buffer.OutputToDevice(); |
916 } | 913 } |
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1212 } | 1209 } |
1213 } | 1210 } |
1214 if (bStroke) { | 1211 if (bStroke) { |
1215 CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor(); | 1212 CPDF_Color& StrokeColor = *pPathObj->m_ColorState.GetStrokeColor(); |
1216 if (StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) { | 1213 if (StrokeColor.m_pCS && StrokeColor.m_pCS->GetFamily() == PDFCS_PATTERN) { |
1217 DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE); | 1214 DrawPathWithPattern(pPathObj, pObj2Device, &StrokeColor, TRUE); |
1218 bStroke = FALSE; | 1215 bStroke = FALSE; |
1219 } | 1216 } |
1220 } | 1217 } |
1221 } | 1218 } |
OLD | NEW |