Krita Source Code Documentation
Loading...
Searching...
No Matches
HeifExport Class Reference

#include <HeifExport.h>

+ Inheritance diagram for HeifExport:

Public Member Functions

KisImportExportErrorCode convert (KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=0) override
 
KisConfigWidgetcreateConfigurationWidget (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/export filter
 
KisPropertiesConfigurationSP defaultConfiguration (const QByteArray &from="", const QByteArray &to="") const override
 defaultConfiguration defines the default settings for the given import export filter
 
 HeifExport (QObject *parent, const QVariantList &)
 
void initializeCapabilities () override
 
bool supportsIO () const override
 Override and return false for the filters that use a library that cannot handle file handles, only file names.
 
 ~HeifExport () override
 
- Public Member Functions inherited from KisImportExportFilter
virtual QMap< QString, KisExportCheckBase * > exportChecks ()
 generate and return the list of capabilities of this export filter. The list
 
virtual bool exportSupportsGuides () const
 exportSupportsGuides Because guides are in the document and not the image, checking for guides cannot be made an exportCheck.
 
KisPropertiesConfigurationSP lastSavedConfiguration (const QByteArray &from="", const QByteArray &to="") const
 lastSavedConfiguration return the last saved configuration for this filter
 
 Private ()
 
void setBatchMode (bool batchmode)
 
void setFilename (const QString &filename)
 
void setImportUserFeedBackInterface (KisImportUserFeedbackInterface *interface)
 
void setMimeType (const QString &mime)
 
void setRealFilename (const QString &filename)
 
void setUpdater (QPointer< KoUpdater > updater)
 
QPointer< KoUpdaterupdater ()
 
virtual QString verify (const QString &fileName) const
 Verify whether the given file is correct and readable.
 
 ~KisImportExportFilter () override
 
 ~Private ()
 

Additional Inherited Members

- Public Attributes inherited from KisImportExportFilter
bool batchmode
 
QMap< QString, KisExportCheckBase * > capabilities
 
QString filename
 
KisImportUserFeedbackInterfaceimportUserFeedBackInterface {nullptr}
 
QByteArray mime
 
QString realFilename
 
QPointer< KoUpdaterupdater
 
- Static Public Attributes inherited from KisImportExportFilter
static const QString CICPPrimariesTag = "CICPCompatiblePrimaries"
 
static const QString CICPTransferCharacteristicsTag = "CICPCompatibleTransferFunction"
 
static const QString ColorDepthIDTag = "ColorDepthID"
 
static const QString ColorModelIDTag = "ColorModelID"
 
static const QString HDRTag = "HDRSupported"
 
static const QString ImageContainsTransparencyTag = "ImageContainsTransparency"
 
static const QString sRGBTag = "sRGB"
 
- Protected Member Functions inherited from KisImportExportFilter
void addCapability (KisExportCheckBase *capability)
 
void addSupportedColorModels (QList< QPair< KoID, KoID > > supportedColorModels, const QString &name, KisExportCheckBase::Level level=KisExportCheckBase::PARTIALLY)
 
bool batchMode () const
 
QString filename () const
 
KisImportUserFeedbackInterfaceimportUserFeedBackInterface () const
 
 KisImportExportFilter (QObject *parent=0)
 
QByteArray mimeType () const
 
QString realFilename () const
 
void setProgress (int value)
 
QString verifyZiPBasedFiles (const QString &fileName, const QStringList &filesToCheck) const
 

Detailed Description

Definition at line 53 of file HeifExport.h.

Constructor & Destructor Documentation

◆ HeifExport()

HeifExport::HeifExport ( QObject * parent,
const QVariantList &  )

Definition at line 55 of file HeifExport.cpp.

55 : KisImportExportFilter(parent)
56{
57}
KisImportExportFilter(QObject *parent=0)

◆ ~HeifExport()

HeifExport::~HeifExport ( )
override

Definition at line 59 of file HeifExport.cpp.

60{
61}

Member Function Documentation

◆ convert()

KisImportExportErrorCode HeifExport::convert ( KisDocument * document,
QIODevice * io,
KisPropertiesConfigurationSP configuration = 0 )
overridevirtual

The filter chain calls this method to perform the actual conversion. The passed mimetypes should be a pair of those you specified in your .desktop file. You have to implement this method to make the filter work.

Returns
The error status, see the #ConversionStatus enum. KisImportExportFilter::OK means that everything is alright.

Implements KisImportExportFilter.

Definition at line 134 of file HeifExport.cpp.

135{
136#if LIBHEIF_HAVE_VERSION(1, 13, 0)
137 HeifLock lock;
138#endif
139
140#if LIBHEIF_HAVE_VERSION(1, 20, 2)
141 using HeifStrideType = size_t;
142 auto heifGetPlaneMethod = std::mem_fn(qNonConstOverload<heif_channel, HeifStrideType*>(&heif::Image::get_plane2));
143#elif LIBHEIF_HAVE_VERSION(1, 20, 0)
144 using HeifStrideType = size_t;
145 auto heifGetPlaneMethod = std::mem_fn(qNonConstOverload<heif_channel, HeifStrideType*>(&heif::Image::get_plane));
146#else
147 using HeifStrideType = int;
148 auto heifGetPlaneMethod = std::mem_fn(qNonConstOverload<heif_channel, HeifStrideType*>(&heif::Image::get_plane));
149#endif
150
151
152 KisImageSP image = document->savingImage();
153 const KoColorSpace *cs = image->colorSpace();
154
155
156
157 dbgFile << "Starting" << mimeType() << "encoding.";
158
159 bool convertToSRGB = (configuration->getBool("monochromeToSRGB") && cs->colorModelId() == GrayAColorModelID);
160
161 // Convert to 8 bits rgba on saving if not rgba or graya.
162 if ( (cs->colorModelId() != RGBAColorModelID && cs->colorModelId() != GrayAColorModelID) || convertToSRGB) {
164 image->convertImageColorSpace(sRgb,
167 }
168
169 if (cs->colorModelId() == GrayAColorModelID && cs->hasHighDynamicRange() && !convertToSRGB) {
171 image->convertImageColorSpace(gray,
174 }
175
177 bool convertToRec2020 = false;
178
179 if (cs->hasHighDynamicRange() && cs->colorModelId() != GrayAColorModelID) {
180 QString conversionOption =
181 (configuration->getString("floatingPointConversionOption",
182 "KeepSame"));
183 if (conversionOption == "Rec2100PQ") {
184 convertToRec2020 = true;
185 conversionPolicy = ConversionPolicy::ApplyPQ;
186 } else if (conversionOption == "Rec2100HLG") {
187 convertToRec2020 = true;
188 conversionPolicy = ConversionPolicy::ApplyHLG;
189 } else if (conversionOption == "ApplyPQ") {
190 conversionPolicy = ConversionPolicy::ApplyPQ;
191 } else if (conversionOption == "ApplyHLG") {
192 conversionPolicy = ConversionPolicy::ApplyHLG;
193 } else if (conversionOption == "ApplySMPTE428") {
194 conversionPolicy = ConversionPolicy::ApplySMPTE428;
195 }
196 }
197
198 if (cs->hasHighDynamicRange() && convertToRec2020) {
201 TRC_LINEAR));
202 const KoColorSpace *linearRec2020 = KoColorSpaceRegistry::instance()->colorSpace("RGBA", "F32", linear);
203 image->convertImageColorSpace(linearRec2020,
206 }
207
208 image->waitForDone();
209 cs = image->colorSpace();
210
211 int quality = configuration->getInt("quality", 50);
212 bool lossless = configuration->getBool("lossless", false);
213 bool hasAlpha = configuration->getBool(KisImportExportFilter::ImageContainsTransparencyTag, false);
214 float hlgGamma = configuration->getFloat("HLGgamma", 1.2f);
215 float hlgNominalPeak = configuration->getFloat("HLGnominalPeak", 1000.0f);
216 bool removeHGLOOTF = configuration->getBool("removeHGLOOTF", true);
217
218 // If we want to add information from the document to the metadata,
219 // we should do that here.
220
221 try {
222 // --- use standard HEVC encoder
223
224
225 heif::Encoder encoder(heif_compression_HEVC);
226
227
228 if (mimeType() == "image/avif") {
229 encoder = heif::Encoder(heif_compression_AV1);
230 }
231
232
233 encoder.set_lossy_quality(quality);
234 if (lossless) {
235 //https://invent.kde.org/graphics/krita/-/merge_requests/530#note_169521
236 encoder.set_lossy_quality(100);
237 }
238 encoder.set_lossless(lossless);
239 if (cs->colorModelId() != GrayAColorModelID) {
240 encoder.set_parameter("chroma", configuration->getString("chroma", "444").toStdString());
241 }
242
243
244 // --- convert KisImage to HEIF image ---
245 int width = image->width();
246 int height = image->height();
247
248 heif::Context ctx;
249
250 heif_chroma chroma = hasAlpha? heif_chroma_interleaved_RRGGBBAA_LE: heif_chroma_interleaved_RRGGBB_LE;
251 if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
252 chroma = hasAlpha? heif_chroma_interleaved_RRGGBBAA_BE: heif_chroma_interleaved_RRGGBB_BE;
253 }
254
255 heif::Image img;
256
257 if (cs->colorModelId() == RGBAColorModelID) {
259 dbgFile << "saving as 8bit rgba";
260 img.create(width,height, heif_colorspace_RGB, heif_chroma_444);
261 img.add_plane(heif_channel_R, width,height, 8);
262 img.add_plane(heif_channel_G, width,height, 8);
263 img.add_plane(heif_channel_B, width,height, 8);
264
265 HeifStrideType strideR = 0;
266 HeifStrideType strideG = 0;
267 HeifStrideType strideB = 0;
268 HeifStrideType strideA = 0;
269
270 uint8_t *ptrR = heifGetPlaneMethod(img, heif_channel_R, &strideR);
271 uint8_t *ptrG = heifGetPlaneMethod(img, heif_channel_G, &strideG);
272 uint8_t *ptrB = heifGetPlaneMethod(img, heif_channel_B, &strideB);
273
274 uint8_t *ptrA = [&]() -> uint8_t * {
275 if (hasAlpha) {
276 img.add_plane(heif_channel_Alpha, width, height, 8);
277 return heifGetPlaneMethod(img, heif_channel_Alpha, &strideA);
278 } else {
279 return nullptr;
280 }
281 }();
282
283 KisPaintDeviceSP pd = image->projection();
285 pd->createHLineConstIteratorNG(0, 0, width);
286
287 Planar::writeLayer(hasAlpha,
288 width,
289 height,
290 ptrR,
291 strideR,
292 ptrG,
293 strideG,
294 ptrB,
295 strideB,
296 ptrA,
297 strideA,
298 it);
299 } else {
300 dbgFile << "Saving as 12bit rgba";
301 img.create(width, height, heif_colorspace_RGB, chroma);
302 img.add_plane(heif_channel_interleaved, width, height, 12);
303
304 HeifStrideType stride = 0;
305
306 uint8_t *ptr = heifGetPlaneMethod(img, heif_channel_interleaved, &stride);
307
308 KisPaintDeviceSP pd = image->projection();
310 pd->createHLineConstIteratorNG(0, 0, width);
311
313 HDRInt::writeInterleavedLayer(QSysInfo::ByteOrder,
314 hasAlpha,
315 width,
316 height,
317 ptr,
318 stride,
319 it);
320 } else {
322 QSysInfo::ByteOrder,
323 hasAlpha,
324 convertToRec2020,
325 cs->profile()->isLinear(),
326 conversionPolicy,
327 removeHGLOOTF,
328 width,
329 height,
330 ptr,
331 stride,
332 it,
333 hlgGamma,
334 hlgNominalPeak,
335 cs);
336 }
337 }
338 } else {
340 dbgFile << "Saving as 8 bit monochrome.";
341 img.create(width, height, heif_colorspace_monochrome, heif_chroma_monochrome);
342
343 img.add_plane(heif_channel_Y, width, height, 8);
344
345 HeifStrideType strideG = 0;
346 HeifStrideType strideA = 0;
347
348 uint8_t *ptrG = heifGetPlaneMethod(img, heif_channel_Y, &strideG);
349 uint8_t *ptrA = [&]() -> uint8_t * {
350 if (hasAlpha) {
351 img.add_plane(heif_channel_Alpha, width, height, 8);
352 return heifGetPlaneMethod(img, heif_channel_Alpha, &strideA);
353 } else {
354 return nullptr;
355 }
356 }();
357
358 KisPaintDeviceSP pd = image->projection();
360 pd->createHLineConstIteratorNG(0, 0, width);
361
362 Gray::writePlanarLayer(QSysInfo::ByteOrder,
363 8,
364 hasAlpha,
365 width,
366 height,
367 ptrG,
368 strideG,
369 ptrA,
370 strideA,
371 it);
372 } else {
373 dbgFile << "Saving as 12 bit monochrome";
374 img.create(width, height, heif_colorspace_monochrome, heif_chroma_monochrome);
375
376 img.add_plane(heif_channel_Y, width, height, 12);
377
378 HeifStrideType strideG = 0;
379 HeifStrideType strideA = 0;
380
381 uint8_t *ptrG = heifGetPlaneMethod(img, heif_channel_Y, &strideG);
382 uint8_t *ptrA = [&]() -> uint8_t * {
383 if (hasAlpha) {
384 img.add_plane(heif_channel_Alpha, width, height, 12);
385 return heifGetPlaneMethod(img, heif_channel_Alpha, &strideA);
386 } else {
387 return nullptr;
388 }
389 }();
390
391 KisPaintDeviceSP pd = image->projection();
393 pd->createHLineConstIteratorNG(0, 0, width);
394
395 Gray::writePlanarLayer(QSysInfo::ByteOrder,
396 12,
397 hasAlpha,
398 width,
399 height,
400 ptrG,
401 strideG,
402 ptrA,
403 strideA,
404 it);
405 }
406 }
407
408 // --- save the color profile.
409 if (conversionPolicy == ConversionPolicy::KeepTheSame) {
410 QByteArray rawProfileBA = image->colorSpace()->profile()->rawData();
411 std::vector<uint8_t> rawProfile(rawProfileBA.begin(), rawProfileBA.end());
412 img.set_raw_color_profile(heif_color_profile_type_prof, rawProfile);
413 } else {
414 heif::ColorProfile_nclx nclxDescription;
415 nclxDescription.set_full_range_flag(true);
416 nclxDescription.set_matrix_coefficients(heif_matrix_coefficients_RGB_GBR);
417 if (convertToRec2020) {
418#if LIBHEIF_HAVE_VERSION(1, 14, 1)
419 nclxDescription.set_color_primaries(heif_color_primaries_ITU_R_BT_2020_2_and_2100_0);
420#else
421 nclxDescription.set_color_primaties(heif_color_primaries_ITU_R_BT_2020_2_and_2100_0);
422#endif
423 } else {
424 const ColorPrimaries primaries =
425 image->colorSpace()->profile()->getColorPrimaries();
426 // PRIMARIES_ADOBE_RGB_1998 and higher are not valid for CICP.
427 // But this should have already been caught by the KeepTheSame
428 // clause...
430 errFile << "Attempt to export a file with unsupported primaries" << primaries;
432 }
433#if LIBHEIF_HAVE_VERSION(1, 14, 1)
434 nclxDescription.set_color_primaries(heif_color_primaries(primaries));
435#else
436 nclxDescription.set_color_primaties(heif_color_primaries(primaries));
437#endif
438 }
439
440 if (conversionPolicy == ConversionPolicy::ApplyPQ) {
441 nclxDescription.set_transfer_characteristics(heif_transfer_characteristic_ITU_R_BT_2100_0_PQ);
442 } else if (conversionPolicy == ConversionPolicy::ApplyHLG) {
443 nclxDescription.set_transfer_characteristics(heif_transfer_characteristic_ITU_R_BT_2100_0_HLG);
444 } else if (conversionPolicy == ConversionPolicy::ApplySMPTE428) {
445 nclxDescription.set_transfer_characteristics(heif_transfer_characteristic_SMPTE_ST_428_1);
446 }
447
448 img.set_nclx_color_profile(nclxDescription);
449 }
450
451
452 // --- encode and write image
453
454 heif::Context::EncodingOptions options;
455
456 // iOS gets confused when a heif file contains an nclx.
457 // but we absolutely need it for hdr.
458 if (conversionPolicy != ConversionPolicy::KeepTheSame && cs->hasHighDynamicRange()) {
459 options.macOS_compatibility_workaround_no_nclx_profile = false;
460 }
461
462 heif::ImageHandle handle = ctx.encode_image(img, encoder, options);
463
464
465 // --- add Exif / XMP metadata
466
467 KisExifInfoVisitor exivInfoVisitor;
468 exivInfoVisitor.visit(image->rootLayer().data());
469
470 QScopedPointer<KisMetaData::Store> metaDataStore;
471 if (exivInfoVisitor.metaDataCount() == 1) {
472 metaDataStore.reset(new KisMetaData::Store(*exivInfoVisitor.exifInfo()));
473 }
474 else {
475 metaDataStore.reset(new KisMetaData::Store());
476 }
477
478 if (!metaDataStore->empty()) {
479 {
481 QBuffer buffer;
482 exifIO->saveTo(metaDataStore.data(), &buffer, KisMetaData::IOBackend::NoHeader); // Or JpegHeader? Or something else?
483 QByteArray data = buffer.data();
484
485 // Write the data to the file
486 if (data.size() > 4) {
487 ctx.add_exif_metadata(handle, data.constData(), data.size());
488 }
489 }
490 {
492 QBuffer buffer;
493 xmpIO->saveTo(metaDataStore.data(), &buffer, KisMetaData::IOBackend::NoHeader); // Or JpegHeader? Or something else?
494 QByteArray data = buffer.data();
495
496 // Write the data to the file
497 if (data.size() > 0) {
498 ctx.add_XMP_metadata(handle, data.constData(), data.size());
499 }
500 }
501 }
502
503
504 // --- write HEIF file
505
506 Writer_QIODevice writer(io);
507
508 ctx.write(writer);
509 } catch (Error &err) {
510 return setHeifError(document, err);
511 }
512
514}
KisImportExportErrorCode setHeifError(KisDocument *document, heif::Error error)
Definition HeifError.cpp:10
const KoID GrayAColorModelID("GRAYA", ki18n("Grayscale/Alpha"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
ColorPrimaries
The colorPrimaries enum Enum of colorants, follows ITU H.273 for values 0 to 255, and has extra known...
@ PRIMARIES_ITU_R_BT_2020_2_AND_2100_0
@ PRIMARIES_EBU_Tech_3213_E
The KisExifInfoVisitor class looks for a layer with metadata.
KisMetaData::Store * exifInfo()
bool visit(KisNode *) override
void waitForDone()
KisGroupLayerSP rootLayer() const
const KoColorSpace * colorSpace() const
void convertImageColorSpace(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
KisPaintDeviceSP projection() const
qint32 width() const
qint32 height() const
static const QString ImageContainsTransparencyTag
@ NoHeader
Don't append any header.
virtual bool saveTo(const Store *store, QIODevice *ioDevice, HeaderType headerType=NoHeader) const =0
static KisMetadataBackendRegistry * instance()
KisHLineConstIteratorSP createHLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const
virtual bool hasHighDynamicRange() const =0
virtual KoID colorModelId() const =0
virtual KoID colorDepthId() const =0
virtual const KoColorProfile * profile() const =0
const T value(const QString &id) const
Encoder * encoder(Imf::OutputFile &file, const ExrPaintLayerSaveInfo &info, int width)
#define KIS_SAFE_ASSERT_RECOVER(cond)
Definition kis_assert.h:126
#define errFile
Definition kis_debug.h:115
#define dbgFile
Definition kis_debug.h:53
auto writePlanarLayer(QSysInfo::Endian endian, Args &&...args)
auto writeInterleavedLayer(const KoID &id, Args &&...args)
auto writeInterleavedLayer(QSysInfo::Endian endian, Args &&...args)
auto writeLayer(bool hasAlpha, Args &&...args)
The KoColorProfileQuery struct.
virtual QByteArray rawData() const
virtual ColorPrimaries getColorPrimaries() const
getColorPrimaries
virtual bool isLinear() const =0
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()
const KoColorProfile * profileFor(const KoColorProfileQuery &query, const bool generate=true) const
profileFor tries to find the profile that matches these characteristics, if no such profile is found,...
const KoColorSpace * graya16(const QString &profile=QString())
const KoColorSpace * rgb8(const QString &profileName=QString())

References ApplyHLG, ApplyPQ, ApplySMPTE428, KoColorSpace::colorDepthId(), KoColorSpace::colorModelId(), KisImage::colorSpace(), KoColorSpaceRegistry::colorSpace(), KisImage::convertImageColorSpace(), KisPaintDevice::createHLineConstIteratorNG(), KisSharedPtr< T >::data(), dbgFile, encoder(), errFile, KisExifInfoVisitor::exifInfo(), ImportExportCodes::FormatColorSpaceUnsupported, KoColorProfile::getColorPrimaries(), KoColorSpaceRegistry::graya16(), GrayAColorModelID, KoColorSpace::hasHighDynamicRange(), KisImage::height(), KisImportExportFilter::ImageContainsTransparencyTag, KisMetadataBackendRegistry::instance(), KoColorSpaceRegistry::instance(), Integer16BitsColorDepthID, Integer8BitsColorDepthID, KoColorConversionTransformation::internalConversionFlags(), KoColorConversionTransformation::internalRenderingIntent(), KoColorProfile::isLinear(), KeepTheSame, KIS_SAFE_ASSERT_RECOVER, KisExifInfoVisitor::metaDataCount(), KisImportExportFilter::mimeType(), KoColorProfile::name, KisMetaData::IOBackend::NoHeader, ImportExportCodes::OK, PRIMARIES_EBU_Tech_3213_E, PRIMARIES_ITU_R_BT_2020_2_AND_2100_0, KoColorSpace::profile(), KoColorSpaceRegistry::profileFor(), KisImage::projection(), KoColorProfile::rawData(), KoColorSpaceRegistry::rgb8(), RGBAColorModelID, KisImage::rootLayer(), KisMetaData::IOBackend::saveTo(), setHeifError(), TRC_LINEAR, KoGenericRegistry< T >::value(), KisExifInfoVisitor::visit(), KisImage::waitForDone(), KisImage::width(), HDRFloat::writeInterleavedLayer(), HDRInt::writeInterleavedLayer(), Planar::writeLayer(), and Gray::writePlanarLayer().

◆ createConfigurationWidget()

KisConfigWidget * HeifExport::createConfigurationWidget ( QWidget * parent,
const QByteArray & from = "",
const QByteArray & to = "" ) const
overridevirtual

createConfigurationWidget creates a widget that can be used to define the settings for a given import/export filter

Parameters
parentthe owner of the widget; the caller is responsible for deleting
fromThe mimetype of the source file/document
toThe mimetype of the destination file/document
Returns
the widget

Reimplemented from KisImportExportFilter.

Definition at line 77 of file HeifExport.cpp.

78{
79 return new KisWdgOptionsHeif(parent);
80}

◆ defaultConfiguration()

KisPropertiesConfigurationSP HeifExport::defaultConfiguration ( const QByteArray & from = "",
const QByteArray & to = "" ) const
overridevirtual

defaultConfiguration defines the default settings for the given import export filter

Parameters
fromThe mimetype of the source file/document
toThe mimetype of the destination file/document
Returns
a serializable KisPropertiesConfiguration object

Reimplemented from KisImportExportFilter.

Definition at line 63 of file HeifExport.cpp.

64{
66 cfg->setProperty("quality", 100);
67 cfg->setProperty("lossless", true);
68 cfg->setProperty("chroma", "444");
69 cfg->setProperty("floatingPointConversionOption", "KeepSame");
70 cfg->setProperty("monochromeToSRGB", false);
71 cfg->setProperty("HLGnominalPeak", 1000.0);
72 cfg->setProperty("HLGgamma", 1.2);
73 cfg->setProperty("removeHGLOOTF", true);
74 return cfg;
75}

◆ initializeCapabilities()

void HeifExport::initializeCapabilities ( )
overridevirtual

Reimplemented from KisImportExportFilter.

Definition at line 516 of file HeifExport.cpp.

517{
518 // This checks before saving for what the file format supports: anything that is supported needs to be mentioned here
519
520 QList<QPair<KoID, KoID> > supportedColorModels;
522 supportedColorModels << QPair<KoID, KoID>()
523 << QPair<KoID, KoID>(RGBAColorModelID, Integer8BitsColorDepthID)
524 << QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID)
525 << QPair<KoID, KoID>(RGBAColorModelID, Integer16BitsColorDepthID)
526 << QPair<KoID, KoID>(GrayAColorModelID, Integer16BitsColorDepthID)
527 ;
528 addSupportedColorModels(supportedColorModels, "HEIF");
529}
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
static KisExportCheckRegistry * instance()
void addSupportedColorModels(QList< QPair< KoID, KoID > > supportedColorModels, const QString &name, KisExportCheckBase::Level level=KisExportCheckBase::PARTIALLY)
void addCapability(KisExportCheckBase *capability)
QPainterPath create(const char32_t codepoint, double height)
Creates a tofu missing glyph indicator representing the provided Unicode codepoint.

References KisImportExportFilter::addCapability(), KisImportExportFilter::addSupportedColorModels(), get(), GrayAColorModelID, KisExportCheckRegistry::instance(), Integer16BitsColorDepthID, Integer8BitsColorDepthID, RGBAColorModelID, and KisExportCheckBase::SUPPORTED.

◆ supportsIO()

bool HeifExport::supportsIO ( ) const
inlineoverridevirtual

Override and return false for the filters that use a library that cannot handle file handles, only file names.

Reimplemented from KisImportExportFilter.

Definition at line 61 of file HeifExport.h.

61{ return true; }

The documentation for this class was generated from the following files: