David PHAM-VAN

Use generic PdfDataType structures

@@ -441,25 +441,25 @@ class PdfIndirect extends PdfDataType { @@ -441,25 +441,25 @@ class PdfIndirect extends PdfDataType {
441 int get hashCode => ser.hashCode + gen.hashCode; 441 int get hashCode => ser.hashCode + gen.hashCode;
442 } 442 }
443 443
444 -class PdfArray extends PdfDataType {  
445 - PdfArray([Iterable<PdfDataType>? values]) { 444 +class PdfArray<T extends PdfDataType> extends PdfDataType {
  445 + PdfArray([Iterable<T>? values]) {
446 if (values != null) { 446 if (values != null) {
447 this.values.addAll(values); 447 this.values.addAll(values);
448 } 448 }
449 } 449 }
450 450
451 - factory PdfArray.fromObjects(List<PdfObject?> objects) { 451 + static PdfArray<PdfIndirect> fromObjects(List<PdfObject?> objects) {
452 return PdfArray( 452 return PdfArray(
453 objects.map<PdfIndirect>((PdfObject? e) => e!.ref()).toList()); 453 objects.map<PdfIndirect>((PdfObject? e) => e!.ref()).toList());
454 } 454 }
455 455
456 - factory PdfArray.fromNum(List<num?> list) { 456 + static PdfArray<PdfNum> fromNum(List<num?> list) {
457 return PdfArray(list.map<PdfNum>((num? e) => PdfNum(e!)).toList()); 457 return PdfArray(list.map<PdfNum>((num? e) => PdfNum(e!)).toList());
458 } 458 }
459 459
460 - final List<PdfDataType> values = <PdfDataType>[]; 460 + final List<T> values = <T>[];
461 461
462 - void add(PdfDataType v) { 462 + void add(T v) {
463 values.add(v); 463 values.add(v);
464 } 464 }
465 465
@@ -489,7 +489,7 @@ class PdfArray extends PdfDataType { @@ -489,7 +489,7 @@ class PdfArray extends PdfDataType {
489 } 489 }
490 490
491 // ignore: prefer_collection_literals 491 // ignore: prefer_collection_literals
492 - final uniques = LinkedHashMap<PdfDataType, bool>(); 492 + final uniques = LinkedHashMap<T, bool>();
493 for (final s in values) { 493 for (final s in values) {
494 uniques[s] = true; 494 uniques[s] = true;
495 } 495 }
@@ -510,14 +510,14 @@ class PdfArray extends PdfDataType { @@ -510,14 +510,14 @@ class PdfArray extends PdfDataType {
510 int get hashCode => values.hashCode; 510 int get hashCode => values.hashCode;
511 } 511 }
512 512
513 -class PdfDict extends PdfDataType {  
514 - PdfDict([Map<String, PdfDataType>? values]) { 513 +class PdfDict<T extends PdfDataType> extends PdfDataType {
  514 + PdfDict([Map<String, T>? values]) {
515 if (values != null) { 515 if (values != null) {
516 this.values.addAll(values); 516 this.values.addAll(values);
517 } 517 }
518 } 518 }
519 519
520 - factory PdfDict.fromObjectMap(Map<String, PdfObject> objects) { 520 + static PdfDict<PdfIndirect> fromObjectMap(Map<String, PdfObject> objects) {
521 return PdfDict( 521 return PdfDict(
522 objects.map<String, PdfIndirect>( 522 objects.map<String, PdfIndirect>(
523 (String key, PdfObject value) => 523 (String key, PdfObject value) =>
@@ -526,22 +526,22 @@ class PdfDict extends PdfDataType { @@ -526,22 +526,22 @@ class PdfDict extends PdfDataType {
526 ); 526 );
527 } 527 }
528 528
529 - final Map<String, PdfDataType> values = <String, PdfDataType>{}; 529 + final Map<String, T> values = <String, T>{};
530 530
531 bool get isNotEmpty => values.isNotEmpty; 531 bool get isNotEmpty => values.isNotEmpty;
532 532
533 - operator []=(String k, PdfDataType v) { 533 + operator []=(String k, T v) {
534 values[k] = v; 534 values[k] = v;
535 } 535 }
536 536
537 - PdfDataType? operator [](String k) { 537 + T? operator [](String k) {
538 return values[k]; 538 return values[k];
539 } 539 }
540 540
541 @override 541 @override
542 void output(PdfStream s) { 542 void output(PdfStream s) {
543 s.putBytes(const <int>[0x3c, 0x3c]); 543 s.putBytes(const <int>[0x3c, 0x3c]);
544 - values.forEach((String k, PdfDataType v) { 544 + values.forEach((String k, T v) {
545 s.putString(k); 545 s.putString(k);
546 if (v is PdfNum || v is PdfBool || v is PdfNull || v is PdfIndirect) { 546 if (v is PdfNum || v is PdfBool || v is PdfNull || v is PdfIndirect) {
547 s.putByte(0x20); 547 s.putByte(0x20);
@@ -555,7 +555,7 @@ class PdfDict extends PdfDataType { @@ -555,7 +555,7 @@ class PdfDict extends PdfDataType {
555 return values.containsKey(key); 555 return values.containsKey(key);
556 } 556 }
557 557
558 - void merge(PdfDict other) { 558 + void merge(PdfDict<T> other) {
559 for (final key in other.values.keys) { 559 for (final key in other.values.keys) {
560 final value = other[key]!; 560 final value = other[key]!;
561 final current = values[key]; 561 final current = values[key];
@@ -572,7 +572,7 @@ class PdfDict extends PdfDataType { @@ -572,7 +572,7 @@ class PdfDict extends PdfDataType {
572 } 572 }
573 } 573 }
574 574
575 - void addAll(PdfDict other) { 575 + void addAll(PdfDict<T> other) {
576 values.addAll(other.values); 576 values.addAll(other.values);
577 } 577 }
578 578
@@ -99,14 +99,14 @@ class PdfPage extends PdfObject with PdfGraphicStream { @@ -99,14 +99,14 @@ class PdfPage extends PdfObject with PdfGraphicStream {
99 PdfArray.fromNum(<double>[0, 0, pageFormat.width, pageFormat.height]); 99 PdfArray.fromNum(<double>[0, 0, pageFormat.width, pageFormat.height]);
100 100
101 // The graphic operations to draw the page 101 // The graphic operations to draw the page
102 - if (contents.isNotEmpty) {  
103 final contentList = PdfArray.fromObjects(contents); 102 final contentList = PdfArray.fromObjects(contents);
104 103
105 if (params.containsKey('/Contents')) { 104 if (params.containsKey('/Contents')) {
106 final prevContent = params['/Contents']!; 105 final prevContent = params['/Contents']!;
107 if (prevContent is PdfArray) { 106 if (prevContent is PdfArray) {
108 - contentList.values.insertAll(0, prevContent.values);  
109 - } else { 107 + contentList.values
  108 + .insertAll(0, prevContent.values.whereType<PdfIndirect>());
  109 + } else if (prevContent is PdfIndirect) {
110 contentList.values.insert(0, prevContent); 110 contentList.values.insert(0, prevContent);
111 } 111 }
112 } 112 }
@@ -115,10 +115,9 @@ class PdfPage extends PdfObject with PdfGraphicStream { @@ -115,10 +115,9 @@ class PdfPage extends PdfObject with PdfGraphicStream {
115 115
116 if (contentList.values.length == 1) { 116 if (contentList.values.length == 1) {
117 params['/Contents'] = contentList.values.first; 117 params['/Contents'] = contentList.values.first;
118 - } else { 118 + } else if (contents.isNotEmpty) {
119 params['/Contents'] = contentList; 119 params['/Contents'] = contentList;
120 } 120 }
121 - }  
122 121
123 // The /Annots object 122 // The /Annots object
124 if (annotations.isNotEmpty) { 123 if (annotations.isNotEmpty) {