Skip to content

Commit 0087806

Browse files
committed
Implement pen_changePenHueBy block
1 parent 2773b4b commit 0087806

File tree

3 files changed

+197
-0
lines changed

3 files changed

+197
-0
lines changed

src/blocks/penblocks.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ void PenBlocks::registerBlocks(IEngine *engine)
9090
engine->addCompileFunction(this, "pen_setPenSizeTo", &compileSetPenSizeTo);
9191
engine->addCompileFunction(this, "pen_changePenShadeBy", &compileChangePenShadeBy);
9292
engine->addCompileFunction(this, "pen_setPenShadeToNumber", &compileSetPenShadeToNumber);
93+
engine->addCompileFunction(this, "pen_changePenHueBy", &compileChangePenHueBy);
9394
}
9495

9596
CompilerValue *PenBlocks::compileClear(Compiler *compiler)
@@ -216,6 +217,14 @@ CompilerValue *PenBlocks::compileSetPenShadeToNumber(Compiler *compiler)
216217
return nullptr;
217218
}
218219

220+
CompilerValue *PenBlocks::compileChangePenHueBy(Compiler *compiler)
221+
{
222+
CompilerValue *hue = compiler->addInput("HUE");
223+
CompilerValue *change = compiler->addConstValue(true);
224+
compiler->addTargetFunctionCall("pen_set_or_change_pen_hue", Compiler::StaticType::Void, { Compiler::StaticType::Number, Compiler::StaticType::Bool }, { hue, change });
225+
return nullptr;
226+
}
227+
219228
static TargetModel *getTargetModel(Target *target)
220229
{
221230
if (target->isStage()) {
@@ -414,3 +423,9 @@ BLOCK_EXPORT void pen_set_or_change_pen_shade(Target *target, double shade, bool
414423

415424
legacy_update_pen_color(penState);
416425
}
426+
427+
BLOCK_EXPORT void pen_set_or_change_pen_hue(Target *target, double hue, bool change)
428+
{
429+
pen_set_or_change_color(target, hue / 2.0, change);
430+
legacy_update_pen_color(getTargetModel(target)->penState());
431+
}

src/blocks/penblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class PenBlocks : public libscratchcpp::IExtension
2525
static libscratchcpp::CompilerValue *compileSetPenSizeTo(libscratchcpp::Compiler *compiler);
2626
static libscratchcpp::CompilerValue *compileChangePenShadeBy(libscratchcpp::Compiler *compiler);
2727
static libscratchcpp::CompilerValue *compileSetPenShadeToNumber(libscratchcpp::Compiler *compiler);
28+
static libscratchcpp::CompilerValue *compileChangePenHueBy(libscratchcpp::Compiler *compiler);
2829
};
2930

3031
} // namespace scratchcpprender

test/blocks/pen_blocks_test.cpp

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2490,3 +2490,184 @@ TEST_F(PenBlocksTest, SetPenShadeTo_Stage)
24902490
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
24912491
EXPECT_EQ(model.penState().shade, 49.2);
24922492
}
2493+
2494+
TEST_F(PenBlocksTest, ChangePenHueBy)
2495+
{
2496+
auto sprite = std::make_shared<Sprite>();
2497+
sprite->setEngine(&m_engineMock);
2498+
2499+
RenderedTarget renderedTarget;
2500+
SpriteModel model;
2501+
model.init(sprite.get());
2502+
model.setRenderedTarget(&renderedTarget);
2503+
sprite->setInterface(&model);
2504+
2505+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2506+
builder.addBlock("pen_changePenHueBy");
2507+
builder.addValueInput("HUE", 49.2);
2508+
2509+
PenState &penState = model.penState();
2510+
penState.color = 60;
2511+
penState.saturation = 90;
2512+
penState.brightness = 75;
2513+
penState.shade = 18.5;
2514+
penState.updateColor();
2515+
2516+
auto original = model.penAttributes().color;
2517+
2518+
auto thread = buildScript(builder, sprite.get());
2519+
2520+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2521+
thread->run();
2522+
2523+
EXPECT_EQ(model.penAttributes().color.red(), 121);
2524+
EXPECT_EQ(model.penAttributes().color.green(), 0);
2525+
EXPECT_EQ(model.penAttributes().color.blue(), 113);
2526+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2527+
EXPECT_EQ(model.penState().shade, 18.5);
2528+
}
2529+
2530+
TEST_F(PenBlocksTest, ChangePenHueBy_DoesNotChangeTransparency)
2531+
{
2532+
auto sprite = std::make_shared<Sprite>();
2533+
sprite->setEngine(&m_engineMock);
2534+
2535+
RenderedTarget renderedTarget;
2536+
SpriteModel model;
2537+
model.init(sprite.get());
2538+
model.setRenderedTarget(&renderedTarget);
2539+
sprite->setInterface(&model);
2540+
2541+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2542+
builder.addBlock("pen_changePenHueBy");
2543+
builder.addValueInput("HUE", 49.2);
2544+
2545+
PenState &penState = model.penState();
2546+
penState.color = 60;
2547+
penState.saturation = 90;
2548+
penState.brightness = 75;
2549+
penState.shade = 18.5;
2550+
penState.transparency = 50;
2551+
penState.updateColor();
2552+
2553+
auto original = model.penAttributes().color;
2554+
2555+
auto thread = buildScript(builder, sprite.get());
2556+
2557+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2558+
thread->run();
2559+
2560+
EXPECT_EQ(model.penAttributes().color.red(), 121);
2561+
EXPECT_EQ(model.penAttributes().color.green(), 0);
2562+
EXPECT_EQ(model.penAttributes().color.blue(), 113);
2563+
EXPECT_EQ(model.penAttributes().color.alpha(), 127);
2564+
EXPECT_EQ(model.penState().transparency, 50);
2565+
}
2566+
2567+
TEST_F(PenBlocksTest, ChangePenHueBy_OutOfRange)
2568+
{
2569+
auto sprite = std::make_shared<Sprite>();
2570+
sprite->setEngine(&m_engineMock);
2571+
2572+
RenderedTarget renderedTarget;
2573+
SpriteModel model;
2574+
model.init(sprite.get());
2575+
model.setRenderedTarget(&renderedTarget);
2576+
sprite->setInterface(&model);
2577+
2578+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2579+
builder.addBlock("pen_changePenHueBy");
2580+
builder.addValueInput("HUE", 197.2);
2581+
2582+
PenState &penState = model.penState();
2583+
penState.color = 60;
2584+
penState.saturation = 90;
2585+
penState.brightness = 75;
2586+
penState.shade = 63.7;
2587+
penState.updateColor();
2588+
2589+
auto original = model.penAttributes().color;
2590+
2591+
auto thread = buildScript(builder, sprite.get());
2592+
2593+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2594+
thread->run();
2595+
2596+
EXPECT_EQ(model.penAttributes().color.red(), 58);
2597+
EXPECT_EQ(model.penAttributes().color.green(), 153);
2598+
EXPECT_EQ(model.penAttributes().color.blue(), 255);
2599+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2600+
EXPECT_EQ(model.penState().shade, 63.7);
2601+
}
2602+
2603+
TEST_F(PenBlocksTest, ChangePenHueBy_OutOfRange_Negative)
2604+
{
2605+
auto sprite = std::make_shared<Sprite>();
2606+
sprite->setEngine(&m_engineMock);
2607+
2608+
RenderedTarget renderedTarget;
2609+
SpriteModel model;
2610+
model.init(sprite.get());
2611+
model.setRenderedTarget(&renderedTarget);
2612+
sprite->setInterface(&model);
2613+
2614+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2615+
builder.addBlock("pen_changePenHueBy");
2616+
builder.addValueInput("HUE", -295);
2617+
2618+
PenState &penState = model.penState();
2619+
penState.color = 60;
2620+
penState.saturation = 90;
2621+
penState.brightness = 75;
2622+
penState.shade = 63.7;
2623+
penState.updateColor();
2624+
2625+
auto original = model.penAttributes().color;
2626+
2627+
auto thread = buildScript(builder, sprite.get());
2628+
2629+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2630+
thread->run();
2631+
2632+
EXPECT_EQ(model.penAttributes().color.red(), 255);
2633+
EXPECT_EQ(model.penAttributes().color.green(), 202);
2634+
EXPECT_EQ(model.penAttributes().color.blue(), 58);
2635+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2636+
EXPECT_EQ(model.penState().shade, 63.7);
2637+
}
2638+
2639+
TEST_F(PenBlocksTest, ChangePenHueBy_Stage)
2640+
{
2641+
auto stage = std::make_shared<Stage>();
2642+
stage->setEngine(&m_engineMock);
2643+
2644+
RenderedTarget renderedTarget;
2645+
StageModel model;
2646+
model.init(stage.get());
2647+
model.setRenderedTarget(&renderedTarget);
2648+
stage->setInterface(&model);
2649+
2650+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
2651+
builder.addBlock("pen_changePenHueBy");
2652+
builder.addValueInput("HUE", 49.2);
2653+
2654+
PenState &penState = model.penState();
2655+
penState.color = 60;
2656+
penState.saturation = 90;
2657+
penState.brightness = 75;
2658+
penState.shade = 18.5;
2659+
penState.updateColor();
2660+
2661+
auto original = model.penAttributes().color;
2662+
2663+
auto thread = buildScript(builder, stage.get());
2664+
2665+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2666+
thread->run();
2667+
2668+
EXPECT_EQ(model.penAttributes().color.red(), 121);
2669+
EXPECT_EQ(model.penAttributes().color.green(), 0);
2670+
EXPECT_EQ(model.penAttributes().color.blue(), 113);
2671+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2672+
EXPECT_EQ(model.penState().shade, 18.5);
2673+
}

0 commit comments

Comments
 (0)