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 54 of file HeifExport.cpp.

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

◆ ~HeifExport()

HeifExport::~HeifExport ( )
override

Definition at line 58 of file HeifExport.cpp.

59{
60}

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 133 of file HeifExport.cpp.

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

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

◆ 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 62 of file HeifExport.cpp.

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

◆ initializeCapabilities()

void HeifExport::initializeCapabilities ( )
overridevirtual

Reimplemented from KisImportExportFilter.

Definition at line 515 of file HeifExport.cpp.

516{
517 // This checks before saving for what the file format supports: anything that is supported needs to be mentioned here
518
519 QList<QPair<KoID, KoID> > supportedColorModels;
521 supportedColorModels << QPair<KoID, KoID>()
522 << QPair<KoID, KoID>(RGBAColorModelID, Integer8BitsColorDepthID)
523 << QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID)
524 << QPair<KoID, KoID>(RGBAColorModelID, Integer16BitsColorDepthID)
525 << QPair<KoID, KoID>(GrayAColorModelID, Integer16BitsColorDepthID)
526 ;
527 addSupportedColorModels(supportedColorModels, "HEIF");
528}
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: