| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 |  | 
| 2 #include "SkPodofoUtils.h" |  | 
| 3 #include "SkMatrix.h" |  | 
| 4 #include "SkPdfHeaders_autogen.h" |  | 
| 5 #include "SkPdfMapper_autogen.h" |  | 
| 6 |  | 
| 7 #include "podofo.h" |  | 
| 8 |  | 
| 9 const PoDoFo::PdfObject* resolveReferenceObject(const SkPodofoParsedPDF* pdfDoc, |  | 
| 10                                   const PoDoFo::PdfObject* obj, |  | 
| 11                                   bool resolveOneElementArrays) { |  | 
| 12     while (obj && (obj->IsReference() || (resolveOneElementArrays && |  | 
| 13                                           obj->IsArray() && |  | 
| 14                                           obj->GetArray().GetSize() == 1))) { |  | 
| 15         if (obj->IsReference()) { |  | 
| 16             // We need to force the non const, the only update we will do is for
      recurssion checks. |  | 
| 17             PoDoFo::PdfReference& ref = (PoDoFo::PdfReference&)obj->GetReference
     (); |  | 
| 18             obj = pdfDoc->podofo()->GetObjects().GetObject(ref); |  | 
| 19         } else { |  | 
| 20             obj = &obj->GetArray()[0]; |  | 
| 21         } |  | 
| 22     } |  | 
| 23 |  | 
| 24     return obj; |  | 
| 25 } |  | 
| 26 |  | 
| 27 // TODO(edisonn): deal with synonyms (/BPC == /BitsPerComponent), here or in Get
     Key? |  | 
| 28 // Always pass long form in key, and have a map of long -> short key |  | 
| 29 bool LongFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 30                         const PoDoFo::PdfDictionary& dict, |  | 
| 31                         const char* key, |  | 
| 32                         long* data) { |  | 
| 33     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 34                                               dict.GetKey(PoDoFo::PdfName(key)))
     ; |  | 
| 35 |  | 
| 36     if (value == NULL || !value->IsNumber()) { |  | 
| 37         return false; |  | 
| 38     } |  | 
| 39     if (data == NULL) { |  | 
| 40         return true; |  | 
| 41     } |  | 
| 42 |  | 
| 43     *data = value->GetNumber(); |  | 
| 44     return true; |  | 
| 45 } |  | 
| 46 |  | 
| 47 bool LongFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 48                         const PoDoFo::PdfDictionary& dict, |  | 
| 49                         const char* key, |  | 
| 50                         const char* abr, |  | 
| 51                         long* data) { |  | 
| 52     if (LongFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 53     if (abr == NULL || *abr == '\0') return false; |  | 
| 54     return LongFromDictionary(pdfDoc, dict, abr, data); |  | 
| 55 } |  | 
| 56 |  | 
| 57 bool DoubleFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 58                           const PoDoFo::PdfDictionary& dict, |  | 
| 59                           const char* key, |  | 
| 60                           double* data) { |  | 
| 61     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 62                                               dict.GetKey(PoDoFo::PdfName(key)))
     ; |  | 
| 63 |  | 
| 64     if (value == NULL || (!value->IsReal() && !value->IsNumber())) { |  | 
| 65         return false; |  | 
| 66     } |  | 
| 67     if (data == NULL) { |  | 
| 68         return true; |  | 
| 69     } |  | 
| 70 |  | 
| 71     *data = value->GetReal(); |  | 
| 72     return true; |  | 
| 73 } |  | 
| 74 |  | 
| 75 bool DoubleFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 76                           const PoDoFo::PdfDictionary& dict, |  | 
| 77                           const char* key, |  | 
| 78                           const char* abr, |  | 
| 79                           double* data) { |  | 
| 80     if (DoubleFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 81     if (abr == NULL || *abr == '\0') return false; |  | 
| 82     return DoubleFromDictionary(pdfDoc, dict, abr, data); |  | 
| 83 } |  | 
| 84 |  | 
| 85 |  | 
| 86 bool BoolFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 87                         const PoDoFo::PdfDictionary& dict, |  | 
| 88                         const char* key, |  | 
| 89                         bool* data) { |  | 
| 90     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 91                                               dict.GetKey(PoDoFo::PdfName(key)))
     ; |  | 
| 92 |  | 
| 93     if (value == NULL || !value->IsBool()) { |  | 
| 94         return false; |  | 
| 95     } |  | 
| 96     if (data == NULL) { |  | 
| 97         return true; |  | 
| 98     } |  | 
| 99 |  | 
| 100     *data = value->GetBool(); |  | 
| 101     return true; |  | 
| 102 } |  | 
| 103 |  | 
| 104 bool BoolFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 105                         const PoDoFo::PdfDictionary& dict, |  | 
| 106                         const char* key, |  | 
| 107                         const char* abr, |  | 
| 108                         bool* data) { |  | 
| 109     if (BoolFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 110     if (abr == NULL || *abr == '\0') return false; |  | 
| 111     return BoolFromDictionary(pdfDoc, dict, abr, data); |  | 
| 112 } |  | 
| 113 |  | 
| 114 bool NameFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 115                         const PoDoFo::PdfDictionary& dict, |  | 
| 116                         const char* key, |  | 
| 117                         std::string* data) { |  | 
| 118     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 119                                               dict.GetKey(PoDoFo::PdfName(key)), |  | 
| 120                                               true); |  | 
| 121     if (value == NULL || !value->IsName()) { |  | 
| 122         return false; |  | 
| 123     } |  | 
| 124     if (data == NULL) { |  | 
| 125         return true; |  | 
| 126     } |  | 
| 127 |  | 
| 128     *data = value->GetName().GetName(); |  | 
| 129     return true; |  | 
| 130 } |  | 
| 131 |  | 
| 132 bool NameFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 133                         const PoDoFo::PdfDictionary& dict, |  | 
| 134                         const char* key, |  | 
| 135                         const char* abr, |  | 
| 136                         std::string* data) { |  | 
| 137     if (NameFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 138     if (abr == NULL || *abr == '\0') return false; |  | 
| 139     return NameFromDictionary(pdfDoc, dict, abr, data); |  | 
| 140 } |  | 
| 141 |  | 
| 142 bool StringFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 143                           const PoDoFo::PdfDictionary& dict, |  | 
| 144                           const char* key, |  | 
| 145                           std::string* data) { |  | 
| 146     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 147                                               dict.GetKey(PoDoFo::PdfName(key)), |  | 
| 148                                               true); |  | 
| 149     if (value == NULL || (!value->IsString() && !value->IsHexString())) { |  | 
| 150         return false; |  | 
| 151     } |  | 
| 152     if (data == NULL) { |  | 
| 153         return true; |  | 
| 154     } |  | 
| 155 |  | 
| 156     *data = value->GetString().GetString(); |  | 
| 157     return true; |  | 
| 158 } |  | 
| 159 |  | 
| 160 bool StringFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 161                           const PoDoFo::PdfDictionary& dict, |  | 
| 162                           const char* key, |  | 
| 163                           const char* abr, |  | 
| 164                           std::string* data) { |  | 
| 165     if (StringFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 166     if (abr == NULL || *abr == '\0') return false; |  | 
| 167     return StringFromDictionary(pdfDoc, dict, abr, data); |  | 
| 168 } |  | 
| 169 |  | 
| 170 |  | 
| 171 bool SkMatrixFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 172                             const PoDoFo::PdfDictionary& dict, |  | 
| 173                             const char* key, |  | 
| 174                             SkMatrix** matrix) { |  | 
| 175     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 176                                                     dict.GetKey(PoDoFo::PdfName(
     key))); |  | 
| 177 |  | 
| 178     if (value == NULL || !value->IsArray()) { |  | 
| 179         return false; |  | 
| 180     } |  | 
| 181 |  | 
| 182     if (value->GetArray().GetSize() != 6) { |  | 
| 183         return false; |  | 
| 184     } |  | 
| 185 |  | 
| 186     double array[6]; |  | 
| 187     for (int i = 0; i < 6; i++) { |  | 
| 188         const PoDoFo::PdfObject* elem = resolveReferenceObject(pdfDoc, &value->G
     etArray()[i]); |  | 
| 189         if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) { |  | 
| 190             return false; |  | 
| 191         } |  | 
| 192         array[i] = elem->GetReal(); |  | 
| 193     } |  | 
| 194 |  | 
| 195     *matrix = new SkMatrix(); |  | 
| 196     **matrix = SkMatrixFromPdfMatrix(array); |  | 
| 197     return true; |  | 
| 198 } |  | 
| 199 |  | 
| 200 bool SkMatrixFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 201                         const PoDoFo::PdfDictionary& dict, |  | 
| 202                         const char* key, |  | 
| 203                         const char* abr, |  | 
| 204                         SkMatrix** data) { |  | 
| 205     if (SkMatrixFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 206     if (abr == NULL || *abr == '\0') return false; |  | 
| 207     return SkMatrixFromDictionary(pdfDoc, dict, abr, data); |  | 
| 208 |  | 
| 209 } |  | 
| 210 |  | 
| 211 bool SkRectFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 212                           const PoDoFo::PdfDictionary& dict, |  | 
| 213                           const char* key, |  | 
| 214                           SkRect** rect) { |  | 
| 215     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 216                                                     dict.GetKey(PoDoFo::PdfName(
     key))); |  | 
| 217 |  | 
| 218     if (value == NULL || !value->IsArray()) { |  | 
| 219         return false; |  | 
| 220     } |  | 
| 221 |  | 
| 222     if (value->GetArray().GetSize() != 4) { |  | 
| 223         return false; |  | 
| 224     } |  | 
| 225 |  | 
| 226     double array[4]; |  | 
| 227     for (int i = 0; i < 4; i++) { |  | 
| 228         const PoDoFo::PdfObject* elem = resolveReferenceObject(pdfDoc, &value->G
     etArray()[i]); |  | 
| 229         if (elem == NULL || (!elem->IsReal() && !elem->IsNumber())) { |  | 
| 230             return false; |  | 
| 231         } |  | 
| 232         array[i] = elem->GetReal(); |  | 
| 233     } |  | 
| 234 |  | 
| 235     *rect = new SkRect(); |  | 
| 236     **rect = SkRect::MakeLTRB(SkDoubleToScalar(array[0]), |  | 
| 237                               SkDoubleToScalar(array[1]), |  | 
| 238                               SkDoubleToScalar(array[2]), |  | 
| 239                               SkDoubleToScalar(array[3])); |  | 
| 240     return true; |  | 
| 241 } |  | 
| 242 |  | 
| 243 bool SkRectFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 244                         const PoDoFo::PdfDictionary& dict, |  | 
| 245                         const char* key, |  | 
| 246                         const char* abr, |  | 
| 247                         SkRect** data) { |  | 
| 248     if (SkRectFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 249     if (abr == NULL || *abr == '\0') return false; |  | 
| 250     return SkRectFromDictionary(pdfDoc, dict, abr, data); |  | 
| 251 |  | 
| 252 } |  | 
| 253 |  | 
| 254 |  | 
| 255 SkPdfObject* get(const SkPdfObject* obj, const char* key, const char* abr = "") 
     { |  | 
| 256     PoDoFo::PdfObject* podofoObj = NULL; |  | 
| 257     if (obj == NULL) return NULL; |  | 
| 258     const SkPdfDictionary* dict = obj->asDictionary(); |  | 
| 259     if (dict == NULL) return NULL; |  | 
| 260     if (!dict->podofo()->IsDictionary()) return NULL; |  | 
| 261     ObjectFromDictionary(dict->doc(), dict->podofo()->GetDictionary(), key, abr,
      &podofoObj); |  | 
| 262     SkPdfObject* ret = NULL; |  | 
| 263     obj->doc()->mapper()->mapObject(podofoObj, &ret); |  | 
| 264     return ret; |  | 
| 265 } |  | 
| 266 |  | 
| 267 bool ArrayFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 268                          const PoDoFo::PdfDictionary& dict, |  | 
| 269                          const char* key, |  | 
| 270                          const char* abr, |  | 
| 271                          SkPdfArray* data) {return false;} |  | 
| 272 |  | 
| 273 bool FileSpecFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 274                          const PoDoFo::PdfDictionary& dict, |  | 
| 275                          const char* key, |  | 
| 276                          const char* abr, |  | 
| 277                          SkPdfFileSpec* data) {return false;} |  | 
| 278 |  | 
| 279 bool StreamFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 280                          const PoDoFo::PdfDictionary& dict, |  | 
| 281                          const char* key, |  | 
| 282                          const char* abr, |  | 
| 283                          SkPdfStream** data); |  | 
| 284 |  | 
| 285 bool TreeFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 286                          const PoDoFo::PdfDictionary& dict, |  | 
| 287                          const char* key, |  | 
| 288                          const char* abr, |  | 
| 289                          SkPdfTree** data) {return false;} |  | 
| 290 |  | 
| 291 bool DateFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 292                          const PoDoFo::PdfDictionary& dict, |  | 
| 293                          const char* key, |  | 
| 294                          const char* abr, |  | 
| 295                          SkPdfDate* data) {return false;} |  | 
| 296 |  | 
| 297 bool FunctionFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 298                          const PoDoFo::PdfDictionary& dict, |  | 
| 299                          const char* key, |  | 
| 300                          const char* abr, |  | 
| 301                          SkPdfFunction* data) {return false;} |  | 
| 302 |  | 
| 303 |  | 
| 304 |  | 
| 305 |  | 
| 306 bool ArrayFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 307                               const PoDoFo::PdfDictionary& dict, |  | 
| 308                               const char* key, |  | 
| 309                               SkPdfArray** data) { |  | 
| 310     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 311                                               dict.GetKey(PoDoFo::PdfName(key)), |  | 
| 312                                               true); |  | 
| 313     if (value == NULL || !value->IsArray()) { |  | 
| 314         return false; |  | 
| 315     } |  | 
| 316     if (data == NULL) { |  | 
| 317         return true; |  | 
| 318     } |  | 
| 319 |  | 
| 320     return pdfDoc->mapper()->mapArray(value, data); |  | 
| 321 } |  | 
| 322 |  | 
| 323 |  | 
| 324 bool ArrayFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 325                         const PoDoFo::PdfDictionary& dict, |  | 
| 326                         const char* key, |  | 
| 327                         const char* abr, |  | 
| 328                         SkPdfArray** data) { |  | 
| 329     if (ArrayFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 330     if (abr == NULL || *abr == '\0') return false; |  | 
| 331     return ArrayFromDictionary(pdfDoc, dict, abr, data); |  | 
| 332 } |  | 
| 333 |  | 
| 334 /* |  | 
| 335 bool DictionaryFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 336                               const PoDoFo::PdfDictionary& dict, |  | 
| 337                               const char* key, |  | 
| 338                               SkPoDoFo::PdfDictionary** data) { |  | 
| 339     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 340                                               dict.GetKey(PoDoFo::PdfName(key)), |  | 
| 341                                               true); |  | 
| 342     if (value == NULL || !value->IsDictionary()) { |  | 
| 343         return false; |  | 
| 344     } |  | 
| 345     if (data == NULL) { |  | 
| 346         return true; |  | 
| 347     } |  | 
| 348 |  | 
| 349     return pdfDoc->mapper()->mapDictionary(value, data); |  | 
| 350 } |  | 
| 351 |  | 
| 352 bool DictionaryFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 353                         const PoDoFo::PdfDictionary& dict, |  | 
| 354                         const char* key, |  | 
| 355                         const char* abr, |  | 
| 356                         SkPoDoFo::PdfDictionary** data) { |  | 
| 357     if (DictionaryFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 358     if (abr == NULL || *abr == '\0') return false; |  | 
| 359     return DictionaryFromDictionary(pdfDoc, dict, abr, data); |  | 
| 360 } |  | 
| 361 */ |  | 
| 362 |  | 
| 363 bool ObjectFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 364                           const PoDoFo::PdfDictionary& dict, |  | 
| 365                           const char* key, |  | 
| 366                           PoDoFo::PdfObject** data) { |  | 
| 367     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 368                                               dict.GetKey(PoDoFo::PdfName(key)), |  | 
| 369                                               true); |  | 
| 370     if (value == NULL) { |  | 
| 371         return false; |  | 
| 372     } |  | 
| 373     if (data == NULL) { |  | 
| 374         return true; |  | 
| 375     } |  | 
| 376     *data = (PoDoFo::PdfObject*)value; |  | 
| 377     return true; |  | 
| 378 } |  | 
| 379 |  | 
| 380 bool ObjectFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 381                         const PoDoFo::PdfDictionary& dict, |  | 
| 382                         const char* key, |  | 
| 383                         const char* abr, |  | 
| 384                         PoDoFo::PdfObject** data) { |  | 
| 385     if (ObjectFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 386     if (abr == NULL || *abr == '\0') return false; |  | 
| 387     return ObjectFromDictionary(pdfDoc, dict, abr, data); |  | 
| 388 } |  | 
| 389 |  | 
| 390 bool StreamFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 391                           const PoDoFo::PdfDictionary& dict, |  | 
| 392                           const char* key, |  | 
| 393                           SkPdfStream** data) { |  | 
| 394     const PoDoFo::PdfObject* value = resolveReferenceObject(pdfDoc, |  | 
| 395                                               dict.GetKey(PoDoFo::PdfName(key)), |  | 
| 396                                               true); |  | 
| 397     if (value == NULL) { |  | 
| 398         return false; |  | 
| 399     } |  | 
| 400     if (data == NULL) { |  | 
| 401         return true; |  | 
| 402     } |  | 
| 403     return pdfDoc->mapper()->mapStream(value, data); |  | 
| 404 } |  | 
| 405 |  | 
| 406 bool StreamFromDictionary(const SkPodofoParsedPDF* pdfDoc, |  | 
| 407                         const PoDoFo::PdfDictionary& dict, |  | 
| 408                         const char* key, |  | 
| 409                         const char* abr, |  | 
| 410                         SkPdfStream** data) { |  | 
| 411     if (StreamFromDictionary(pdfDoc, dict, key, data)) return true; |  | 
| 412     if (abr == NULL || *abr == '\0') return false; |  | 
| 413     return StreamFromDictionary(pdfDoc, dict, abr, data); |  | 
| 414 } |  | 
| OLD | NEW | 
|---|