14#include <exiv2/exiv2.hpp>
15#include <kpluginfactory.h>
34#include <config-tiff.h>
35#ifdef TIFF_CAN_WRITE_PSD_TAGS
63 cfg->fromXML(configuration->toXML());
73 const bool hasGroupLayers =
76 return node->parent() && node->inherits(
"KisGroupLayer");
78 options.
flatten = hasGroupLayers;
85 document->savingImage()->width(),
86 document->savingImage()->height(),
87 document->savingImage()->colorSpace(),
90 document->savingImage()->yRes());
101 return document->savingImage();
105 dbgFile <<
"Start writing TIFF File";
109 if (!file.open(QFile::ReadWrite | QFile::Truncate)) {
114 const QByteArray encodedFilename = QFile::encodeName(
filename());
118 const int handle = (int)(_get_osfhandle(file.handle()));
120 const int handle = file.handle();
124 std::unique_ptr<TIFF,
decltype(&TIFFCleanup)> image(TIFFFdOpen(handle, encodedFilename.data(),
"w"), &TIFFCleanup);
133 QString title = info->
aboutInfo(
"title");
134 if (!title.isEmpty()) {
135 if (!TIFFSetField(image.get(),
136 TIFFTAG_DOCUMENTNAME,
137 title.toLatin1().constData())) {
141 QString abstract = info->
aboutInfo(
"description");
142 if (!abstract.isEmpty()) {
143 if (!TIFFSetField(image.get(),
144 TIFFTAG_IMAGEDESCRIPTION,
145 abstract.toLatin1().constData())) {
150 if (!author.isEmpty()) {
151 if (!TIFFSetField(image.get(),
153 author.toLatin1().constData())) {
168 if (!TIFFSetField(image.get(),
174 if (!TIFFSetField(image.get(), TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH)) {
183#ifdef TIFF_CAN_WRITE_PSD_TAGS
187 if (!result.
isOk()) {
194 if (!(visitor.
visit(root))) {
208#if EXIV2_TEST_VERSION(0,28,0)
209 const std::unique_ptr<Exiv2::Image> img = Exiv2::ImageFactory::open(std::move(basicIoDevice));
211 const std::unique_ptr<Exiv2::Image> img(Exiv2::ImageFactory::open(basicIoDevice).release());
216 Exiv2::ExifData &data = img->exifData();
227 KisLayer *layer = qobject_cast<KisLayer *>(node.
data());
233 Exiv2::ExifData dataToInject;
237 Exiv2::ExifParser::decode(
239 reinterpret_cast<const Exiv2::byte *
>(ioDevice.data().data()),
240 static_cast<uint32_t
>(ioDevice.size()));
242 for (
const auto &
v : dataToInject) {
243 data[
v.key()] =
v.value();
246 img->writeMetadata();
247#if EXIV2_TEST_VERSION(0,28,0)
248 }
catch (Exiv2::Error &e) {
249 errFile <<
"Failed injecting TIFF metadata:" << Exiv2::Error(e.code()).what();
251 }
catch (Exiv2::AnyError &e) {
252 errFile <<
"Failed injecting TIFF metadata:" << e.code()
278 ->
get(
"TiffExifCheck")
305#include <kis_tiff_export.moc>
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
const KoID YCbCrAColorModelID("YCbCrA", ki18n("YCbCr/Alpha"))
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID Float16BitsColorDepthID("F16", ki18n("16-bit float/channel"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID CMYKAColorModelID("CMYKA", ki18n("CMYK/Alpha"))
const KoID LABAColorModelID("LABA", ki18n("L*a*b*/Alpha"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
const quint8 OPACITY_OPAQUE_U8
constexpr qreal INCH_TO_POINT(qreal inch)
static QByteArray nativeFormatMimeType()
Exiv2::BasicIo::AutoPtr ptr_type
static KisExportCheckRegistry * instance()
KisGroupLayerSP rootLayer() const
void setResolution(double xres, double yres)
The base class for import and export filters.
KisPropertiesConfigurationSP lastSavedConfiguration(const QByteArray &from="", const QByteArray &to="") const
lastSavedConfiguration return the last saved configuration for this filter
void addSupportedColorModels(QList< QPair< KoID, KoID > > supportedColorModels, const QString &name, KisExportCheckBase::Level level=KisExportCheckBase::PARTIALLY)
void addCapability(KisExportCheckBase *capability)
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...
TIFFErrorHandler oldErrHandler
KisTIFFExport(QObject *parent, const QVariantList &)
KisImportExportErrorCode convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=0) override
~KisTIFFExport() override
TIFFErrorHandler oldWarnHandler
void initializeCapabilities() override
KisPropertiesConfigurationSP defaultConfiguration(const QByteArray &from="", const QByteArray &to="") const override
defaultConfiguration defines the default settings for the given import export filter
bool visit(KisNode *) override
KisImportExportErrorCode writeImage(KisGroupLayerSP rootLayer)
The class containing all meta information about a document.
QString authorInfo(const QString &info) const
QString aboutInfo(const QString &info) const
const T value(const QString &id) const
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
KisSharedPtr< KisPaintLayer > KisPaintLayerSP
void KisTiffWarningHandler(const char *module, const char *fmt, va_list args)
void KisTiffErrorHandler(const char *module, const char *fmt, va_list args)
KisSharedPtr< KisPaintDevice > KisPaintDeviceSP
KisSharedPtr< KisNode > KisNodeSP
KisNodeSP recursiveFindNode(KisNodeSP node, std::function< bool(KisNodeSP)> func)
KisMetaData::Store * metaData()
bool addNode(KisNodeSP node, KisNodeSP parent=KisNodeSP(), KisNodeAdditionFlags flags=KisNodeAdditionFlag::None)
KisNodeSP firstChild() const
void fromProperties(KisPropertiesConfigurationSP cfg)
KisPropertiesConfigurationSP toProperties() const