8#include <qx/core/qx-error.h>
11#include "medium_io/canvas.h"
12#include "art_io/artwork_error.h"
13#include "art_io/measure.h"
17namespace PxCryptPrivate
24 using rendition_id_t = quint16;
29 static inline const QByteArray MAGIC_NUM =
"PXC"_ba;
37 static quint64 size(quint64 renditionSize);
41 virtual quint64 renditionSize()
const = 0;
47template<
typename DerivedT, IArtwork::rendition_
id_t RenditionId>
48class Artwork : IArtwork
52 static constexpr quint16 RENDITION_ID = RenditionId;
59 static_assert(measureable<DerivedT>);
64 static ArtworkError readFromCanvas(DerivedT& art, Canvas& canvas)
71 canvasStream.setVersion(STREAM_VER);
74 QByteArray magic(MAGIC_NUM.size(), Qt::Uninitialized);
75 canvasStream.readRawData(magic.data(), MAGIC_NUM.size());
76 if(magic != MAGIC_NUM)
77 return ArtworkError(ArtworkError::NotMagic);
80 quint16 renditionId; canvasStream >> renditionId;
81 if(renditionId != RENDITION_ID)
82 return ArtworkError(ArtworkError::WrongCodec, u
"0x%1 instead of 0x%2."_s.arg(renditionId, 2, 16,
QChar(u
'0'))
83 .arg(RENDITION_ID, 2, 16,
QChar(u
'0')));
87 Artwork& readArtBase =
static_cast<Artwork&
>(readArt);
90 ArtworkError renditionError = readArtBase.renditionRead(canvasStream);
95 return ArtworkError(ArtworkError::DataStreamError, ENUM_NAME(ss));
99 return renditionError;
103 return ArtworkError();
108 virtual ArtworkError renditionRead(
QDataStream& stream) = 0;
109 virtual ArtworkError renditionWrite(
QDataStream& stream)
const = 0;
112 ArtworkError writeToCanvas(Canvas& canvas)
116 canvasStream.setVersion(STREAM_VER);
119 canvasStream.writeRawData(MAGIC_NUM.constData(), MAGIC_NUM.size());
120 canvasStream << RENDITION_ID;
123 ArtworkError renditionError = renditionWrite(canvasStream);
128 return ArtworkError(ArtworkError::DataStreamError, ENUM_NAME(ss));
130 return renditionError;