Skip to content

Commit 2773b4b

Browse files
committed
Implement pen_setPenShadeToNumber block
1 parent e7b3ea7 commit 2773b4b

File tree

3 files changed

+154
-0
lines changed

3 files changed

+154
-0
lines changed

src/blocks/penblocks.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ void PenBlocks::registerBlocks(IEngine *engine)
8989
engine->addCompileFunction(this, "pen_changePenSizeBy", &compileChangePenSizeBy);
9090
engine->addCompileFunction(this, "pen_setPenSizeTo", &compileSetPenSizeTo);
9191
engine->addCompileFunction(this, "pen_changePenShadeBy", &compileChangePenShadeBy);
92+
engine->addCompileFunction(this, "pen_setPenShadeToNumber", &compileSetPenShadeToNumber);
9293
}
9394

9495
CompilerValue *PenBlocks::compileClear(Compiler *compiler)
@@ -207,6 +208,14 @@ CompilerValue *PenBlocks::compileChangePenShadeBy(Compiler *compiler)
207208
return nullptr;
208209
}
209210

211+
CompilerValue *PenBlocks::compileSetPenShadeToNumber(Compiler *compiler)
212+
{
213+
CompilerValue *shade = compiler->addInput("SHADE");
214+
CompilerValue *change = compiler->addConstValue(false);
215+
compiler->addTargetFunctionCall("pen_set_or_change_pen_shade", Compiler::StaticType::Void, { Compiler::StaticType::Number, Compiler::StaticType::Bool }, { shade, change });
216+
return nullptr;
217+
}
218+
210219
static TargetModel *getTargetModel(Target *target)
211220
{
212221
if (target->isStage()) {

src/blocks/penblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class PenBlocks : public libscratchcpp::IExtension
2424
static libscratchcpp::CompilerValue *compileChangePenSizeBy(libscratchcpp::Compiler *compiler);
2525
static libscratchcpp::CompilerValue *compileSetPenSizeTo(libscratchcpp::Compiler *compiler);
2626
static libscratchcpp::CompilerValue *compileChangePenShadeBy(libscratchcpp::Compiler *compiler);
27+
static libscratchcpp::CompilerValue *compileSetPenShadeToNumber(libscratchcpp::Compiler *compiler);
2728
};
2829

2930
} // namespace scratchcpprender

test/blocks/pen_blocks_test.cpp

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2346,3 +2346,147 @@ TEST_F(PenBlocksTest, ChangePenShadeBy_Stage)
23462346
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
23472347
EXPECT_EQ(model.penState().shade, 63);
23482348
}
2349+
2350+
TEST_F(PenBlocksTest, SetPenShadeTo)
2351+
{
2352+
auto sprite = std::make_shared<Sprite>();
2353+
sprite->setEngine(&m_engineMock);
2354+
2355+
RenderedTarget renderedTarget;
2356+
SpriteModel model;
2357+
model.init(sprite.get());
2358+
model.setRenderedTarget(&renderedTarget);
2359+
sprite->setInterface(&model);
2360+
2361+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2362+
builder.addBlock("pen_setPenShadeToNumber");
2363+
builder.addValueInput("SHADE", 49.2);
2364+
2365+
PenState &penState = model.penState();
2366+
penState.color = 60;
2367+
penState.saturation = 90;
2368+
penState.brightness = 75;
2369+
penState.shade = 13.8;
2370+
penState.updateColor();
2371+
2372+
auto original = model.penAttributes().color;
2373+
2374+
auto thread = buildScript(builder, sprite.get());
2375+
2376+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2377+
thread->run();
2378+
2379+
EXPECT_EQ(model.penAttributes().color.red(), 0);
2380+
EXPECT_EQ(model.penAttributes().color.green(), 100);
2381+
EXPECT_EQ(model.penAttributes().color.blue(), 251);
2382+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2383+
EXPECT_EQ(model.penState().shade, 49.2);
2384+
}
2385+
2386+
TEST_F(PenBlocksTest, SetPenShadeTo_OutOfRange)
2387+
{
2388+
auto sprite = std::make_shared<Sprite>();
2389+
sprite->setEngine(&m_engineMock);
2390+
2391+
RenderedTarget renderedTarget;
2392+
SpriteModel model;
2393+
model.init(sprite.get());
2394+
model.setRenderedTarget(&renderedTarget);
2395+
sprite->setInterface(&model);
2396+
2397+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2398+
builder.addBlock("pen_setPenShadeToNumber");
2399+
builder.addValueInput("SHADE", 201.4);
2400+
2401+
PenState &penState = model.penState();
2402+
penState.color = 60;
2403+
penState.saturation = 90;
2404+
penState.brightness = 75;
2405+
penState.shade = 13.8;
2406+
penState.updateColor();
2407+
2408+
auto original = model.penAttributes().color;
2409+
2410+
auto thread = buildScript(builder, sprite.get());
2411+
2412+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2413+
thread->run();
2414+
2415+
EXPECT_EQ(model.penAttributes().color.red(), 0);
2416+
EXPECT_EQ(model.penAttributes().color.green(), 19);
2417+
EXPECT_EQ(model.penAttributes().color.blue(), 48);
2418+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2419+
EXPECT_EQ(std::round(model.penState().shade * 100) / 100, 1.4);
2420+
}
2421+
2422+
TEST_F(PenBlocksTest, SetPenShadeTo_OutOfRange_Negative)
2423+
{
2424+
auto sprite = std::make_shared<Sprite>();
2425+
sprite->setEngine(&m_engineMock);
2426+
2427+
RenderedTarget renderedTarget;
2428+
SpriteModel model;
2429+
model.init(sprite.get());
2430+
model.setRenderedTarget(&renderedTarget);
2431+
sprite->setInterface(&model);
2432+
2433+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2434+
builder.addBlock("pen_setPenShadeToNumber");
2435+
builder.addValueInput("SHADE", -25.3);
2436+
2437+
PenState &penState = model.penState();
2438+
penState.color = 60;
2439+
penState.saturation = 90;
2440+
penState.brightness = 75;
2441+
penState.shade = 13.8;
2442+
penState.updateColor();
2443+
2444+
auto original = model.penAttributes().color;
2445+
2446+
auto thread = buildScript(builder, sprite.get());
2447+
2448+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2449+
thread->run();
2450+
2451+
EXPECT_EQ(model.penAttributes().color.red(), 0);
2452+
EXPECT_EQ(model.penAttributes().color.green(), 60);
2453+
EXPECT_EQ(model.penAttributes().color.blue(), 150);
2454+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2455+
EXPECT_EQ(model.penState().shade, 174.7);
2456+
}
2457+
2458+
TEST_F(PenBlocksTest, SetPenShadeTo_Stage)
2459+
{
2460+
auto stage = std::make_shared<Stage>();
2461+
stage->setEngine(&m_engineMock);
2462+
2463+
RenderedTarget renderedTarget;
2464+
StageModel model;
2465+
model.init(stage.get());
2466+
model.setRenderedTarget(&renderedTarget);
2467+
stage->setInterface(&model);
2468+
2469+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
2470+
builder.addBlock("pen_setPenShadeToNumber");
2471+
builder.addValueInput("SHADE", 49.2);
2472+
2473+
PenState &penState = model.penState();
2474+
penState.color = 60;
2475+
penState.saturation = 90;
2476+
penState.brightness = 75;
2477+
penState.shade = 13.8;
2478+
penState.updateColor();
2479+
2480+
auto original = model.penAttributes().color;
2481+
2482+
auto thread = buildScript(builder, stage.get());
2483+
2484+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2485+
thread->run();
2486+
2487+
EXPECT_EQ(model.penAttributes().color.red(), 0);
2488+
EXPECT_EQ(model.penAttributes().color.green(), 100);
2489+
EXPECT_EQ(model.penAttributes().color.blue(), 251);
2490+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2491+
EXPECT_EQ(model.penState().shade, 49.2);
2492+
}

0 commit comments

Comments
 (0)