Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_jpeg_export.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2005 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_jpeg_export.h"
8
9#include <QCheckBox>
10#include <QSlider>
11#include <QColor>
12#include <QString>
13#include <QApplication>
14#include <QScopedPointer>
15
16#include <kpluginfactory.h>
17
18#include <KoColorSpace.h>
19#include <KoColorProfile.h>
22
24#include <kis_slider_spin_box.h>
25#include <KisDocument.h>
26#include <KoDocumentInfo.h>
27#include <kis_image.h>
28#include <kis_group_layer.h>
29#include <kis_paint_layer.h>
30#include <kis_paint_device.h>
32#include <kis_config.h>
33#include <kis_meta_data_store.h>
34#include <kis_meta_data_entry.h>
35#include <kis_meta_data_value.h>
43#include "kis_jpeg_converter.h"
44
46
47K_PLUGIN_FACTORY_WITH_JSON(KisJPEGExportFactory, "krita_jpeg_export.json", registerPlugin<KisJPEGExport>();)
48
50{
51}
52
56
58{
59 KisImageSP image = document->savingImage();
60 Q_CHECK_PTR(image);
61
62 // An extra option to pass to the config widget to set the state correctly, this isn't saved
63 const KoColorSpace* cs = image->projection()->colorSpace();
64 bool sRGB = cs->profile()->name().contains(QLatin1String("srgb"), Qt::CaseInsensitive);
65 configuration->setProperty("is_sRGB", sRGB);
66
67 KisJPEGOptions options;
68 options.progressive = configuration->getBool("progressive", false);
69 options.quality = configuration->getInt("quality", 80);
70 options.forceSRGB = configuration->getBool("forceSRGB", false);
71 options.saveProfile = configuration->getBool("saveProfile", true);
72 options.optimize = configuration->getBool("optimize", true);
73 options.smooth = configuration->getInt("smoothing", 0);
74 options.baseLineJPEG = configuration->getBool("baseline", true);
75 options.subsampling = configuration->getInt("subsampling", 0);
76 options.exif = configuration->getBool("exif", true);
77 options.iptc = configuration->getBool("iptc", true);
78 options.xmp = configuration->getBool("xmp", true);
80 c.fromQColor(Qt::white);
81 options.transparencyFillColor = configuration->getColor("transparencyFillcolor", c).toQColor();
83 m.setEnabledFilters(configuration->getString("filters").split(","));
84 options.filters = m.enabledFilters();
85 options.storeAuthor = configuration->getBool("storeAuthor", false);
86 options.storeDocumentMetaData = configuration->getBool("storeMetaData", false);
87
88 KisPaintDeviceSP pd = new KisPaintDevice(*image->projection());
89
90 KisJPEGConverter kpc(document, batchMode());
91 KisPaintLayerSP l = new KisPaintLayer(image, "projection", OPACITY_OPAQUE_U8, pd);
92
93 KisExifInfoVisitor exivInfoVisitor;
94 exivInfoVisitor.visit(image->rootLayer().data());
95
96 QScopedPointer<KisMetaData::Store> metaDataStore;
97 if (exivInfoVisitor.metaDataCount() == 1) {
98 metaDataStore.reset(new KisMetaData::Store(*exivInfoVisitor.exifInfo()));
99 }
100 else {
101 metaDataStore.reset(new KisMetaData::Store());
102 }
103
104 //add extra meta-data here
106 Q_ASSERT(dcSchema);
107 if (options.storeDocumentMetaData) {
108 QString title = document->documentInfo()->aboutInfo("title");
109 if (!title.isEmpty()) {
110 if (metaDataStore->containsEntry("title")) {
111 metaDataStore->removeEntry("title");
112 }
113 metaDataStore->addEntry(KisMetaData::Entry(dcSchema, "title", KisMetaData::Value(QVariant(title))));
114 }
115 QString description = document->documentInfo()->aboutInfo("subject");
116 if (description.isEmpty()) {
117 description = document->documentInfo()->aboutInfo("abstract");
118 }
119 if (!description.isEmpty()) {
120 QString keywords = document->documentInfo()->aboutInfo("keyword");
121 if (!keywords.isEmpty()) {
122 description = description + " keywords: " + keywords;
123 }
124 if (metaDataStore->containsEntry("description")) {
125 metaDataStore->removeEntry("description");
126 }
127 metaDataStore->addEntry(KisMetaData::Entry(dcSchema, "description", KisMetaData::Value(QVariant(description))));
128 }
129 QString license = document->documentInfo()->aboutInfo("license");
130 if (!license.isEmpty()) {
131 if (metaDataStore->containsEntry("rights")) {
132 metaDataStore->removeEntry("rights");
133 }
134 metaDataStore->addEntry(KisMetaData::Entry(dcSchema, "rights", KisMetaData::Value(QVariant(license))));
135 }
136 QString date = document->documentInfo()->aboutInfo("date");
137 if (!date.isEmpty() && !metaDataStore->containsEntry("rights")) {
138 metaDataStore->addEntry(KisMetaData::Entry(dcSchema, "date", KisMetaData::Value(QVariant(date))));
139 }
140 }
141 if (options.storeAuthor) {
142 QString author = document->documentInfo()->authorInfo("creator");
143 if (!author.isEmpty()) {
144 if (!document->documentInfo()->authorContactInfo().isEmpty()) {
145 QString contact = document->documentInfo()->authorContactInfo().at(0);
146 if (!contact.isEmpty()) {
147 author = author+"("+contact+")";
148 }
149 }
150 if (metaDataStore->containsEntry("creator")) {
151 metaDataStore->removeEntry("creator");
152 }
153 metaDataStore->addEntry(KisMetaData::Entry(dcSchema, "creator", KisMetaData::Value(QVariant(author))));
154 }
155 }
156
157 KisImportExportErrorCode res = kpc.buildFile(io, l, options, metaDataStore.data());
158 return res;
159}
160
161KisPropertiesConfigurationSP KisJPEGExport::defaultConfiguration(const QByteArray &/*from*/, const QByteArray &/*to*/) const
162{
164 cfg->setProperty("progressive", false);
165 cfg->setProperty("quality", 80);
166 cfg->setProperty("forceSRGB", false);
167 cfg->setProperty("saveProfile", true);
168 cfg->setProperty("optimize", true);
169 cfg->setProperty("smoothing", 0);
170 cfg->setProperty("baseline", true);
171 cfg->setProperty("subsampling", 0);
172 cfg->setProperty("exif", true);
173 cfg->setProperty("iptc", true);
174 cfg->setProperty("xmp", true);
175 cfg->setProperty("storeAuthor", false);
176 cfg->setProperty("storeMetaData", false);
177
178 KoColor fill_color(KoColorSpaceRegistry::instance()->rgb8());
179 fill_color = KoColor();
180 fill_color.fromQColor(Qt::white);
181 QVariant v;
182 v.setValue(fill_color);
183
184 cfg->setProperty("transparencyFillcolor", v);
185 cfg->setProperty("filters", "");
186
187 return cfg;
188}
189
190KisConfigWidget *KisJPEGExport::createConfigurationWidget(QWidget *parent, const QByteArray &/*from*/, const QByteArray &/*to*/) const
191{
192 return new KisWdgOptionsJPEG(parent);
193}
194
196{
199
200 QList<QPair<KoID, KoID> > supportedColorModels;
201 supportedColorModels << QPair<KoID, KoID>()
202 << QPair<KoID, KoID>(RGBAColorModelID, Integer8BitsColorDepthID)
203 << QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID)
204 << QPair<KoID, KoID>(CMYKAColorModelID, Integer8BitsColorDepthID);
205 addSupportedColorModels(supportedColorModels, "JPEG");
206}
207
208
211{
212 setupUi(this);
213
214 metaDataFilters->setModel(&m_filterRegistryModel);
215 qualityLevel->setRange(0, 100, 0);
216 KisSpinBoxI18nHelper::setText(qualityLevel, i18nc("{n} is the number value, % is the percent sign", "{n}%"));
217 smoothLevel->setRange(0, 100, 0);
218 KisSpinBoxI18nHelper::setText(smoothLevel, i18nc("{n} is the number value, % is the percent sign", "{n}%"));
219}
220
221
223{
224 progressive->setChecked(cfg->getBool("progressive", false));
225 qualityLevel->setValue(cfg->getInt("quality", 80));
226 optimize->setChecked(cfg->getBool("optimize", true));
227 smoothLevel->setValue(cfg->getInt("smoothing", 0));
228 baseLineJPEG->setChecked(cfg->getBool("baseline", true));
229 subsampling->setCurrentIndex(cfg->getInt("subsampling", 0));
230 exif->setChecked(cfg->getBool("exif", true));
231 iptc->setChecked(cfg->getBool("iptc", true));
232 xmp->setChecked(cfg->getBool("xmp", true));
233 chkForceSRGB->setVisible(cfg->getBool("is_sRGB"));
234 chkForceSRGB->setChecked(cfg->getBool("forceSRGB", false));
235 chkSaveProfile->setChecked(cfg->getBool("saveProfile", true));
236 KoColor background(KoColorSpaceRegistry::instance()->rgb8());
237 background.fromQColor(Qt::white);
238 bnTransparencyFillColor->setDefaultColor(background);
239 bnTransparencyFillColor->setColor(cfg->getColor("transparencyFillcolor", background));
240 chkAuthor->setChecked(cfg->getBool("storeAuthor", false));
241 chkMetaData->setChecked(cfg->getBool("storeMetaData", false));
242
243 m_filterRegistryModel.setEnabledFilters(cfg->getString("filters").split(','));
244
245}
246
248{
250
251 QVariant transparencyFillcolor;
252 transparencyFillcolor.setValue(bnTransparencyFillColor->color());
253
254 cfg->setProperty("progressive", progressive->isChecked());
255 cfg->setProperty("quality", (int)qualityLevel->value());
256 cfg->setProperty("forceSRGB", chkForceSRGB->isChecked());
257 cfg->setProperty("saveProfile", chkSaveProfile->isChecked());
258 cfg->setProperty("optimize", optimize->isChecked());
259 cfg->setProperty("smoothing", (int)smoothLevel->value());
260 cfg->setProperty("baseline", baseLineJPEG->isChecked());
261 cfg->setProperty("subsampling", subsampling->currentIndex());
262 cfg->setProperty("exif", exif->isChecked());
263 cfg->setProperty("iptc", iptc->isChecked());
264 cfg->setProperty("xmp", xmp->isChecked());
265 cfg->setProperty("transparencyFillcolor", transparencyFillcolor);
266 cfg->setProperty("storeAuthor", chkAuthor->isChecked());
267 cfg->setProperty("storeMetaData", chkMetaData->isChecked());
268
269 QString enabledFilters;
270 Q_FOREACH (const KisMetaData::Filter* filter, m_filterRegistryModel.enabledFilters()) {
271 enabledFilters = enabledFilters + filter->id() + ',';
272 }
273 cfg->setProperty("filters", enabledFilters);
274
275 return cfg;
276}
277#include <kis_jpeg_export.moc>
qreal v
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID CMYKAColorModelID("CMYKA", ki18n("CMYK/Alpha"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
const quint8 OPACITY_OPAQUE_U8
The KisExifInfoVisitor class looks for a layer with metadata.
KisMetaData::Store * exifInfo()
bool visit(KisNode *) override
static KisExportCheckRegistry * instance()
KisGroupLayerSP rootLayer() const
KisPaintDeviceSP projection() const
The base class for import and export filters.
void addSupportedColorModels(QList< QPair< KoID, KoID > > supportedColorModels, const QString &name, KisExportCheckBase::Level level=KisExportCheckBase::PARTIALLY)
void addCapability(KisExportCheckBase *capability)
KisImportExportErrorCode buildFile(QIODevice *io, KisPaintLayerSP layer, KisJPEGOptions options, KisMetaData::Store *metaData)
KisPropertiesConfigurationSP defaultConfiguration(const QByteArray &from="", const QByteArray &to="") const override
defaultConfiguration defines the default settings for the given import export filter
KisJPEGExport(QObject *parent, const QVariantList &)
void initializeCapabilities() override
KisImportExportErrorCode convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=0) override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const QByteArray &from="", const QByteArray &to="") const override
createConfigurationWidget creates a widget that can be used to define the settings for a given import...
~KisJPEGExport() override
virtual void setEnabledFilters(const QStringList &enabledFilters)
enable the filters in the given list; others will be disabled.
virtual QString id() const =0
static KisMetaData::SchemaRegistry * instance()
const Schema * schemaFromUri(const QString &uri) const
static const QString DublinCoreSchemaUri
const KoColorSpace * colorSpace() const
KisPropertiesConfigurationSP configuration() const override
KisMetaData::FilterRegistryModel m_filterRegistryModel
void setConfiguration(const KisPropertiesConfigurationSP cfg) override
KisWdgOptionsJPEG(QWidget *parent)
virtual const KoColorProfile * profile() const =0
void fromQColor(const QColor &c)
Convenient function for converting from a QColor.
Definition KoColor.cpp:213
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
void setText(QSpinBox *spinBox, const QStringView textTemplate)
QList< const KisMetaData::Filter * > filters
KisNodeWSP parent
Definition kis_node.cpp:86
static KoColorSpaceRegistry * instance()