Skip to content

Commit 4a33d22

Browse files
committed
Get size from the event loop thread
1 parent 2e4f970 commit 4a33d22

File tree

3 files changed

+120
-20
lines changed

3 files changed

+120
-20
lines changed

ScratchCPPGui/renderedtarget.cpp

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,20 @@ void RenderedTarget::loadProperties()
5454
}
5555

5656
// Coordinates
57-
double size = sprite->size() / 100;
58-
m_x = static_cast<double>(m_engine->stageWidth()) / 2 + sprite->x() - m_costume->rotationCenterX() * size / m_costume->bitmapResolution() * (m_newMirrorHorizontally ? -1 : 1);
59-
m_y = static_cast<double>(m_engine->stageHeight()) / 2 - sprite->y() - m_costume->rotationCenterY() * size / m_costume->bitmapResolution();
60-
m_originX = m_costume->rotationCenterX() * size / m_costume->bitmapResolution();
61-
m_originY = m_costume->rotationCenterY() * size / m_costume->bitmapResolution();
57+
m_size = sprite->size() / 100;
58+
updateCostumeData();
59+
m_x = static_cast<double>(m_engine->stageWidth()) / 2 + sprite->x() - m_costume->rotationCenterX() * m_size / m_costume->bitmapResolution() * (m_newMirrorHorizontally ? -1 : 1);
60+
m_y = static_cast<double>(m_engine->stageHeight()) / 2 - sprite->y() - m_costume->rotationCenterY() * m_size / m_costume->bitmapResolution();
61+
m_originX = m_costume->rotationCenterX() * m_size / m_costume->bitmapResolution();
62+
m_originY = m_costume->rotationCenterY() * m_size / m_costume->bitmapResolution();
6263

6364
// Layer
6465
m_z = sprite->layerOrder();
6566
}
6667

6768
mutex.unlock();
6869
} else if (m_stageModel) {
70+
updateCostumeData();
6971
m_x = static_cast<double>(m_engine->stageWidth()) / 2 - m_costume->rotationCenterX() / m_costume->bitmapResolution();
7072
m_y = static_cast<double>(m_engine->stageHeight()) / 2 - m_costume->rotationCenterY() / m_costume->bitmapResolution();
7173
m_originX = m_costume->rotationCenterX() / m_costume->bitmapResolution();
@@ -79,13 +81,8 @@ void RenderedTarget::loadCostume(Costume *costume)
7981
return;
8082

8183
m_costumeMutex.lock();
82-
m_imageChanged = true;
83-
84-
if (costume->dataFormat() == "svg") {
85-
if (costume != m_costume)
86-
m_svgRenderer.load(QByteArray::fromRawData(static_cast<const char *>(costume->data()), costume->dataSize()));
87-
}
88-
84+
m_loadCostume = true;
85+
m_costumeChanged = (costume != m_costume);
8986
m_costume = costume;
9087
m_costumeMutex.unlock();
9188
}
@@ -97,14 +94,15 @@ void RenderedTarget::updateProperties()
9794

9895
if (m_visible) {
9996
if (m_imageChanged) {
100-
doLoadCostume();
10197
update();
10298
m_imageChanged = false;
10399
}
104100

105101
setX(m_x);
106102
setY(m_y);
107103
setZ(m_z);
104+
setWidth(m_width);
105+
setHeight(m_height);
108106
setRotation(m_rotation);
109107
setTransformOriginPoint(QPointF(m_originX, m_originY));
110108

@@ -194,6 +192,28 @@ QNanoQuickItemPainter *RenderedTarget::createItemPainter() const
194192
return new TargetPainter();
195193
}
196194

195+
void RenderedTarget::updateCostumeData()
196+
{
197+
// Costume
198+
m_costumeMutex.lock();
199+
200+
if (m_loadCostume) {
201+
m_loadCostume = false;
202+
m_imageChanged = true;
203+
204+
if (m_costumeChanged) {
205+
m_costumeChanged = false;
206+
assert(m_costume);
207+
208+
if (m_costume->dataFormat() == "svg")
209+
m_svgRenderer.load(QByteArray::fromRawData(static_cast<const char *>(m_costume->data()), m_costume->dataSize()));
210+
}
211+
}
212+
213+
m_costumeMutex.unlock();
214+
doLoadCostume();
215+
}
216+
197217
void RenderedTarget::doLoadCostume()
198218
{
199219
m_costumeMutex.lock();
@@ -265,12 +285,11 @@ void RenderedTarget::calculateSize(Target *target, double costumeWidth, double c
265285
Sprite *sprite = dynamic_cast<Sprite *>(target);
266286

267287
if (sprite) {
268-
double size = sprite->size();
269-
setWidth(costumeWidth * size / 100 / bitmapRes);
270-
setHeight(costumeHeight * size / 100 / bitmapRes);
288+
m_width = costumeWidth * m_size / bitmapRes;
289+
m_height = costumeHeight * m_size / bitmapRes;
271290
} else {
272-
setWidth(costumeWidth / bitmapRes);
273-
setHeight(costumeHeight / bitmapRes);
291+
m_width = costumeWidth / bitmapRes;
292+
m_height = costumeHeight / bitmapRes;
274293
}
275294
}
276295
}

ScratchCPPGui/renderedtarget.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class RenderedTarget : public IRenderedTarget
7070
QNanoQuickItemPainter *createItemPainter() const override;
7171

7272
private:
73+
void updateCostumeData();
7374
void doLoadCostume();
7475
void calculateSize(libscratchcpp::Target *target, double costumeWidth, double costumeHeight);
7576

@@ -82,11 +83,16 @@ class RenderedTarget : public IRenderedTarget
8283
QString m_bitmapUniqueKey;
8384
QMutex m_costumeMutex;
8485
QMutex mutex;
86+
bool m_loadCostume = false;
87+
bool m_costumeChanged = false;
8588
bool m_imageChanged = false;
8689
bool m_visible = true;
90+
double m_size = 1;
8791
double m_x = 0;
8892
double m_y = 0;
8993
double m_z = 0;
94+
double m_width = 0;
95+
double m_height = 0;
9096
double m_rotation = 0;
9197
bool m_mirrorHorizontally = false;
9298
bool m_newMirrorHorizontally = false;

test/renderedtarget/renderedtarget_test.cpp

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@ TEST_F(RenderedTargetTest, LoadAndUpdateProperties)
130130
ASSERT_EQ(target.transformOriginPoint(), QPointF(3.4, 9.7));
131131

132132
target.updateProperties();
133-
ASSERT_EQ(target.width(), 14.3);
134-
ASSERT_EQ(target.height(), 5.8);
133+
ASSERT_EQ(target.width(), 5.7592);
134+
ASSERT_EQ(target.height(), 8.6388);
135135
ASSERT_EQ(std::round(target.x() * 100) / 100, 237.18);
136136
ASSERT_EQ(std::round(target.y() * 100) / 100, -100.93);
137137
ASSERT_EQ(target.z(), 3);
@@ -197,6 +197,41 @@ TEST_F(RenderedTargetTest, LoadJpegCostume)
197197
ASSERT_TRUE(target.bitmapUniqueKey().toStdString().empty());
198198
target.bitmapBuffer()->close();
199199

200+
EngineMock engine;
201+
SpriteModel spriteModel;
202+
Sprite sprite;
203+
sprite.setSize(196.5);
204+
spriteModel.init(&sprite);
205+
206+
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
207+
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
208+
target.setEngine(&engine);
209+
target.setSpriteModel(&spriteModel);
210+
target.loadProperties();
211+
ASSERT_FALSE(target.isSvg());
212+
ASSERT_FALSE(target.bitmapBuffer()->isOpen());
213+
target.bitmapBuffer()->open(QBuffer::ReadOnly);
214+
ASSERT_EQ(target.bitmapBuffer()->readAll().toStdString(), str);
215+
ASSERT_EQ(target.bitmapUniqueKey().toStdString(), costume.id());
216+
target.bitmapBuffer()->close();
217+
target.bitmapBuffer()->open(QBuffer::WriteOnly); // clear the buffer
218+
target.bitmapBuffer()->close();
219+
220+
StageModel stageModel;
221+
Stage stage;
222+
223+
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
224+
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
225+
target.setSpriteModel(nullptr);
226+
target.setStageModel(&stageModel);
227+
target.loadProperties();
228+
ASSERT_FALSE(target.isSvg());
229+
ASSERT_FALSE(target.bitmapBuffer()->isOpen());
230+
target.bitmapBuffer()->open(QBuffer::ReadOnly);
231+
ASSERT_EQ(target.bitmapBuffer()->readAll().toStdString(), str);
232+
ASSERT_EQ(target.bitmapUniqueKey().toStdString(), costume.id());
233+
target.bitmapBuffer()->close();
234+
200235
target.updateProperties();
201236
ASSERT_FALSE(target.isSvg());
202237
ASSERT_FALSE(target.bitmapBuffer()->isOpen());
@@ -223,6 +258,41 @@ TEST_F(RenderedTargetTest, LoadPngCostume)
223258
ASSERT_TRUE(target.bitmapUniqueKey().toStdString().empty());
224259
target.bitmapBuffer()->close();
225260

261+
EngineMock engine;
262+
SpriteModel spriteModel;
263+
Sprite sprite;
264+
sprite.setSize(196.5);
265+
spriteModel.init(&sprite);
266+
267+
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
268+
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
269+
target.setEngine(&engine);
270+
target.setSpriteModel(&spriteModel);
271+
target.loadProperties();
272+
ASSERT_FALSE(target.isSvg());
273+
ASSERT_FALSE(target.bitmapBuffer()->isOpen());
274+
target.bitmapBuffer()->open(QBuffer::ReadOnly);
275+
ASSERT_EQ(target.bitmapBuffer()->readAll().toStdString(), str);
276+
ASSERT_EQ(target.bitmapUniqueKey().toStdString(), costume.id());
277+
target.bitmapBuffer()->close();
278+
target.bitmapBuffer()->open(QBuffer::WriteOnly); // clear the buffer
279+
target.bitmapBuffer()->close();
280+
281+
StageModel stageModel;
282+
Stage stage;
283+
284+
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
285+
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
286+
target.setSpriteModel(nullptr);
287+
target.setStageModel(&stageModel);
288+
target.loadProperties();
289+
ASSERT_FALSE(target.isSvg());
290+
ASSERT_FALSE(target.bitmapBuffer()->isOpen());
291+
target.bitmapBuffer()->open(QBuffer::ReadOnly);
292+
ASSERT_EQ(target.bitmapBuffer()->readAll().toStdString(), str);
293+
ASSERT_EQ(target.bitmapUniqueKey().toStdString(), costume.id());
294+
target.bitmapBuffer()->close();
295+
226296
target.updateProperties();
227297
ASSERT_FALSE(target.isSvg());
228298
ASSERT_FALSE(target.bitmapBuffer()->isOpen());
@@ -265,15 +335,20 @@ TEST_F(RenderedTargetTest, PaintSvg)
265335
costume.setData(str.size(), static_cast<void *>(const_cast<char *>(str.c_str())));
266336
costume.setBitmapResolution(3);
267337

338+
EngineMock engine;
268339
Sprite sprite;
269340
sprite.setSize(2525.7);
270341

271342
SpriteModel model;
272343
model.init(&sprite);
273344

345+
EXPECT_CALL(engine, stageWidth()).WillOnce(Return(480));
346+
EXPECT_CALL(engine, stageHeight()).WillOnce(Return(360));
274347
RenderedTarget target;
348+
target.setEngine(&engine);
275349
target.setSpriteModel(&model);
276350
target.loadCostume(&costume);
351+
target.loadProperties();
277352
target.updateProperties();
278353

279354
// Create OpenGL context

0 commit comments

Comments
 (0)