Krita Source Code Documentation
Loading...
Searching...
No Matches
KisFrameDataSerializer.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2018 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KISFRAMEDATASERIALIZER_H
7#define KISFRAMEDATASERIALIZER_H
8
9#include "kritaui_export.h"
10#include <QScopedPointer>
12
13// TODO: extract DataBuffer into a separate file
15
16#include <vector>
17#include <boost/optional.hpp>
18
19class QString;
20
21
33class KRITAUI_EXPORT KisFrameDataSerializer
34{
35public:
36 struct FrameTile
37 {
38 FrameTile(KisTextureTileInfoPoolSP pool) : data(pool) {}
39
40 FrameTile(FrameTile &&rhs) = default;
41 FrameTile& operator=(FrameTile &&rhs) = default;
42
43 FrameTile(const FrameTile &rhs) = delete;
44 FrameTile& operator=(FrameTile &rhs) = delete;
45
46 bool isValid() const {
47 return data.data();
48 }
49
51 FrameTile tile(data.pool());
52 tile.col = col;
53 tile.row = row;
54 tile.rect = rect;
55 tile.data.allocate(data.pixelSize());
56
57 const int bufferSize = data.pixelSize() * rect.width() * rect.height();
58 memcpy(tile.data.data(), data.data(), bufferSize);
59
60 return tile;
61 }
62
63 int col = -1;
64 int row = -1;
65 bool isCompressed = false;
66 QRect rect;
68 };
69
70 struct Frame
71 {
72 Frame() = default;
73
74 Frame(Frame&&rhs) = default;
75 Frame& operator=(Frame &&rhs) = default;
76
77 Frame(const Frame &rhs) = delete;
78 Frame& operator=(Frame &rhs) = delete;
79
80 Frame clone() const {
81 Frame frame;
82 frame.pixelSize = pixelSize;
83 for (auto it = frameTiles.begin(); it != frameTiles.end(); ++it) {
84 frame.frameTiles.push_back(it->clone());
85 }
86 return frame;
87 }
88
89 int pixelSize = 0;
90 std::vector<FrameTile> frameTiles;
91
92 bool isValid() const {
93 return pixelSize > 0;
94 }
95 };
96
97public:
99 KisFrameDataSerializer(const QString &frameCachePath);
101
102 int saveFrame(const Frame &frame);
103 Frame loadFrame(int frameId, KisTextureTileInfoPoolSP pool);
104
105 void moveFrame(int srcFrameId, int dstFrameId);
106
107 bool hasFrame(int frameId) const;
108 void forgetFrame(int frameId);
109
110 static boost::optional<qreal> estimateFrameUniqueness(const Frame &lhs, const Frame &rhs, qreal portion);
111 static bool subtractFrames(Frame &dst, const Frame &src);
112 static void addFrames(Frame &dst, const Frame &src);
113
114private:
115 template<template <typename U> class OpPolicy>
116 static bool processFrames(KisFrameDataSerializer::Frame &dst, const KisFrameDataSerializer::Frame &src);
117
118private:
119 Q_DISABLE_COPY(KisFrameDataSerializer)
120
121 struct Private;
122 const QScopedPointer<Private> m_d;
123};
124
125#endif // KISFRAMEDATASERIALIZER_H
void allocate(int pixelSize)
FrameTile(const FrameTile &rhs)=delete
FrameTile & operator=(FrameTile &rhs)=delete
FrameTile(FrameTile &&rhs)=default
FrameTile & operator=(FrameTile &&rhs)=default
FrameTile(KisTextureTileInfoPoolSP pool)
std::vector< FrameTile > frameTiles
Frame(const Frame &rhs)=delete
Frame & operator=(Frame &&rhs)=default
Frame(Frame &&rhs)=default
Frame & operator=(Frame &rhs)=delete
const QScopedPointer< Private > m_d