Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_heightmap_export.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 Boudewijn Rempt <boud@valdyas.org>
3 * SPDX-FileCopyrightText: 2017 Victor Wåhlström <victor.wahlstrom@initiali.se>
4 *
5 * SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7
9
10#include <qendian.h>
11#include <QDataStream>
12#include <QApplication>
13
14#include <kpluginfactory.h>
15
16#include <KoColorSpace.h>
18#include <KoColorSpaceTraits.h>
21
24
25#include <KisDocument.h>
26#include <kis_image.h>
27#include <kis_paint_device.h>
29#include <kis_config.h>
30#include <kis_iterator_ng.h>
32#include <kis_config_widget.h>
33
35#include "kis_heightmap_utils.h"
36
37K_PLUGIN_FACTORY_WITH_JSON(KisHeightMapExportFactory, "krita_heightmap_export.json", registerPlugin<KisHeightMapExport>();)
38
39template<typename T>
40static void writeData(KisPaintDeviceSP pd, const QRect &bounds, QDataStream &out_stream)
41{
43
45 while (it.nextPixel()) {
46 out_stream << KoGrayTraits<T>::gray(const_cast<quint8*>(it.rawDataConst()));
47 }
48}
49
50KisHeightMapExport::KisHeightMapExport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent)
51{
52}
53
57
58KisPropertiesConfigurationSP KisHeightMapExport::defaultConfiguration(const QByteArray &from, const QByteArray &to) const
59{
60 Q_UNUSED(from);
61 Q_UNUSED(to);
63 cfg->setProperty("endianness", 0);
64 return cfg;
65}
66
67KisConfigWidget *KisHeightMapExport::createConfigurationWidget(QWidget *parent, const QByteArray &from, const QByteArray &to) const
68{
69 Q_UNUSED(from);
70 Q_UNUSED(to);
71 bool export_mode = true;
72 KisWdgOptionsHeightmap* wdg = new KisWdgOptionsHeightmap(parent, export_mode);
73 return wdg;
74}
75
77{
78 if (mimeType() == "image/x-r8") {
79 QList<QPair<KoID, KoID> > supportedColorModels;
80 supportedColorModels << QPair<KoID, KoID>()
81 << QPair<KoID, KoID>(GrayAColorModelID, Integer8BitsColorDepthID);
82 addSupportedColorModels(supportedColorModels, "R8 Heightmap");
83 }
84 else if (mimeType() == "image/x-r16") {
85 QList<QPair<KoID, KoID> > supportedColorModels;
86 supportedColorModels << QPair<KoID, KoID>()
87 << QPair<KoID, KoID>(GrayAColorModelID, Integer16BitsColorDepthID);
88 addSupportedColorModels(supportedColorModels, "R16 Heightmap");
89 }
90 else if (mimeType() == "image/x-r32") {
91 QList<QPair<KoID, KoID> > supportedColorModels;
92 supportedColorModels << QPair<KoID, KoID>()
93 << QPair<KoID, KoID>(GrayAColorModelID, Float32BitsColorDepthID);
94 addSupportedColorModels(supportedColorModels, "R32 Heightmap");
95 }
96}
97
99{
100 KIS_ASSERT_RECOVER_RETURN_VALUE(mimeType() == "image/x-r16" || mimeType() == "image/x-r8" || mimeType() == "image/x-r32", ImportExportCodes::FileFormatIncorrect);
101
102 KisImageSP image = document->savingImage();
103 QDataStream::ByteOrder bo = configuration->getInt("endianness", 1) == 0 ? QDataStream::BigEndian : QDataStream::LittleEndian;
104
105 KisPaintDeviceSP pd = new KisPaintDevice(*image->projection());
106
107 QDataStream s(io);
108 s.setByteOrder(bo);
109 // needed for 32bit float data
110 s.setFloatingPointPrecision(QDataStream::SinglePrecision);
111
112 KoID target_co_model = GrayAColorModelID;
114 KIS_ASSERT(!target_co_depth.id().isNull());
115
116 if (pd->colorSpace()->colorModelId() != target_co_model || pd->colorSpace()->colorDepthId() != target_co_depth) {
117 pd = new KisPaintDevice(*pd.data());
118 pd->convertTo(KoColorSpaceRegistry::instance()->colorSpace(target_co_model.id(), target_co_depth.id()));
119 }
120
121 if (target_co_depth == Float32BitsColorDepthID) {
122 writeData<float>(pd, image->bounds(), s);
123 }
124 else if (target_co_depth == Integer16BitsColorDepthID) {
125 writeData<quint16>(pd, image->bounds(), s);
126 }
127 else if (target_co_depth == Integer8BitsColorDepthID) {
128 writeData<quint8>(pd, image->bounds(), s);
129 }
130 else {
133 }
135}
136
137#include "kis_heightmap_export.moc"
const KoID Float32BitsColorDepthID("F32", ki18n("32-bit float/channel"))
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"))
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...
KisPropertiesConfigurationSP defaultConfiguration(const QByteArray &from="", const QByteArray &to="") const override
defaultConfiguration defines the default settings for the given import export filter
void initializeCapabilities() override
KisImportExportErrorCode convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP configuration=0) override
KisHeightMapExport(QObject *parent, const QVariantList &)
KisPaintDeviceSP projection() const
QRect bounds() const override
The base class for import and export filters.
void addSupportedColorModels(QList< QPair< KoID, KoID > > supportedColorModels, const QString &name, KisExportCheckBase::Level level=KisExportCheckBase::PARTIALLY)
const KoColorSpace * colorSpace() const
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
ALWAYS_INLINE const quint8 * rawDataConst() const
virtual KoID colorModelId() const =0
virtual KoID colorDepthId() const =0
Definition KoID.h:30
QString id() const
Definition KoID.cpp:63
K_PLUGIN_FACTORY_WITH_JSON(KritaASCCDLFactory, "kritaasccdl.json", registerPlugin< KritaASCCDL >();) KritaASCCDL
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:85
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define KIS_ASSERT(cond)
Definition kis_assert.h:33
#define bounds(x, a, b)
static void writeData(KisPaintDeviceSP pd, const QRect &bounds, QDataStream &out_stream)
KoID mimeTypeToKoID(const class QByteArray &mimeType)
static KoColorSpaceRegistry * instance()