Skip to content

Commit 5894ade

Browse files
committed
Add sprite size limit
1 parent c9d1802 commit 5894ade

File tree

3 files changed

+52
-10
lines changed

3 files changed

+52
-10
lines changed

src/scratch/sprite.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,21 @@ double Sprite::size() const
258258
/*! Sets the size. */
259259
void Sprite::setSize(double newSize)
260260
{
261+
IEngine *engine = this->engine();
262+
263+
if (engine) {
264+
const int oldWidth = currentCostumeWidth();
265+
const int oldHeight = currentCostumeHeight();
266+
const double minScale = std::min(1.0, std::max(5.0 / oldWidth, 5.0 / oldHeight));
267+
const double maxScale = std::min((1.5 * engine->stageWidth()) / oldWidth, (1.5 * engine->stageHeight()) / oldHeight);
268+
newSize = std::clamp(newSize, minScale * 100, maxScale * 100);
269+
}
270+
261271
impl->size = newSize;
262272

263273
if (impl->visible) {
264-
IEngine *eng = engine();
265-
266-
if (eng)
267-
eng->requestRedraw();
274+
if (engine)
275+
engine->requestRedraw();
268276
}
269277

270278
if (impl->iface)

test/scratch_classes/sprite_test.cpp

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -448,21 +448,43 @@ TEST(SpriteTest, Dragging)
448448
TEST(SpriteTest, Size)
449449
{
450450
Sprite sprite;
451+
SpriteHandlerMock handler;
452+
EXPECT_CALL(handler, init);
453+
sprite.setInterface(&handler);
451454
ASSERT_EQ(sprite.size(), 100);
452455

453456
EngineMock engine;
454457
sprite.setEngine(&engine);
455-
EXPECT_CALL(engine, requestRedraw()).Times(4);
458+
EXPECT_CALL(engine, requestRedraw()).WillRepeatedly(Return());
459+
EXPECT_CALL(engine, stageWidth()).WillRepeatedly(Return(480));
460+
EXPECT_CALL(engine, stageHeight()).WillRepeatedly(Return(360));
461+
EXPECT_CALL(handler, onSizeChanged).WillRepeatedly(Return());
456462

463+
EXPECT_CALL(handler, costumeWidth()).WillRepeatedly(Return(50));
464+
EXPECT_CALL(handler, costumeHeight()).WillRepeatedly(Return(30));
457465
sprite.setSize(63.724);
458466
ASSERT_EQ(sprite.size(), 63.724);
459-
460-
sprite.setCostumeIndex(1);
467+
sprite.setSize(0);
468+
ASSERT_EQ(std::round(sprite.size() * 100) / 100, 16.67);
469+
sprite.setSize(2000);
470+
ASSERT_EQ(sprite.size(), 1440);
471+
472+
EXPECT_CALL(handler, costumeWidth()).WillRepeatedly(Return(30));
473+
EXPECT_CALL(handler, costumeHeight()).WillRepeatedly(Return(50));
474+
sprite.setSize(0);
475+
ASSERT_EQ(std::round(sprite.size() * 100) / 100, 16.67);
476+
sprite.setSize(2000);
477+
ASSERT_EQ(sprite.size(), 1080);
478+
479+
EXPECT_CALL(handler, costumeWidth()).WillRepeatedly(Return(88));
480+
EXPECT_CALL(handler, costumeHeight()).WillRepeatedly(Return(88));
481+
sprite.setSize(0);
482+
ASSERT_EQ(std::round(sprite.size() * 100) / 100, 5.68);
483+
sprite.setSize(2000);
484+
ASSERT_EQ(std::round(sprite.size() * 100) / 100, 613.64);
461485

462486
sprite.setSize(186.84);
463487
ASSERT_EQ(sprite.size(), 186.84);
464-
465-
sprite.setCostumeIndex(0);
466488
}
467489

468490
TEST(SpriteTest, CostumeIndex)

test/target_interfaces/ispritehandler_test.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,21 @@ TEST_F(ISpriteHandlerTest, Position)
116116

117117
TEST_F(ISpriteHandlerTest, Size)
118118
{
119-
EXPECT_CALL(m_handler, onSizeChanged(53.8)).Times(1);
119+
EXPECT_CALL(m_handler, onSizeChanged(53.8));
120+
EXPECT_CALL(m_handler, costumeWidth()).WillOnce(Return(100));
121+
EXPECT_CALL(m_handler, costumeHeight()).WillOnce(Return(100));
122+
EXPECT_CALL(m_engine, stageWidth()).WillOnce(Return(480));
123+
EXPECT_CALL(m_engine, stageHeight()).WillOnce(Return(360));
120124
EXPECT_CALL(m_engine, requestRedraw());
121125
m_sprite.setSize(53.8);
126+
127+
EXPECT_CALL(m_handler, onSizeChanged(540));
128+
EXPECT_CALL(m_handler, costumeWidth()).WillOnce(Return(100));
129+
EXPECT_CALL(m_handler, costumeHeight()).WillOnce(Return(100));
130+
EXPECT_CALL(m_engine, stageWidth()).WillOnce(Return(480));
131+
EXPECT_CALL(m_engine, stageHeight()).WillOnce(Return(360));
132+
EXPECT_CALL(m_engine, requestRedraw());
133+
m_sprite.setSize(100000);
122134
}
123135

124136
TEST_F(ISpriteHandlerTest, Direction)

0 commit comments

Comments
 (0)