| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkDevice.h" | 9 #include "SkDevice.h" |
| 10 #include "SkGraphics.h" | 10 #include "SkGraphics.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 | 23 |
| 24 #include "podofo.h" | 24 #include "podofo.h" |
| 25 using namespace PoDoFo; | 25 using namespace PoDoFo; |
| 26 | 26 |
| 27 bool LongFromDictionary(const PdfMemDocument* pdfDoc, | 27 bool LongFromDictionary(const PdfMemDocument* pdfDoc, |
| 28 const PdfDictionary& dict, | 28 const PdfDictionary& dict, |
| 29 const char* key, | 29 const char* key, |
| 30 const char* abr, | 30 const char* abr, |
| 31 long* data); | 31 long* data); |
| 32 | 32 |
| 33 bool DoubleFromDictionary(const PdfMemDocument* pdfDoc, |
| 34 const PdfDictionary& dict, |
| 35 const char* key, |
| 36 const char* abr, |
| 37 double* data); |
| 38 |
| 33 bool BoolFromDictionary(const PdfMemDocument* pdfDoc, | 39 bool BoolFromDictionary(const PdfMemDocument* pdfDoc, |
| 34 const PdfDictionary& dict, | 40 const PdfDictionary& dict, |
| 35 const char* key, | 41 const char* key, |
| 36 const char* abr, | 42 const char* abr, |
| 37 bool* data); | 43 bool* data); |
| 38 | 44 |
| 39 bool NameFromDictionary(const PdfMemDocument* pdfDoc, | 45 bool NameFromDictionary(const PdfMemDocument* pdfDoc, |
| 40 const PdfDictionary& dict, | 46 const PdfDictionary& dict, |
| 41 const char* key, | 47 const char* key, |
| 42 const char* abr, | 48 const char* abr, |
| 43 std::string* data); | 49 std::string* data); |
| 44 | 50 |
| 51 bool StringFromDictionary(const PdfMemDocument* pdfDoc, |
| 52 const PdfDictionary& dict, |
| 53 const char* key, |
| 54 const char* abr, |
| 55 std::string* data); |
| 56 |
| 57 class SkPdfDictionary; |
| 58 bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc, |
| 59 const PdfDictionary& dict, |
| 60 const char* key, |
| 61 const char* abr, |
| 62 SkPdfDictionary** data); |
| 63 |
| 64 class SkPdfObject; |
| 65 bool ObjectFromDictionary(const PdfMemDocument* pdfDoc, |
| 66 const PdfDictionary& dict, |
| 67 const char* key, |
| 68 const char* abr, |
| 69 SkPdfObject** data); |
| 45 | 70 |
| 46 | 71 |
| 47 #include "pdf_auto_gen.h" | 72 #include "pdf_auto_gen.h" |
| 48 | 73 |
| 49 /* | 74 /* |
| 50 * TODO(edisonn): ASAP so skp -> pdf -> png looks greap | 75 * TODO(edisonn): ASAP so skp -> pdf -> png looks greap |
| 51 * - load gs/ especially smask and already known prop | 76 * - load gs/ especially smask and already known prop |
| 52 * - use transparency (I think ca and CA ops) | 77 * - use transparency (I think ca and CA ops) |
| 53 * - load font for baidu.pdf | 78 * - load font for baidu.pdf |
| 54 * - load font for youtube.pdf | 79 * - load font for youtube.pdf |
| (...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 bool LongFromDictionary(const PdfMemDocument* pdfDoc, | 794 bool LongFromDictionary(const PdfMemDocument* pdfDoc, |
| 770 const PdfDictionary& dict, | 795 const PdfDictionary& dict, |
| 771 const char* key, | 796 const char* key, |
| 772 const char* abr, | 797 const char* abr, |
| 773 long* data) { | 798 long* data) { |
| 774 if (LongFromDictionary(pdfDoc, dict, key, data)) return true; | 799 if (LongFromDictionary(pdfDoc, dict, key, data)) return true; |
| 775 if (abr == NULL || *abr == '\0') return false; | 800 if (abr == NULL || *abr == '\0') return false; |
| 776 return LongFromDictionary(pdfDoc, dict, abr, data); | 801 return LongFromDictionary(pdfDoc, dict, abr, data); |
| 777 } | 802 } |
| 778 | 803 |
| 804 bool DoubleFromDictionary(const PdfMemDocument* pdfDoc, |
| 805 const PdfDictionary& dict, |
| 806 const char* key, |
| 807 double* data) { |
| 808 const PdfObject* value = resolveReferenceObject(pdfDoc, |
| 809 dict.GetKey(PdfName(key))); |
| 810 |
| 811 if (value == NULL || !value->IsReal()) { |
| 812 return false; |
| 813 } |
| 814 |
| 815 *data = value->GetReal(); |
| 816 return true; |
| 817 } |
| 818 |
| 819 bool DoubleFromDictionary(const PdfMemDocument* pdfDoc, |
| 820 const PdfDictionary& dict, |
| 821 const char* key, |
| 822 const char* abr, |
| 823 double* data) { |
| 824 if (DoubleFromDictionary(pdfDoc, dict, key, data)) return true; |
| 825 if (abr == NULL || *abr == '\0') return false; |
| 826 return DoubleFromDictionary(pdfDoc, dict, abr, data); |
| 827 } |
| 828 |
| 829 |
| 779 bool BoolFromDictionary(const PdfMemDocument* pdfDoc, | 830 bool BoolFromDictionary(const PdfMemDocument* pdfDoc, |
| 780 const PdfDictionary& dict, | 831 const PdfDictionary& dict, |
| 781 const char* key, | 832 const char* key, |
| 782 bool* data) { | 833 bool* data) { |
| 783 const PdfObject* value = resolveReferenceObject(pdfDoc, | 834 const PdfObject* value = resolveReferenceObject(pdfDoc, |
| 784 dict.GetKey(PdfName(key))); | 835 dict.GetKey(PdfName(key))); |
| 785 | 836 |
| 786 if (value == NULL || !value->IsBool()) { | 837 if (value == NULL || !value->IsBool()) { |
| 787 return false; | 838 return false; |
| 788 } | 839 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 819 bool NameFromDictionary(const PdfMemDocument* pdfDoc, | 870 bool NameFromDictionary(const PdfMemDocument* pdfDoc, |
| 820 const PdfDictionary& dict, | 871 const PdfDictionary& dict, |
| 821 const char* key, | 872 const char* key, |
| 822 const char* abr, | 873 const char* abr, |
| 823 std::string* data) { | 874 std::string* data) { |
| 824 if (NameFromDictionary(pdfDoc, dict, key, data)) return true; | 875 if (NameFromDictionary(pdfDoc, dict, key, data)) return true; |
| 825 if (abr == NULL || *abr == '\0') return false; | 876 if (abr == NULL || *abr == '\0') return false; |
| 826 return NameFromDictionary(pdfDoc, dict, abr, data); | 877 return NameFromDictionary(pdfDoc, dict, abr, data); |
| 827 } | 878 } |
| 828 | 879 |
| 880 bool StringFromDictionary(const PdfMemDocument* pdfDoc, |
| 881 const PdfDictionary& dict, |
| 882 const char* key, |
| 883 std::string* data) { |
| 884 const PdfObject* value = resolveReferenceObject(pdfDoc, |
| 885 dict.GetKey(PdfName(key)), |
| 886 true); |
| 887 if (value == NULL || (!value->IsString() && !value->IsHexString())) { |
| 888 return false; |
| 889 } |
| 890 |
| 891 *data = value->GetString().GetString(); |
| 892 return true; |
| 893 } |
| 894 |
| 895 bool StringFromDictionary(const PdfMemDocument* pdfDoc, |
| 896 const PdfDictionary& dict, |
| 897 const char* key, |
| 898 const char* abr, |
| 899 std::string* data) { |
| 900 if (StringFromDictionary(pdfDoc, dict, key, data)) return true; |
| 901 if (abr == NULL || *abr == '\0') return false; |
| 902 return StringFromDictionary(pdfDoc, dict, abr, data); |
| 903 } |
| 904 |
| 905 bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc, |
| 906 const PdfDictionary& dict, |
| 907 const char* key, |
| 908 SkPdfDictionary** data) { |
| 909 const PdfObject* value = resolveReferenceObject(pdfDoc, |
| 910 dict.GetKey(PdfName(key)), |
| 911 true); |
| 912 if (value == NULL || !value->IsDictionary()) { |
| 913 return false; |
| 914 } |
| 915 |
| 916 return PodofoMapper::mapDictionary(*pdfDoc, *value, (SkPdfObject**)data); |
| 917 } |
| 918 |
| 919 bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc, |
| 920 const PdfDictionary& dict, |
| 921 const char* key, |
| 922 const char* abr, |
| 923 SkPdfDictionary** data) { |
| 924 if (DictionaryFromDictionary(pdfDoc, dict, key, data)) return true; |
| 925 if (abr == NULL || *abr == '\0') return false; |
| 926 return DictionaryFromDictionary(pdfDoc, dict, abr, data); |
| 927 } |
| 928 |
| 929 bool ObjectFromDictionary(const PdfMemDocument* pdfDoc, |
| 930 const PdfDictionary& dict, |
| 931 const char* key, |
| 932 SkPdfObject** data) { |
| 933 const PdfObject* value = resolveReferenceObject(pdfDoc, |
| 934 dict.GetKey(PdfName(key)), |
| 935 true); |
| 936 if (value == NULL) { |
| 937 return false; |
| 938 } |
| 939 return PodofoMapper::mapObject(*pdfDoc, *value, data); |
| 940 } |
| 941 |
| 942 bool ObjectFromDictionary(const PdfMemDocument* pdfDoc, |
| 943 const PdfDictionary& dict, |
| 944 const char* key, |
| 945 const char* abr, |
| 946 SkPdfObject** data) { |
| 947 if (ObjectFromDictionary(pdfDoc, dict, key, data)) return true; |
| 948 if (abr == NULL || *abr == '\0') return false; |
| 949 return ObjectFromDictionary(pdfDoc, dict, abr, data); |
| 950 } |
| 951 |
| 952 |
| 829 // TODO(edisonn): perf!!! | 953 // TODO(edisonn): perf!!! |
| 830 | 954 |
| 831 static SkColorTable* getGrayColortable() { | 955 static SkColorTable* getGrayColortable() { |
| 832 static SkColorTable* grayColortable = NULL; | 956 static SkColorTable* grayColortable = NULL; |
| 833 if (grayColortable == NULL) { | 957 if (grayColortable == NULL) { |
| 834 SkPMColor* colors = new SkPMColor[256]; | 958 SkPMColor* colors = new SkPMColor[256]; |
| 835 for (int i = 0 ; i < 256; i++) { | 959 for (int i = 0 ; i < 256; i++) { |
| 836 colors[i] = SkPreMultiplyARGB(255, i, i, i); | 960 colors[i] = SkPreMultiplyARGB(255, i, i, i); |
| 837 } | 961 } |
| 838 grayColortable = new SkColorTable(colors, 256); | 962 grayColortable = new SkColorTable(colors, 256); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 945 | 1069 |
| 946 // utils | 1070 // utils |
| 947 | 1071 |
| 948 // TODO(edisonn): add cache, or put the bitmap property directly on the PdfObjec
t | 1072 // TODO(edisonn): add cache, or put the bitmap property directly on the PdfObjec
t |
| 949 // TODO(edisonn): deal with colorSpaces, we could add them to SkBitmap::Config | 1073 // TODO(edisonn): deal with colorSpaces, we could add them to SkBitmap::Config |
| 950 // TODO(edisonn): preserve A1 format that skia knows, + fast convert from 111, 2
22, 444 to closest | 1074 // TODO(edisonn): preserve A1 format that skia knows, + fast convert from 111, 2
22, 444 to closest |
| 951 // skia format, through a table | 1075 // skia format, through a table |
| 952 | 1076 |
| 953 // this functions returns the image, it does not look at the smask. | 1077 // this functions returns the image, it does not look at the smask. |
| 954 | 1078 |
| 955 SkBitmap getImageFromObject(PdfContext* pdfContext, const SkPdfImage* image, boo
l transparencyMask) { | 1079 SkBitmap getImageFromObject(PdfContext* pdfContext, const SkPdfImageDictionary*
image, bool transparencyMask) { |
| 956 if (image == NULL || !image->valid()) { | 1080 if (image == NULL || !image->valid()) { |
| 957 // TODO(edisonn): report warning to be used in testing. | 1081 // TODO(edisonn): report warning to be used in testing. |
| 958 return SkBitmap(); | 1082 return SkBitmap(); |
| 959 } | 1083 } |
| 960 | 1084 |
| 961 // TODO (edisonn): Fast Jpeg(DCTDecode) draw, or fast PNG(FlateDecode) draw
... | 1085 // TODO (edisonn): Fast Jpeg(DCTDecode) draw, or fast PNG(FlateDecode) draw
... |
| 962 // PdfObject* value = resolveReferenceObject(pdfContext->fPdfDoc, | 1086 // PdfObject* value = resolveReferenceObject(pdfContext->fPdfDoc, |
| 963 // obj.GetDictionary().GetKey(PdfNa
me("Filter"))); | 1087 // obj.GetDictionary().GetKey(PdfNa
me("Filter"))); |
| 964 // if (value && value->IsArray() && value->GetArray().GetSize() == 1) { | 1088 // if (value && value->IsArray() && value->GetArray().GetSize() == 1) { |
| 965 // value = resolveReferenceObject(pdfContext->fPdfDoc, | 1089 // value = resolveReferenceObject(pdfContext->fPdfDoc, |
| 966 // &value->GetArray()[0]); | 1090 // &value->GetArray()[0]); |
| 967 // } | 1091 // } |
| 968 // if (value && value->IsName() && value->GetName().GetName() == "DCTDecode")
{ | 1092 // if (value && value->IsName() && value->GetName().GetName() == "DCTDecode")
{ |
| 969 // SkStream stream = SkStream:: | 1093 // SkStream stream = SkStream:: |
| 970 // SkImageDecoder::Factory() | 1094 // SkImageDecoder::Factory() |
| 971 // } | 1095 // } |
| 972 | 1096 |
| 973 long bpc = image->bpc(); | 1097 long bpc = image->BitsPerComponent(); |
| 974 long width = image->w(); | 1098 long width = image->Width(); |
| 975 long height = image->h(); | 1099 long height = image->Height(); |
| 976 std::string colorSpace = image->cs(); | 1100 SkPdfObject* colorSpaceDict = image->ColorSpace(); |
| 1101 std::string colorSpace = "DeviceRGB"; |
| 1102 // TODO(edisonn): for multiple type fileds, generate code, like, isName(), i
sArray(), ...and fields like colorSpace_name(), colorSpace_array() |
| 1103 // so we do nto go to podofo anywhere in our cpp file |
| 1104 if (colorSpaceDict && colorSpaceDict->podofo() && colorSpaceDict->podofo()->
IsName()) { |
| 1105 colorSpace = colorSpaceDict->podofo()->GetName().GetName(); |
| 1106 } |
| 977 | 1107 |
| 978 /* | 1108 /* |
| 979 bool imageMask = image->imageMask(); | 1109 bool imageMask = image->imageMask(); |
| 980 | 1110 |
| 981 if (imageMask) { | 1111 if (imageMask) { |
| 982 if (bpc != 0 && bpc != 1) { | 1112 if (bpc != 0 && bpc != 1) { |
| 983 // TODO(edisonn): report warning to be used in testing. | 1113 // TODO(edisonn): report warning to be used in testing. |
| 984 return SkBitmap(); | 1114 return SkBitmap(); |
| 985 } | 1115 } |
| 986 bpc = 1; | 1116 bpc = 1; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1012 (unsigned char*)uncompressedStream, uncompressedStreamLength, | 1142 (unsigned char*)uncompressedStream, uncompressedStreamLength, |
| 1013 width, height, bytesPerLine, | 1143 width, height, bytesPerLine, |
| 1014 bpc, colorSpace, | 1144 bpc, colorSpace, |
| 1015 transparencyMask); | 1145 transparencyMask); |
| 1016 | 1146 |
| 1017 free(uncompressedStream); | 1147 free(uncompressedStream); |
| 1018 | 1148 |
| 1019 return bitmap; | 1149 return bitmap; |
| 1020 } | 1150 } |
| 1021 | 1151 |
| 1022 SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImage* obj) { | 1152 SkBitmap getSmaskFromObject(PdfContext* pdfContext, const SkPdfImageDictionary*
obj) { |
| 1023 const PdfObject* sMask = resolveReferenceObject(pdfContext->fPdfDoc, | 1153 const PdfObject* sMask = resolveReferenceObject(pdfContext->fPdfDoc, |
| 1024 obj->podofo()->GetDictionary().Get
Key(PdfName("SMask"))); | 1154 obj->podofo()->GetDictionary().Get
Key(PdfName("SMask"))); |
| 1025 | 1155 |
| 1026 #ifdef PDF_TRACE | 1156 #ifdef PDF_TRACE |
| 1027 std::string str; | 1157 std::string str; |
| 1028 if (sMask) { | 1158 if (sMask) { |
| 1029 sMask->ToString(str); | 1159 sMask->ToString(str); |
| 1030 printf("/SMask of /Subtype /Image: %s\n", str.c_str()); | 1160 printf("/SMask of /Subtype /Image: %s\n", str.c_str()); |
| 1031 } | 1161 } |
| 1032 #endif | 1162 #endif |
| 1033 | 1163 |
| 1034 if (sMask) { | 1164 if (sMask) { |
| 1035 SkPdfImage skxobjmask(pdfContext->fPdfDoc, sMask); | 1165 SkPdfImageDictionary skxobjmask(pdfContext->fPdfDoc, sMask); |
| 1036 return getImageFromObject(pdfContext, &skxobjmask, true); | 1166 return getImageFromObject(pdfContext, &skxobjmask, true); |
| 1037 } | 1167 } |
| 1038 | 1168 |
| 1039 // TODO(edisonn): implement GS SMask. Default to empty right now. | 1169 // TODO(edisonn): implement GS SMask. Default to empty right now. |
| 1040 return pdfContext->fGraphicsState.fSMask; | 1170 return pdfContext->fGraphicsState.fSMask; |
| 1041 } | 1171 } |
| 1042 | 1172 |
| 1043 PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfI
mage* skpdfimage) { | 1173 PdfResult doXObject_Image(PdfContext* pdfContext, SkCanvas* canvas, const SkPdfI
mageDictionary* skpdfimage) { |
| 1044 if (skpdfimage == NULL || !skpdfimage->valid()) { | 1174 if (skpdfimage == NULL || !skpdfimage->valid()) { |
| 1045 return kIgnoreError_PdfResult; | 1175 return kIgnoreError_PdfResult; |
| 1046 } | 1176 } |
| 1047 | 1177 |
| 1048 SkBitmap image = getImageFromObject(pdfContext, skpdfimage, false); | 1178 SkBitmap image = getImageFromObject(pdfContext, skpdfimage, false); |
| 1049 SkBitmap sMask = getSmaskFromObject(pdfContext, skpdfimage); | 1179 SkBitmap sMask = getSmaskFromObject(pdfContext, skpdfimage); |
| 1050 | 1180 |
| 1051 canvas->save(); | 1181 canvas->save(); |
| 1052 canvas->setMatrix(pdfContext->fGraphicsState.fMatrix); | 1182 canvas->setMatrix(pdfContext->fGraphicsState.fMatrix); |
| 1053 SkRect dst = SkRect::MakeXYWH(SkDoubleToScalar(0.0), SkDoubleToScalar(0.0),
SkDoubleToScalar(1.0), SkDoubleToScalar(1.0)); | 1183 SkRect dst = SkRect::MakeXYWH(SkDoubleToScalar(0.0), SkDoubleToScalar(0.0),
SkDoubleToScalar(1.0), SkDoubleToScalar(1.0)); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1211 PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject& o
bj) { | 1341 PdfResult doXObject(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject& o
bj) { |
| 1212 if (CheckRecursiveRendering::IsInRendering(obj)) { | 1342 if (CheckRecursiveRendering::IsInRendering(obj)) { |
| 1213 // Oops, corrupt PDF! | 1343 // Oops, corrupt PDF! |
| 1214 return kIgnoreError_PdfResult; | 1344 return kIgnoreError_PdfResult; |
| 1215 } | 1345 } |
| 1216 | 1346 |
| 1217 CheckRecursiveRendering checkRecursion(obj); | 1347 CheckRecursiveRendering checkRecursion(obj); |
| 1218 | 1348 |
| 1219 // TODO(edisonn): check type | 1349 // TODO(edisonn): check type |
| 1220 SkPdfObject* skobj = NULL; | 1350 SkPdfObject* skobj = NULL; |
| 1221 if (!PodofoMapper::mapObject(*pdfContext->fPdfDoc, obj, &skobj)) return kIgn
oreError_PdfResult; | 1351 if (!PodofoMapper::mapXObjectDictionary(*pdfContext->fPdfDoc, obj, &skobj))
return kIgnoreError_PdfResult; |
| 1222 | 1352 |
| 1223 if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult; | 1353 if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult; |
| 1224 | 1354 |
| 1225 PdfResult ret = kIgnoreError_PdfResult; | 1355 PdfResult ret = kIgnoreError_PdfResult; |
| 1226 switch (skobj->getType()) | 1356 switch (skobj->getType()) |
| 1227 { | 1357 { |
| 1228 case kObjectDictionaryXObjectImage_SkPdfObjectType: | 1358 case kObjectDictionaryXObjectDictionaryImageDictionary_SkPdfObjectType: |
| 1229 ret = doXObject_Image(pdfContext, canvas, skobj->asImage()); | 1359 ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary()
); |
| 1230 break; | 1360 break; |
| 1231 case kObjectDictionaryXObjectForm_SkPdfObjectType: | 1361 case kObjectDictionaryXObjectDictionaryType1FormDictionary_SkPdfObjectTy
pe: |
| 1232 ret = doXObject_Form(pdfContext, canvas, obj); | 1362 ret = doXObject_Form(pdfContext, canvas, obj);//skobj->asType1FormDi
ctionary()); |
| 1233 break; | 1363 break; |
| 1234 //case kObjectDictionaryXObjectPS_SkPdfObjectType: | 1364 //case kObjectDictionaryXObjectPS_SkPdfObjectType: |
| 1235 //return doXObject_PS(skxobj.asPS()); | 1365 //return doXObject_PS(skxobj.asPS()); |
| 1236 } | 1366 } |
| 1237 | 1367 |
| 1238 delete skobj; | 1368 delete skobj; |
| 1239 return ret; | 1369 return ret; |
| 1240 } | 1370 } |
| 1241 | 1371 |
| 1242 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { | 1372 PdfResult PdfOp_q(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** loo
per) { |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1964 pdfContext->fVarStack.pop(); | 2094 pdfContext->fVarStack.pop(); |
| 1965 | 2095 |
| 1966 return kNYI_PdfResult; | 2096 return kNYI_PdfResult; |
| 1967 } | 2097 } |
| 1968 | 2098 |
| 1969 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is | 2099 //dictName gs (PDF 1.2) Set the specified parameters in the graphics state. dictN
ame is |
| 1970 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). | 2100 //the name of a graphics state parameter dictionary in the ExtGState subdictiona
ry of the current resource dictionary (see the next section). |
| 1971 PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { | 2101 PdfResult PdfOp_gs(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** lo
oper) { |
| 1972 PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarSta
ck.pop(); | 2102 PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarSta
ck.pop(); |
| 1973 | 2103 |
| 2104 #ifdef PDF_TRACE |
| 2105 std::string str; |
| 2106 #endif |
| 2107 |
| 1974 const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResour
ces->GetDictionary(); | 2108 const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResour
ces->GetDictionary(); |
| 2109 |
| 2110 #ifdef PDF_TRACE |
| 2111 pdfContext->fGraphicsState.fObjectWithResources->ToString(str); |
| 2112 printf("Print Object with resources: %s\n", str.c_str()); |
| 2113 #endif |
| 2114 |
| 1975 const PdfObject* resources = resolveReferenceObject(pdfContext->fPdfDoc, | 2115 const PdfObject* resources = resolveReferenceObject(pdfContext->fPdfDoc, |
| 1976 pageDict.GetKey("Resourc
es")); | 2116 pageDict.GetKey("Resourc
es")); |
| 1977 | 2117 |
| 1978 if (resources == NULL) { | 2118 if (resources == NULL) { |
| 1979 #ifdef PDF_TRACE | 2119 #ifdef PDF_TRACE |
| 1980 printf("WARNING: No Resources for a page with 'gs' operator!\n"); | 2120 printf("WARNING: No Resources for a page with 'gs' operator!\n"); |
| 1981 #endif | 2121 #endif |
| 1982 return kIgnoreError_PdfResult; | 2122 return kIgnoreError_PdfResult; |
| 1983 } | 2123 } |
| 1984 | 2124 |
| 1985 #ifdef PDF_TRACE | 2125 #ifdef PDF_TRACE |
| 1986 std::string str; | |
| 1987 resources->ToString(str); | 2126 resources->ToString(str); |
| 1988 printf("Print gs Page Resources: %s\n", str.c_str()); | 2127 printf("Print gs Page Resources: %s\n", str.c_str()); |
| 1989 #endif | 2128 #endif |
| 1990 | 2129 |
| 1991 if (!resources->IsDictionary()) { | 2130 if (!resources->IsDictionary()) { |
| 1992 #ifdef PDF_TRACE | 2131 #ifdef PDF_TRACE |
| 1993 printf("Resources is not a dictionary!\n"); | 2132 printf("Resources is not a dictionary!\n"); |
| 1994 #endif | 2133 #endif |
| 1995 return kIgnoreError_PdfResult; | 2134 return kIgnoreError_PdfResult; |
| 1996 } | 2135 } |
| (...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2776 } | 2915 } |
| 2777 | 2916 |
| 2778 return 0; | 2917 return 0; |
| 2779 } | 2918 } |
| 2780 | 2919 |
| 2781 #if !defined SK_BUILD_FOR_IOS | 2920 #if !defined SK_BUILD_FOR_IOS |
| 2782 int main(int argc, char * const argv[]) { | 2921 int main(int argc, char * const argv[]) { |
| 2783 return tool_main(argc, (char**) argv); | 2922 return tool_main(argc, (char**) argv); |
| 2784 } | 2923 } |
| 2785 #endif | 2924 #endif |
| OLD | NEW |