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

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

Issue 2510223002: Make CPDF_Dictionary use unique pointers. (Closed)
Patch Set: rebase Created 4 years, 1 month 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
« no previous file with comments | « core/fpdfdoc/cpvt_fontmap.cpp ('k') | core/fxge/dib/fx_dib_engine_unittest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
11 #include <utility> 11 #include <utility>
12 12
13 #include "core/fpdfapi/font/cpdf_font.h" 13 #include "core/fpdfapi/font/cpdf_font.h"
14 #include "core/fpdfapi/parser/cpdf_boolean.h"
14 #include "core/fpdfapi/parser/cpdf_dictionary.h" 15 #include "core/fpdfapi/parser/cpdf_dictionary.h"
15 #include "core/fpdfapi/parser/cpdf_document.h" 16 #include "core/fpdfapi/parser/cpdf_document.h"
17 #include "core/fpdfapi/parser/cpdf_name.h"
18 #include "core/fpdfapi/parser/cpdf_number.h"
19 #include "core/fpdfapi/parser/cpdf_reference.h"
16 #include "core/fpdfapi/parser/cpdf_simple_parser.h" 20 #include "core/fpdfapi/parser/cpdf_simple_parser.h"
17 #include "core/fpdfapi/parser/cpdf_stream.h" 21 #include "core/fpdfapi/parser/cpdf_stream.h"
22 #include "core/fpdfapi/parser/cpdf_string.h"
18 #include "core/fpdfapi/parser/fpdf_parser_decode.h" 23 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
19 #include "core/fpdfdoc/cpdf_annot.h" 24 #include "core/fpdfdoc/cpdf_annot.h"
20 #include "core/fpdfdoc/cpdf_formfield.h" 25 #include "core/fpdfdoc/cpdf_formfield.h"
21 #include "core/fpdfdoc/cpvt_color.h" 26 #include "core/fpdfdoc/cpvt_color.h"
22 #include "core/fpdfdoc/cpvt_fontmap.h" 27 #include "core/fpdfdoc/cpvt_fontmap.h"
23 #include "core/fpdfdoc/cpvt_word.h" 28 #include "core/fpdfdoc/cpvt_word.h"
24 #include "third_party/base/ptr_util.h" 29 #include "third_party/base/ptr_util.h"
25 30
26 namespace { 31 namespace {
27 32
(...skipping 27 matching lines...) Expand all
55 if (!pDRDict) 60 if (!pDRDict)
56 return false; 61 return false;
57 62
58 CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font"); 63 CPDF_Dictionary* pDRFontDict = pDRDict->GetDictFor("Font");
59 if (!pDRFontDict) 64 if (!pDRFontDict)
60 return false; 65 return false;
61 66
62 CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1)); 67 CPDF_Dictionary* pFontDict = pDRFontDict->GetDictFor(sFontName.Mid(1));
63 if (!pFontDict) { 68 if (!pFontDict) {
64 pFontDict = pDoc->NewIndirect<CPDF_Dictionary>(); 69 pFontDict = pDoc->NewIndirect<CPDF_Dictionary>();
65 pFontDict->SetNameFor("Type", "Font"); 70 pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
66 pFontDict->SetNameFor("Subtype", "Type1"); 71 pFontDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
67 pFontDict->SetNameFor("BaseFont", "Helvetica"); 72 pFontDict->SetNewFor<CPDF_Name>("BaseFont", "Helvetica");
68 pFontDict->SetNameFor("Encoding", "WinAnsiEncoding"); 73 pFontDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
69 pDRFontDict->SetReferenceFor(sFontName.Mid(1), pDoc, pFontDict); 74 pDRFontDict->SetNewFor<CPDF_Reference>(sFontName.Mid(1), pDoc,
75 pFontDict->GetObjNum());
70 } 76 }
71 CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict); 77 CPDF_Font* pDefFont = pDoc->LoadFont(pFontDict);
72 if (!pDefFont) 78 if (!pDefFont)
73 return false; 79 return false;
74 80
75 CFX_FloatRect rcAnnot = pAnnotDict->GetRectFor("Rect"); 81 CFX_FloatRect rcAnnot = pAnnotDict->GetRectFor("Rect");
76 int32_t nRotate = 0; 82 int32_t nRotate = 0;
77 if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK")) 83 if (CPDF_Dictionary* pMKDict = pAnnotDict->GetDictFor("MK"))
78 nRotate = pMKDict->GetIntegerFor("R"); 84 nRotate = pMKDict->GetIntegerFor("R");
79 85
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
156 CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP( 162 CFX_ByteString sBorderStream = CPVT_GenerateAP::GenerateBorderAP(
157 rcBBox, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle, 163 rcBBox, fBorderWidth, crBorder, crLeftTop, crRightBottom, nBorderStyle,
158 dsBorder); 164 dsBorder);
159 if (sBorderStream.GetLength() > 0) 165 if (sBorderStream.GetLength() > 0)
160 sAppStream << "q\n" << sBorderStream << "Q\n"; 166 sAppStream << "q\n" << sBorderStream << "Q\n";
161 167
162 CFX_FloatRect rcBody = 168 CFX_FloatRect rcBody =
163 CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth, 169 CFX_FloatRect(rcBBox.left + fBorderWidth, rcBBox.bottom + fBorderWidth,
164 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth); 170 rcBBox.right - fBorderWidth, rcBBox.top - fBorderWidth);
165 rcBody.Normalize(); 171 rcBody.Normalize();
172
166 CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP"); 173 CPDF_Dictionary* pAPDict = pAnnotDict->GetDictFor("AP");
167 if (!pAPDict) { 174 if (!pAPDict)
168 auto pNewAPDict = 175 pAPDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
169 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 176
170 // Ownership passes to |pAnnotDict|.
171 pAPDict = pNewAPDict.release();
172 pAnnotDict->SetFor("AP", pAPDict);
173 }
174 CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N"); 177 CPDF_Stream* pNormalStream = pAPDict->GetStreamFor("N");
175 if (!pNormalStream) { 178 if (!pNormalStream) {
176 pNormalStream = pDoc->NewIndirect<CPDF_Stream>(); 179 pNormalStream = pDoc->NewIndirect<CPDF_Stream>();
177 pAPDict->SetReferenceFor("N", pDoc, pNormalStream); 180 pAPDict->SetNewFor<CPDF_Reference>("N", pDoc, pNormalStream->GetObjNum());
178 } 181 }
179 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); 182 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
180 if (pStreamDict) { 183 if (pStreamDict) {
181 pStreamDict->SetMatrixFor("Matrix", matrix); 184 pStreamDict->SetMatrixFor("Matrix", matrix);
182 pStreamDict->SetRectFor("BBox", rcBBox); 185 pStreamDict->SetRectFor("BBox", rcBBox);
183 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); 186 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
184 if (pStreamResList) { 187 if (pStreamResList) {
185 CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font"); 188 CPDF_Dictionary* pStreamResFontList = pStreamResList->GetDictFor("Font");
186 if (!pStreamResFontList) { 189 if (!pStreamResFontList)
187 auto pNewStreamResFontList = 190 pStreamResFontList = pStreamResList->SetNewFor<CPDF_Dictionary>("Font");
188 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 191 if (!pStreamResFontList->KeyExist(sFontName)) {
189 // Ownership passes to |pStreamResList|. 192 pStreamResFontList->SetNewFor<CPDF_Reference>(sFontName, pDoc,
190 pStreamResFontList = pNewStreamResFontList.release(); 193 pFontDict->GetObjNum());
191 pStreamResList->SetFor("Font", pStreamResFontList);
192 } 194 }
193 if (!pStreamResFontList->KeyExist(sFontName))
194 pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict);
195 } else { 195 } else {
196 pStreamDict->SetFor("Resources", 196 pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
197 pFormDict->GetDictFor("DR")->Clone().release());
198 pStreamResList = pStreamDict->GetDictFor("Resources"); 197 pStreamResList = pStreamDict->GetDictFor("Resources");
199 } 198 }
200 } 199 }
201 switch (nWidgetType) { 200 switch (nWidgetType) {
202 case 0: { 201 case 0: {
203 CFX_WideString swValue = 202 CFX_WideString swValue =
204 FPDF_GetFieldAttr(pAnnotDict, "V") 203 FPDF_GetFieldAttr(pAnnotDict, "V")
205 ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText() 204 ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
206 : CFX_WideString(); 205 : CFX_WideString();
207 int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q") 206 int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
431 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize()); 430 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize());
432 pStreamDict = pNormalStream->GetDict(); 431 pStreamDict = pNormalStream->GetDict();
433 if (pStreamDict) { 432 if (pStreamDict) {
434 pStreamDict->SetMatrixFor("Matrix", matrix); 433 pStreamDict->SetMatrixFor("Matrix", matrix);
435 pStreamDict->SetRectFor("BBox", rcBBox); 434 pStreamDict->SetRectFor("BBox", rcBBox);
436 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources"); 435 CPDF_Dictionary* pStreamResList = pStreamDict->GetDictFor("Resources");
437 if (pStreamResList) { 436 if (pStreamResList) {
438 CPDF_Dictionary* pStreamResFontList = 437 CPDF_Dictionary* pStreamResFontList =
439 pStreamResList->GetDictFor("Font"); 438 pStreamResList->GetDictFor("Font");
440 if (!pStreamResFontList) { 439 if (!pStreamResFontList) {
441 auto pNewStreamResFontList = 440 pStreamResFontList =
442 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 441 pStreamResList->SetNewFor<CPDF_Dictionary>("Font");
443 // Ownership passes to |pStreamResList|.
444 pStreamResFontList = pNewStreamResFontList.release();
445 pStreamResList->SetFor("Font", pStreamResFontList);
446 } 442 }
447 if (!pStreamResFontList->KeyExist(sFontName)) 443 if (!pStreamResFontList->KeyExist(sFontName)) {
448 pStreamResFontList->SetReferenceFor(sFontName, pDoc, pFontDict); 444 pStreamResFontList->SetNewFor<CPDF_Reference>(sFontName, pDoc,
445 pFontDict->GetObjNum());
446 }
449 } else { 447 } else {
450 pStreamDict->SetFor("Resources", 448 pStreamDict->SetFor("Resources", pFormDict->GetDictFor("DR")->Clone());
451 pFormDict->GetDictFor("DR")->Clone().release());
452 pStreamResList = pStreamDict->GetDictFor("Resources"); 449 pStreamResList = pStreamDict->GetDictFor("Resources");
453 } 450 }
454 } 451 }
455 } 452 }
456 return true; 453 return true;
457 } 454 }
458 455
459 CFX_ByteString GetColorStringWithDefault(CPDF_Array* pColor, 456 CFX_ByteString GetColorStringWithDefault(CPDF_Array* pColor,
460 const CPVT_Color& crDefaultColor, 457 const CPVT_Color& crDefaultColor,
461 PaintOperation nOperation) { 458 PaintOperation nOperation) {
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 << "Q\n"; 544 << "Q\n";
548 return sAppStream.MakeString(); 545 return sAppStream.MakeString();
549 } 546 }
550 547
551 std::unique_ptr<CPDF_Dictionary> GenerateExtGStateDict( 548 std::unique_ptr<CPDF_Dictionary> GenerateExtGStateDict(
552 const CPDF_Dictionary& pAnnotDict, 549 const CPDF_Dictionary& pAnnotDict,
553 const CFX_ByteString& sExtGSDictName, 550 const CFX_ByteString& sExtGSDictName,
554 const CFX_ByteString& sBlendMode) { 551 const CFX_ByteString& sBlendMode) {
555 auto pGSDict = 552 auto pGSDict =
556 pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool()); 553 pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
557 pGSDict->SetStringFor("Type", "ExtGState"); 554 pGSDict->SetNewFor<CPDF_String>("Type", "ExtGState", false);
558 555
559 FX_FLOAT fOpacity = 556 FX_FLOAT fOpacity =
560 pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1; 557 pAnnotDict.KeyExist("CA") ? pAnnotDict.GetNumberFor("CA") : 1;
561 pGSDict->SetNumberFor("CA", fOpacity); 558 pGSDict->SetNewFor<CPDF_Number>("CA", fOpacity);
562 pGSDict->SetNumberFor("ca", fOpacity); 559 pGSDict->SetNewFor<CPDF_Number>("ca", fOpacity);
563 pGSDict->SetBooleanFor("AIS", false); 560 pGSDict->SetNewFor<CPDF_Boolean>("AIS", false);
564 pGSDict->SetStringFor("BM", sBlendMode); 561 pGSDict->SetNewFor<CPDF_String>("BM", sBlendMode, false);
565 562
566 auto pExtGStateDict = 563 auto pExtGStateDict =
567 pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool()); 564 pdfium::MakeUnique<CPDF_Dictionary>(pAnnotDict.GetByteStringPool());
568 pExtGStateDict->SetFor(sExtGSDictName, pGSDict.release()); 565 pExtGStateDict->SetFor(sExtGSDictName, std::move(pGSDict));
569 return pExtGStateDict; 566 return pExtGStateDict;
570 } 567 }
571 568
572 std::unique_ptr<CPDF_Dictionary> GenerateResourceFontDict( 569 std::unique_ptr<CPDF_Dictionary> GenerateResourceFontDict(
573 CPDF_Document* pDoc, 570 CPDF_Document* pDoc,
574 const CFX_ByteString& sFontDictName) { 571 const CFX_ByteString& sFontDictName) {
575 CPDF_Dictionary* pFontDict = pDoc->NewIndirect<CPDF_Dictionary>(); 572 CPDF_Dictionary* pFontDict = pDoc->NewIndirect<CPDF_Dictionary>();
576 pFontDict->SetNameFor("Type", "Font"); 573 pFontDict->SetNewFor<CPDF_Name>("Type", "Font");
577 pFontDict->SetNameFor("Subtype", "Type1"); 574 pFontDict->SetNewFor<CPDF_Name>("Subtype", "Type1");
578 pFontDict->SetNameFor("BaseFont", "Helvetica"); 575 pFontDict->SetNewFor<CPDF_Name>("BaseFont", "Helvetica");
579 pFontDict->SetNameFor("Encoding", "WinAnsiEncoding"); 576 pFontDict->SetNewFor<CPDF_Name>("Encoding", "WinAnsiEncoding");
580 577
581 auto pResourceFontDict = 578 auto pResourceFontDict =
582 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 579 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
583 pResourceFontDict->SetReferenceFor(sFontDictName, pDoc, pFontDict); 580 pResourceFontDict->SetNewFor<CPDF_Reference>(sFontDictName, pDoc,
581 pFontDict->GetObjNum());
584 return pResourceFontDict; 582 return pResourceFontDict;
585 } 583 }
586 584
587 std::unique_ptr<CPDF_Dictionary> GenerateResourceDict( 585 std::unique_ptr<CPDF_Dictionary> GenerateResourceDict(
588 CPDF_Document* pDoc, 586 CPDF_Document* pDoc,
589 std::unique_ptr<CPDF_Dictionary> pExtGStateDict, 587 std::unique_ptr<CPDF_Dictionary> pExtGStateDict,
590 std::unique_ptr<CPDF_Dictionary> pResourceFontDict) { 588 std::unique_ptr<CPDF_Dictionary> pResourceFontDict) {
591 auto pResourceDict = 589 auto pResourceDict =
592 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 590 pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool());
593 if (pExtGStateDict) 591 if (pExtGStateDict)
594 pResourceDict->SetFor("ExtGState", pExtGStateDict.release()); 592 pResourceDict->SetFor("ExtGState", std::move(pExtGStateDict));
595 if (pResourceFontDict) 593 if (pResourceFontDict)
596 pResourceDict->SetFor("Font", pResourceFontDict.release()); 594 pResourceDict->SetFor("Font", std::move(pResourceFontDict));
597 return pResourceDict; 595 return pResourceDict;
598 } 596 }
599 597
600 void GenerateAndSetAPDict(CPDF_Document* pDoc, 598 void GenerateAndSetAPDict(CPDF_Document* pDoc,
601 CPDF_Dictionary* pAnnotDict, 599 CPDF_Dictionary* pAnnotDict,
602 const CFX_ByteTextBuf& sAppStream, 600 const CFX_ByteTextBuf& sAppStream,
603 std::unique_ptr<CPDF_Dictionary> pResourceDict, 601 std::unique_ptr<CPDF_Dictionary> pResourceDict,
604 bool bIsTextMarkupAnnotation) { 602 bool bIsTextMarkupAnnotation) {
605 CPDF_Stream* pNormalStream = pDoc->NewIndirect<CPDF_Stream>(); 603 CPDF_Stream* pNormalStream = pDoc->NewIndirect<CPDF_Stream>();
606 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize()); 604 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize());
607 605
608 auto pAPDict = pdfium::MakeUnique<CPDF_Dictionary>(pDoc->GetByteStringPool()); 606 CPDF_Dictionary* pAPDict = pAnnotDict->SetNewFor<CPDF_Dictionary>("AP");
609 pAPDict->SetReferenceFor("N", pDoc, pNormalStream); 607 pAPDict->SetNewFor<CPDF_Reference>("N", pDoc, pNormalStream->GetObjNum());
610 pAnnotDict->SetFor("AP", pAPDict.release());
611 608
612 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); 609 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
613 pStreamDict->SetIntegerFor("FormType", 1); 610 pStreamDict->SetNewFor<CPDF_Number>("FormType", 1);
614 pStreamDict->SetStringFor("Subtype", "Form"); 611 pStreamDict->SetNewFor<CPDF_String>("Subtype", "Form", false);
615 pStreamDict->SetMatrixFor("Matrix", CFX_Matrix()); 612 pStreamDict->SetMatrixFor("Matrix", CFX_Matrix());
616 613
617 CFX_FloatRect rect = bIsTextMarkupAnnotation 614 CFX_FloatRect rect = bIsTextMarkupAnnotation
618 ? CPDF_Annot::RectFromQuadPoints(pAnnotDict) 615 ? CPDF_Annot::RectFromQuadPoints(pAnnotDict)
619 : pAnnotDict->GetRectFor("Rect"); 616 : pAnnotDict->GetRectFor("Rect");
620 pStreamDict->SetRectFor("BBox", rect); 617 pStreamDict->SetRectFor("BBox", rect);
621 pStreamDict->SetFor("Resources", pResourceDict.release()); 618 pStreamDict->SetFor("Resources", std::move(pResourceDict));
622 } 619 }
623 620
624 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) { 621 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) {
625 if (bIsStrokeRect) 622 if (bIsStrokeRect)
626 return bIsFillRect ? "b" : "s"; 623 return bIsFillRect ? "b" : "s";
627 return bIsFillRect ? "f" : "n"; 624 return bIsFillRect ? "f" : "n";
628 } 625 }
629 626
630 CFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) { 627 CFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) {
631 CFX_ByteTextBuf sAppStream; 628 CFX_ByteTextBuf sAppStream;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
686 CPDF_Object* pFieldTypeObj = FPDF_GetFieldAttr(pAnnotDict, "FT"); 683 CPDF_Object* pFieldTypeObj = FPDF_GetFieldAttr(pAnnotDict, "FT");
687 if (!pFieldTypeObj) 684 if (!pFieldTypeObj)
688 return false; 685 return false;
689 686
690 CFX_ByteString field_type = pFieldTypeObj->GetString(); 687 CFX_ByteString field_type = pFieldTypeObj->GetString();
691 if (field_type == "Tx") 688 if (field_type == "Tx")
692 return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict); 689 return CPVT_GenerateAP::GenerateTextFieldAP(pDoc, pAnnotDict);
693 690
694 CPDF_Object* pFieldFlagsObj = FPDF_GetFieldAttr(pAnnotDict, "Ff"); 691 CPDF_Object* pFieldFlagsObj = FPDF_GetFieldAttr(pAnnotDict, "Ff");
695 uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0; 692 uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0;
696
697 if (field_type == "Ch") { 693 if (field_type == "Ch") {
698 return (flags & (1 << 17)) 694 return (flags & (1 << 17))
699 ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict) 695 ? CPVT_GenerateAP::GenerateComboBoxAP(pDoc, pAnnotDict)
700 : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict); 696 : CPVT_GenerateAP::GenerateListBoxAP(pDoc, pAnnotDict);
701 } 697 }
702 698
703 if (field_type == "Btn") { 699 if (field_type == "Btn") {
704 if (!(flags & (1 << 16))) { 700 if (!(flags & (1 << 16))) {
705 if (!pAnnotDict->KeyExist("AS")) { 701 if (!pAnnotDict->KeyExist("AS")) {
706 if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent")) { 702 if (CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent")) {
707 if (pParentDict->KeyExist("AS")) { 703 if (pParentDict->KeyExist("AS")) {
708 pAnnotDict->SetStringFor("AS", pParentDict->GetStringFor("AS")); 704 pAnnotDict->SetNewFor<CPDF_String>(
705 "AS", pParentDict->GetStringFor("AS"), false);
709 } 706 }
710 } 707 }
711 } 708 }
712 } 709 }
713 } 710 }
714 711
715 return false; 712 return false;
716 } 713 }
717 714
718 // Static. 715 // Static.
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 int32_t nFontIndex, 1358 int32_t nFontIndex,
1362 FX_FLOAT fFontSize) { 1359 FX_FLOAT fFontSize) {
1363 CFX_ByteTextBuf sRet; 1360 CFX_ByteTextBuf sRet;
1364 if (pFontMap) { 1361 if (pFontMap) {
1365 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); 1362 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
1366 if (sFontAlias.GetLength() > 0 && fFontSize > 0) 1363 if (sFontAlias.GetLength() > 0 && fFontSize > 0)
1367 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; 1364 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
1368 } 1365 }
1369 return sRet.MakeString(); 1366 return sRet.MakeString();
1370 } 1367 }
OLDNEW
« no previous file with comments | « core/fpdfdoc/cpvt_fontmap.cpp ('k') | core/fxge/dib/fx_dib_engine_unittest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698