OLD | NEW |
---|---|
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 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
711 << rect.left << " " << rect.bottom << " l " | 711 << rect.left << " " << rect.bottom << " l " |
712 << "h f\n"; | 712 << "h f\n"; |
713 | 713 |
714 CPDF_Dictionary* pExtGStateDict = | 714 CPDF_Dictionary* pExtGStateDict = |
715 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); | 715 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Multiply"); |
716 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pExtGStateDict); | 716 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pExtGStateDict); |
717 | 717 |
718 return true; | 718 return true; |
719 } | 719 } |
720 | 720 |
721 bool CPVT_GenerateAP::GenerateInkAP(CPDF_Document* pDoc, | |
722 CPDF_Dictionary* pAnnotDict) { | |
723 // If AP dictionary exists, we use the appearance defined in the | |
724 // existing AP dictionary. | |
725 if (pAnnotDict->KeyExist("AP")) | |
726 return false; | |
727 | |
728 FX_FLOAT fBorderWidth = GetBorderWidth(*pAnnotDict); | |
729 bool bIsStroke = fBorderWidth > 0; | |
730 | |
731 if (!bIsStroke) | |
732 return false; | |
733 | |
734 CPDF_Array* pInkList = pAnnotDict->GetArrayBy("InkList"); | |
735 if (!pInkList || pInkList->IsEmpty()) | |
736 return false; | |
737 | |
738 CFX_ByteTextBuf sAppStream; | |
739 CFX_ByteString sExtGSDictName = "GS"; | |
740 sAppStream << "/" << sExtGSDictName << " gs "; | |
741 | |
742 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | |
743 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), | |
744 PaintOperation::STROKE); | |
745 | |
746 sAppStream << fBorderWidth << " w "; | |
747 sAppStream << GetDashPatternString(*pAnnotDict); | |
748 | |
749 // Set inflated rect as a new rect because paths near the border with large | |
750 // width should not be clipped to the original rect. | |
751 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | |
752 rect.Inflate(fBorderWidth / 2, fBorderWidth / 2); | |
753 pAnnotDict->SetAtRect("Rect", rect); | |
754 | |
755 for (size_t i = 0; i < pInkList->GetCount(); i++) { | |
756 CPDF_Array* pInkCoordList = pInkList->GetArrayAt(i); | |
757 if (!pInkCoordList || pInkCoordList->GetCount() < 2) | |
758 continue; | |
759 | |
760 sAppStream << pInkCoordList->GetNumberAt(0) << " " | |
761 << pInkCoordList->GetNumberAt(1) << " m "; | |
762 | |
763 for (size_t i = 0; i < pInkCoordList->GetCount() - 1; i += 2) { | |
Lei Zhang
2016/08/09 21:38:57
This |i| is a shadow variable. Time for |j|.
jaepark
2016/08/09 22:19:09
Done.
| |
764 sAppStream << pInkCoordList->GetNumberAt(i) << " " | |
765 << pInkCoordList->GetNumberAt(i + 1) << " l "; | |
766 } | |
767 | |
768 sAppStream << "S\n"; | |
769 } | |
770 | |
771 CPDF_Dictionary* pExtGStateDict = | |
772 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | |
773 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pExtGStateDict); | |
774 return true; | |
775 } | |
776 | |
721 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, | 777 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, |
722 CPDF_Dictionary* pAnnotDict) { | 778 CPDF_Dictionary* pAnnotDict) { |
723 // If AP dictionary exists, we use the appearance defined in the | 779 // If AP dictionary exists, we use the appearance defined in the |
724 // existing AP dictionary. | 780 // existing AP dictionary. |
725 if (pAnnotDict->KeyExist("AP")) | 781 if (pAnnotDict->KeyExist("AP")) |
726 return false; | 782 return false; |
727 | 783 |
728 CFX_ByteTextBuf sAppStream; | 784 CFX_ByteTextBuf sAppStream; |
729 CFX_ByteString sExtGSDictName = "GS"; | 785 CFX_ByteString sExtGSDictName = "GS"; |
730 sAppStream << "/" << sExtGSDictName << " gs "; | 786 sAppStream << "/" << sExtGSDictName << " gs "; |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1138 int32_t nFontIndex, | 1194 int32_t nFontIndex, |
1139 FX_FLOAT fFontSize) { | 1195 FX_FLOAT fFontSize) { |
1140 CFX_ByteTextBuf sRet; | 1196 CFX_ByteTextBuf sRet; |
1141 if (pFontMap) { | 1197 if (pFontMap) { |
1142 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); | 1198 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); |
1143 if (sFontAlias.GetLength() > 0 && fFontSize > 0) | 1199 if (sFontAlias.GetLength() > 0 && fFontSize > 0) |
1144 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; | 1200 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; |
1145 } | 1201 } |
1146 return sRet.MakeString(); | 1202 return sRet.MakeString(); |
1147 } | 1203 } |
OLD | NEW |