Chromium Code Reviews| 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 "core/src/fpdfapi/fpdf_page/pageint.h" | 7 #include "core/src/fpdfapi/fpdf_page/pageint.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_page.h" | 10 #include "core/include/fpdfapi/fpdf_page.h" |
| (...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 773 TRUE); | 773 TRUE); |
| 774 } | 774 } |
| 775 CPDF_StreamAcc stream; | 775 CPDF_StreamAcc stream; |
| 776 stream.LoadAllData(pStream, FALSE); | 776 stream.LoadAllData(pStream, FALSE); |
| 777 if (stream.GetSize() == 0) { | 777 if (stream.GetSize() == 0) { |
| 778 return; | 778 return; |
| 779 } | 779 } |
| 780 parser.Parse(stream.GetData(), stream.GetSize(), 0); | 780 parser.Parse(stream.GetData(), stream.GetSize(), 0); |
| 781 return; | 781 return; |
| 782 } | 782 } |
| 783 CPDF_FormObject* pFormObj = new CPDF_FormObject; | 783 std::unique_ptr<CPDF_FormObject> pFormObj(new CPDF_FormObject); |
| 784 pFormObj->m_pForm = | 784 pFormObj->m_pForm = |
| 785 new CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources); | 785 new CPDF_Form(m_pDocument, m_pPageResources, pStream, m_pResources); |
| 786 pFormObj->m_FormMatrix = m_pCurStates->m_CTM; | 786 pFormObj->m_FormMatrix = m_pCurStates->m_CTM; |
| 787 pFormObj->m_FormMatrix.Concat(m_mtContentToUser); | 787 pFormObj->m_FormMatrix.Concat(m_mtContentToUser); |
| 788 CPDF_AllStates status; | 788 CPDF_AllStates status; |
| 789 status.m_GeneralState = m_pCurStates->m_GeneralState; | 789 status.m_GeneralState = m_pCurStates->m_GeneralState; |
| 790 status.m_GraphState = m_pCurStates->m_GraphState; | 790 status.m_GraphState = m_pCurStates->m_GraphState; |
| 791 status.m_ColorState = m_pCurStates->m_ColorState; | 791 status.m_ColorState = m_pCurStates->m_ColorState; |
| 792 status.m_TextState = m_pCurStates->m_TextState; | 792 status.m_TextState = m_pCurStates->m_TextState; |
| 793 pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1); | 793 pFormObj->m_pForm->ParseContent(&status, NULL, NULL, &m_Options, m_Level + 1); |
| 794 if (!m_pObjectHolder->BackgroundAlphaNeeded() && | 794 if (!m_pObjectHolder->BackgroundAlphaNeeded() && |
| 795 pFormObj->m_pForm->BackgroundAlphaNeeded()) { | 795 pFormObj->m_pForm->BackgroundAlphaNeeded()) { |
| 796 m_pObjectHolder->SetBackgroundAlphaNeeded(TRUE); | 796 m_pObjectHolder->SetBackgroundAlphaNeeded(TRUE); |
| 797 } | 797 } |
| 798 pFormObj->CalcBoundingBox(); | 798 pFormObj->CalcBoundingBox(); |
| 799 SetGraphicStates(pFormObj, TRUE, TRUE, TRUE); | 799 SetGraphicStates(pFormObj.get(), TRUE, TRUE, TRUE); |
| 800 m_pObjectHolder->GetPageObjectList()->AddTail(pFormObj); | 800 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pFormObj)); |
| 801 } | 801 } |
| 802 | 802 |
| 803 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, | 803 CPDF_ImageObject* CPDF_StreamContentParser::AddImage(CPDF_Stream* pStream, |
| 804 CPDF_Image* pImage, | 804 CPDF_Image* pImage, |
| 805 FX_BOOL bInline) { | 805 FX_BOOL bInline) { |
| 806 if (!pStream && !pImage) { | 806 if (!pStream && !pImage) { |
| 807 return NULL; | 807 return NULL; |
| 808 } | 808 } |
| 809 CFX_Matrix ImageMatrix; | 809 CFX_Matrix ImageMatrix; |
| 810 ImageMatrix.Copy(m_pCurStates->m_CTM); | 810 ImageMatrix.Copy(m_pCurStates->m_CTM); |
| 811 ImageMatrix.Concat(m_mtContentToUser); | 811 ImageMatrix.Concat(m_mtContentToUser); |
| 812 CPDF_ImageObject* pImageObj = new CPDF_ImageObject; | 812 |
| 813 std::unique_ptr<CPDF_ImageObject> pImageObj(new CPDF_ImageObject); | |
| 813 if (pImage) { | 814 if (pImage) { |
| 814 pImageObj->m_pImage = | 815 pImageObj->m_pImage = |
| 815 m_pDocument->GetPageData()->GetImage(pImage->GetStream()); | 816 m_pDocument->GetPageData()->GetImage(pImage->GetStream()); |
| 816 } else if (pStream->GetObjNum()) { | 817 } else if (pStream->GetObjNum()) { |
| 817 pImageObj->m_pImage = m_pDocument->LoadImageF(pStream); | 818 pImageObj->m_pImage = m_pDocument->LoadImageF(pStream); |
| 818 } else { | 819 } else { |
| 819 pImageObj->m_pImage = new CPDF_Image(m_pDocument); | 820 pImageObj->m_pImage = new CPDF_Image(m_pDocument); |
| 820 pImageObj->m_pImage->LoadImageF(pStream, bInline); | 821 pImageObj->m_pImage->LoadImageF(pStream, bInline); |
| 821 } | 822 } |
| 822 SetGraphicStates(pImageObj, pImageObj->m_pImage->IsMask(), FALSE, FALSE); | 823 SetGraphicStates(pImageObj.get(), pImageObj->m_pImage->IsMask(), FALSE, |
| 824 FALSE); | |
| 823 pImageObj->m_Matrix = ImageMatrix; | 825 pImageObj->m_Matrix = ImageMatrix; |
| 824 pImageObj->CalcBoundingBox(); | 826 pImageObj->CalcBoundingBox(); |
| 825 m_pObjectHolder->GetPageObjectList()->AddTail(pImageObj); | 827 CPDF_ImageObject* pRet = pImageObj.get(); |
| 826 return pImageObj; | 828 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pImageObj)); |
| 829 return pRet; | |
| 827 } | 830 } |
| 828 | 831 |
| 829 void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary() {} | 832 void CPDF_StreamContentParser::Handle_MarkPlace_Dictionary() {} |
| 830 | 833 |
| 831 void CPDF_StreamContentParser::Handle_EndImage() {} | 834 void CPDF_StreamContentParser::Handle_EndImage() {} |
| 832 | 835 |
| 833 void CPDF_StreamContentParser::Handle_EndMarkedContent() { | 836 void CPDF_StreamContentParser::Handle_EndMarkedContent() { |
| 834 if (!m_Options.m_bMarkedContent) { | 837 if (!m_Options.m_bMarkedContent) { |
| 835 return; | 838 return; |
| 836 } | 839 } |
| (...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1183 if (pPattern->m_PatternType != CPDF_Pattern::SHADING) { | 1186 if (pPattern->m_PatternType != CPDF_Pattern::SHADING) { |
| 1184 return; | 1187 return; |
| 1185 } | 1188 } |
| 1186 CPDF_ShadingPattern* pShading = static_cast<CPDF_ShadingPattern*>(pPattern); | 1189 CPDF_ShadingPattern* pShading = static_cast<CPDF_ShadingPattern*>(pPattern); |
| 1187 if (!pShading->m_bShadingObj) { | 1190 if (!pShading->m_bShadingObj) { |
| 1188 return; | 1191 return; |
| 1189 } | 1192 } |
| 1190 if (!pShading->Load()) { | 1193 if (!pShading->Load()) { |
| 1191 return; | 1194 return; |
| 1192 } | 1195 } |
| 1193 CPDF_ShadingObject* pObj = new CPDF_ShadingObject; | 1196 std::unique_ptr<CPDF_ShadingObject> pObj(new CPDF_ShadingObject); |
| 1194 pObj->m_pShading = pShading; | 1197 pObj->m_pShading = pShading; |
| 1195 SetGraphicStates(pObj, FALSE, FALSE, FALSE); | 1198 SetGraphicStates(pObj.get(), FALSE, FALSE, FALSE); |
| 1196 pObj->m_Matrix = m_pCurStates->m_CTM; | 1199 pObj->m_Matrix = m_pCurStates->m_CTM; |
| 1197 pObj->m_Matrix.Concat(m_mtContentToUser); | 1200 pObj->m_Matrix.Concat(m_mtContentToUser); |
| 1198 CFX_FloatRect bbox; | 1201 CFX_FloatRect bbox; |
| 1199 if (!pObj->m_ClipPath.IsNull()) { | 1202 if (!pObj->m_ClipPath.IsNull()) { |
| 1200 bbox = pObj->m_ClipPath.GetClipBox(); | 1203 bbox = pObj->m_ClipPath.GetClipBox(); |
| 1201 } else { | 1204 } else { |
| 1202 bbox = m_BBox; | 1205 bbox = m_BBox; |
| 1203 } | 1206 } |
| 1204 if (pShading->IsMeshShading()) { | 1207 if (pShading->IsMeshShading()) { |
| 1205 bbox.Intersect(GetShadingBBox(ToStream(pShading->m_pShadingObj), | 1208 bbox.Intersect(GetShadingBBox(ToStream(pShading->m_pShadingObj), |
| 1206 pShading->m_ShadingType, &pObj->m_Matrix, | 1209 pShading->m_ShadingType, &pObj->m_Matrix, |
| 1207 pShading->m_pFunctions, pShading->m_nFuncs, | 1210 pShading->m_pFunctions, pShading->m_nFuncs, |
| 1208 pShading->m_pCS)); | 1211 pShading->m_pCS)); |
| 1209 } | 1212 } |
| 1210 pObj->m_Left = bbox.left; | 1213 pObj->m_Left = bbox.left; |
| 1211 pObj->m_Right = bbox.right; | 1214 pObj->m_Right = bbox.right; |
| 1212 pObj->m_Top = bbox.top; | 1215 pObj->m_Top = bbox.top; |
| 1213 pObj->m_Bottom = bbox.bottom; | 1216 pObj->m_Bottom = bbox.bottom; |
| 1214 m_pObjectHolder->GetPageObjectList()->AddTail(pObj); | 1217 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pObj)); |
| 1215 } | 1218 } |
| 1216 | 1219 |
| 1217 void CPDF_StreamContentParser::Handle_SetCharSpace() { | 1220 void CPDF_StreamContentParser::Handle_SetCharSpace() { |
| 1218 m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0); | 1221 m_pCurStates->m_TextState.GetModify()->m_CharSpace = GetNumber(0); |
| 1219 } | 1222 } |
| 1220 | 1223 |
| 1221 void CPDF_StreamContentParser::Handle_MoveTextPoint() { | 1224 void CPDF_StreamContentParser::Handle_MoveTextPoint() { |
| 1222 m_pCurStates->m_TextLineX += GetNumber(1); | 1225 m_pCurStates->m_TextLineX += GetNumber(1); |
| 1223 m_pCurStates->m_TextLineY += GetNumber(0); | 1226 m_pCurStates->m_TextLineY += GetNumber(0); |
| 1224 m_pCurStates->m_TextX = m_pCurStates->m_TextLineX; | 1227 m_pCurStates->m_TextX = m_pCurStates->m_TextLineX; |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1358 } | 1361 } |
| 1359 if (nsegs == 0) { | 1362 if (nsegs == 0) { |
| 1360 return; | 1363 return; |
| 1361 } | 1364 } |
| 1362 int textmode; | 1365 int textmode; |
| 1363 if (pFont->GetFontType() == PDFFONT_TYPE3) { | 1366 if (pFont->GetFontType() == PDFFONT_TYPE3) { |
| 1364 textmode = 0; | 1367 textmode = 0; |
| 1365 } else { | 1368 } else { |
| 1366 textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode; | 1369 textmode = m_pCurStates->m_TextState.GetObject()->m_TextMode; |
| 1367 } | 1370 } |
| 1368 CPDF_TextObject* pText = new CPDF_TextObject; | 1371 { |
| 1369 m_pLastTextObject = pText; | 1372 std::unique_ptr<CPDF_TextObject> pText(new CPDF_TextObject); |
| 1370 SetGraphicStates(pText, TRUE, TRUE, TRUE); | 1373 m_pLastTextObject = pText.get(); |
| 1371 if (textmode && textmode != 3 && textmode != 4 && textmode != 7) { | 1374 SetGraphicStates(m_pLastTextObject, TRUE, TRUE, TRUE); |
| 1372 FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM; | 1375 if (textmode && textmode != 3 && textmode != 4 && textmode != 7) { |
| 1373 pCTM[0] = m_pCurStates->m_CTM.a; | 1376 FX_FLOAT* pCTM = pText->m_TextState.GetModify()->m_CTM; |
| 1374 pCTM[1] = m_pCurStates->m_CTM.c; | 1377 pCTM[0] = m_pCurStates->m_CTM.a; |
| 1375 pCTM[2] = m_pCurStates->m_CTM.b; | 1378 pCTM[1] = m_pCurStates->m_CTM.c; |
| 1376 pCTM[3] = m_pCurStates->m_CTM.d; | 1379 pCTM[2] = m_pCurStates->m_CTM.b; |
| 1380 pCTM[3] = m_pCurStates->m_CTM.d; | |
| 1381 } | |
| 1382 pText->SetSegments(pStrs, pKerning, nsegs); | |
| 1383 pText->m_PosX = m_pCurStates->m_TextX; | |
| 1384 pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise; | |
| 1385 ConvertTextSpace(pText->m_PosX, pText->m_PosY); | |
| 1386 FX_FLOAT x_advance, y_advance; | |
|
Lei Zhang
2016/02/18 00:38:44
one per line
Tom Sepez
2016/02/18 00:47:26
Done.
| |
| 1387 pText->CalcPositionData(&x_advance, &y_advance, | |
| 1388 m_pCurStates->m_TextHorzScale, m_Level); | |
| 1389 m_pCurStates->m_TextX += x_advance; | |
| 1390 m_pCurStates->m_TextY += y_advance; | |
| 1391 if (textmode > 3) { | |
| 1392 CPDF_TextObject* pCopy = new CPDF_TextObject; | |
| 1393 pCopy->Copy(pText.get()); | |
| 1394 m_ClipTextList.Add(pCopy); | |
| 1395 } | |
| 1396 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pText)); | |
| 1377 } | 1397 } |
| 1378 pText->SetSegments(pStrs, pKerning, nsegs); | |
| 1379 pText->m_PosX = m_pCurStates->m_TextX; | |
| 1380 pText->m_PosY = m_pCurStates->m_TextY + m_pCurStates->m_TextRise; | |
| 1381 ConvertTextSpace(pText->m_PosX, pText->m_PosY); | |
| 1382 FX_FLOAT x_advance, y_advance; | |
| 1383 pText->CalcPositionData(&x_advance, &y_advance, m_pCurStates->m_TextHorzScale, | |
| 1384 m_Level); | |
| 1385 m_pCurStates->m_TextX += x_advance; | |
| 1386 m_pCurStates->m_TextY += y_advance; | |
| 1387 if (textmode > 3) { | |
| 1388 CPDF_TextObject* pCopy = new CPDF_TextObject; | |
| 1389 pCopy->Copy(pText); | |
| 1390 m_ClipTextList.Add(pCopy); | |
| 1391 } | |
| 1392 m_pObjectHolder->GetPageObjectList()->AddTail(pText); | |
| 1393 if (pKerning && pKerning[nsegs - 1] != 0) { | 1398 if (pKerning && pKerning[nsegs - 1] != 0) { |
| 1394 if (!pFont->IsVertWriting()) { | 1399 if (!pFont->IsVertWriting()) { |
| 1395 m_pCurStates->m_TextX -= | 1400 m_pCurStates->m_TextX -= |
| 1396 FXSYS_Mul(pKerning[nsegs - 1], | 1401 FXSYS_Mul(pKerning[nsegs - 1], |
| 1397 m_pCurStates->m_TextState.GetFontSize()) / | 1402 m_pCurStates->m_TextState.GetFontSize()) / |
| 1398 1000; | 1403 1000; |
| 1399 } else { | 1404 } else { |
| 1400 m_pCurStates->m_TextY -= | 1405 m_pCurStates->m_TextY -= |
| 1401 FXSYS_Mul(pKerning[nsegs - 1], | 1406 FXSYS_Mul(pKerning[nsegs - 1], |
| 1402 m_pCurStates->m_TextState.GetFontSize()) / | 1407 m_pCurStates->m_TextState.GetFontSize()) / |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1610 PathPointCount--; | 1615 PathPointCount--; |
| 1611 } | 1616 } |
| 1612 CPDF_Path Path; | 1617 CPDF_Path Path; |
| 1613 CFX_PathData* pPathData = Path.New(); | 1618 CFX_PathData* pPathData = Path.New(); |
| 1614 pPathData->SetPointCount(PathPointCount); | 1619 pPathData->SetPointCount(PathPointCount); |
| 1615 FXSYS_memcpy(pPathData->GetPoints(), m_pPathPoints, | 1620 FXSYS_memcpy(pPathData->GetPoints(), m_pPathPoints, |
| 1616 sizeof(FX_PATHPOINT) * PathPointCount); | 1621 sizeof(FX_PATHPOINT) * PathPointCount); |
| 1617 CFX_Matrix matrix = m_pCurStates->m_CTM; | 1622 CFX_Matrix matrix = m_pCurStates->m_CTM; |
| 1618 matrix.Concat(m_mtContentToUser); | 1623 matrix.Concat(m_mtContentToUser); |
| 1619 if (bStroke || FillType) { | 1624 if (bStroke || FillType) { |
| 1620 CPDF_PathObject* pPathObj = new CPDF_PathObject; | 1625 std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject); |
| 1621 pPathObj->m_bStroke = bStroke; | 1626 pPathObj->m_bStroke = bStroke; |
| 1622 pPathObj->m_FillType = FillType; | 1627 pPathObj->m_FillType = FillType; |
| 1623 pPathObj->m_Path = Path; | 1628 pPathObj->m_Path = Path; |
| 1624 pPathObj->m_Matrix = matrix; | 1629 pPathObj->m_Matrix = matrix; |
| 1625 SetGraphicStates(pPathObj, TRUE, FALSE, TRUE); | 1630 SetGraphicStates(pPathObj.get(), TRUE, FALSE, TRUE); |
| 1626 pPathObj->CalcBoundingBox(); | 1631 pPathObj->CalcBoundingBox(); |
| 1627 m_pObjectHolder->GetPageObjectList()->AddTail(pPathObj); | 1632 m_pObjectHolder->GetPageObjectList()->push_back(std::move(pPathObj)); |
| 1628 } | 1633 } |
| 1629 if (PathClipType) { | 1634 if (PathClipType) { |
| 1630 if (!matrix.IsIdentity()) { | 1635 if (!matrix.IsIdentity()) { |
| 1631 Path.Transform(&matrix); | 1636 Path.Transform(&matrix); |
| 1632 matrix.SetIdentity(); | 1637 matrix.SetIdentity(); |
| 1633 } | 1638 } |
| 1634 m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE); | 1639 m_pCurStates->m_ClipPath.AppendPath(Path, PathClipType, TRUE); |
| 1635 } | 1640 } |
| 1636 } | 1641 } |
| 1637 | 1642 |
| 1638 FX_DWORD CPDF_StreamContentParser::Parse(const uint8_t* pData, | 1643 FX_DWORD CPDF_StreamContentParser::Parse(const uint8_t* pData, |
| 1639 FX_DWORD dwSize, | 1644 FX_DWORD dwSize, |
| 1640 FX_DWORD max_cost) { | 1645 FX_DWORD max_cost) { |
| 1641 if (m_Level > _FPDF_MAX_FORM_LEVEL_) { | 1646 if (m_Level > _FPDF_MAX_FORM_LEVEL_) { |
| 1642 return dwSize; | 1647 return dwSize; |
| 1643 } | 1648 } |
| 1644 FX_DWORD InitObjCount = m_pObjectHolder->GetPageObjectList()->GetCount(); | 1649 FX_DWORD InitObjCount = m_pObjectHolder->GetPageObjectList()->size(); |
| 1645 CPDF_StreamParser syntax(pData, dwSize); | 1650 CPDF_StreamParser syntax(pData, dwSize); |
| 1646 CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); | 1651 CPDF_StreamParserAutoClearer auto_clearer(&m_pSyntax, &syntax); |
| 1647 m_CompatCount = 0; | 1652 m_CompatCount = 0; |
| 1648 while (1) { | 1653 while (1) { |
| 1649 FX_DWORD cost = | 1654 FX_DWORD cost = m_pObjectHolder->GetPageObjectList()->size() - InitObjCount; |
| 1650 m_pObjectHolder->GetPageObjectList()->GetCount() - InitObjCount; | |
| 1651 if (max_cost && cost >= max_cost) { | 1655 if (max_cost && cost >= max_cost) { |
| 1652 break; | 1656 break; |
| 1653 } | 1657 } |
| 1654 switch (syntax.ParseNextElement()) { | 1658 switch (syntax.ParseNextElement()) { |
| 1655 case CPDF_StreamParser::EndOfData: | 1659 case CPDF_StreamParser::EndOfData: |
| 1656 return m_pSyntax->GetPos(); | 1660 return m_pSyntax->GetPos(); |
| 1657 case CPDF_StreamParser::Keyword: | 1661 case CPDF_StreamParser::Keyword: |
| 1658 OnOperator((char*)syntax.GetWordBuf()); | 1662 OnOperator((char*)syntax.GetWordBuf()); |
| 1659 ClearAllParams(); | 1663 ClearAllParams(); |
| 1660 break; | 1664 break; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1814 } else { | 1818 } else { |
| 1815 PDF_ReplaceAbbr(pElement); | 1819 PDF_ReplaceAbbr(pElement); |
| 1816 } | 1820 } |
| 1817 } | 1821 } |
| 1818 break; | 1822 break; |
| 1819 } | 1823 } |
| 1820 default: | 1824 default: |
| 1821 break; | 1825 break; |
| 1822 } | 1826 } |
| 1823 } | 1827 } |
| OLD | NEW |