31 FrameInfo(
const QRect &dirtyImageRect,
const QRect &imageBounds,
int levelOfDetail,
KisFrameDataSerializer &serializer, FrameInfoSP baseFrame);
35 FrameType type()
const {
39 int levelOfDetail()
const {
40 return m_levelOfDetail;
43 QRect dirtyImageRect()
const {
44 return m_dirtyImageRect;
47 QRect imageBounds()
const {
51 int frameDataId()
const {
52 return m_savedFrameDataId;
55 FrameInfoSP baseFrame()
const {
59 int m_levelOfDetail = 0;
60 QRect m_dirtyImageRect;
62 FrameInfoSP m_baseFrame;
63 FrameType m_type = FrameFull;
64 int m_savedFrameDataId = -1;
70 : m_levelOfDetail(levelOfDetail),
71 m_dirtyImageRect(dirtyImageRect),
72 m_imageBounds(imageBounds),
75 m_serializer(serializer)
77 m_savedFrameDataId = m_serializer.saveFrame(frame);
82 : m_levelOfDetail(levelOfDetail),
83 m_dirtyImageRect(dirtyImageRect),
84 m_imageBounds(imageBounds),
85 m_baseFrame(baseFrame),
87 m_serializer(serializer)
89 m_savedFrameDataId = m_serializer.saveFrame(frame);
93FrameInfo::FrameInfo(
const QRect &dirtyImageRect,
const QRect &imageBounds,
int levelOfDetail,
KisFrameDataSerializer &serializer, FrameInfoSP baseFrame)
94 : m_levelOfDetail(levelOfDetail),
95 m_dirtyImageRect(dirtyImageRect),
96 m_imageBounds(imageBounds),
97 m_baseFrame(baseFrame),
99 m_savedFrameDataId(-1),
100 m_serializer(serializer)
104FrameInfo::~FrameInfo()
108 if (m_savedFrameDataId >= 0) {
119 : serializer(frameCachePath)
128 int lastSavedFullFrameId = -1;
142 : m_d(new
Private(frameCachePath))
155 Q_FOREACH (
auto tile, info->
tileList) {
158 pixelSize = tile->pixelSize();
163 pixelSize = tile->pixelSize();
178 tile.
col = (*it)->tileCol();
179 tile.
row = (*it)->tileRow();
180 tile.
rect = (*it)->realPatchRect();
181 tile.
data = std::move((*it)->takePixelData());
188 FrameInfoSP frameInfo;
190 if (
m_d->lastSavedFullFrame.isValid()) {
205 if (*uniqueness == 0.0) {
206 FrameInfoSP baseFrameInfo =
m_d->savedFrames[
m_d->lastSavedFullFrameId];
215 if (*uniqueness < 0.5) {
216 FrameInfoSP baseFrameInfo =
m_d->savedFrames[
m_d->lastSavedFullFrameId];
237 m_d->savedFrames.insert(frameId, frameInfo);
239 if (frameInfo->type() == FrameFull) {
240 m_d->lastSavedFullFrame = std::move(frame);
241 m_d->lastSavedFullFrameId = frameId;
250 FrameInfoSP frameInfo =
m_d->savedFrames[frameId];
257 switch (frameInfo->type()) {
259 frame =
m_d->serializer.loadFrame(frameInfo->frameDataId(), builder.
textureInfoPool());
260 m_d->lastLoadedBaseFrame = frame.
clone();
261 m_d->lastLoadedBaseFrameInfo = frameInfo;
264 FrameInfoSP baseFrameInfo = frameInfo->baseFrame();
267 if (baseFrameInfo ==
m_d->lastLoadedBaseFrameInfo) {
268 frame =
m_d->lastLoadedBaseFrame.
clone();
270 frame =
m_d->serializer.loadFrame(baseFrameInfo->frameDataId(), builder.
textureInfoPool());
271 m_d->lastLoadedBaseFrame = frame.
clone();
272 m_d->lastLoadedBaseFrameInfo = baseFrameInfo;
277 FrameInfoSP baseFrameInfo = frameInfo->baseFrame();
280 if (baseFrameInfo ==
m_d->lastLoadedBaseFrameInfo) {
283 m_d->lastLoadedBaseFrame =
m_d->serializer.loadFrame(baseFrameInfo->frameDataId(), builder.
textureInfoPool());
284 m_d->lastLoadedBaseFrameInfo = baseFrameInfo;
292 frame =
m_d->serializer.loadFrame(frameInfo->frameDataId(), builder.
textureInfoPool());
301 QRect patchRect = tile.
rect;
303 if (frameInfo->levelOfDetail()) {
307 const QRect fullSizeTileRect =
309 frameInfo->imageBounds(),
310 frameInfo->levelOfDetail());
314 fullSizeTileRect, patchRect,
315 frameInfo->imageBounds(),
316 frameInfo->levelOfDetail(),
334 m_d->savedFrames.remove(dstFrameId);
337 m_d->savedFrames.insert(dstFrameId,
m_d->savedFrames[srcFrameId]);
338 m_d->savedFrames.remove(srcFrameId);
340 if (
m_d->lastSavedFullFrameId == srcFrameId) {
341 m_d->lastSavedFullFrameId = dstFrameId;
349 if (
m_d->lastSavedFullFrameId == frameId) {
351 m_d->lastSavedFullFrameId = -1;
354 m_d->savedFrames.remove(frameId);
359 return m_d->savedFrames.contains(frameId);
365 return m_d->savedFrames[frameId]->levelOfDetail();
371 return m_d->savedFrames[frameId]->dirtyImageRect();
KisSharedPtr< KisOpenGLUpdateInfo > KisOpenGLUpdateInfoSP
KisTextureTileUpdateInfoSPList tileList
void assignLevelOfDetail(int lod)
QRect dirtyImageRect() const override
void assignDirtyImageRect(const QRect &rect)
int levelOfDetail() const override
#define KIS_SAFE_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
QSharedPointer< KisTextureTileInfoPool > KisTextureTileInfoPoolSP
QSharedPointer< T > toQShared(T *ptr)
KisFrameDataSerializer::Frame lastLoadedBaseFrame
QMap< int, FrameInfoSP > savedFrames
bool hasFrame(int frameId) const
KisFrameDataSerializer serializer
int frameLevelOfDetail(int frameId) const
const QScopedPointer< Private > m_d
KisFrameDataSerializer::Frame lastSavedFullFrame
void saveFrame(int frameId, KisOpenGLUpdateInfoSP info, const QRect &imageBounds)
void moveFrame(int srcFrameId, int dstFrameId)
KisOpenGLUpdateInfoSP loadFrame(int frameId, const KisOpenGLUpdateInfoBuilder &builder)
QRect frameDirtyRect(int frameId) const
Private(const QString &frameCachePath)
FrameInfoSP lastLoadedBaseFrameInfo
void forgetFrame(int frameId)
std::vector< FrameTile > frameTiles
static boost::optional< qreal > estimateFrameUniqueness(const Frame &lhs, const Frame &rhs, qreal portion)
static void addFrames(Frame &dst, const Frame &src)
void forgetFrame(int frameId)
static bool subtractFrames(Frame &dst, const Frame &src)
const KoColorSpace * destinationColorSpace() const
KisTextureTileInfoPoolSP textureInfoPool() const
QRect calculatePhysicalTileRect(int col, int row, const QRect &imageBounds, int levelOfDetail) const