Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Side by Side Diff: core/fpdfdoc/cpvt_generateap.cpp

Issue 2345063002: Use string pools in some dictionaries (Closed)
Patch Set: more Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 PDFium Authors. All rights reserved. 1 // Copyright 2016 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/fpdfdoc/cpvt_generateap.h" 7 #include "core/fpdfdoc/cpvt_generateap.h"
8 8
9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
10 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h" 10 #include "core/fpdfapi/fpdf_parser/include/cpdf_dictionary.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR"); 49 CPDF_Dictionary* pDRDict = pFormDict->GetDictFor("DR");
50 if (!pDRDict) 50 if (!pDRDict)
51 return false; 51 return false;
52 52
53 CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font"); 53 CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font");
54 if (!pDRFontDict) 54 if (!pDRFontDict)
55 return false; 55 return false;
56 56
57 CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1)); 57 CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1));
58 if (!pFontDict) { 58 if (!pFontDict) {
59 pFontDict = new CPDF_Dictionary; 59 pFontDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
60 pFontDict->SetNameFor("Type", "Font"); 60 pFontDict->SetNameFor("Type", "Font");
61 pFontDict->SetNameFor("Subtype", "Type1"); 61 pFontDict->SetNameFor("Subtype", "Type1");
62 pFontDict->SetNameFor("BaseFont", "Helvetica"); 62 pFontDict->SetNameFor("BaseFont", "Helvetica");
63 pFontDict->SetNameFor("Encoding", "WinAnsiEncoding"); 63 pFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
64 pDoc->AddIndirectObject(pFontDict); 64 pDoc->AddIndirectObject(pFontDict);
65 pDRFontDict->SetReferenceFor(sFontName.Mid(1), pDoc, pFontDict); 65 pDRFontDict->SetReferenceFor(sFontName.Mid(1), pDoc, pFontDict);
66 } 66 }
67 CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict); 67 CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
68 if (!pDefFont) 68 if (!pDefFont)
69 return false; 69 return false;
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 dsBorder); 154 dsBorder);
155 if (sBorderStream.GetLength() > 0) 155 if (sBorderStream.GetLength() > 0)
156 sAppStream << "q\n" << sBorderStream << "Q\n"; 156 sAppStream << "q\n" << sBorderStream << "Q\n";
157 157
158 CFX_FloatRect rcBody = 158 CFX_FloatRect rcBody =
159 CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth, 159 CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
160 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth); 160 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
161 rcBody.Normalize(); 161 rcBody.Normalize();
162 CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP"); 162 CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP");
163 if (!pAPDict) { 163 if (!pAPDict) {
164 pAPDict = new CPDF_Dictionary; 164 pAPDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
165 pAnnotDict->SetFor("AP", pAPDict); 165 pAnnotDict->SetFor("AP", pAPDict);
166 } 166 }
167 CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N"); 167 CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N");
168 if (!pNormalStream) { 168 if (!pNormalStream) {
169 pNormalStream = new CPDF_Stream(nullptr, 0, nullptr); 169 pNormalStream = new CPDF_Stream(nullptr, 0, nullptr);
170 int32_t objnum = pDoc->AddIndirectObject(pNormalStream); 170 int32_t objnum = pDoc->AddIndirectObject(pNormalStream);
171 pAnnotDict->GetDictFor("AP")->SetReferenceFor("N", pDoc, objnum); 171 pAnnotDict->GetDictFor("AP")->SetReferenceFor("N", pDoc, objnum);
172 } 172 }
173 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); 173 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
174 if (pStreamDict) { 174 if (pStreamDict) {
175 pStreamDict->SetMatrixFor("Matrix", matrix); 175 pStreamDict->SetMatrixFor("Matrix", matrix);
176 pStreamDict->SetRectFor("BBox", rcBBox); 176 pStreamDict->SetRectFor("BBox", rcBBox);
177 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); 177 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
178 if (pStreamResList) { 178 if (pStreamResList) {
179 CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font"); 179 CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font");
180 if (!pStreamResFontList) { 180 if (!pStreamResFontList) {
181 pStreamResFontList = new CPDF_Dictionary; 181 pStreamResFontList = new CPDF_Dictionary(pDoc->GetByteStringPool());
182 pStreamResList->SetFor("Font", pStreamResFontList); 182 pStreamResList->SetFor("Font", pStreamResFontList);
183 } 183 }
184 if (!pStreamResFontList->KeyExist(sFontName)) 184 if (!pStreamResFontList->KeyExist(sFontName))
185 pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict); 185 pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict);
186 } else { 186 } else {
187 pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone()); 187 pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
188 pStreamResList = pStreamDict->GetDictFor("Resources"); 188 pStreamResList = pStreamDict->GetDictFor("Resources");
189 } 189 }
190 } 190 }
191 switch (nWidgetType) { 191 switch (nWidgetType) {
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 FALSE); 422 FALSE);
423 pStreamDict = pNormalStream->GetDict(); 423 pStreamDict = pNormalStream->GetDict();
424 if (pStreamDict) { 424 if (pStreamDict) {
425 pStreamDict->SetMatrixFor("Matrix", matrix); 425 pStreamDict->SetMatrixFor("Matrix", matrix);
426 pStreamDict->SetRectFor("BBox", rcBBox); 426 pStreamDict->SetRectFor("BBox", rcBBox);
427 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); 427 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
428 if (pStreamResList) { 428 if (pStreamResList) {
429 CPDF_Dictionary* pStreamResFontList = 429 CPDF_Dictionary* pStreamResFontList =
430 pStreamResList->GetDictFor("Font"); 430 pStreamResList->GetDictFor("Font");
431 if (!pStreamResFontList) { 431 if (!pStreamResFontList) {
432 pStreamResFontList = new CPDF_Dictionary; 432 pStreamResFontList = new CPDF_Dictionary(pDoc->GetByteStringPool());
433 pStreamResList->SetFor("Font", pStreamResFontList); 433 pStreamResList->SetFor("Font", pStreamResFontList);
434 } 434 }
435 if (!pStreamResFontList->KeyExist(sFontName)) 435 if (!pStreamResFontList->KeyExist(sFontName))
436 pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict); 436 pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict);
437 } else { 437 } else {
438 pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone()); 438 pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
439 pStreamResList = pStreamDict->GetDictFor("Resources"); 439 pStreamResList = pStreamDict->GetDictFor("Resources");
440 } 440 }
441 } 441 }
442 } 442 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 << CPVT_GenerateAP::GenerateColorAP( 531 << CPVT_GenerateAP::GenerateColorAP(
532 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::FILL) 532 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::FILL)
533 << sContent << "ET\n" 533 << sContent << "ET\n"
534 << "Q\n"; 534 << "Q\n";
535 return sAppStream.MakeString(); 535 return sAppStream.MakeString();
536 } 536 }
537 537
538 CPDF_Dictionary* GenerateExtGStateDict(const CPDF_Dictionary& pAnnotDict, 538 CPDF_Dictionary* GenerateExtGStateDict(const CPDF_Dictionary& pAnnotDict,
539 const CFX_ByteString& sExtGSDictName, 539 const CFX_ByteString& sExtGSDictName,
540 const CFX_ByteString& sBlendMode) { 540 const CFX_ByteString& sBlendMode) {
541 CPDF_Dictionary* pGSDict = new CPDF_Dictionary; 541 CPDF_Dictionary* pGSDict =
542 new CPDF_Dictionary(pAnnotDict.GetByteStringPool());
542 pGSDict->SetStringFor("Type", "ExtGState"); 543 pGSDict->SetStringFor("Type", "ExtGState");
543 544
544 FX_FLOAT fOpacity = 545 FX_FLOAT fOpacity =
545 pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1; 546 pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1;
546 pGSDict->SetNumberFor("CA", fOpacity); 547 pGSDict->SetNumberFor("CA", fOpacity);
547 pGSDict->SetNumberFor("ca", fOpacity); 548 pGSDict->SetNumberFor("ca", fOpacity);
548 pGSDict->SetBooleanFor("AIS", false); 549 pGSDict->SetBooleanFor("AIS", false);
549 pGSDict->SetStringFor("BM", sBlendMode); 550 pGSDict->SetStringFor("BM", sBlendMode);
550 551
551 CPDF_Dictionary* pExtGStateDict = new CPDF_Dictionary; 552 CPDF_Dictionary* pExtGStateDict =
553 new CPDF_Dictionary(pAnnotDict.GetByteStringPool());
552 pExtGStateDict->SetFor(sExtGSDictName, pGSDict); 554 pExtGStateDict->SetFor(sExtGSDictName, pGSDict);
553
554 return pExtGStateDict; 555 return pExtGStateDict;
555 } 556 }
556 557
557 CPDF_Dictionary* GenerateResourceFontDict(CPDF_Document* pDoc, 558 CPDF_Dictionary* GenerateResourceFontDict(CPDF_Document* pDoc,
558 const CFX_ByteString& sFontDictName) { 559 const CFX_ByteString& sFontDictName) {
559 CPDF_Dictionary* pFontDict = new CPDF_Dictionary; 560 CPDF_Dictionary* pFontDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
560 pFontDict->SetNameFor("Type", "Font"); 561 pFontDict->SetNameFor("Type", "Font");
561 pFontDict->SetNameFor("Subtype", "Type1"); 562 pFontDict->SetNameFor("Subtype", "Type1");
562 pFontDict->SetNameFor("BaseFont", "Helvetica"); 563 pFontDict->SetNameFor("BaseFont", "Helvetica");
563 pFontDict->SetNameFor("Encoding", "WinAnsiEncoding"); 564 pFontDict->SetNameFor("Encoding", "WinAnsiEncoding");
564 pDoc->AddIndirectObject(pFontDict); 565 pDoc->AddIndirectObject(pFontDict);
565 566
566 CPDF_Dictionary* pResourceFontDict = new CPDF_Dictionary; 567 CPDF_Dictionary* pResourceFontDict =
568 new CPDF_Dictionary(pDoc->GetByteStringPool());
567 pResourceFontDict->SetReferenceFor(sFontDictName, pDoc, pFontDict); 569 pResourceFontDict->SetReferenceFor(sFontDictName, pDoc, pFontDict);
568
569 return pResourceFontDict; 570 return pResourceFontDict;
570 } 571 }
571 572
572 // Takes ownership of |pExtGStateDict| and |pResourceFontDict|. 573 // Takes ownership of |pExtGStateDict| and |pResourceFontDict|.
573 CPDF_Dictionary* GenerateResourceDict(CPDF_Dictionary* pExtGStateDict, 574 CPDF_Dictionary* GenerateResourceDict(CPDF_Document* pDoc,
575 CPDF_Dictionary* pExtGStateDict,
574 CPDF_Dictionary* pResourceFontDict) { 576 CPDF_Dictionary* pResourceFontDict) {
575 CPDF_Dictionary* pResourceDict = new CPDF_Dictionary; 577 CPDF_Dictionary* pResourceDict =
578 new CPDF_Dictionary(pDoc->GetByteStringPool());
579
576 if (pExtGStateDict) 580 if (pExtGStateDict)
577 pResourceDict->SetFor("ExtGState", pExtGStateDict); 581 pResourceDict->SetFor("ExtGState", pExtGStateDict);
578 582
579 if (pResourceFontDict) 583 if (pResourceFontDict)
580 pResourceDict->SetFor("Font", pResourceFontDict); 584 pResourceDict->SetFor("Font", pResourceFontDict);
581 585
582 return pResourceDict; 586 return pResourceDict;
583 } 587 }
584 588
585 // Takes ownership of |pResourceDict|. 589 // Takes ownership of |pResourceDict|.
586 void GenerateAndSetAPDict(CPDF_Document* pDoc, 590 void GenerateAndSetAPDict(CPDF_Document* pDoc,
587 CPDF_Dictionary* pAnnotDict, 591 CPDF_Dictionary* pAnnotDict,
588 const CFX_ByteTextBuf& sAppStream, 592 const CFX_ByteTextBuf& sAppStream,
589 CPDF_Dictionary* pResourceDict, 593 CPDF_Dictionary* pResourceDict,
590 bool bIsTextMarkupAnnotation) { 594 bool bIsTextMarkupAnnotation) {
591 CPDF_Dictionary* pAPDict = new CPDF_Dictionary; 595 CPDF_Dictionary* pAPDict = new CPDF_Dictionary(pDoc->GetByteStringPool());
592 pAnnotDict->SetFor("AP", pAPDict); 596 pAnnotDict->SetFor("AP", pAPDict);
593 597
594 CPDF_Stream* pNormalStream = new CPDF_Stream(nullptr, 0, nullptr); 598 CPDF_Stream* pNormalStream = new CPDF_Stream(nullptr, 0, nullptr);
595 int32_t objnum = pDoc->AddIndirectObject(pNormalStream); 599 int32_t objnum = pDoc->AddIndirectObject(pNormalStream);
596 pAnnotDict->GetDictFor("AP")->SetReferenceFor("N", pDoc, objnum); 600 pAnnotDict->GetDictFor("AP")->SetReferenceFor("N", pDoc, objnum);
597
598 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, 601 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE,
599 FALSE); 602 FALSE);
600 603
601 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); 604 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
602 pStreamDict->SetIntegerFor("FormType", 1); 605 pStreamDict->SetIntegerFor("FormType", 1);
603 pStreamDict->SetStringFor("Subtype", "Form"); 606 pStreamDict->SetStringFor("Subtype", "Form");
604 pStreamDict->SetMatrixFor("Matrix", CFX_Matrix()); 607 pStreamDict->SetMatrixFor("Matrix", CFX_Matrix());
605 608
606 CFX_FloatRect rect = bIsTextMarkupAnnotation 609 CFX_FloatRect rect = bIsTextMarkupAnnotation
607 ? CPDF_Annot::RectFromQuadPoints(pAnnotDict) 610 ? CPDF_Annot::RectFromQuadPoints(pAnnotDict)
608 : pAnnotDict->GetRectFor("Rect"); 611 : pAnnotDict->GetRectFor("Rect");
609 pStreamDict->SetRectFor("BBox", rect); 612 pStreamDict->SetRectFor("BBox", rect);
610
611 pStreamDict->SetFor("Resources", pResourceDict); 613 pStreamDict->SetFor("Resources", pResourceDict);
612 } 614 }
613 615
614 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) { 616 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) {
615 if (bIsStrokeRect) 617 if (bIsStrokeRect)
616 return bIsFillRect ? "b" : "s"; 618 return bIsFillRect ? "b" : "s";
617 return bIsFillRect ? "f" : "n"; 619 return bIsFillRect ? "f" : "n";
618 } 620 }
619 621
620 CFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) { 622 CFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) {
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 sAppStream << rect.left << " " << fMiddleY + fDeltaY << " " 780 sAppStream << rect.left << " " << fMiddleY + fDeltaY << " "
779 << fMiddleX - fDeltaX << " " << rect.top << " " << fMiddleX << " " 781 << fMiddleX - fDeltaX << " " << rect.top << " " << fMiddleX << " "
780 << rect.top << " c\n"; 782 << rect.top << " c\n";
781 783
782 bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty(); 784 bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty();
783 sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n"; 785 sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
784 786
785 CPDF_Dictionary* pExtGStateDict = 787 CPDF_Dictionary* pExtGStateDict =
786 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 788 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
787 CPDF_Dictionary* pResourceDict = 789 CPDF_Dictionary* pResourceDict =
788 GenerateResourceDict(pExtGStateDict, nullptr); 790 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
789 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 791 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
790 false /*IsTextMarkupAnnotation*/); 792 false /*IsTextMarkupAnnotation*/);
791 return true; 793 return true;
792 } 794 }
793 795
794 bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc, 796 bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc,
795 CPDF_Dictionary* pAnnotDict) { 797 CPDF_Dictionary* pAnnotDict) {
796 CFX_ByteTextBuf sAppStream; 798 CFX_ByteTextBuf sAppStream;
797 CFX_ByteString sExtGSDictName = "GS"; 799 CFX_ByteString sExtGSDictName = "GS";
798 sAppStream << "/" << sExtGSDictName << " gs "; 800 sAppStream << "/" << sExtGSDictName << " gs ";
799 801
800 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), 802 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
801 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), 803 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
802 PaintOperation::FILL); 804 PaintOperation::FILL);
803 805
804 CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); 806 CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
805 rect.Normalize(); 807 rect.Normalize();
806 808
807 sAppStream << rect.left << " " << rect.top << " m " << rect.right << " " 809 sAppStream << rect.left << " " << rect.top << " m " << rect.right << " "
808 << rect.top << " l " << rect.right << " " << rect.bottom << " l " 810 << rect.top << " l " << rect.right << " " << rect.bottom << " l "
809 << rect.left << " " << rect.bottom << " l " 811 << rect.left << " " << rect.bottom << " l "
810 << "h f\n"; 812 << "h f\n";
811 813
812 CPDF_Dictionary* pExtGStateDict = 814 CPDF_Dictionary* pExtGStateDict =
813 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); 815 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply");
814 CPDF_Dictionary* pResourceDict = 816 CPDF_Dictionary* pResourceDict =
815 GenerateResourceDict(pExtGStateDict, nullptr); 817 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
816 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 818 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
817 true /*IsTextMarkupAnnotation*/); 819 true /*IsTextMarkupAnnotation*/);
818 820
819 return true; 821 return true;
820 } 822 }
821 823
822 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc, 824 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc,
823 CPDF_Dictionary* pAnnotDict) { 825 CPDF_Dictionary* pAnnotDict) {
824 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); 826 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict);
825 bool bIsStroke = fBorderWidth > 0; 827 bool bIsStroke = fBorderWidth > 0;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
860 sAppStream << pInkCoordList->GetNumberAt(j) << " " 862 sAppStream << pInkCoordList->GetNumberAt(j) << " "
861 << pInkCoordList->GetNumberAt(j + 1) << " l "; 863 << pInkCoordList->GetNumberAt(j + 1) << " l ";
862 } 864 }
863 865
864 sAppStream << "S\n"; 866 sAppStream << "S\n";
865 } 867 }
866 868
867 CPDF_Dictionary* pExtGStateDict = 869 CPDF_Dictionary* pExtGStateDict =
868 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 870 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
869 CPDF_Dictionary* pResourceDict = 871 CPDF_Dictionary* pResourceDict =
870 GenerateResourceDict(pExtGStateDict, nullptr); 872 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
871 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 873 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
872 false /*IsTextMarkupAnnotation*/); 874 false /*IsTextMarkupAnnotation*/);
873 return true; 875 return true;
874 } 876 }
875 877
876 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc, 878 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc,
877 CPDF_Dictionary* pAnnotDict) { 879 CPDF_Dictionary* pAnnotDict) {
878 CFX_ByteTextBuf sAppStream; 880 CFX_ByteTextBuf sAppStream;
879 CFX_ByteString sExtGSDictName = "GS"; 881 CFX_ByteString sExtGSDictName = "GS";
880 sAppStream << "/" << sExtGSDictName << " gs "; 882 sAppStream << "/" << sExtGSDictName << " gs ";
881 883
882 CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect"); 884 CFX_FloatRect rect = pAnnotDict->GetRectFor("Rect");
883 const FX_FLOAT fNoteLength = 20; 885 const FX_FLOAT fNoteLength = 20;
884 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength, 886 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength,
885 rect.bottom + fNoteLength); 887 rect.bottom + fNoteLength);
886 pAnnotDict->SetRectFor("Rect", noteRect); 888 pAnnotDict->SetRectFor("Rect", noteRect);
887 889
888 sAppStream << GenerateTextSymbolAP(noteRect); 890 sAppStream << GenerateTextSymbolAP(noteRect);
889 891
890 CPDF_Dictionary* pExtGStateDict = 892 CPDF_Dictionary* pExtGStateDict =
891 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 893 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
892 CPDF_Dictionary* pResourceDict = 894 CPDF_Dictionary* pResourceDict =
893 GenerateResourceDict(pExtGStateDict, nullptr); 895 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
894 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 896 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
895 false /*IsTextMarkupAnnotation*/); 897 false /*IsTextMarkupAnnotation*/);
896 return true; 898 return true;
897 } 899 }
898 900
899 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, 901 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc,
900 CPDF_Dictionary* pAnnotDict) { 902 CPDF_Dictionary* pAnnotDict) {
901 CFX_ByteTextBuf sAppStream; 903 CFX_ByteTextBuf sAppStream;
902 CFX_ByteString sExtGSDictName = "GS"; 904 CFX_ByteString sExtGSDictName = "GS";
903 sAppStream << "/" << sExtGSDictName << " gs "; 905 sAppStream << "/" << sExtGSDictName << " gs ";
904 906
905 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), 907 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
906 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), 908 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
907 PaintOperation::STROKE); 909 PaintOperation::STROKE);
908 910
909 CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); 911 CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
910 rect.Normalize(); 912 rect.Normalize();
911 913
912 FX_FLOAT fLineWidth = 1.0; 914 FX_FLOAT fLineWidth = 1.0;
913 sAppStream << fLineWidth << " w " << rect.left << " " 915 sAppStream << fLineWidth << " w " << rect.left << " "
914 << rect.bottom + fLineWidth << " m " << rect.right << " " 916 << rect.bottom + fLineWidth << " m " << rect.right << " "
915 << rect.bottom + fLineWidth << " l S\n"; 917 << rect.bottom + fLineWidth << " l S\n";
916 918
917 CPDF_Dictionary* pExtGStateDict = 919 CPDF_Dictionary* pExtGStateDict =
918 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 920 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
919 CPDF_Dictionary* pResourceDict = 921 CPDF_Dictionary* pResourceDict =
920 GenerateResourceDict(pExtGStateDict, nullptr); 922 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
921 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 923 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
922 true /*IsTextMarkupAnnotation*/); 924 true /*IsTextMarkupAnnotation*/);
923 return true; 925 return true;
924 } 926 }
925 927
926 bool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc, 928 bool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc,
927 CPDF_Dictionary* pAnnotDict) { 929 CPDF_Dictionary* pAnnotDict) {
928 CFX_ByteTextBuf sAppStream; 930 CFX_ByteTextBuf sAppStream;
929 CFX_ByteString sExtGSDictName = "GS"; 931 CFX_ByteString sExtGSDictName = "GS";
930 sAppStream << "/" << sExtGSDictName << " gs\n"; 932 sAppStream << "/" << sExtGSDictName << " gs\n";
(...skipping 12 matching lines...) Expand all
943 945
944 sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " " 946 sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " "
945 << rect.Height() << " re b\n"; 947 << rect.Height() << " re b\n";
946 948
947 CFX_ByteString sFontName = "FONT"; 949 CFX_ByteString sFontName = "FONT";
948 CPDF_Dictionary* pExtGStateDict = 950 CPDF_Dictionary* pExtGStateDict =
949 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 951 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
950 CPDF_Dictionary* pResourceFontDict = 952 CPDF_Dictionary* pResourceFontDict =
951 GenerateResourceFontDict(pDoc, sFontName); 953 GenerateResourceFontDict(pDoc, sFontName);
952 CPDF_Dictionary* pResourceDict = 954 CPDF_Dictionary* pResourceDict =
953 GenerateResourceDict(pResourceFontDict, pExtGStateDict); 955 GenerateResourceDict(pDoc, pResourceFontDict, pExtGStateDict);
954 956
955 CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict); 957 CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict);
956 if (!pDefFont) 958 if (!pDefFont)
957 return false; 959 return false;
958 960
959 sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName); 961 sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName);
960 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 962 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
961 false /*IsTextMarkupAnnotation*/); 963 false /*IsTextMarkupAnnotation*/);
962 return true; 964 return true;
963 } 965 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 999
998 bool bIsFillRect = pInteriorColor && (pInteriorColor->GetCount() > 0); 1000 bool bIsFillRect = pInteriorColor && (pInteriorColor->GetCount() > 0);
999 1001
1000 sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " " 1002 sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " "
1001 << rect.Height() << " re " 1003 << rect.Height() << " re "
1002 << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n"; 1004 << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
1003 1005
1004 CPDF_Dictionary* pExtGStateDict = 1006 CPDF_Dictionary* pExtGStateDict =
1005 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 1007 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
1006 CPDF_Dictionary* pResourceDict = 1008 CPDF_Dictionary* pResourceDict =
1007 GenerateResourceDict(pExtGStateDict, nullptr); 1009 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
1008 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 1010 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
1009 false /*IsTextMarkupAnnotation*/); 1011 false /*IsTextMarkupAnnotation*/);
1010 return true; 1012 return true;
1011 } 1013 }
1012 1014
1013 bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc, 1015 bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc,
1014 CPDF_Dictionary* pAnnotDict) { 1016 CPDF_Dictionary* pAnnotDict) {
1015 CFX_ByteTextBuf sAppStream; 1017 CFX_ByteTextBuf sAppStream;
1016 CFX_ByteString sExtGSDictName = "GS"; 1018 CFX_ByteString sExtGSDictName = "GS";
1017 sAppStream << "/" << sExtGSDictName << " gs "; 1019 sAppStream << "/" << sExtGSDictName << " gs ";
(...skipping 28 matching lines...) Expand all
1046 if (isUpwards) 1048 if (isUpwards)
1047 sAppStream << rect.right << " " << fBottom + fRemainder << " l "; 1049 sAppStream << rect.right << " " << fBottom + fRemainder << " l ";
1048 else 1050 else
1049 sAppStream << rect.right << " " << fTop - fRemainder << " l "; 1051 sAppStream << rect.right << " " << fTop - fRemainder << " l ";
1050 1052
1051 sAppStream << "S\n"; 1053 sAppStream << "S\n";
1052 1054
1053 CPDF_Dictionary* pExtGStateDict = 1055 CPDF_Dictionary* pExtGStateDict =
1054 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 1056 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
1055 CPDF_Dictionary* pResourceDict = 1057 CPDF_Dictionary* pResourceDict =
1056 GenerateResourceDict(pExtGStateDict, nullptr); 1058 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
1057 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 1059 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
1058 true /*IsTextMarkupAnnotation*/); 1060 true /*IsTextMarkupAnnotation*/);
1059 return true; 1061 return true;
1060 } 1062 }
1061 1063
1062 bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc, 1064 bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc,
1063 CPDF_Dictionary* pAnnotDict) { 1065 CPDF_Dictionary* pAnnotDict) {
1064 CFX_ByteTextBuf sAppStream; 1066 CFX_ByteTextBuf sAppStream;
1065 CFX_ByteString sExtGSDictName = "GS"; 1067 CFX_ByteString sExtGSDictName = "GS";
1066 sAppStream << "/" << sExtGSDictName << " gs "; 1068 sAppStream << "/" << sExtGSDictName << " gs ";
1067 1069
1068 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"), 1070 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayFor("C"),
1069 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), 1071 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
1070 PaintOperation::STROKE); 1072 PaintOperation::STROKE);
1071 1073
1072 CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict); 1074 CFX_FloatRect rect = CPDF_Annot::RectFromQuadPoints(pAnnotDict);
1073 rect.Normalize(); 1075 rect.Normalize();
1074 1076
1075 FX_FLOAT fLineWidth = 1.0; 1077 FX_FLOAT fLineWidth = 1.0;
1076 FX_FLOAT fY = (rect.top + rect.bottom) / 2; 1078 FX_FLOAT fY = (rect.top + rect.bottom) / 2;
1077 sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m " 1079 sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m "
1078 << rect.right << " " << fY << " l S\n"; 1080 << rect.right << " " << fY << " l S\n";
1079 1081
1080 CPDF_Dictionary* pExtGStateDict = 1082 CPDF_Dictionary* pExtGStateDict =
1081 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 1083 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
1082 CPDF_Dictionary* pResourceDict = 1084 CPDF_Dictionary* pResourceDict =
1083 GenerateResourceDict(pExtGStateDict, nullptr); 1085 GenerateResourceDict(pDoc, pExtGStateDict, nullptr);
1084 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict, 1086 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
1085 true /*IsTextMarkupAnnotation*/); 1087 true /*IsTextMarkupAnnotation*/);
1086 return true; 1088 return true;
1087 } 1089 }
1088 1090
1089 // Static. 1091 // Static.
1090 CFX_ByteString CPVT_GenerateAP::GenerateEditAP( 1092 CFX_ByteString CPVT_GenerateAP::GenerateEditAP(
1091 IPVT_FontMap* pFontMap, 1093 IPVT_FontMap* pFontMap,
1092 CPDF_VariableText::Iterator* pIterator, 1094 CPDF_VariableText::Iterator* pIterator,
1093 const CFX_FloatPoint& ptOffset, 1095 const CFX_FloatPoint& ptOffset,
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1346 int32_t nFontIndex, 1348 int32_t nFontIndex,
1347 FX_FLOAT fFontSize) { 1349 FX_FLOAT fFontSize) {
1348 CFX_ByteTextBuf sRet; 1350 CFX_ByteTextBuf sRet;
1349 if (pFontMap) { 1351 if (pFontMap) {
1350 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); 1352 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
1351 if (sFontAlias.GetLength() > 0 && fFontSize > 0) 1353 if (sFontAlias.GetLength() > 0 && fFontSize > 0)
1352 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; 1354 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
1353 } 1355 }
1354 return sRet.MakeString(); 1356 return sRet.MakeString();
1355 } 1357 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698