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

Side by Side Diff: core/fpdfapi/fpdf_parser/cpdf_document.cpp

Issue 2345063002: Use string pools in some dictionaries (Closed)
Patch Set: windows compilation 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 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
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
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
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
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
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
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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698