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
22AnnotStampImageHelper::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
27AnnotStampImageHelper::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
36void 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
72void AnnotStampImageHelper::removeAnnotStampImageObject()
73{
74 if (sMaskRef != Ref::INVALID()) {
75 doc->getXRef()->removeIndirectObject(r: sMaskRef);
76 }
77
78 doc->getXRef()->removeIndirectObject(r: ref);
79}
80

source code of poppler/poppler/AnnotStampImageHelper.cc