Skip to content

Commit a005131

Browse files
committed
Implement pen_setPenHueToNumber block
1 parent 0087806 commit a005131

File tree

3 files changed

+194
-0
lines changed

3 files changed

+194
-0
lines changed

src/blocks/penblocks.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ void PenBlocks::registerBlocks(IEngine *engine)
9191
engine->addCompileFunction(this, "pen_changePenShadeBy", &compileChangePenShadeBy);
9292
engine->addCompileFunction(this, "pen_setPenShadeToNumber", &compileSetPenShadeToNumber);
9393
engine->addCompileFunction(this, "pen_changePenHueBy", &compileChangePenHueBy);
94+
engine->addCompileFunction(this, "pen_setPenHueToNumber", &compileSetPenHueToNumber);
9495
}
9596

9697
CompilerValue *PenBlocks::compileClear(Compiler *compiler)
@@ -225,6 +226,17 @@ CompilerValue *PenBlocks::compileChangePenHueBy(Compiler *compiler)
225226
return nullptr;
226227
}
227228

229+
CompilerValue *PenBlocks::compileSetPenHueToNumber(Compiler *compiler)
230+
{
231+
CompilerValue *hue = compiler->addInput("HUE");
232+
CompilerValue *transparency = compiler->addConstValue(0);
233+
CompilerValue *change = compiler->addConstValue(false);
234+
235+
compiler->addTargetFunctionCall("pen_set_or_change_pen_hue", Compiler::StaticType::Void, { Compiler::StaticType::Number, Compiler::StaticType::Bool }, { hue, change });
236+
compiler->addTargetFunctionCall("pen_set_or_change_transparency", Compiler::StaticType::Void, { Compiler::StaticType::Number, Compiler::StaticType::Bool }, { transparency, change });
237+
return nullptr;
238+
}
239+
228240
static TargetModel *getTargetModel(Target *target)
229241
{
230242
if (target->isStage()) {

src/blocks/penblocks.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class PenBlocks : public libscratchcpp::IExtension
2626
static libscratchcpp::CompilerValue *compileChangePenShadeBy(libscratchcpp::Compiler *compiler);
2727
static libscratchcpp::CompilerValue *compileSetPenShadeToNumber(libscratchcpp::Compiler *compiler);
2828
static libscratchcpp::CompilerValue *compileChangePenHueBy(libscratchcpp::Compiler *compiler);
29+
static libscratchcpp::CompilerValue *compileSetPenHueToNumber(libscratchcpp::Compiler *compiler);
2930
};
3031

3132
} // namespace scratchcpprender

test/blocks/pen_blocks_test.cpp

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2671,3 +2671,184 @@ TEST_F(PenBlocksTest, ChangePenHueBy_Stage)
26712671
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
26722672
EXPECT_EQ(model.penState().shade, 18.5);
26732673
}
2674+
2675+
TEST_F(PenBlocksTest, SetPenHueToNumber)
2676+
{
2677+
auto sprite = std::make_shared<Sprite>();
2678+
sprite->setEngine(&m_engineMock);
2679+
2680+
RenderedTarget renderedTarget;
2681+
SpriteModel model;
2682+
model.init(sprite.get());
2683+
model.setRenderedTarget(&renderedTarget);
2684+
sprite->setInterface(&model);
2685+
2686+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2687+
builder.addBlock("pen_setPenHueToNumber");
2688+
builder.addValueInput("HUE", 49.2);
2689+
2690+
PenState &penState = model.penState();
2691+
penState.color = 60;
2692+
penState.saturation = 90;
2693+
penState.brightness = 75;
2694+
penState.shade = 18.5;
2695+
penState.updateColor();
2696+
2697+
auto original = model.penAttributes().color;
2698+
2699+
auto thread = buildScript(builder, sprite.get());
2700+
2701+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2702+
thread->run();
2703+
2704+
EXPECT_EQ(model.penAttributes().color.red(), 65);
2705+
EXPECT_EQ(model.penAttributes().color.green(), 121);
2706+
EXPECT_EQ(model.penAttributes().color.blue(), 0);
2707+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2708+
EXPECT_EQ(model.penState().shade, 18.5);
2709+
}
2710+
2711+
TEST_F(PenBlocksTest, SetPenHueToNumber_ResetsTransparency)
2712+
{
2713+
auto sprite = std::make_shared<Sprite>();
2714+
sprite->setEngine(&m_engineMock);
2715+
2716+
RenderedTarget renderedTarget;
2717+
SpriteModel model;
2718+
model.init(sprite.get());
2719+
model.setRenderedTarget(&renderedTarget);
2720+
sprite->setInterface(&model);
2721+
2722+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2723+
builder.addBlock("pen_setPenHueToNumber");
2724+
builder.addValueInput("HUE", 49.2);
2725+
2726+
PenState &penState = model.penState();
2727+
penState.color = 60;
2728+
penState.saturation = 90;
2729+
penState.brightness = 75;
2730+
penState.shade = 18.5;
2731+
penState.transparency = 50;
2732+
penState.updateColor();
2733+
2734+
auto original = model.penAttributes().color;
2735+
2736+
auto thread = buildScript(builder, sprite.get());
2737+
2738+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2739+
thread->run();
2740+
2741+
EXPECT_EQ(model.penAttributes().color.red(), 65);
2742+
EXPECT_EQ(model.penAttributes().color.green(), 121);
2743+
EXPECT_EQ(model.penAttributes().color.blue(), 0);
2744+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2745+
EXPECT_EQ(model.penState().transparency, 0);
2746+
}
2747+
2748+
TEST_F(PenBlocksTest, SetPenHueToNumber_OutOfRange)
2749+
{
2750+
auto sprite = std::make_shared<Sprite>();
2751+
sprite->setEngine(&m_engineMock);
2752+
2753+
RenderedTarget renderedTarget;
2754+
SpriteModel model;
2755+
model.init(sprite.get());
2756+
model.setRenderedTarget(&renderedTarget);
2757+
sprite->setInterface(&model);
2758+
2759+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2760+
builder.addBlock("pen_setPenHueToNumber");
2761+
builder.addValueInput("HUE", 211.3);
2762+
2763+
PenState &penState = model.penState();
2764+
penState.color = 60;
2765+
penState.saturation = 90;
2766+
penState.brightness = 75;
2767+
penState.shade = 63.7;
2768+
penState.updateColor();
2769+
2770+
auto original = model.penAttributes().color;
2771+
2772+
auto thread = buildScript(builder, sprite.get());
2773+
2774+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2775+
thread->run();
2776+
2777+
EXPECT_EQ(model.penAttributes().color.red(), 255);
2778+
EXPECT_EQ(model.penAttributes().color.green(), 124);
2779+
EXPECT_EQ(model.penAttributes().color.blue(), 58);
2780+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2781+
EXPECT_EQ(model.penState().shade, 63.7);
2782+
}
2783+
2784+
TEST_F(PenBlocksTest, SetPenHueToNumber_OutOfRange_Negative)
2785+
{
2786+
auto sprite = std::make_shared<Sprite>();
2787+
sprite->setEngine(&m_engineMock);
2788+
2789+
RenderedTarget renderedTarget;
2790+
SpriteModel model;
2791+
model.init(sprite.get());
2792+
model.setRenderedTarget(&renderedTarget);
2793+
sprite->setInterface(&model);
2794+
2795+
ScriptBuilder builder(m_extension.get(), m_engine, sprite);
2796+
builder.addBlock("pen_setPenHueToNumber");
2797+
builder.addValueInput("HUE", -23.4);
2798+
2799+
PenState &penState = model.penState();
2800+
penState.color = 60;
2801+
penState.saturation = 90;
2802+
penState.brightness = 75;
2803+
penState.shade = 63.7;
2804+
penState.updateColor();
2805+
2806+
auto original = model.penAttributes().color;
2807+
2808+
auto thread = buildScript(builder, sprite.get());
2809+
2810+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2811+
thread->run();
2812+
2813+
EXPECT_EQ(model.penAttributes().color.red(), 255);
2814+
EXPECT_EQ(model.penAttributes().color.green(), 58);
2815+
EXPECT_EQ(model.penAttributes().color.blue(), 199);
2816+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2817+
EXPECT_EQ(model.penState().shade, 63.7);
2818+
}
2819+
2820+
TEST_F(PenBlocksTest, SetPenHueToNumber_Stage)
2821+
{
2822+
auto stage = std::make_shared<Stage>();
2823+
stage->setEngine(&m_engineMock);
2824+
2825+
RenderedTarget renderedTarget;
2826+
StageModel model;
2827+
model.init(stage.get());
2828+
model.setRenderedTarget(&renderedTarget);
2829+
stage->setInterface(&model);
2830+
2831+
ScriptBuilder builder(m_extension.get(), m_engine, stage);
2832+
builder.addBlock("pen_setPenHueToNumber");
2833+
builder.addValueInput("HUE", 49.2);
2834+
2835+
PenState &penState = model.penState();
2836+
penState.color = 60;
2837+
penState.saturation = 90;
2838+
penState.brightness = 75;
2839+
penState.shade = 18.5;
2840+
penState.updateColor();
2841+
2842+
auto original = model.penAttributes().color;
2843+
2844+
auto thread = buildScript(builder, stage.get());
2845+
2846+
EXPECT_CALL(m_engineMock, requestRedraw).Times(0);
2847+
thread->run();
2848+
2849+
EXPECT_EQ(model.penAttributes().color.red(), 65);
2850+
EXPECT_EQ(model.penAttributes().color.green(), 121);
2851+
EXPECT_EQ(model.penAttributes().color.blue(), 0);
2852+
EXPECT_EQ(model.penAttributes().color.alpha(), 255);
2853+
EXPECT_EQ(model.penState().shade, 18.5);
2854+
}

0 commit comments

Comments
 (0)