OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 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/fpdfapi/fpdf_parser/include/cpdf_document.h" | 7 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h" |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <set> | 10 #include <set> |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 basefont += ",Bold"; | 377 basefont += ",Bold"; |
378 else if (italic) | 378 else if (italic) |
379 basefont += ",Italic"; | 379 basefont += ",Italic"; |
380 pBaseDict->SetNameFor("Subtype", "TrueType"); | 380 pBaseDict->SetNameFor("Subtype", "TrueType"); |
381 pBaseDict->SetNameFor("BaseFont", basefont); | 381 pBaseDict->SetNameFor("BaseFont", basefont); |
382 pBaseDict->SetNumberFor("FirstChar", 32); | 382 pBaseDict->SetNumberFor("FirstChar", 32); |
383 pBaseDict->SetNumberFor("LastChar", 255); | 383 pBaseDict->SetNumberFor("LastChar", 255); |
384 pBaseDict->SetFor("Widths", pWidths); | 384 pBaseDict->SetFor("Widths", pWidths); |
385 } | 385 } |
386 | 386 |
387 CPDF_Dictionary* CalculateFontDesc(CFX_ByteString basefont, | 387 CPDF_Dictionary* CalculateFontDesc(CPDF_Document* pDoc, |
| 388 CFX_ByteString basefont, |
388 int flags, | 389 int flags, |
389 int italicangle, | 390 int italicangle, |
390 int ascend, | 391 int ascend, |
391 int descend, | 392 int descend, |
392 CPDF_Array* bbox, | 393 CPDF_Array* bbox, |
393 int32_t stemV) { | 394 int32_t stemV) { |
394 CPDF_Dictionary* pFontDesc = new CPDF_Dictionary; | 395 CPDF_Dictionary* pFontDesc = new CPDF_Dictionary(pDoc->GetByteStringPool()); |
395 pFontDesc->SetNameFor("Type", "FontDescriptor"); | 396 pFontDesc->SetNameFor("Type", "FontDescriptor"); |
396 pFontDesc->SetNameFor("FontName", basefont); | 397 pFontDesc->SetNameFor("FontName", basefont); |
397 pFontDesc->SetIntegerFor("Flags", flags); | 398 pFontDesc->SetIntegerFor("Flags", flags); |
398 pFontDesc->SetFor("FontBBox", bbox); | 399 pFontDesc->SetFor("FontBBox", bbox); |
399 pFontDesc->SetIntegerFor("ItalicAngle", italicangle); | 400 pFontDesc->SetIntegerFor("ItalicAngle", italicangle); |
400 pFontDesc->SetIntegerFor("Ascent", ascend); | 401 pFontDesc->SetIntegerFor("Ascent", ascend); |
401 pFontDesc->SetIntegerFor("Descent", descend); | 402 pFontDesc->SetIntegerFor("Descent", descend); |
402 pFontDesc->SetIntegerFor("StemV", stemV); | 403 pFontDesc->SetIntegerFor("StemV", stemV); |
403 return pFontDesc; | 404 return pFontDesc; |
404 } | 405 } |
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
673 CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj) { | 674 CPDF_Image* CPDF_Document::LoadImageF(CPDF_Object* pObj) { |
674 if (!pObj) | 675 if (!pObj) |
675 return nullptr; | 676 return nullptr; |
676 | 677 |
677 ASSERT(pObj->GetObjNum()); | 678 ASSERT(pObj->GetObjNum()); |
678 return m_pDocPage->GetImage(pObj); | 679 return m_pDocPage->GetImage(pObj); |
679 } | 680 } |
680 | 681 |
681 void CPDF_Document::CreateNewDoc() { | 682 void CPDF_Document::CreateNewDoc() { |
682 ASSERT(!m_pRootDict && !m_pInfoDict); | 683 ASSERT(!m_pRootDict && !m_pInfoDict); |
683 m_pRootDict = new CPDF_Dictionary; | 684 m_pRootDict = new CPDF_Dictionary(&m_ByteStringPool); |
684 m_pRootDict->SetNameFor("Type", "Catalog"); | 685 m_pRootDict->SetNameFor("Type", "Catalog"); |
685 int objnum = AddIndirectObject(m_pRootDict); | 686 int objnum = AddIndirectObject(m_pRootDict); |
686 CPDF_Dictionary* pPages = new CPDF_Dictionary; | 687 CPDF_Dictionary* pPages = new CPDF_Dictionary(&m_ByteStringPool); |
687 pPages->SetNameFor("Type", "Pages"); | 688 pPages->SetNameFor("Type", "Pages"); |
688 pPages->SetNumberFor("Count", 0); | 689 pPages->SetNumberFor("Count", 0); |
689 pPages->SetFor("Kids", new CPDF_Array); | 690 pPages->SetFor("Kids", new CPDF_Array); |
690 objnum = AddIndirectObject(pPages); | 691 objnum = AddIndirectObject(pPages); |
691 m_pRootDict->SetReferenceFor("Pages", this, objnum); | 692 m_pRootDict->SetReferenceFor("Pages", this, objnum); |
692 m_pInfoDict = new CPDF_Dictionary; | 693 m_pInfoDict = new CPDF_Dictionary(&m_ByteStringPool); |
693 AddIndirectObject(m_pInfoDict); | 694 AddIndirectObject(m_pInfoDict); |
694 } | 695 } |
695 | 696 |
696 CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage) { | 697 CPDF_Dictionary* CPDF_Document::CreateNewPage(int iPage) { |
697 CPDF_Dictionary* pDict = new CPDF_Dictionary; | 698 CPDF_Dictionary* pDict = new CPDF_Dictionary(&m_ByteStringPool); |
698 pDict->SetNameFor("Type", "Page"); | 699 pDict->SetNameFor("Type", "Page"); |
699 uint32_t dwObjNum = AddIndirectObject(pDict); | 700 uint32_t dwObjNum = AddIndirectObject(pDict); |
700 if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) { | 701 if (InsertNewPage(this, iPage, pDict, m_PageList) < 0) { |
701 ReleaseIndirectObject(dwObjNum); | 702 ReleaseIndirectObject(dwObjNum); |
702 return nullptr; | 703 return nullptr; |
703 } | 704 } |
704 return pDict; | 705 return pDict; |
705 } | 706 } |
706 | 707 |
707 void CPDF_Document::DeletePage(int iPage) { | 708 void CPDF_Document::DeletePage(int iPage) { |
(...skipping 22 matching lines...) Expand all Loading... |
730 | 731 |
731 size_t CPDF_Document::CalculateEncodingDict(int charset, | 732 size_t CPDF_Document::CalculateEncodingDict(int charset, |
732 CPDF_Dictionary* pBaseDict) { | 733 CPDF_Dictionary* pBaseDict) { |
733 size_t i; | 734 size_t i; |
734 for (i = 0; i < FX_ArraySize(g_FX_CharsetUnicodes); ++i) { | 735 for (i = 0; i < FX_ArraySize(g_FX_CharsetUnicodes); ++i) { |
735 if (g_FX_CharsetUnicodes[i].m_Charset == charset) | 736 if (g_FX_CharsetUnicodes[i].m_Charset == charset) |
736 break; | 737 break; |
737 } | 738 } |
738 if (i == FX_ArraySize(g_FX_CharsetUnicodes)) | 739 if (i == FX_ArraySize(g_FX_CharsetUnicodes)) |
739 return i; | 740 return i; |
740 CPDF_Dictionary* pEncodingDict = new CPDF_Dictionary; | 741 CPDF_Dictionary* pEncodingDict = new CPDF_Dictionary(&m_ByteStringPool); |
741 pEncodingDict->SetNameFor("BaseEncoding", "WinAnsiEncoding"); | 742 pEncodingDict->SetNameFor("BaseEncoding", "WinAnsiEncoding"); |
742 CPDF_Array* pArray = new CPDF_Array; | 743 CPDF_Array* pArray = new CPDF_Array; |
743 pArray->AddInteger(128); | 744 pArray->AddInteger(128); |
744 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; | 745 const uint16_t* pUnicodes = g_FX_CharsetUnicodes[i].m_pUnicodes; |
745 for (int j = 0; j < 128; j++) { | 746 for (int j = 0; j < 128; j++) { |
746 CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); | 747 CFX_ByteString name = PDF_AdobeNameFromUnicode(pUnicodes[j]); |
747 pArray->AddName(name.IsEmpty() ? ".notdef" : name); | 748 pArray->AddName(name.IsEmpty() ? ".notdef" : name); |
748 } | 749 } |
749 pEncodingDict->SetFor("Differences", pArray); | 750 pEncodingDict->SetFor("Differences", pArray); |
750 AddIndirectObject(pEncodingDict); | 751 AddIndirectObject(pEncodingDict); |
751 pBaseDict->SetReferenceFor("Encoding", this, pEncodingDict); | 752 pBaseDict->SetReferenceFor("Encoding", this, pEncodingDict); |
752 return i; | 753 return i; |
753 } | 754 } |
754 | 755 |
755 CPDF_Dictionary* CPDF_Document::ProcessbCJK( | 756 CPDF_Dictionary* CPDF_Document::ProcessbCJK( |
756 CPDF_Dictionary* pBaseDict, | 757 CPDF_Dictionary* pBaseDict, |
757 int charset, | 758 int charset, |
758 FX_BOOL bVert, | 759 FX_BOOL bVert, |
759 CFX_ByteString basefont, | 760 CFX_ByteString basefont, |
760 std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) { | 761 std::function<void(FX_WCHAR, FX_WCHAR, CPDF_Array*)> Insert) { |
761 CPDF_Dictionary* pFontDict = new CPDF_Dictionary; | 762 CPDF_Dictionary* pFontDict = new CPDF_Dictionary(&m_ByteStringPool); |
762 CFX_ByteString cmap; | 763 CFX_ByteString cmap; |
763 CFX_ByteString ordering; | 764 CFX_ByteString ordering; |
764 int supplement = 0; | 765 int supplement = 0; |
765 CPDF_Array* pWidthArray = new CPDF_Array; | 766 CPDF_Array* pWidthArray = new CPDF_Array; |
766 switch (charset) { | 767 switch (charset) { |
767 case FXFONT_CHINESEBIG5_CHARSET: | 768 case FXFONT_CHINESEBIG5_CHARSET: |
768 cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; | 769 cmap = bVert ? "ETenms-B5-V" : "ETenms-B5-H"; |
769 ordering = "CNS1"; | 770 ordering = "CNS1"; |
770 supplement = 4; | 771 supplement = 4; |
771 pWidthArray->AddInteger(1); | 772 pWidthArray->AddInteger(1); |
(...skipping 29 matching lines...) Expand all Loading... |
801 Insert(0x7e, 0x7e, pWidthArray); | 802 Insert(0x7e, 0x7e, pWidthArray); |
802 break; | 803 break; |
803 } | 804 } |
804 pBaseDict->SetNameFor("Subtype", "Type0"); | 805 pBaseDict->SetNameFor("Subtype", "Type0"); |
805 pBaseDict->SetNameFor("BaseFont", basefont); | 806 pBaseDict->SetNameFor("BaseFont", basefont); |
806 pBaseDict->SetNameFor("Encoding", cmap); | 807 pBaseDict->SetNameFor("Encoding", cmap); |
807 pFontDict->SetFor("W", pWidthArray); | 808 pFontDict->SetFor("W", pWidthArray); |
808 pFontDict->SetNameFor("Type", "Font"); | 809 pFontDict->SetNameFor("Type", "Font"); |
809 pFontDict->SetNameFor("Subtype", "CIDFontType2"); | 810 pFontDict->SetNameFor("Subtype", "CIDFontType2"); |
810 pFontDict->SetNameFor("BaseFont", basefont); | 811 pFontDict->SetNameFor("BaseFont", basefont); |
811 CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary; | 812 CPDF_Dictionary* pCIDSysInfo = new CPDF_Dictionary(&m_ByteStringPool); |
812 pCIDSysInfo->SetStringFor("Registry", "Adobe"); | 813 pCIDSysInfo->SetStringFor("Registry", "Adobe"); |
813 pCIDSysInfo->SetStringFor("Ordering", ordering); | 814 pCIDSysInfo->SetStringFor("Ordering", ordering); |
814 pCIDSysInfo->SetIntegerFor("Supplement", supplement); | 815 pCIDSysInfo->SetIntegerFor("Supplement", supplement); |
815 pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); | 816 pFontDict->SetFor("CIDSystemInfo", pCIDSysInfo); |
816 CPDF_Array* pArray = new CPDF_Array; | 817 CPDF_Array* pArray = new CPDF_Array; |
817 pBaseDict->SetFor("DescendantFonts", pArray); | 818 pBaseDict->SetFor("DescendantFonts", pArray); |
818 AddIndirectObject(pFontDict); | 819 AddIndirectObject(pFontDict); |
819 pArray->AddReference(this, pFontDict); | 820 pArray->AddReference(this, pFontDict); |
820 return pFontDict; | 821 return pFontDict; |
821 } | 822 } |
822 | 823 |
823 CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { | 824 CPDF_Font* CPDF_Document::AddFont(CFX_Font* pFont, int charset, FX_BOOL bVert) { |
824 if (!pFont) | 825 if (!pFont) |
825 return nullptr; | 826 return nullptr; |
826 | 827 |
827 bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || | 828 bool bCJK = charset == FXFONT_CHINESEBIG5_CHARSET || |
828 charset == FXFONT_GB2312_CHARSET || | 829 charset == FXFONT_GB2312_CHARSET || |
829 charset == FXFONT_HANGUL_CHARSET || | 830 charset == FXFONT_HANGUL_CHARSET || |
830 charset == FXFONT_SHIFTJIS_CHARSET; | 831 charset == FXFONT_SHIFTJIS_CHARSET; |
831 CFX_ByteString basefont = pFont->GetFamilyName(); | 832 CFX_ByteString basefont = pFont->GetFamilyName(); |
832 basefont.Replace(" ", ""); | 833 basefont.Replace(" ", ""); |
833 int flags = | 834 int flags = |
834 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), | 835 CalculateFlags(pFont->IsBold(), pFont->IsItalic(), pFont->IsFixedWidth(), |
835 false, false, charset == FXFONT_SYMBOL_CHARSET); | 836 false, false, charset == FXFONT_SYMBOL_CHARSET); |
836 | 837 |
837 CPDF_Dictionary* pBaseDict = new CPDF_Dictionary; | 838 CPDF_Dictionary* pBaseDict = new CPDF_Dictionary(&m_ByteStringPool); |
838 pBaseDict->SetNameFor("Type", "Font"); | 839 pBaseDict->SetNameFor("Type", "Font"); |
839 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( | 840 std::unique_ptr<CFX_UnicodeEncoding> pEncoding( |
840 new CFX_UnicodeEncoding(pFont)); | 841 new CFX_UnicodeEncoding(pFont)); |
841 CPDF_Dictionary* pFontDict = pBaseDict; | 842 CPDF_Dictionary* pFontDict = pBaseDict; |
842 if (!bCJK) { | 843 if (!bCJK) { |
843 CPDF_Array* pWidths = new CPDF_Array; | 844 CPDF_Array* pWidths = new CPDF_Array; |
844 for (int charcode = 32; charcode < 128; charcode++) { | 845 for (int charcode = 32; charcode < 128; charcode++) { |
845 int glyph_index = pEncoding->GlyphFromCharCode(charcode); | 846 int glyph_index = pEncoding->GlyphFromCharCode(charcode); |
846 int char_width = pFont->GetGlyphWidth(glyph_index); | 847 int char_width = pFont->GetGlyphWidth(glyph_index); |
847 pWidths->AddInteger(char_width); | 848 pWidths->AddInteger(char_width); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); | 895 uint32_t glyph = pEncoding->GlyphFromCharCode(stem_chars[0]); |
895 nStemV = pFont->GetGlyphWidth(glyph); | 896 nStemV = pFont->GetGlyphWidth(glyph); |
896 for (size_t i = 1; i < count; i++) { | 897 for (size_t i = 1; i < count; i++) { |
897 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); | 898 glyph = pEncoding->GlyphFromCharCode(stem_chars[i]); |
898 int width = pFont->GetGlyphWidth(glyph); | 899 int width = pFont->GetGlyphWidth(glyph); |
899 if (width > 0 && width < nStemV) | 900 if (width > 0 && width < nStemV) |
900 nStemV = width; | 901 nStemV = width; |
901 } | 902 } |
902 } | 903 } |
903 CPDF_Dictionary* pFontDesc = | 904 CPDF_Dictionary* pFontDesc = |
904 CalculateFontDesc(basefont, flags, italicangle, pFont->GetAscent(), | 905 CalculateFontDesc(this, basefont, flags, italicangle, pFont->GetAscent(), |
905 pFont->GetDescent(), pBBox, nStemV); | 906 pFont->GetDescent(), pBBox, nStemV); |
906 AddIndirectObject(pFontDesc); | 907 AddIndirectObject(pFontDesc); |
907 pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); | 908 pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); |
908 return LoadFont(pBaseDict); | 909 return LoadFont(pBaseDict); |
909 } | 910 } |
910 | 911 |
911 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 912 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
912 CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, | 913 CPDF_Font* CPDF_Document::AddWindowsFont(LOGFONTW* pLogFont, |
913 FX_BOOL bVert, | 914 FX_BOOL bVert, |
914 FX_BOOL bTranslateName) { | 915 FX_BOOL bTranslateName) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 basefont = pLogFont->lfFaceName; | 960 basefont = pLogFont->lfFaceName; |
960 | 961 |
961 int italicangle = ptm->otmItalicAngle / 10; | 962 int italicangle = ptm->otmItalicAngle / 10; |
962 int ascend = ptm->otmrcFontBox.top; | 963 int ascend = ptm->otmrcFontBox.top; |
963 int descend = ptm->otmrcFontBox.bottom; | 964 int descend = ptm->otmrcFontBox.bottom; |
964 int capheight = ptm->otmsCapEmHeight; | 965 int capheight = ptm->otmsCapEmHeight; |
965 int bbox[4] = {ptm->otmrcFontBox.left, ptm->otmrcFontBox.bottom, | 966 int bbox[4] = {ptm->otmrcFontBox.left, ptm->otmrcFontBox.bottom, |
966 ptm->otmrcFontBox.right, ptm->otmrcFontBox.top}; | 967 ptm->otmrcFontBox.right, ptm->otmrcFontBox.top}; |
967 FX_Free(tm_buf); | 968 FX_Free(tm_buf); |
968 basefont.Replace(" ", ""); | 969 basefont.Replace(" ", ""); |
969 CPDF_Dictionary* pBaseDict = new CPDF_Dictionary; | 970 CPDF_Dictionary* pBaseDict = new CPDF_Dictionary(&m_ByteStringPool); |
970 pBaseDict->SetNameFor("Type", "Font"); | 971 pBaseDict->SetNameFor("Type", "Font"); |
971 CPDF_Dictionary* pFontDict = pBaseDict; | 972 CPDF_Dictionary* pFontDict = pBaseDict; |
972 if (!bCJK) { | 973 if (!bCJK) { |
973 if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || | 974 if (pLogFont->lfCharSet == FXFONT_ANSI_CHARSET || |
974 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || | 975 pLogFont->lfCharSet == FXFONT_DEFAULT_CHARSET || |
975 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { | 976 pLogFont->lfCharSet == FXFONT_SYMBOL_CHARSET) { |
976 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); | 977 pBaseDict->SetNameFor("Encoding", "WinAnsiEncoding"); |
977 } else { | 978 } else { |
978 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); | 979 CalculateEncodingDict(pLogFont->lfCharSet, pBaseDict); |
979 } | 980 } |
980 int char_widths[224]; | 981 int char_widths[224]; |
981 GetCharWidth(hDC, 32, 255, char_widths); | 982 GetCharWidth(hDC, 32, 255, char_widths); |
982 CPDF_Array* pWidths = new CPDF_Array; | 983 CPDF_Array* pWidths = new CPDF_Array; |
983 for (size_t i = 0; i < 224; i++) | 984 for (size_t i = 0; i < 224; i++) |
984 pWidths->AddInteger(char_widths[i]); | 985 pWidths->AddInteger(char_widths[i]); |
985 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, | 986 ProcessNonbCJK(pBaseDict, pLogFont->lfWeight > FW_MEDIUM, |
986 pLogFont->lfItalic != 0, basefont, pWidths); | 987 pLogFont->lfItalic != 0, basefont, pWidths); |
987 } else { | 988 } else { |
988 pFontDict = | 989 pFontDict = |
989 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, | 990 ProcessbCJK(pBaseDict, pLogFont->lfCharSet, bVert, basefont, |
990 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { | 991 [&hDC](FX_WCHAR start, FX_WCHAR end, CPDF_Array* widthArr) { |
991 InsertWidthArray(hDC, start, end, widthArr); | 992 InsertWidthArray(hDC, start, end, widthArr); |
992 }); | 993 }); |
993 } | 994 } |
994 AddIndirectObject(pBaseDict); | 995 AddIndirectObject(pBaseDict); |
995 CPDF_Array* pBBox = new CPDF_Array; | 996 CPDF_Array* pBBox = new CPDF_Array; |
996 for (int i = 0; i < 4; i++) | 997 for (int i = 0; i < 4; i++) |
997 pBBox->AddInteger(bbox[i]); | 998 pBBox->AddInteger(bbox[i]); |
998 CPDF_Dictionary* pFontDesc = | 999 CPDF_Dictionary* pFontDesc = |
999 CalculateFontDesc(basefont, flags, italicangle, ascend, descend, pBBox, | 1000 CalculateFontDesc(this, basefont, flags, italicangle, ascend, descend, |
1000 pLogFont->lfWeight / 5); | 1001 pBBox, pLogFont->lfWeight / 5); |
1001 pFontDesc->SetIntegerFor("CapHeight", capheight); | 1002 pFontDesc->SetIntegerFor("CapHeight", capheight); |
1002 AddIndirectObject(pFontDesc); | 1003 AddIndirectObject(pFontDesc); |
1003 pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); | 1004 pFontDict->SetReferenceFor("FontDescriptor", this, pFontDesc); |
1004 hFont = SelectObject(hDC, hFont); | 1005 hFont = SelectObject(hDC, hFont); |
1005 DeleteObject(hFont); | 1006 DeleteObject(hFont); |
1006 DeleteDC(hDC); | 1007 DeleteDC(hDC); |
1007 return LoadFont(pBaseDict); | 1008 return LoadFont(pBaseDict); |
1008 } | 1009 } |
1009 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 1010 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
OLD | NEW |