| 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 #ifndef SkPdfNativeObject_DEFINED | 8 #ifndef SkPdfNativeObject_DEFINED |
| 9 #define SkPdfNativeObject_DEFINED | 9 #define SkPdfNativeObject_DEFINED |
| 10 | 10 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 SkTDArray<SkPdfNativeObject*>* fArray; | 96 SkTDArray<SkPdfNativeObject*>* fArray; |
| 97 Reference fRef; | 97 Reference fRef; |
| 98 }; | 98 }; |
| 99 SkTDict<SkPdfNativeObject*>* fMap; | 99 SkTDict<SkPdfNativeObject*>* fMap; |
| 100 | 100 |
| 101 // TODO(edisonn): rename data with cache | 101 // TODO(edisonn): rename data with cache |
| 102 void* fData; | 102 void* fData; |
| 103 DataType fDataType; | 103 DataType fDataType; |
| 104 | 104 |
| 105 | 105 |
| 106 // Keep this the last entrys |
| 107 #ifdef PDF_TRACK_OBJECT_USAGE |
| 108 mutable bool fUsed; |
| 109 #endif // PDF_TRACK_OBJECT_USAGE |
| 110 |
| 106 public: | 111 public: |
| 107 | 112 |
| 108 SkPdfNativeObject() : fInRendering(0), fObjectType(kInvalid_PdfObjectType),
fMap(NULL), fData(NULL), fDataType(kEmpty_Data) {} | 113 SkPdfNativeObject() : fInRendering(0) |
| 114 , fObjectType(kInvalid_PdfObjectType) |
| 115 , fMap(NULL) |
| 116 , fData(NULL) |
| 117 , fDataType(kEmpty_Data) |
| 118 #ifdef PDF_TRACK_OBJECT_USAGE |
| 119 , fUsed(false) |
| 120 #endif // PDF_TRACK_OBJECT_USAGE |
| 121 {} |
| 109 | 122 |
| 110 bool inRendering() const { return fInRendering != 0; } | 123 bool inRendering() const { return fInRendering != 0; } |
| 111 void startRendering() {fInRendering = 1;} | 124 void startRendering() {fInRendering = 1;} |
| 112 void doneRendering() {fInRendering = 0;} | 125 void doneRendering() {fInRendering = 0;} |
| 113 | 126 |
| 114 inline bool hasData(DataType type) { | 127 inline bool hasData(DataType type) { |
| 115 return type == fDataType; | 128 return type == fDataType; |
| 116 } | 129 } |
| 117 | 130 |
| 118 inline void* data(DataType type) { | 131 inline void* data(DataType type) { |
| 119 return type == fDataType ? fData : NULL; | 132 return type == fDataType ? fData : NULL; |
| 120 } | 133 } |
| 121 | 134 |
| 122 inline void setData(void* data, DataType type) { | 135 inline void setData(void* data, DataType type) { |
| 123 releaseData(); | 136 releaseData(); |
| 124 fDataType = type; | 137 fDataType = type; |
| 125 fData = data; | 138 fData = data; |
| 126 } | 139 } |
| 127 | 140 |
| 128 void releaseData(); | 141 void releaseData(); |
| 129 | 142 |
| 130 // ~SkPdfNativeObject() { | 143 // ~SkPdfNativeObject() { |
| 131 // //reset(); must be called manually! | 144 // //reset(); must be called manually! |
| 132 // } | 145 // } |
| 133 | 146 |
| 134 void reset() { | 147 void reset() { |
| 148 SkPdfMarkObjectUnused(); |
| 149 |
| 135 switch (fObjectType) { | 150 switch (fObjectType) { |
| 136 case kArray_PdfObjectType: | 151 case kArray_PdfObjectType: |
| 137 delete fArray; | 152 delete fArray; |
| 138 break; | 153 break; |
| 139 | 154 |
| 140 case kDictionary_PdfObjectType: | 155 case kDictionary_PdfObjectType: |
| 141 delete fMap; | 156 delete fMap; |
| 142 if (isStreamOwned()) { | 157 if (isStreamOwned()) { |
| 143 delete[] fStr.fBuffer; | 158 delete[] fStr.fBuffer; |
| 144 fStr.fBuffer = NULL; | 159 fStr.fBuffer = NULL; |
| 145 fStr.fBytes = 0; | 160 fStr.fBytes = 0; |
| 146 } | 161 } |
| 147 break; | 162 break; |
| 148 | 163 |
| 149 default: | 164 default: |
| 150 break; | 165 break; |
| 151 } | 166 } |
| 152 fObjectType = kInvalid_PdfObjectType; | 167 fObjectType = kInvalid_PdfObjectType; |
| 153 releaseData(); | 168 releaseData(); |
| 154 } | 169 } |
| 155 | 170 |
| 156 ObjectType type() { return fObjectType; } | 171 ObjectType type() { |
| 172 SkPdfMarkObjectUsed(); |
| 173 |
| 174 return fObjectType; |
| 175 } |
| 157 | 176 |
| 158 const char* c_str() const { | 177 const char* c_str() const { |
| 178 SkPdfMarkObjectUsed(); |
| 179 |
| 159 switch (fObjectType) { | 180 switch (fObjectType) { |
| 160 case kString_PdfObjectType: | 181 case kString_PdfObjectType: |
| 161 case kHexString_PdfObjectType: | 182 case kHexString_PdfObjectType: |
| 162 case kKeyword_PdfObjectType: | 183 case kKeyword_PdfObjectType: |
| 163 case kName_PdfObjectType: | 184 case kName_PdfObjectType: |
| 164 return (const char*)fStr.fBuffer; | 185 return (const char*)fStr.fBuffer; |
| 165 | 186 |
| 166 default: | 187 default: |
| 167 // TODO(edisonn): report/warning | 188 // TODO(edisonn): report/warning |
| 168 return NULL; | 189 return NULL; |
| 169 } | 190 } |
| 170 } | 191 } |
| 171 | 192 |
| 172 size_t lenstr() const { | 193 size_t lenstr() const { |
| 194 SkPdfMarkObjectUsed(); |
| 195 |
| 173 switch (fObjectType) { | 196 switch (fObjectType) { |
| 174 case kString_PdfObjectType: | 197 case kString_PdfObjectType: |
| 175 case kHexString_PdfObjectType: | 198 case kHexString_PdfObjectType: |
| 176 case kKeyword_PdfObjectType: | 199 case kKeyword_PdfObjectType: |
| 177 case kName_PdfObjectType: | 200 case kName_PdfObjectType: |
| 178 return fStr.fBytes; | 201 return fStr.fBytes; |
| 179 | 202 |
| 180 default: | 203 default: |
| 181 // TODO(edisonn): report/warning | 204 // TODO(edisonn): report/warning |
| 182 return 0; | 205 return 0; |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 if (fObjectType != kArray_PdfObjectType) { | 369 if (fObjectType != kArray_PdfObjectType) { |
| 347 // TODO(edisonn): report err | 370 // TODO(edisonn): report err |
| 348 return false; | 371 return false; |
| 349 } | 372 } |
| 350 | 373 |
| 351 fArray->push(obj); | 374 fArray->push(obj); |
| 352 return true; | 375 return true; |
| 353 } | 376 } |
| 354 | 377 |
| 355 size_t size() const { | 378 size_t size() const { |
| 379 SkPdfMarkObjectUsed(); |
| 380 |
| 356 SkASSERT(fObjectType == kArray_PdfObjectType); | 381 SkASSERT(fObjectType == kArray_PdfObjectType); |
| 357 | 382 |
| 358 return fArray->count(); | 383 return fArray->count(); |
| 359 } | 384 } |
| 360 | 385 |
| 361 SkPdfNativeObject* objAtAIndex(int i) { | 386 SkPdfNativeObject* objAtAIndex(int i) { |
| 387 SkPdfMarkObjectUsed(); |
| 388 |
| 362 SkASSERT(fObjectType == kArray_PdfObjectType); | 389 SkASSERT(fObjectType == kArray_PdfObjectType); |
| 363 | 390 |
| 364 return (*fArray)[i]; | 391 return (*fArray)[i]; |
| 365 } | 392 } |
| 366 | 393 |
| 367 SkPdfNativeObject* removeLastInArray() { | 394 SkPdfNativeObject* removeLastInArray() { |
| 395 // SkPdfMarkObjectUsed(); |
| 396 |
| 368 SkASSERT(fObjectType == kArray_PdfObjectType); | 397 SkASSERT(fObjectType == kArray_PdfObjectType); |
| 369 | 398 |
| 370 SkPdfNativeObject* ret = NULL; | 399 SkPdfNativeObject* ret = NULL; |
| 371 fArray->pop(&ret); | 400 fArray->pop(&ret); |
| 372 | 401 |
| 373 return ret; | 402 return ret; |
| 374 } | 403 } |
| 375 | 404 |
| 376 | 405 |
| 377 const SkPdfNativeObject* objAtAIndex(int i) const { | 406 const SkPdfNativeObject* objAtAIndex(int i) const { |
| 407 SkPdfMarkObjectUsed(); |
| 408 |
| 378 SkASSERT(fObjectType == kArray_PdfObjectType); | 409 SkASSERT(fObjectType == kArray_PdfObjectType); |
| 379 | 410 |
| 380 return (*fArray)[i]; | 411 return (*fArray)[i]; |
| 381 } | 412 } |
| 382 | 413 |
| 383 SkPdfNativeObject* operator[](int i) { | 414 SkPdfNativeObject* operator[](int i) { |
| 384 SkASSERT(fObjectType == kArray_PdfObjectType); | 415 SkASSERT(fObjectType == kArray_PdfObjectType); |
| 385 | 416 |
| 386 return (*fArray)[i]; | 417 return (*fArray)[i]; |
| 387 } | 418 } |
| 388 | 419 |
| 389 const SkPdfNativeObject* operator[](int i) const { | 420 const SkPdfNativeObject* operator[](int i) const { |
| 421 SkPdfMarkObjectUsed(); |
| 422 |
| 390 SkASSERT(fObjectType == kArray_PdfObjectType); | 423 SkASSERT(fObjectType == kArray_PdfObjectType); |
| 391 | 424 |
| 392 return (*fArray)[i]; | 425 return (*fArray)[i]; |
| 393 } | 426 } |
| 394 | 427 |
| 395 | 428 |
| 396 // TODO(edisonn): make the functions to return SkPdfDictionary, move these f
unctions in SkPdfDictionary | 429 // TODO(edisonn): make the functions to return SkPdfDictionary, move these f
unctions in SkPdfDictionary |
| 397 static void makeEmptyDictionary(SkPdfNativeObject* obj) { | 430 static void makeEmptyDictionary(SkPdfNativeObject* obj) { |
| 398 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType); | 431 SkASSERT(obj->fObjectType == kInvalid_PdfObjectType); |
| 399 | 432 |
| 400 obj->fObjectType = kDictionary_PdfObjectType; | 433 obj->fObjectType = kDictionary_PdfObjectType; |
| 401 obj->fMap = new SkTDict<SkPdfNativeObject*>(1); | 434 obj->fMap = new SkTDict<SkPdfNativeObject*>(1); |
| 402 obj->fStr.fBuffer = NULL; | 435 obj->fStr.fBuffer = NULL; |
| 403 obj->fStr.fBytes = 0; | 436 obj->fStr.fBytes = 0; |
| 404 } | 437 } |
| 405 | 438 |
| 406 // TODO(edisonn): get all the possible names from spec, and compute a hash f
unction | 439 // TODO(edisonn): get all the possible names from spec, and compute a hash f
unction |
| 407 // that would create no overlaps in the same dictionary | 440 // that would create no overlaps in the same dictionary |
| 408 // or build a tree of chars that when followed goes to a unique id/index/has
h | 441 // or build a tree of chars that when followed goes to a unique id/index/has
h |
| 409 // TODO(edisonn): generate constants like kDictFoo, kNameDict_name | 442 // TODO(edisonn): generate constants like kDictFoo, kNameDict_name |
| 410 // which will be used in code | 443 // which will be used in code |
| 411 // add function SkPdfFastNameKey key(const char* key); | 444 // add function SkPdfFastNameKey key(const char* key); |
| 412 // TODO(edisonn): setting the same key twike, will make the value undefined! | 445 // TODO(edisonn): setting the same key twike, will make the value undefined! |
| 413 bool set(const SkPdfNativeObject* key, SkPdfNativeObject* value) { | 446 bool set(const SkPdfNativeObject* key, SkPdfNativeObject* value) { |
| 447 //SkPdfMarkObjectUsed(); |
| 448 |
| 414 SkASSERT(fObjectType == kDictionary_PdfObjectType); | 449 SkASSERT(fObjectType == kDictionary_PdfObjectType); |
| 415 SkASSERT(key->fObjectType == kName_PdfObjectType); | 450 SkASSERT(key->fObjectType == kName_PdfObjectType); |
| 416 | 451 |
| 417 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar
y_PdfObjectType) { | 452 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar
y_PdfObjectType) { |
| 418 // TODO(edisonn): report err | 453 // TODO(edisonn): report err |
| 419 return false; | 454 return false; |
| 420 } | 455 } |
| 421 | 456 |
| 422 //// we rewrite all delimiters and white spaces with '\0', so we expect
the end of name to be '\0' | 457 //// we rewrite all delimiters and white spaces with '\0', so we expect
the end of name to be '\0' |
| 423 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); | 458 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); |
| 424 | 459 |
| 425 return set(key->fStr.fBuffer, key->fStr.fBytes, value); | 460 return set(key->fStr.fBuffer, key->fStr.fBytes, value); |
| 426 } | 461 } |
| 427 | 462 |
| 428 bool set(const char* key, SkPdfNativeObject* value) { | 463 bool set(const char* key, SkPdfNativeObject* value) { |
| 464 //SkPdfMarkObjectUsed(); |
| 465 |
| 429 return set((const unsigned char*)key, strlen(key), value); | 466 return set((const unsigned char*)key, strlen(key), value); |
| 430 } | 467 } |
| 431 | 468 |
| 432 bool set(const unsigned char* key, size_t len, SkPdfNativeObject* value) { | 469 bool set(const unsigned char* key, size_t len, SkPdfNativeObject* value) { |
| 470 //SkPdfMarkObjectUsed(); |
| 471 |
| 433 SkASSERT(fObjectType == kDictionary_PdfObjectType); | 472 SkASSERT(fObjectType == kDictionary_PdfObjectType); |
| 434 | 473 |
| 435 if (fObjectType != kDictionary_PdfObjectType) { | 474 if (fObjectType != kDictionary_PdfObjectType) { |
| 436 // TODO(edisonn): report err | 475 // TODO(edisonn): report err |
| 437 return false; | 476 return false; |
| 438 } | 477 } |
| 439 | 478 |
| 440 return fMap->set((const char*)key, len, value); | 479 return fMap->set((const char*)key, len, value); |
| 441 } | 480 } |
| 442 | 481 |
| 443 SkPdfNativeObject* get(const SkPdfNativeObject* key) { | 482 SkPdfNativeObject* get(const SkPdfNativeObject* key) { |
| 483 SkPdfMarkObjectUsed(); |
| 484 |
| 444 SkASSERT(fObjectType == kDictionary_PdfObjectType); | 485 SkASSERT(fObjectType == kDictionary_PdfObjectType); |
| 445 SkASSERT(key->fObjectType == kName_PdfObjectType); | 486 SkASSERT(key->fObjectType == kName_PdfObjectType); |
| 446 | 487 |
| 447 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar
y_PdfObjectType) { | 488 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar
y_PdfObjectType) { |
| 448 // TODO(edisonn): report err | 489 // TODO(edisonn): report err |
| 449 return NULL; | 490 return NULL; |
| 450 } | 491 } |
| 451 | 492 |
| 452 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); | 493 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); |
| 453 | 494 |
| 454 return get(key->fStr.fBuffer, key->fStr.fBytes); | 495 return get(key->fStr.fBuffer, key->fStr.fBytes); |
| 455 } | 496 } |
| 456 | 497 |
| 457 SkPdfNativeObject* get(const char* key) { | 498 SkPdfNativeObject* get(const char* key) { |
| 499 SkPdfMarkObjectUsed(); |
| 500 |
| 458 return get((const unsigned char*)key, strlen(key)); | 501 return get((const unsigned char*)key, strlen(key)); |
| 459 } | 502 } |
| 460 | 503 |
| 461 SkPdfNativeObject* get(const unsigned char* key, size_t len) { | 504 SkPdfNativeObject* get(const unsigned char* key, size_t len) { |
| 505 SkPdfMarkObjectUsed(); |
| 506 |
| 462 SkASSERT(fObjectType == kDictionary_PdfObjectType); | 507 SkASSERT(fObjectType == kDictionary_PdfObjectType); |
| 463 SkASSERT(key); | 508 SkASSERT(key); |
| 464 if (fObjectType != kDictionary_PdfObjectType) { | 509 if (fObjectType != kDictionary_PdfObjectType) { |
| 465 // TODO(edisonn): report err | 510 // TODO(edisonn): report err |
| 466 return NULL; | 511 return NULL; |
| 467 } | 512 } |
| 468 SkPdfNativeObject* ret = NULL; | 513 SkPdfNativeObject* ret = NULL; |
| 469 fMap->find((const char*)key, len, &ret); | 514 fMap->find((const char*)key, len, &ret); |
| 470 | 515 |
| 471 #ifdef PDF_TRACE | 516 #ifdef PDF_TRACE |
| 472 SkString _key; | 517 SkString _key; |
| 473 _key.append((const char*)key, len); | 518 _key.append((const char*)key, len); |
| 474 printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9
).c_str() : "_NOT_FOUND"); | 519 printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9
).c_str() : "_NOT_FOUND"); |
| 475 #endif | 520 #endif |
| 476 | 521 |
| 477 return ret; | 522 return ret; |
| 478 } | 523 } |
| 479 | 524 |
| 480 const SkPdfNativeObject* get(const SkPdfNativeObject* key) const { | 525 const SkPdfNativeObject* get(const SkPdfNativeObject* key) const { |
| 526 SkPdfMarkObjectUsed(); |
| 527 |
| 481 SkASSERT(fObjectType == kDictionary_PdfObjectType); | 528 SkASSERT(fObjectType == kDictionary_PdfObjectType); |
| 482 SkASSERT(key->fObjectType == kName_PdfObjectType); | 529 SkASSERT(key->fObjectType == kName_PdfObjectType); |
| 483 | 530 |
| 484 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar
y_PdfObjectType) { | 531 if (key->fObjectType != kName_PdfObjectType || fObjectType != kDictionar
y_PdfObjectType) { |
| 485 // TODO(edisonn): report err | 532 // TODO(edisonn): report err |
| 486 return NULL; | 533 return NULL; |
| 487 } | 534 } |
| 488 | 535 |
| 489 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); | 536 //SkASSERT(key->fStr.fBuffer[key->fStr.fBytes] == '\0'); |
| 490 | 537 |
| 491 return get(key->fStr.fBuffer, key->fStr.fBytes); | 538 return get(key->fStr.fBuffer, key->fStr.fBytes); |
| 492 } | 539 } |
| 493 | 540 |
| 494 const SkPdfNativeObject* get(const char* key) const { | 541 const SkPdfNativeObject* get(const char* key) const { |
| 542 SkPdfMarkObjectUsed(); |
| 543 |
| 495 return get((const unsigned char*)key, strlen(key)); | 544 return get((const unsigned char*)key, strlen(key)); |
| 496 } | 545 } |
| 497 | 546 |
| 498 const SkPdfNativeObject* get(const unsigned char* key, size_t len) const { | 547 const SkPdfNativeObject* get(const unsigned char* key, size_t len) const { |
| 548 SkPdfMarkObjectUsed(); |
| 549 |
| 499 SkASSERT(fObjectType == kDictionary_PdfObjectType); | 550 SkASSERT(fObjectType == kDictionary_PdfObjectType); |
| 500 SkASSERT(key); | 551 SkASSERT(key); |
| 501 if (fObjectType != kDictionary_PdfObjectType) { | 552 if (fObjectType != kDictionary_PdfObjectType) { |
| 502 // TODO(edisonn): report err | 553 // TODO(edisonn): report err |
| 503 return NULL; | 554 return NULL; |
| 504 } | 555 } |
| 505 SkPdfNativeObject* ret = NULL; | 556 SkPdfNativeObject* ret = NULL; |
| 506 fMap->find((const char*)key, len, &ret); | 557 fMap->find((const char*)key, len, &ret); |
| 507 | 558 |
| 508 #ifdef PDF_TRACE | 559 #ifdef PDF_TRACE |
| 509 SkString _key; | 560 SkString _key; |
| 510 _key.append((const char*)key, len); | 561 _key.append((const char*)key, len); |
| 511 printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9
).c_str() : "_NOT_FOUND"); | 562 printf("\nget(/%s) = %s\n", _key.c_str(), ret ? ret->toString(0, len + 9
).c_str() : "_NOT_FOUND"); |
| 512 #endif | 563 #endif |
| 513 | 564 |
| 514 return ret; | 565 return ret; |
| 515 } | 566 } |
| 516 | 567 |
| 517 const SkPdfNativeObject* get(const char* key, const char* abr) const { | 568 const SkPdfNativeObject* get(const char* key, const char* abr) const { |
| 569 SkPdfMarkObjectUsed(); |
| 570 |
| 518 const SkPdfNativeObject* ret = get(key); | 571 const SkPdfNativeObject* ret = get(key); |
| 519 // TODO(edisonn): / is a valid name, and it might be an abreviation, so
"" should not be like NULL | 572 // TODO(edisonn): / is a valid name, and it might be an abreviation, so
"" should not be like NULL |
| 520 // make this distiontion in generator, and remove "" from condition | 573 // make this distiontion in generator, and remove "" from condition |
| 521 if (ret != NULL || abr == NULL || *abr == '\0') { | 574 if (ret != NULL || abr == NULL || *abr == '\0') { |
| 522 return ret; | 575 return ret; |
| 523 } | 576 } |
| 524 return get(abr); | 577 return get(abr); |
| 525 } | 578 } |
| 526 | 579 |
| 527 SkPdfNativeObject* get(const char* key, const char* abr) { | 580 SkPdfNativeObject* get(const char* key, const char* abr) { |
| 581 SkPdfMarkObjectUsed(); |
| 582 |
| 528 SkPdfNativeObject* ret = get(key); | 583 SkPdfNativeObject* ret = get(key); |
| 529 // TODO(edisonn): / is a valid name, and it might be an abreviation, so
"" should not be like NULL | 584 // TODO(edisonn): / is a valid name, and it might be an abreviation, so
"" should not be like NULL |
| 530 // make this distiontion in generator, and remove "" from condition | 585 // make this distiontion in generator, and remove "" from condition |
| 531 if (ret != NULL || abr == NULL || *abr == '\0') { | 586 if (ret != NULL || abr == NULL || *abr == '\0') { |
| 532 return ret; | 587 return ret; |
| 533 } | 588 } |
| 534 return get(abr); | 589 return get(abr); |
| 535 } | 590 } |
| 536 | 591 |
| 537 SkPdfDictionary* asDictionary() { | 592 SkPdfDictionary* asDictionary() { |
| 593 SkPdfMarkObjectUsed(); |
| 594 |
| 538 SkASSERT(isDictionary()); | 595 SkASSERT(isDictionary()); |
| 539 if (!isDictionary()) { | 596 if (!isDictionary()) { |
| 540 return NULL; | 597 return NULL; |
| 541 } | 598 } |
| 542 return (SkPdfDictionary*) this; | 599 return (SkPdfDictionary*) this; |
| 543 } | 600 } |
| 544 | 601 |
| 545 const SkPdfDictionary* asDictionary() const { | 602 const SkPdfDictionary* asDictionary() const { |
| 603 SkPdfMarkObjectUsed(); |
| 604 |
| 546 SkASSERT(isDictionary()); | 605 SkASSERT(isDictionary()); |
| 547 if (!isDictionary()) { | 606 if (!isDictionary()) { |
| 548 return NULL; | 607 return NULL; |
| 549 } | 608 } |
| 550 return (SkPdfDictionary*) this; | 609 return (SkPdfDictionary*) this; |
| 551 } | 610 } |
| 552 | 611 |
| 553 | 612 |
| 554 bool isReference() const { | 613 bool isReference() const { |
| 614 SkPdfMarkObjectUsed(); |
| 615 |
| 555 return fObjectType == kReference_PdfObjectType; | 616 return fObjectType == kReference_PdfObjectType; |
| 556 } | 617 } |
| 557 | 618 |
| 558 bool isBoolean() const { | 619 bool isBoolean() const { |
| 620 SkPdfMarkObjectUsed(); |
| 621 |
| 559 return fObjectType == kBoolean_PdfObjectType; | 622 return fObjectType == kBoolean_PdfObjectType; |
| 560 } | 623 } |
| 561 | 624 |
| 562 bool isInteger() const { | 625 bool isInteger() const { |
| 626 SkPdfMarkObjectUsed(); |
| 627 |
| 563 return fObjectType == kInteger_PdfObjectType; | 628 return fObjectType == kInteger_PdfObjectType; |
| 564 } | 629 } |
| 565 private: | 630 private: |
| 566 bool isReal() const { | 631 bool isReal() const { |
| 632 SkPdfMarkObjectUsed(); |
| 633 |
| 567 return fObjectType == kReal_PdfObjectType; | 634 return fObjectType == kReal_PdfObjectType; |
| 568 } | 635 } |
| 569 public: | 636 public: |
| 570 bool isNumber() const { | 637 bool isNumber() const { |
| 638 SkPdfMarkObjectUsed(); |
| 639 |
| 571 return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_Pdf
ObjectType; | 640 return fObjectType == kInteger_PdfObjectType || fObjectType == kReal_Pdf
ObjectType; |
| 572 } | 641 } |
| 573 | 642 |
| 574 bool isKeywordReference() const { | 643 bool isKeywordReference() const { |
| 644 SkPdfMarkObjectUsed(); |
| 645 |
| 575 return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr
.fBuffer[0] == 'R'; | 646 return fObjectType == kKeyword_PdfObjectType && fStr.fBytes == 1 && fStr
.fBuffer[0] == 'R'; |
| 576 } | 647 } |
| 577 | 648 |
| 578 bool isKeyword() const { | 649 bool isKeyword() const { |
| 650 SkPdfMarkObjectUsed(); |
| 651 |
| 579 return fObjectType == kKeyword_PdfObjectType; | 652 return fObjectType == kKeyword_PdfObjectType; |
| 580 } | 653 } |
| 581 | 654 |
| 582 bool isKeyword(const char* keyword) const { | 655 bool isKeyword(const char* keyword) const { |
| 656 SkPdfMarkObjectUsed(); |
| 657 |
| 583 if (!isKeyword()) { | 658 if (!isKeyword()) { |
| 584 return false; | 659 return false; |
| 585 } | 660 } |
| 586 | 661 |
| 587 if (strlen(keyword) != fStr.fBytes) { | 662 if (strlen(keyword) != fStr.fBytes) { |
| 588 return false; | 663 return false; |
| 589 } | 664 } |
| 590 | 665 |
| 591 if (strncmp(keyword, (const char*)fStr.fBuffer, fStr.fBytes) != 0) { | 666 if (strncmp(keyword, (const char*)fStr.fBuffer, fStr.fBytes) != 0) { |
| 592 return false; | 667 return false; |
| 593 } | 668 } |
| 594 | 669 |
| 595 return true; | 670 return true; |
| 596 } | 671 } |
| 597 | 672 |
| 598 bool isName() const { | 673 bool isName() const { |
| 674 SkPdfMarkObjectUsed(); |
| 675 |
| 599 return fObjectType == kName_PdfObjectType; | 676 return fObjectType == kName_PdfObjectType; |
| 600 } | 677 } |
| 601 | 678 |
| 602 bool isName(const char* name) const { | 679 bool isName(const char* name) const { |
| 680 SkPdfMarkObjectUsed(); |
| 681 |
| 603 return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name)
&& strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0; | 682 return fObjectType == kName_PdfObjectType && fStr.fBytes == strlen(name)
&& strncmp((const char*)fStr.fBuffer, name, fStr.fBytes) == 0; |
| 604 } | 683 } |
| 605 | 684 |
| 606 bool isArray() const { | 685 bool isArray() const { |
| 686 SkPdfMarkObjectUsed(); |
| 687 |
| 607 return fObjectType == kArray_PdfObjectType; | 688 return fObjectType == kArray_PdfObjectType; |
| 608 } | 689 } |
| 609 | 690 |
| 610 bool isDate() const { | 691 bool isDate() const { |
| 692 SkPdfMarkObjectUsed(); |
| 693 |
| 611 return fObjectType == kString_PdfObjectType || fObjectType == kHexString
_PdfObjectType; | 694 return fObjectType == kString_PdfObjectType || fObjectType == kHexString
_PdfObjectType; |
| 612 } | 695 } |
| 613 | 696 |
| 614 bool isDictionary() const { | 697 bool isDictionary() const { |
| 698 SkPdfMarkObjectUsed(); |
| 699 |
| 615 return fObjectType == kDictionary_PdfObjectType; | 700 return fObjectType == kDictionary_PdfObjectType; |
| 616 } | 701 } |
| 617 | 702 |
| 618 bool isFunction() const { | 703 bool isFunction() const { |
| 704 SkPdfMarkObjectUsed(); |
| 705 |
| 619 return false; // NYI | 706 return false; // NYI |
| 620 } | 707 } |
| 621 | 708 |
| 622 bool isRectangle() const { | 709 bool isRectangle() const { |
| 710 SkPdfMarkObjectUsed(); |
| 711 |
| 623 return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // N
YI + and elems are numbers | 712 return fObjectType == kArray_PdfObjectType && fArray->count() == 4; // N
YI + and elems are numbers |
| 624 } | 713 } |
| 625 | 714 |
| 626 // TODO(edisonn): has stream .. or is stream ... TBD | 715 // TODO(edisonn): has stream .. or is stream ... TBD |
| 627 bool hasStream() const { | 716 bool hasStream() const { |
| 717 SkPdfMarkObjectUsed(); |
| 718 |
| 628 return isDictionary() && fStr.fBuffer != NULL; | 719 return isDictionary() && fStr.fBuffer != NULL; |
| 629 } | 720 } |
| 630 | 721 |
| 631 // TODO(edisonn): has stream .. or is stream ... TBD | 722 // TODO(edisonn): has stream .. or is stream ... TBD |
| 632 const SkPdfStream* getStream() const { | 723 const SkPdfStream* getStream() const { |
| 724 SkPdfMarkObjectUsed(); |
| 725 |
| 633 return hasStream() ? (const SkPdfStream*)this : NULL; | 726 return hasStream() ? (const SkPdfStream*)this : NULL; |
| 634 } | 727 } |
| 635 | 728 |
| 636 SkPdfStream* getStream() { | 729 SkPdfStream* getStream() { |
| 730 SkPdfMarkObjectUsed(); |
| 731 |
| 637 return hasStream() ? (SkPdfStream*)this : NULL; | 732 return hasStream() ? (SkPdfStream*)this : NULL; |
| 638 } | 733 } |
| 639 | 734 |
| 640 bool isAnyString() const { | 735 bool isAnyString() const { |
| 736 SkPdfMarkObjectUsed(); |
| 737 |
| 641 return fObjectType == kString_PdfObjectType || fObjectType == kHexString
_PdfObjectType; | 738 return fObjectType == kString_PdfObjectType || fObjectType == kHexString
_PdfObjectType; |
| 642 } | 739 } |
| 643 | 740 |
| 644 bool isHexString() const { | 741 bool isHexString() const { |
| 742 SkPdfMarkObjectUsed(); |
| 743 |
| 645 return fObjectType == kHexString_PdfObjectType; | 744 return fObjectType == kHexString_PdfObjectType; |
| 646 } | 745 } |
| 647 | 746 |
| 648 bool isMatrix() const { | 747 bool isMatrix() const { |
| 748 SkPdfMarkObjectUsed(); |
| 749 |
| 649 return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // N
YI + and elems are numbers | 750 return fObjectType == kArray_PdfObjectType && fArray->count() == 6; // N
YI + and elems are numbers |
| 650 } | 751 } |
| 651 | 752 |
| 652 inline int64_t intValue() const { | 753 inline int64_t intValue() const { |
| 754 SkPdfMarkObjectUsed(); |
| 755 |
| 653 SkASSERT(fObjectType == kInteger_PdfObjectType); | 756 SkASSERT(fObjectType == kInteger_PdfObjectType); |
| 654 | 757 |
| 655 if (fObjectType != kInteger_PdfObjectType) { | 758 if (fObjectType != kInteger_PdfObjectType) { |
| 656 // TODO(edisonn): log err | 759 // TODO(edisonn): log err |
| 657 return 0; | 760 return 0; |
| 658 } | 761 } |
| 659 return fIntegerValue; | 762 return fIntegerValue; |
| 660 } | 763 } |
| 661 private: | 764 private: |
| 662 inline double realValue() const { | 765 inline double realValue() const { |
| 766 SkPdfMarkObjectUsed(); |
| 767 |
| 663 SkASSERT(fObjectType == kReal_PdfObjectType); | 768 SkASSERT(fObjectType == kReal_PdfObjectType); |
| 664 | 769 |
| 665 if (fObjectType != kReal_PdfObjectType) { | 770 if (fObjectType != kReal_PdfObjectType) { |
| 666 // TODO(edisonn): log err | 771 // TODO(edisonn): log err |
| 667 return 0; | 772 return 0; |
| 668 } | 773 } |
| 669 return fRealValue; | 774 return fRealValue; |
| 670 } | 775 } |
| 671 public: | 776 public: |
| 672 inline double numberValue() const { | 777 inline double numberValue() const { |
| 778 SkPdfMarkObjectUsed(); |
| 779 |
| 673 SkASSERT(isNumber()); | 780 SkASSERT(isNumber()); |
| 674 | 781 |
| 675 if (!isNumber()) { | 782 if (!isNumber()) { |
| 676 // TODO(edisonn): log err | 783 // TODO(edisonn): log err |
| 677 return 0; | 784 return 0; |
| 678 } | 785 } |
| 679 return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue; | 786 return fObjectType == kReal_PdfObjectType ? fRealValue : fIntegerValue; |
| 680 } | 787 } |
| 681 | 788 |
| 682 inline SkScalar scalarValue() const { | 789 inline SkScalar scalarValue() const { |
| 790 SkPdfMarkObjectUsed(); |
| 791 |
| 683 SkASSERT(isNumber()); | 792 SkASSERT(isNumber()); |
| 684 | 793 |
| 685 if (!isNumber()) { | 794 if (!isNumber()) { |
| 686 // TODO(edisonn): log err | 795 // TODO(edisonn): log err |
| 687 return SkIntToScalar(0); | 796 return SkIntToScalar(0); |
| 688 } | 797 } |
| 689 return fObjectType == kReal_PdfObjectType ? SkDoubleToScalar(fRealValue)
: | 798 return fObjectType == kReal_PdfObjectType ? SkDoubleToScalar(fRealValue)
: |
| 690 SkIntToScalar(fIntegerValue)
; | 799 SkIntToScalar(fIntegerValue)
; |
| 691 } | 800 } |
| 692 | 801 |
| 693 int referenceId() const { | 802 int referenceId() const { |
| 803 SkPdfMarkObjectUsed(); |
| 804 |
| 694 SkASSERT(fObjectType == kReference_PdfObjectType); | 805 SkASSERT(fObjectType == kReference_PdfObjectType); |
| 695 return fRef.fId; | 806 return fRef.fId; |
| 696 } | 807 } |
| 697 | 808 |
| 698 int referenceGeneration() const { | 809 int referenceGeneration() const { |
| 810 SkPdfMarkObjectUsed(); |
| 811 |
| 699 SkASSERT(fObjectType == kReference_PdfObjectType); | 812 SkASSERT(fObjectType == kReference_PdfObjectType); |
| 700 return fRef.fGen; | 813 return fRef.fGen; |
| 701 } | 814 } |
| 702 | 815 |
| 703 inline const char* nameValue() const { | 816 inline const char* nameValue() const { |
| 817 SkPdfMarkObjectUsed(); |
| 818 |
| 704 SkASSERT(fObjectType == kName_PdfObjectType); | 819 SkASSERT(fObjectType == kName_PdfObjectType); |
| 705 | 820 |
| 706 if (fObjectType != kName_PdfObjectType) { | 821 if (fObjectType != kName_PdfObjectType) { |
| 707 // TODO(edisonn): log err | 822 // TODO(edisonn): log err |
| 708 return ""; | 823 return ""; |
| 709 } | 824 } |
| 710 return (const char*)fStr.fBuffer; | 825 return (const char*)fStr.fBuffer; |
| 711 } | 826 } |
| 712 | 827 |
| 713 inline const char* stringValue() const { | 828 inline const char* stringValue() const { |
| 829 SkPdfMarkObjectUsed(); |
| 830 |
| 714 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri
ng_PdfObjectType); | 831 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri
ng_PdfObjectType); |
| 715 | 832 |
| 716 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd
fObjectType) { | 833 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd
fObjectType) { |
| 717 // TODO(edisonn): log err | 834 // TODO(edisonn): log err |
| 718 return ""; | 835 return ""; |
| 719 } | 836 } |
| 720 return (const char*)fStr.fBuffer; | 837 return (const char*)fStr.fBuffer; |
| 721 } | 838 } |
| 722 | 839 |
| 723 inline NotOwnedString strRef() { | 840 inline NotOwnedString strRef() { |
| 841 SkPdfMarkObjectUsed(); |
| 842 |
| 724 switch (fObjectType) { | 843 switch (fObjectType) { |
| 725 case kString_PdfObjectType: | 844 case kString_PdfObjectType: |
| 726 case kHexString_PdfObjectType: | 845 case kHexString_PdfObjectType: |
| 727 case kKeyword_PdfObjectType: | 846 case kKeyword_PdfObjectType: |
| 728 case kName_PdfObjectType: | 847 case kName_PdfObjectType: |
| 729 return fStr; | 848 return fStr; |
| 730 | 849 |
| 731 default: | 850 default: |
| 732 // TODO(edisonn): report/warning | 851 // TODO(edisonn): report/warning |
| 733 return NotOwnedString(); | 852 return NotOwnedString(); |
| 734 } | 853 } |
| 735 } | 854 } |
| 736 | 855 |
| 737 // TODO(edisonn): nameValue2 and stringValue2 are used to make code generati
on easy, | 856 // TODO(edisonn): nameValue2 and stringValue2 are used to make code generati
on easy, |
| 738 // but it is not a performat way to do it, since it will create an extra cop
y | 857 // but it is not a performat way to do it, since it will create an extra cop
y |
| 739 // remove these functions and make code generated faster | 858 // remove these functions and make code generated faster |
| 740 inline SkString nameValue2() const { | 859 inline SkString nameValue2() const { |
| 860 SkPdfMarkObjectUsed(); |
| 861 |
| 741 SkASSERT(fObjectType == kName_PdfObjectType); | 862 SkASSERT(fObjectType == kName_PdfObjectType); |
| 742 | 863 |
| 743 if (fObjectType != kName_PdfObjectType) { | 864 if (fObjectType != kName_PdfObjectType) { |
| 744 // TODO(edisonn): log err | 865 // TODO(edisonn): log err |
| 745 return SkString(); | 866 return SkString(); |
| 746 } | 867 } |
| 747 return SkString((const char*)fStr.fBuffer, fStr.fBytes); | 868 return SkString((const char*)fStr.fBuffer, fStr.fBytes); |
| 748 } | 869 } |
| 749 | 870 |
| 750 inline SkString stringValue2() const { | 871 inline SkString stringValue2() const { |
| 872 SkPdfMarkObjectUsed(); |
| 873 |
| 751 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri
ng_PdfObjectType); | 874 SkASSERT(fObjectType == kString_PdfObjectType || fObjectType == kHexStri
ng_PdfObjectType); |
| 752 | 875 |
| 753 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd
fObjectType) { | 876 if (fObjectType != kString_PdfObjectType && fObjectType != kHexString_Pd
fObjectType) { |
| 754 // TODO(edisonn): log err | 877 // TODO(edisonn): log err |
| 755 return SkString(); | 878 return SkString(); |
| 756 } | 879 } |
| 757 return SkString((const char*)fStr.fBuffer, fStr.fBytes); | 880 return SkString((const char*)fStr.fBuffer, fStr.fBytes); |
| 758 } | 881 } |
| 759 | 882 |
| 760 inline bool boolValue() const { | 883 inline bool boolValue() const { |
| 884 SkPdfMarkObjectUsed(); |
| 885 |
| 761 SkASSERT(fObjectType == kBoolean_PdfObjectType); | 886 SkASSERT(fObjectType == kBoolean_PdfObjectType); |
| 762 | 887 |
| 763 if (fObjectType != kBoolean_PdfObjectType) { | 888 if (fObjectType != kBoolean_PdfObjectType) { |
| 764 // TODO(edisonn): log err | 889 // TODO(edisonn): log err |
| 765 return false; | 890 return false; |
| 766 } | 891 } |
| 767 return fBooleanValue; | 892 return fBooleanValue; |
| 768 } | 893 } |
| 769 | 894 |
| 770 SkRect rectangleValue() const { | 895 SkRect rectangleValue() const { |
| 896 SkPdfMarkObjectUsed(); |
| 897 |
| 771 SkASSERT(isRectangle()); | 898 SkASSERT(isRectangle()); |
| 772 if (!isRectangle()) { | 899 if (!isRectangle()) { |
| 773 return SkRect::MakeEmpty(); | 900 return SkRect::MakeEmpty(); |
| 774 } | 901 } |
| 775 | 902 |
| 776 double array[4]; | 903 double array[4]; |
| 777 for (int i = 0; i < 4; i++) { | 904 for (int i = 0; i < 4; i++) { |
| 778 // TODO(edisonn): version where we could resolve references? | 905 // TODO(edisonn): version where we could resolve references? |
| 779 const SkPdfNativeObject* elem = objAtAIndex(i); | 906 const SkPdfNativeObject* elem = objAtAIndex(i); |
| 780 if (elem == NULL || !elem->isNumber()) { | 907 if (elem == NULL || !elem->isNumber()) { |
| 781 // TODO(edisonn): report error | 908 // TODO(edisonn): report error |
| 782 return SkRect::MakeEmpty(); | 909 return SkRect::MakeEmpty(); |
| 783 } | 910 } |
| 784 array[i] = elem->numberValue(); | 911 array[i] = elem->numberValue(); |
| 785 } | 912 } |
| 786 | 913 |
| 787 return SkRect::MakeLTRB(SkDoubleToScalar(array[0]), | 914 return SkRect::MakeLTRB(SkDoubleToScalar(array[0]), |
| 788 SkDoubleToScalar(array[1]), | 915 SkDoubleToScalar(array[1]), |
| 789 SkDoubleToScalar(array[2]), | 916 SkDoubleToScalar(array[2]), |
| 790 SkDoubleToScalar(array[3])); | 917 SkDoubleToScalar(array[3])); |
| 791 } | 918 } |
| 792 | 919 |
| 793 SkMatrix matrixValue() const { | 920 SkMatrix matrixValue() const { |
| 921 SkPdfMarkObjectUsed(); |
| 922 |
| 794 SkASSERT(isMatrix()); | 923 SkASSERT(isMatrix()); |
| 795 if (!isMatrix()) { | 924 if (!isMatrix()) { |
| 796 return SkMatrix::I(); | 925 return SkMatrix::I(); |
| 797 } | 926 } |
| 798 | 927 |
| 799 double array[6]; | 928 double array[6]; |
| 800 for (int i = 0; i < 6; i++) { | 929 for (int i = 0; i < 6; i++) { |
| 801 // TODO(edisonn): version where we could resolve references? | 930 // TODO(edisonn): version where we could resolve references? |
| 802 const SkPdfNativeObject* elem = objAtAIndex(i); | 931 const SkPdfNativeObject* elem = objAtAIndex(i); |
| 803 if (elem == NULL || !elem->isNumber()) { | 932 if (elem == NULL || !elem->isNumber()) { |
| 804 // TODO(edisonn): report error | 933 // TODO(edisonn): report error |
| 805 return SkMatrix::I(); | 934 return SkMatrix::I(); |
| 806 } | 935 } |
| 807 array[i] = elem->numberValue(); | 936 array[i] = elem->numberValue(); |
| 808 } | 937 } |
| 809 | 938 |
| 810 return SkMatrixFromPdfMatrix(array); | 939 return SkMatrixFromPdfMatrix(array); |
| 811 } | 940 } |
| 812 | 941 |
| 813 bool filterStream(); | 942 bool filterStream(); |
| 814 | 943 |
| 815 | 944 |
| 816 bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) { | 945 bool GetFilteredStreamRef(unsigned char const** buffer, size_t* len) { |
| 946 SkPdfMarkObjectUsed(); |
| 947 |
| 817 // TODO(edisonn): add params that couls let the last filter in place if
it is jpeg or png to fast load images | 948 // TODO(edisonn): add params that couls let the last filter in place if
it is jpeg or png to fast load images |
| 818 if (!hasStream()) { | 949 if (!hasStream()) { |
| 819 return false; | 950 return false; |
| 820 } | 951 } |
| 821 | 952 |
| 822 filterStream(); | 953 filterStream(); |
| 823 | 954 |
| 824 if (buffer) { | 955 if (buffer) { |
| 825 *buffer = fStr.fBuffer; | 956 *buffer = fStr.fBuffer; |
| 826 } | 957 } |
| 827 | 958 |
| 828 if (len) { | 959 if (len) { |
| 829 *len = fStr.fBytes >> 2; // last 2 bits | 960 *len = fStr.fBytes >> 2; // last 2 bits |
| 830 } | 961 } |
| 831 | 962 |
| 832 return true; | 963 return true; |
| 833 } | 964 } |
| 834 | 965 |
| 835 bool isStreamFiltered() const { | 966 bool isStreamFiltered() const { |
| 967 SkPdfMarkObjectUsed(); |
| 968 |
| 836 return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit); | 969 return hasStream() && ((fStr.fBytes & 1) == kFilteredStreamBit); |
| 837 } | 970 } |
| 838 | 971 |
| 839 bool isStreamOwned() const { | 972 bool isStreamOwned() const { |
| 973 SkPdfMarkObjectUsed(); |
| 974 |
| 840 return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit); | 975 return hasStream() && ((fStr.fBytes & 2) == kOwnedStreamBit); |
| 841 } | 976 } |
| 842 | 977 |
| 843 bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const
{ | 978 bool GetUnfilteredStreamRef(unsigned char const** buffer, size_t* len) const
{ |
| 979 SkPdfMarkObjectUsed(); |
| 980 |
| 844 if (isStreamFiltered()) { | 981 if (isStreamFiltered()) { |
| 845 return false; | 982 return false; |
| 846 } | 983 } |
| 847 | 984 |
| 848 if (!hasStream()) { | 985 if (!hasStream()) { |
| 849 return false; | 986 return false; |
| 850 } | 987 } |
| 851 | 988 |
| 852 if (buffer) { | 989 if (buffer) { |
| 853 *buffer = fStr.fBuffer; | 990 *buffer = fStr.fBuffer; |
| 854 } | 991 } |
| 855 | 992 |
| 856 if (len) { | 993 if (len) { |
| 857 *len = fStr.fBytes >> 2; // remove last 2 bits | 994 *len = fStr.fBytes >> 2; // remove last 2 bits |
| 858 } | 995 } |
| 859 | 996 |
| 860 return true; | 997 return true; |
| 861 } | 998 } |
| 862 | 999 |
| 863 bool addStream(const unsigned char* buffer, size_t len) { | 1000 bool addStream(const unsigned char* buffer, size_t len) { |
| 1001 //SkPdfMarkObjectUsed(); |
| 1002 |
| 864 SkASSERT(!hasStream()); | 1003 SkASSERT(!hasStream()); |
| 865 SkASSERT(isDictionary()); | 1004 SkASSERT(isDictionary()); |
| 866 | 1005 |
| 867 if (!isDictionary() || hasStream()) { | 1006 if (!isDictionary() || hasStream()) { |
| 868 return false; | 1007 return false; |
| 869 } | 1008 } |
| 870 | 1009 |
| 871 fStr.fBuffer = buffer; | 1010 fStr.fBuffer = buffer; |
| 872 fStr.fBytes = (len << 2) + kUnfilteredStreamBit; | 1011 fStr.fBytes = (len << 2) + kUnfilteredStreamBit; |
| 873 | 1012 |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1038 SkPdfName() : SkPdfNativeObject() { | 1177 SkPdfName() : SkPdfNativeObject() { |
| 1039 SkPdfNativeObject::makeName((const unsigned char*)"", this); | 1178 SkPdfNativeObject::makeName((const unsigned char*)"", this); |
| 1040 } | 1179 } |
| 1041 public: | 1180 public: |
| 1042 SkPdfName(char* name) : SkPdfNativeObject() { | 1181 SkPdfName(char* name) : SkPdfNativeObject() { |
| 1043 this->makeName((const unsigned char*)name, this); | 1182 this->makeName((const unsigned char*)name, this); |
| 1044 } | 1183 } |
| 1045 }; | 1184 }; |
| 1046 | 1185 |
| 1047 #endif // SkPdfNativeObject | 1186 #endif // SkPdfNativeObject |
| OLD | NEW |