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

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

Issue 2289293005: Use /RECT or /QuadPoints for annotation coordinates, depending on /AP (Closed)
Patch Set: addressed thestig's comments 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 578 matching lines...) Expand 10 before | Expand all | Expand 10 after
589 if (pResourceFontDict) 589 if (pResourceFontDict)
590 pResourceDict->SetAt("Font", pResourceFontDict); 590 pResourceDict->SetAt("Font", pResourceFontDict);
591 591
592 return pResourceDict; 592 return pResourceDict;
593 } 593 }
594 594
595 // Takes ownership of |pResourceDict|. 595 // Takes ownership of |pResourceDict|.
596 void GenerateAndSetAPDict(CPDF_Document* pDoc, 596 void GenerateAndSetAPDict(CPDF_Document* pDoc,
597 CPDF_Dictionary* pAnnotDict, 597 CPDF_Dictionary* pAnnotDict,
598 const CFX_ByteTextBuf& sAppStream, 598 const CFX_ByteTextBuf& sAppStream,
599 CPDF_Dictionary* pResourceDict) { 599 CPDF_Dictionary* pResourceDict,
600 bool bIsTextAnnotation) {
jaepark 2016/09/07 17:30:09 bIsTextMarkupAnnotation. In PDF annotation, there
tonikitoo 2016/09/08 04:10:35 Done.
600 CPDF_Dictionary* pAPDict = new CPDF_Dictionary; 601 CPDF_Dictionary* pAPDict = new CPDF_Dictionary;
601 pAnnotDict->SetAt("AP", pAPDict); 602 pAnnotDict->SetAt("AP", pAPDict);
602 603
603 CPDF_Stream* pNormalStream = new CPDF_Stream(nullptr, 0, nullptr); 604 CPDF_Stream* pNormalStream = new CPDF_Stream(nullptr, 0, nullptr);
604 int32_t objnum = pDoc->AddIndirectObject(pNormalStream); 605 int32_t objnum = pDoc->AddIndirectObject(pNormalStream);
605 pAnnotDict->GetDictBy("AP")->SetAtReference("N", pDoc, objnum); 606 pAnnotDict->GetDictBy("AP")->SetAtReference("N", pDoc, objnum);
606 607
607 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE, 608 pNormalStream->SetData(sAppStream.GetBuffer(), sAppStream.GetSize(), FALSE,
608 FALSE); 609 FALSE);
609 610
610 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict(); 611 CPDF_Dictionary* pStreamDict = pNormalStream->GetDict();
611 pStreamDict->SetAtInteger("FormType", 1); 612 pStreamDict->SetAtInteger("FormType", 1);
612 pStreamDict->SetAtString("Subtype", "Form"); 613 pStreamDict->SetAtString("Subtype", "Form");
613 pStreamDict->SetAtMatrix("Matrix", CFX_Matrix()); 614 pStreamDict->SetAtMatrix("Matrix", CFX_Matrix());
614 615
615 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); 616 CFX_FloatRect rect = bIsTextAnnotation ? CPDF_Annot::RectFromQuads(pAnnotDict)
617 : pAnnotDict->GetRectBy("Rect");
jaepark 2016/09/07 17:30:09 It seems like this and RectForDrawing is basically
tonikitoo 2016/09/08 04:10:35 Good point. Ideally yes, we could use RectForDrawi
616 pStreamDict->SetAtRect("BBox", rect); 618 pStreamDict->SetAtRect("BBox", rect);
617 619
618 pStreamDict->SetAt("Resources", pResourceDict); 620 pStreamDict->SetAt("Resources", pResourceDict);
619 } 621 }
620 622
621 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) { 623 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) {
622 if (bIsStrokeRect) 624 if (bIsStrokeRect)
623 return bIsFillRect ? "b" : "s"; 625 return bIsFillRect ? "b" : "s";
624 return bIsFillRect ? "f" : "n"; 626 return bIsFillRect ? "f" : "n";
625 } 627 }
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
786 << fMiddleX - fDeltaX << " " << rect.top << " " << fMiddleX << " " 788 << fMiddleX - fDeltaX << " " << rect.top << " " << fMiddleX << " "
787 << rect.top << " c\n"; 789 << rect.top << " c\n";
788 790
789 bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty(); 791 bool bIsFillRect = pInteriorColor && !pInteriorColor->IsEmpty();
790 sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n"; 792 sAppStream << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
791 793
792 CPDF_Dictionary* pExtGStateDict = 794 CPDF_Dictionary* pExtGStateDict =
793 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 795 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
794 CPDF_Dictionary* pResourceDict = 796 CPDF_Dictionary* pResourceDict =
795 GenerateResourceDict(pExtGStateDict, nullptr); 797 GenerateResourceDict(pExtGStateDict, nullptr);
796 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 798 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
799 false /*IsTextMarkupAnnotation*/);
797 return true; 800 return true;
798 } 801 }
799 802
800 bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc, 803 bool CPVT_GenerateAP::GenerateHighlightAP(CPDF_Document* pDoc,
801 CPDF_Dictionary* pAnnotDict) { 804 CPDF_Dictionary* pAnnotDict) {
802 CFX_ByteTextBuf sAppStream; 805 CFX_ByteTextBuf sAppStream;
803 CFX_ByteString sExtGSDictName = "GS"; 806 CFX_ByteString sExtGSDictName = "GS";
804 sAppStream << "/" << sExtGSDictName << " gs "; 807 sAppStream << "/" << sExtGSDictName << " gs ";
805 808
806 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), 809 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"),
807 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), 810 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
808 PaintOperation::FILL); 811 PaintOperation::FILL);
809 812
810 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); 813 CFX_FloatRect rect = CPDF_Annot::RectFromQuads(pAnnotDict);
811 rect.Normalize(); 814 rect.Normalize();
812 815
813 sAppStream << rect.left << " " << rect.top << " m " << rect.right << " " 816 sAppStream << rect.left << " " << rect.top << " m " << rect.right << " "
814 << rect.top << " l " << rect.right << " " << rect.bottom << " l " 817 << rect.top << " l " << rect.right << " " << rect.bottom << " l "
815 << rect.left << " " << rect.bottom << " l " 818 << rect.left << " " << rect.bottom << " l "
816 << "h f\n"; 819 << "h f\n";
817 820
818 CPDF_Dictionary* pExtGStateDict = 821 CPDF_Dictionary* pExtGStateDict =
819 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); 822 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply");
820 CPDF_Dictionary* pResourceDict = 823 CPDF_Dictionary* pResourceDict =
821 GenerateResourceDict(pExtGStateDict, nullptr); 824 GenerateResourceDict(pExtGStateDict, nullptr);
822 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 825 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
826 true /*IsTextMarkupAnnotation*/);
823 827
824 return true; 828 return true;
825 } 829 }
826 830
827 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc, 831 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc,
828 CPDF_Dictionary* pAnnotDict) { 832 CPDF_Dictionary* pAnnotDict) {
829 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); 833 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict);
830 bool bIsStroke = fBorderWidth > 0; 834 bool bIsStroke = fBorderWidth > 0;
831 835
832 if (!bIsStroke) 836 if (!bIsStroke)
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
866 << pInkCoordList->GetNumberAt(j + 1) << " l "; 870 << pInkCoordList->GetNumberAt(j + 1) << " l ";
867 } 871 }
868 872
869 sAppStream << "S\n"; 873 sAppStream << "S\n";
870 } 874 }
871 875
872 CPDF_Dictionary* pExtGStateDict = 876 CPDF_Dictionary* pExtGStateDict =
873 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 877 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
874 CPDF_Dictionary* pResourceDict = 878 CPDF_Dictionary* pResourceDict =
875 GenerateResourceDict(pExtGStateDict, nullptr); 879 GenerateResourceDict(pExtGStateDict, nullptr);
876 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 880 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
881 false /*IsTextMarkupAnnotation*/);
877 return true; 882 return true;
878 } 883 }
879 884
880 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc, 885 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc,
881 CPDF_Dictionary* pAnnotDict) { 886 CPDF_Dictionary* pAnnotDict) {
882 CFX_ByteTextBuf sAppStream; 887 CFX_ByteTextBuf sAppStream;
883 CFX_ByteString sExtGSDictName = "GS"; 888 CFX_ByteString sExtGSDictName = "GS";
884 sAppStream << "/" << sExtGSDictName << " gs "; 889 sAppStream << "/" << sExtGSDictName << " gs ";
885 890
886 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); 891 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect");
887 const FX_FLOAT fNoteLength = 20; 892 const FX_FLOAT fNoteLength = 20;
888 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength, 893 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength,
889 rect.bottom + fNoteLength); 894 rect.bottom + fNoteLength);
890 pAnnotDict->SetAtRect("Rect", noteRect); 895 pAnnotDict->SetAtRect("Rect", noteRect);
891 896
892 sAppStream << GenerateTextSymbolAP(noteRect); 897 sAppStream << GenerateTextSymbolAP(noteRect);
893 898
894 CPDF_Dictionary* pExtGStateDict = 899 CPDF_Dictionary* pExtGStateDict =
895 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 900 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
896 CPDF_Dictionary* pResourceDict = 901 CPDF_Dictionary* pResourceDict =
897 GenerateResourceDict(pExtGStateDict, nullptr); 902 GenerateResourceDict(pExtGStateDict, nullptr);
898 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 903 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
904 false /*IsTextMarkupAnnotation*/);
899 return true; 905 return true;
900 } 906 }
901 907
902 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, 908 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc,
903 CPDF_Dictionary* pAnnotDict) { 909 CPDF_Dictionary* pAnnotDict) {
904 CFX_ByteTextBuf sAppStream; 910 CFX_ByteTextBuf sAppStream;
905 CFX_ByteString sExtGSDictName = "GS"; 911 CFX_ByteString sExtGSDictName = "GS";
906 sAppStream << "/" << sExtGSDictName << " gs "; 912 sAppStream << "/" << sExtGSDictName << " gs ";
907 913
908 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), 914 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"),
909 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), 915 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
910 PaintOperation::STROKE); 916 PaintOperation::STROKE);
911 917
912 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); 918 CFX_FloatRect rect = CPDF_Annot::RectFromQuads(pAnnotDict);
913 rect.Normalize(); 919 rect.Normalize();
914 920
915 FX_FLOAT fLineWidth = 1.0; 921 FX_FLOAT fLineWidth = 1.0;
916 sAppStream << fLineWidth << " w " << rect.left << " " 922 sAppStream << fLineWidth << " w " << rect.left << " "
917 << rect.bottom + fLineWidth << " m " << rect.right << " " 923 << rect.bottom + fLineWidth << " m " << rect.right << " "
918 << rect.bottom + fLineWidth << " l S\n"; 924 << rect.bottom + fLineWidth << " l S\n";
919 925
920 CPDF_Dictionary* pExtGStateDict = 926 CPDF_Dictionary* pExtGStateDict =
921 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 927 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
922 CPDF_Dictionary* pResourceDict = 928 CPDF_Dictionary* pResourceDict =
923 GenerateResourceDict(pExtGStateDict, nullptr); 929 GenerateResourceDict(pExtGStateDict, nullptr);
924 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 930 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
931 true /*IsTextMarkupAnnotation*/);
925 return true; 932 return true;
926 } 933 }
927 934
928 bool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc, 935 bool CPVT_GenerateAP::GeneratePopupAP(CPDF_Document* pDoc,
929 CPDF_Dictionary* pAnnotDict) { 936 CPDF_Dictionary* pAnnotDict) {
930 CFX_ByteTextBuf sAppStream; 937 CFX_ByteTextBuf sAppStream;
931 CFX_ByteString sExtGSDictName = "GS"; 938 CFX_ByteString sExtGSDictName = "GS";
932 sAppStream << "/" << sExtGSDictName << " gs\n"; 939 sAppStream << "/" << sExtGSDictName << " gs\n";
933 940
934 sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), 941 sAppStream << GenerateColorAP(CPVT_Color(CPVT_Color::kRGB, 1, 1, 0),
(...skipping 17 matching lines...) Expand all
952 CPDF_Dictionary* pResourceFontDict = 959 CPDF_Dictionary* pResourceFontDict =
953 GenerateResourceFontDict(pDoc, sFontName); 960 GenerateResourceFontDict(pDoc, sFontName);
954 CPDF_Dictionary* pResourceDict = 961 CPDF_Dictionary* pResourceDict =
955 GenerateResourceDict(pResourceFontDict, pExtGStateDict); 962 GenerateResourceDict(pResourceFontDict, pExtGStateDict);
956 963
957 CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict); 964 CPDF_Font* pDefFont = pDoc->LoadFont(pResourceFontDict);
958 if (!pDefFont) 965 if (!pDefFont)
959 return false; 966 return false;
960 967
961 sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName); 968 sAppStream << GetPopupContentsString(pDoc, *pAnnotDict, pDefFont, sFontName);
962 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 969 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
970 false /*IsTextMarkupAnnotation*/);
963 return true; 971 return true;
964 } 972 }
965 973
966 bool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc, 974 bool CPVT_GenerateAP::GenerateSquareAP(CPDF_Document* pDoc,
967 CPDF_Dictionary* pAnnotDict) { 975 CPDF_Dictionary* pAnnotDict) {
968 CFX_ByteTextBuf sAppStream; 976 CFX_ByteTextBuf sAppStream;
969 CFX_ByteString sExtGSDictName = "GS"; 977 CFX_ByteString sExtGSDictName = "GS";
970 sAppStream << "/" << sExtGSDictName << " gs "; 978 sAppStream << "/" << sExtGSDictName << " gs ";
971 979
972 CPDF_Array* pInteriorColor = pAnnotDict->GetArrayBy("IC"); 980 CPDF_Array* pInteriorColor = pAnnotDict->GetArrayBy("IC");
(...skipping 26 matching lines...) Expand all
999 bool bIsFillRect = pInteriorColor && (pInteriorColor->GetCount() > 0); 1007 bool bIsFillRect = pInteriorColor && (pInteriorColor->GetCount() > 0);
1000 1008
1001 sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " " 1009 sAppStream << rect.left << " " << rect.bottom << " " << rect.Width() << " "
1002 << rect.Height() << " re " 1010 << rect.Height() << " re "
1003 << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n"; 1011 << GetPaintOperatorString(bIsStrokeRect, bIsFillRect) << "\n";
1004 1012
1005 CPDF_Dictionary* pExtGStateDict = 1013 CPDF_Dictionary* pExtGStateDict =
1006 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 1014 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
1007 CPDF_Dictionary* pResourceDict = 1015 CPDF_Dictionary* pResourceDict =
1008 GenerateResourceDict(pExtGStateDict, nullptr); 1016 GenerateResourceDict(pExtGStateDict, nullptr);
1009 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 1017 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
1018 false /*IsTextMarkupAnnotation*/);
1010 return true; 1019 return true;
1011 } 1020 }
1012 1021
1013 bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc, 1022 bool CPVT_GenerateAP::GenerateSquigglyAP(CPDF_Document* pDoc,
1014 CPDF_Dictionary* pAnnotDict) { 1023 CPDF_Dictionary* pAnnotDict) {
1015 CFX_ByteTextBuf sAppStream; 1024 CFX_ByteTextBuf sAppStream;
1016 CFX_ByteString sExtGSDictName = "GS"; 1025 CFX_ByteString sExtGSDictName = "GS";
1017 sAppStream << "/" << sExtGSDictName << " gs "; 1026 sAppStream << "/" << sExtGSDictName << " gs ";
1018 1027
1019 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), 1028 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"),
1020 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), 1029 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
1021 PaintOperation::STROKE); 1030 PaintOperation::STROKE);
1022 1031
1023 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); 1032 CFX_FloatRect rect = CPDF_Annot::RectFromQuads(pAnnotDict);
1024 rect.Normalize(); 1033 rect.Normalize();
1025 1034
1026 FX_FLOAT fLineWidth = 1.0; 1035 FX_FLOAT fLineWidth = 1.0;
1027 sAppStream << fLineWidth << " w "; 1036 sAppStream << fLineWidth << " w ";
1028 1037
1029 const FX_FLOAT fDelta = 2.0; 1038 const FX_FLOAT fDelta = 2.0;
1030 const FX_FLOAT fTop = rect.bottom + fDelta; 1039 const FX_FLOAT fTop = rect.bottom + fDelta;
1031 const FX_FLOAT fBottom = rect.bottom; 1040 const FX_FLOAT fBottom = rect.bottom;
1032 1041
1033 sAppStream << rect.left << " " << fTop << " m "; 1042 sAppStream << rect.left << " " << fTop << " m ";
(...skipping 13 matching lines...) Expand all
1047 sAppStream << rect.right << " " << fBottom + fRemainder << " l "; 1056 sAppStream << rect.right << " " << fBottom + fRemainder << " l ";
1048 else 1057 else
1049 sAppStream << rect.right << " " << fTop - fRemainder << " l "; 1058 sAppStream << rect.right << " " << fTop - fRemainder << " l ";
1050 1059
1051 sAppStream << "S\n"; 1060 sAppStream << "S\n";
1052 1061
1053 CPDF_Dictionary* pExtGStateDict = 1062 CPDF_Dictionary* pExtGStateDict =
1054 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 1063 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
1055 CPDF_Dictionary* pResourceDict = 1064 CPDF_Dictionary* pResourceDict =
1056 GenerateResourceDict(pExtGStateDict, nullptr); 1065 GenerateResourceDict(pExtGStateDict, nullptr);
1057 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 1066 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
1067 true /*IsTextMarkupAnnotation*/);
1058 return true; 1068 return true;
1059 } 1069 }
1060 1070
1061 bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc, 1071 bool CPVT_GenerateAP::GenerateStrikeOutAP(CPDF_Document* pDoc,
1062 CPDF_Dictionary* pAnnotDict) { 1072 CPDF_Dictionary* pAnnotDict) {
1063 CFX_ByteTextBuf sAppStream; 1073 CFX_ByteTextBuf sAppStream;
1064 CFX_ByteString sExtGSDictName = "GS"; 1074 CFX_ByteString sExtGSDictName = "GS";
1065 sAppStream << "/" << sExtGSDictName << " gs "; 1075 sAppStream << "/" << sExtGSDictName << " gs ";
1066 1076
1067 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), 1077 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"),
1068 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), 1078 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0),
1069 PaintOperation::STROKE); 1079 PaintOperation::STROKE);
1070 1080
1071 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); 1081 CFX_FloatRect rect = CPDF_Annot::RectFromQuads(pAnnotDict);
1072 rect.Normalize(); 1082 rect.Normalize();
1073 1083
1074 FX_FLOAT fLineWidth = 1.0; 1084 FX_FLOAT fLineWidth = 1.0;
1075 FX_FLOAT fY = (rect.top + rect.bottom) / 2; 1085 FX_FLOAT fY = (rect.top + rect.bottom) / 2;
1076 sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m " 1086 sAppStream << fLineWidth << " w " << rect.left << " " << fY << " m "
1077 << rect.right << " " << fY << " l S\n"; 1087 << rect.right << " " << fY << " l S\n";
1078 1088
1079 CPDF_Dictionary* pExtGStateDict = 1089 CPDF_Dictionary* pExtGStateDict =
1080 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); 1090 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal");
1081 CPDF_Dictionary* pResourceDict = 1091 CPDF_Dictionary* pResourceDict =
1082 GenerateResourceDict(pExtGStateDict, nullptr); 1092 GenerateResourceDict(pExtGStateDict, nullptr);
1083 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict); 1093 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pResourceDict,
1094 true /*IsTextMarkupAnnotation*/);
1084 return true; 1095 return true;
1085 } 1096 }
1086 1097
1087 // Static. 1098 // Static.
1088 CFX_ByteString CPVT_GenerateAP::GenerateEditAP( 1099 CFX_ByteString CPVT_GenerateAP::GenerateEditAP(
1089 IPVT_FontMap* pFontMap, 1100 IPVT_FontMap* pFontMap,
1090 CPDF_VariableText::Iterator* pIterator, 1101 CPDF_VariableText::Iterator* pIterator,
1091 const CFX_FloatPoint& ptOffset, 1102 const CFX_FloatPoint& ptOffset,
1092 FX_BOOL bContinuous, 1103 FX_BOOL bContinuous,
1093 uint16_t SubWord) { 1104 uint16_t SubWord) {
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 int32_t nFontIndex, 1356 int32_t nFontIndex,
1346 FX_FLOAT fFontSize) { 1357 FX_FLOAT fFontSize) {
1347 CFX_ByteTextBuf sRet; 1358 CFX_ByteTextBuf sRet;
1348 if (pFontMap) { 1359 if (pFontMap) {
1349 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); 1360 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex);
1350 if (sFontAlias.GetLength() > 0 && fFontSize > 0) 1361 if (sFontAlias.GetLength() > 0 && fFontSize > 0)
1351 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; 1362 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n";
1352 } 1363 }
1353 return sRet.MakeString(); 1364 return sRet.MakeString();
1354 } 1365 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698