1 | //======================================================================== |
2 | // |
3 | // AnnotStampImageHelper.cc |
4 | // |
5 | // Copyright (C) 2021 Mahmoud Ahmed Khalil <mahmoudkhalil11@gmail.com> |
6 | // Copyright (C) 2021 Albert Astals Cid <aacid@kde.org> |
7 | // |
8 | // Licensed under GPLv2 or later |
9 | // |
10 | //======================================================================== |
11 | |
12 | #include "AnnotStampImageHelper.h" |
13 | |
14 | #include "goo/gmem.h" |
15 | #include "goo/gstrtod.h" |
16 | #include "PDFDoc.h" |
17 | #include "Stream.h" |
18 | #include "Dict.h" |
19 | |
20 | #include <iostream> |
21 | |
22 | AnnotStampImageHelper::AnnotStampImageHelper(PDFDoc *docA, int widthA, int heightA, ColorSpace colorSpace, int bitsPerComponent, char *data, int dataLength) |
23 | { |
24 | initialize(docA, widthA, heightA, colorSpace, bitsPerComponent, data, dataLength); |
25 | } |
26 | |
27 | AnnotStampImageHelper::AnnotStampImageHelper(PDFDoc *docA, int widthA, int heightA, ColorSpace colorSpace, int bitsPerComponent, char *data, int dataLength, Ref softMaskRef) |
28 | { |
29 | initialize(docA, widthA, heightA, colorSpace, bitsPerComponent, data, dataLength); |
30 | |
31 | sMaskRef = softMaskRef; |
32 | Dict *dict = imgObj.streamGetDict(); |
33 | dict->add(key: "SMask" , val: Object(sMaskRef)); |
34 | } |
35 | |
36 | void AnnotStampImageHelper::initialize(PDFDoc *docA, int widthA, int heightA, ColorSpace colorSpace, int bitsPerComponent, char *data, int dataLength) |
37 | { |
38 | doc = docA; |
39 | width = widthA; |
40 | height = heightA; |
41 | sMaskRef = Ref::INVALID(); |
42 | |
43 | Dict *dict = new Dict(docA->getXRef()); |
44 | dict->add(key: "Type" , val: Object(objName, "XObject" )); |
45 | dict->add(key: "Subtype" , val: Object(objName, "Image" )); |
46 | dict->add(key: "Width" , val: Object(width)); |
47 | dict->add(key: "Height" , val: Object(height)); |
48 | dict->add(key: "ImageMask" , val: Object(false)); |
49 | dict->add(key: "BitsPerComponent" , val: Object(bitsPerComponent)); |
50 | dict->add(key: "Length" , val: Object(dataLength)); |
51 | |
52 | switch (colorSpace) { |
53 | case ColorSpace::DeviceGray: |
54 | dict->add(key: "ColorSpace" , val: Object(objName, "DeviceGray" )); |
55 | break; |
56 | case ColorSpace::DeviceRGB: |
57 | dict->add(key: "ColorSpace" , val: Object(objName, "DeviceRGB" )); |
58 | break; |
59 | case ColorSpace::DeviceCMYK: |
60 | dict->add(key: "ColorSpace" , val: Object(objName, "DeviceCMYK" )); |
61 | break; |
62 | } |
63 | |
64 | char *dataCopied = (char *)gmalloc(size: sizeof(char) * (dataLength)); |
65 | std::memcpy(dest: dataCopied, src: data, n: dataLength); |
66 | |
67 | Stream *dataStream = new AutoFreeMemStream(dataCopied, 0, dataLength, Object(dict)); |
68 | imgObj = Object(dataStream); |
69 | ref = doc->getXRef()->addIndirectObject(o: imgObj); |
70 | } |
71 | |
72 | void AnnotStampImageHelper::removeAnnotStampImageObject() |
73 | { |
74 | if (sMaskRef != Ref::INVALID()) { |
75 | doc->getXRef()->removeIndirectObject(r: sMaskRef); |
76 | } |
77 | |
78 | doc->getXRef()->removeIndirectObject(r: ref); |
79 | } |
80 | |