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 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
556 | 556 |
557 pStreamDict->SetAt("Resources", pResourceDict); | 557 pStreamDict->SetAt("Resources", pResourceDict); |
558 } | 558 } |
559 | 559 |
560 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) { | 560 CFX_ByteString GetPaintOperatorString(bool bIsStrokeRect, bool bIsFillRect) { |
561 if (bIsStrokeRect) | 561 if (bIsStrokeRect) |
562 return bIsFillRect ? "b" : "s"; | 562 return bIsFillRect ? "b" : "s"; |
563 return bIsFillRect ? "f" : "n"; | 563 return bIsFillRect ? "f" : "n"; |
564 } | 564 } |
565 | 565 |
566 CFX_ByteString GenerateTextSymbolAP(const CFX_FloatRect& rect) { | |
567 CFX_ByteTextBuf sAppStream; | |
568 sAppStream << CPVT_GenerateAP::GenerateColorAP( | |
569 CPVT_Color(CPVT_Color::kRGB, 1, 1, 0), PaintOperation::FILL); | |
570 sAppStream << CPVT_GenerateAP::GenerateColorAP( | |
571 CPVT_Color(CPVT_Color::kRGB, 0, 0, 0), PaintOperation::STROKE); | |
572 | |
573 const FX_FLOAT fBorderWidth = 1; | |
574 sAppStream << fBorderWidth << " w\n"; | |
575 | |
576 const FX_FLOAT fHalfWidth = fBorderWidth / 2; | |
577 const FX_FLOAT fTipDelta = 4; | |
578 | |
579 const FX_FLOAT fLeftBound = rect.left + fHalfWidth; | |
Lei Zhang
2016/08/22 22:53:38
Can we create a new FloatRect, Inflate() it, and u
jaepark
2016/08/22 23:19:51
Done.
| |
580 const FX_FLOAT fRightBound = rect.right - fHalfWidth; | |
581 const FX_FLOAT fBottomBound = rect.bottom + fHalfWidth; | |
582 const FX_FLOAT fTopBound = rect.top - fHalfWidth; | |
583 | |
584 // Draw outer box. | |
585 sAppStream << fLeftBound << " " << fBottomBound + fTipDelta << " m\n" | |
586 << fLeftBound << " " << fTopBound << " l\n" | |
587 << fRightBound << " " << fTopBound << " l\n" | |
588 << fRightBound << " " << fBottomBound + fTipDelta << " l\n" | |
589 << fLeftBound + (2 * fTipDelta) << " " << fBottomBound + fTipDelta | |
590 << " l\n" | |
591 << fLeftBound + fTipDelta + (fTipDelta / 2) << " " << fBottomBound | |
592 << " l\n" | |
593 << fLeftBound + fTipDelta << " " << fBottomBound + fTipDelta | |
594 << " l\n" | |
595 << fLeftBound + fTipDelta << " " << fBottomBound + fTipDelta | |
596 << " l\n" | |
597 << fLeftBound << " " << fBottomBound + fTipDelta << " l\n"; | |
598 | |
599 // Draw inner lines. | |
600 const FX_FLOAT fXDelta = 2; | |
601 const FX_FLOAT fYDelta = (fTopBound - (fBottomBound + fTipDelta)) / 4; | |
602 sAppStream << fLeftBound + fXDelta << " " << fTopBound - fYDelta << " m\n" | |
603 << fRightBound - fXDelta << " " << fTopBound - fYDelta << " l\n" | |
604 << fLeftBound + fXDelta << " " << fTopBound - (2 * fYDelta) | |
605 << " m\n" | |
606 << fRightBound - fXDelta << " " << fTopBound - (2 * fYDelta) | |
607 << " l\n" | |
608 << fLeftBound + fXDelta << " " << fTopBound - (3 * fYDelta) | |
609 << " m\n" | |
610 << fRightBound - fXDelta << " " << fTopBound - (3 * fYDelta) | |
611 << " l\n" | |
612 << "B*\n"; | |
613 | |
614 return sAppStream.MakeString(); | |
615 } | |
616 | |
566 bool ShouldGenerateAPForAnnotation(CPDF_Dictionary* pAnnotDict) { | 617 bool ShouldGenerateAPForAnnotation(CPDF_Dictionary* pAnnotDict) { |
567 // If AP dictionary exists, we use the appearance defined in the | 618 // If AP dictionary exists, we use the appearance defined in the |
568 // existing AP dictionary. | 619 // existing AP dictionary. |
569 if (pAnnotDict->KeyExist("AP")) | 620 if (pAnnotDict->KeyExist("AP")) |
570 return false; | 621 return false; |
571 | 622 |
572 return !CPDF_Annot::IsAnnotationHidden(pAnnotDict); | 623 return !CPDF_Annot::IsAnnotationHidden(pAnnotDict); |
573 } | 624 } |
574 | 625 |
575 } // namespace | 626 } // namespace |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
771 | 822 |
772 sAppStream << "S\n"; | 823 sAppStream << "S\n"; |
773 } | 824 } |
774 | 825 |
775 CPDF_Dictionary* pExtGStateDict = | 826 CPDF_Dictionary* pExtGStateDict = |
776 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | 827 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); |
777 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pExtGStateDict); | 828 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pExtGStateDict); |
778 return true; | 829 return true; |
779 } | 830 } |
780 | 831 |
832 bool CPVT_GenerateAP::GenerateTextAP(CPDF_Document* pDoc, | |
833 CPDF_Dictionary* pAnnotDict) { | |
834 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | |
835 return false; | |
836 | |
837 CFX_ByteTextBuf sAppStream; | |
838 CFX_ByteString sExtGSDictName = "GS"; | |
839 sAppStream << "/" << sExtGSDictName << " gs "; | |
840 | |
841 CFX_FloatRect rect = pAnnotDict->GetRectBy("Rect"); | |
842 const FX_FLOAT fNoteLength = 20; | |
843 CFX_FloatRect noteRect(rect.left, rect.bottom, rect.left + fNoteLength, | |
844 rect.bottom + fNoteLength); | |
845 pAnnotDict->SetAtRect("Rect", noteRect); | |
846 | |
847 sAppStream << GenerateTextSymbolAP(noteRect); | |
848 | |
849 CPDF_Dictionary* pExtGStateDict = | |
850 GenerateExtGStateDict(*pAnnotDict, sExtGSDictName, "Normal"); | |
851 GenerateAndSetAPDict(pDoc, pAnnotDict, sAppStream, pExtGStateDict); | |
852 | |
853 return true; | |
854 } | |
855 | |
781 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, | 856 bool CPVT_GenerateAP::GenerateUnderlineAP(CPDF_Document* pDoc, |
782 CPDF_Dictionary* pAnnotDict) { | 857 CPDF_Dictionary* pAnnotDict) { |
783 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) | 858 if (!ShouldGenerateAPForAnnotation(pAnnotDict)) |
784 return false; | 859 return false; |
785 | 860 |
786 CFX_ByteTextBuf sAppStream; | 861 CFX_ByteTextBuf sAppStream; |
787 CFX_ByteString sExtGSDictName = "GS"; | 862 CFX_ByteString sExtGSDictName = "GS"; |
788 sAppStream << "/" << sExtGSDictName << " gs "; | 863 sAppStream << "/" << sExtGSDictName << " gs "; |
789 | 864 |
790 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), | 865 sAppStream << GetColorStringWithDefault(pAnnotDict->GetArrayBy("C"), |
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1190 int32_t nFontIndex, | 1265 int32_t nFontIndex, |
1191 FX_FLOAT fFontSize) { | 1266 FX_FLOAT fFontSize) { |
1192 CFX_ByteTextBuf sRet; | 1267 CFX_ByteTextBuf sRet; |
1193 if (pFontMap) { | 1268 if (pFontMap) { |
1194 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); | 1269 CFX_ByteString sFontAlias = pFontMap->GetPDFFontAlias(nFontIndex); |
1195 if (sFontAlias.GetLength() > 0 && fFontSize > 0) | 1270 if (sFontAlias.GetLength() > 0 && fFontSize > 0) |
1196 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; | 1271 sRet << "/" << sFontAlias << " " << fFontSize << " Tf\n"; |
1197 } | 1272 } |
1198 return sRet.MakeString(); | 1273 return sRet.MakeString(); |
1199 } | 1274 } |
OLD | NEW |