Skip to content

Commit f494cc1

Browse files
committed
Adapt to new color API
1 parent 1d6028d commit f494cc1

11 files changed

+56
-85
lines changed

src/irenderedtarget.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ class IRenderedTarget : public QNanoQuickItem
9292
virtual QRgb colorAtScratchPoint(double x, double y) const = 0;
9393

9494
virtual bool touchingClones(const std::vector<libscratchcpp::Sprite *> &clones) const = 0;
95-
virtual bool touchingColor(const libscratchcpp::Value &color) const = 0;
96-
virtual bool touchingColor(const libscratchcpp::Value &color, const libscratchcpp::Value &mask) const = 0;
95+
virtual bool touchingColor(libscratchcpp::Rgb color) const = 0;
96+
virtual bool touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const = 0;
9797
};
9898

9999
} // namespace scratchcpprender

src/renderedtarget.cpp

+6-33
Original file line numberDiff line numberDiff line change
@@ -668,12 +668,12 @@ bool RenderedTarget::touchingClones(const std::vector<libscratchcpp::Sprite *> &
668668
return false;
669669
}
670670

671-
bool RenderedTarget::touchingColor(const Value &color) const
671+
bool RenderedTarget::touchingColor(Rgb color) const
672672
{
673-
return touchingColor(color, false, Value());
673+
return touchingColor(color, false, 0);
674674
}
675675

676-
bool RenderedTarget::touchingColor(const Value &color, const Value &mask) const
676+
bool RenderedTarget::touchingColor(Rgb color, Rgb mask) const
677677
{
678678
return touchingColor(color, true, mask);
679679
}
@@ -873,13 +873,13 @@ CpuTextureManager *RenderedTarget::textureManager() const
873873
return m_textureManager.get();
874874
}
875875

876-
bool RenderedTarget::touchingColor(const libscratchcpp::Value &color, bool hasMask, const libscratchcpp::Value &mask) const
876+
bool RenderedTarget::touchingColor(Rgb color, bool hasMask, Rgb mask) const
877877
{
878878
// https://github.com/scratchfoundation/scratch-render/blob/0a04c2fb165f5c20406ec34ab2ea5682ae45d6e0/src/RenderWebGL.js#L775-L841
879879
if (!m_engine)
880880
return false;
881881

882-
QRgb rgb = convertColor(color);
882+
QRgb rgb = qRgb(qRed(color), qGreen(color), qBlue(color)); // ignore alpha
883883
QRgb mask3b;
884884
double ghostValue = 0;
885885

@@ -891,7 +891,7 @@ bool RenderedTarget::touchingColor(const libscratchcpp::Value &color, bool hasMa
891891
m_graphicEffectMask &= ~ShaderManager::Effect::Ghost;
892892
}
893893

894-
mask3b = convertColor(mask);
894+
mask3b = qRgb(qRed(mask), qGreen(mask), qBlue(mask)); // ignore alpha
895895
}
896896

897897
std::vector<Target *> targets;
@@ -1065,33 +1065,6 @@ void RenderedTarget::clampRect(Rect &rect, double left, double right, double bot
10651065
rect.setTop(std::max(rect.top(), bottom));
10661066
}
10671067

1068-
QRgb RenderedTarget::convertColor(const libscratchcpp::Value &color)
1069-
{
1070-
// TODO: Remove this after libscratchcpp starts converting colors (it still needs to be converted to RGB here)
1071-
std::string stringValue;
1072-
1073-
if (color.isString())
1074-
stringValue = color.toString();
1075-
1076-
if (!stringValue.empty() && stringValue[0] == '#') {
1077-
bool valid = false;
1078-
QColor color;
1079-
1080-
if (stringValue.size() <= 7) // #RRGGBB
1081-
{
1082-
color = QColor::fromString(stringValue);
1083-
valid = color.isValid();
1084-
}
1085-
1086-
if (!valid)
1087-
color = Qt::black;
1088-
1089-
return color.rgb();
1090-
1091-
} else
1092-
return QColor::fromRgba(static_cast<QRgb>(color.toLong())).rgb();
1093-
}
1094-
10951068
bool RenderedTarget::colorMatches(QRgb a, QRgb b)
10961069
{
10971070
// https://github.com/scratchfoundation/scratch-render/blob/0a04c2fb165f5c20406ec34ab2ea5682ae45d6e0/src/RenderWebGL.js#L77-L81

src/renderedtarget.h

+3-4
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ class RenderedTarget : public IRenderedTarget
101101
QRgb colorAtScratchPoint(double x, double y) const override;
102102

103103
bool touchingClones(const std::vector<libscratchcpp::Sprite *> &) const override;
104-
bool touchingColor(const libscratchcpp::Value &color) const override;
105-
bool touchingColor(const libscratchcpp::Value &color, const libscratchcpp::Value &mask) const override;
104+
bool touchingColor(libscratchcpp::Rgb color) const override;
105+
bool touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const override;
106106

107107
signals:
108108
void engineChanged();
@@ -132,14 +132,13 @@ class RenderedTarget : public IRenderedTarget
132132
QPointF mapFromStageWithOriginPoint(const QPointF &scenePoint) const;
133133
QPointF mapFromScratchToLocal(const QPointF &point) const;
134134
CpuTextureManager *textureManager() const;
135-
bool touchingColor(const libscratchcpp::Value &color, bool hasMask, const libscratchcpp::Value &mask) const;
135+
bool touchingColor(libscratchcpp::Rgb color, bool hasMask, libscratchcpp::Rgb mask) const;
136136
QRectF touchingBounds() const;
137137
QRectF candidatesBounds(const QRectF &targetRect, const std::vector<libscratchcpp::Target *> &candidates, std::vector<IRenderedTarget *> &dst) const;
138138
QRectF candidatesBounds(const QRectF &targetRect, const std::vector<libscratchcpp::Sprite *> &candidates, std::vector<IRenderedTarget *> &dst) const;
139139
static QRectF candidateIntersection(const QRectF &targetRect, IRenderedTarget *target);
140140
static QRectF rectIntersection(const QRectF &targetRect, const libscratchcpp::Rect &candidateRect);
141141
static void clampRect(libscratchcpp::Rect &rect, double left, double right, double bottom, double top);
142-
static QRgb convertColor(const libscratchcpp::Value &color);
143142
static bool colorMatches(QRgb a, QRgb b);
144143
static bool maskMatches(QRgb a, QRgb b);
145144
QRgb sampleColor3b(double x, double y, const std::vector<IRenderedTarget *> &targets) const;

src/spritemodel.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,12 @@ bool SpriteModel::touchingPoint(double x, double y) const
175175
return m_renderedTarget->containsScratchPoint(x, y);
176176
}
177177

178-
bool SpriteModel::touchingColor(const libscratchcpp::Value &color) const
178+
bool SpriteModel::touchingColor(libscratchcpp::Rgb color) const
179179
{
180180
return m_renderedTarget->touchingColor(color);
181181
}
182182

183-
bool SpriteModel::touchingColor(const libscratchcpp::Value &color, const libscratchcpp::Value &mask) const
183+
bool SpriteModel::touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const
184184
{
185185
return m_renderedTarget->touchingColor(color, mask);
186186
}

src/spritemodel.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ class SpriteModel
6060

6161
bool touchingClones(const std::vector<libscratchcpp::Sprite *> &clones) const override;
6262
bool touchingPoint(double x, double y) const override;
63-
bool touchingColor(const libscratchcpp::Value &color) const override;
64-
bool touchingColor(const libscratchcpp::Value &color, const libscratchcpp::Value &mask) const override;
63+
bool touchingColor(libscratchcpp::Rgb color) const override;
64+
bool touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const override;
6565

6666
libscratchcpp::Sprite *sprite() const;
6767

src/stagemodel.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,12 +112,12 @@ bool StageModel::touchingPoint(double x, double y) const
112112
return m_renderedTarget->containsScratchPoint(x, y);
113113
}
114114

115-
bool StageModel::touchingColor(const libscratchcpp::Value &color) const
115+
bool StageModel::touchingColor(libscratchcpp::Rgb color) const
116116
{
117117
return m_renderedTarget->touchingColor(color);
118118
}
119119

120-
bool StageModel::touchingColor(const libscratchcpp::Value &color, const libscratchcpp::Value &mask) const
120+
bool StageModel::touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const
121121
{
122122
return m_renderedTarget->touchingColor(color, mask);
123123
}

src/stagemodel.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ class StageModel
4646

4747
bool touchingClones(const std::vector<libscratchcpp::Sprite *> &clones) const override;
4848
bool touchingPoint(double x, double y) const override;
49-
bool touchingColor(const libscratchcpp::Value &color) const override;
50-
bool touchingColor(const libscratchcpp::Value &color, const libscratchcpp::Value &mask) const override;
49+
bool touchingColor(libscratchcpp::Rgb color) const override;
50+
bool touchingColor(libscratchcpp::Rgb color, libscratchcpp::Rgb mask) const override;
5151

5252
Q_INVOKABLE void loadCostume();
5353

test/mocks/renderedtargetmock.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ class RenderedTargetMock : public IRenderedTarget
7777
MOCK_METHOD(QRgb, colorAtScratchPoint, (double, double), (const, override));
7878

7979
MOCK_METHOD(bool, touchingClones, (const std::vector<libscratchcpp::Sprite *> &), (const, override));
80-
MOCK_METHOD(bool, touchingColor, (const libscratchcpp::Value &), (const, override));
81-
MOCK_METHOD(bool, touchingColor, (const libscratchcpp::Value &, const libscratchcpp::Value &), (const, override));
80+
MOCK_METHOD(bool, touchingColor, (libscratchcpp::Rgb), (const, override));
81+
MOCK_METHOD(bool, touchingColor, (libscratchcpp::Rgb, libscratchcpp::Rgb), (const, override));
8282

8383
MOCK_METHOD(QNanoQuickItemPainter *, createItemPainter, (), (const, override));
8484
MOCK_METHOD(void, hoverEnterEvent, (QHoverEvent *), (override));

test/renderedtarget/renderedtarget_test.cpp

+33-34
Original file line numberDiff line numberDiff line change
@@ -1152,24 +1152,23 @@ TEST_F(RenderedTargetTest, TouchingColor)
11521152
EXPECT_CALL(target2, stageModel()).WillRepeatedly(Return(nullptr));
11531153
EXPECT_CALL(penLayer, getBounds()).WillRepeatedly(ReturnRef(penBounds));
11541154

1155-
static const QRgb color1 = 4286611711; // "purple"
1156-
static const QRgb color2 = 596083443; // close to color1 and transparent
1157-
static const Value color3 = "#808000"; // "olive" (4286611456)
1158-
static const QRgb color3Int = 4286611456;
1155+
static const Rgb color1 = 4286611711; // "purple"
1156+
static const Rgb color2 = 596083443; // close to color1 and transparent
1157+
static const Rgb color3 = 4286611456; // "olive"
11591158
static const QRgb color4 = 2505545047; // transparent "hippie green"
11601159
static const QRgb color5 = 4287417025; // color1 + color4
11611160

11621161
EXPECT_CALL(stageTarget, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
11631162
EXPECT_CALL(target1, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
11641163
EXPECT_CALL(target2, getFastBounds()).WillOnce(Return(Rect(-5, -1, 1, -8)));
1165-
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3Int));
1166-
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3Int));
1167-
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3Int));
1168-
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3Int));
1169-
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3Int));
1170-
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color3Int));
1164+
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3));
1165+
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3));
1166+
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3));
1167+
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3));
1168+
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3));
1169+
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color3));
11711170
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color4));
1172-
EXPECT_CALL(target1, colorAtScratchPoint(2, -1)).WillOnce(Return(color3Int));
1171+
EXPECT_CALL(target1, colorAtScratchPoint(2, -1)).WillOnce(Return(color3));
11731172
EXPECT_CALL(target2, colorAtScratchPoint(3, -1)).WillOnce(Return(color4));
11741173
EXPECT_CALL(target1, colorAtScratchPoint(3, -1)).WillOnce(Return(color4));
11751174
EXPECT_CALL(penLayer, colorAtScratchPoint(3, -1)).WillOnce(Return(color4));
@@ -1179,47 +1178,47 @@ TEST_F(RenderedTargetTest, TouchingColor)
11791178
EXPECT_CALL(stageTarget, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
11801179
EXPECT_CALL(target1, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
11811180
EXPECT_CALL(target2, getFastBounds()).WillOnce(Return(Rect(-5, -1, 1, -8)));
1182-
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3Int));
1181+
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3));
11831182
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color1));
11841183
ASSERT_TRUE(target.touchingColor(color1));
11851184

11861185
EXPECT_CALL(stageTarget, getFastBounds()).WillOnce(Return(Rect(5, 1, 6, -5)));
11871186
EXPECT_CALL(target1, getFastBounds()).WillOnce(Return(Rect(5, 1, 6, -5)));
11881187
EXPECT_CALL(target2, getFastBounds()).WillOnce(Return(Rect(-5, -1, 2, -8)));
1189-
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3Int));
1190-
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3Int));
1191-
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3Int));
1192-
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3Int));
1193-
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3Int));
1188+
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3));
1189+
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3));
1190+
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3));
1191+
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3));
1192+
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3));
11941193
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color4));
1195-
EXPECT_CALL(target1, colorAtScratchPoint(1, -1)).WillOnce(Return(color3Int));
1196-
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color3Int));
1197-
EXPECT_CALL(target2, colorAtScratchPoint(3, -1)).WillOnce(Return(color3Int));
1194+
EXPECT_CALL(target1, colorAtScratchPoint(1, -1)).WillOnce(Return(color3));
1195+
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color3));
1196+
EXPECT_CALL(target2, colorAtScratchPoint(3, -1)).WillOnce(Return(color3));
11981197
ASSERT_FALSE(target.touchingColor(color1));
11991198

12001199
EXPECT_CALL(stageTarget, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
12011200
EXPECT_CALL(target1, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
12021201
EXPECT_CALL(target2, getFastBounds()).WillOnce(Return(Rect(-5, -6, 2, -8)));
1203-
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3Int));
1204-
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3Int));
1205-
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3Int));
1206-
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3Int));
1207-
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3Int));
1208-
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color3Int));
1209-
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color3Int));
1202+
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3));
1203+
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3));
1204+
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3));
1205+
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3));
1206+
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3));
1207+
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color3));
1208+
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color3));
12101209
EXPECT_CALL(target2, colorAtScratchPoint(3, -1)).WillOnce(Return(color1));
12111210
ASSERT_TRUE(target.touchingColor(color2));
12121211

12131212
EXPECT_CALL(stageTarget, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
12141213
EXPECT_CALL(target1, getFastBounds()).WillOnce(Return(Rect(2, 1, 6, -5)));
12151214
EXPECT_CALL(target2, getFastBounds()).WillOnce(Return(Rect(-5, -6.5, 1.8, -8)));
1216-
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3Int));
1217-
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3Int));
1218-
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3Int));
1219-
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3Int));
1220-
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3Int));
1221-
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color3Int));
1222-
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color3Int));
1215+
EXPECT_CALL(target2, colorAtScratchPoint(1, -3)).WillOnce(Return(color3));
1216+
EXPECT_CALL(target2, colorAtScratchPoint(2, -3)).WillOnce(Return(color3));
1217+
EXPECT_CALL(target2, colorAtScratchPoint(3, -3)).WillOnce(Return(color3));
1218+
EXPECT_CALL(target2, colorAtScratchPoint(1, -2)).WillOnce(Return(color3));
1219+
EXPECT_CALL(target2, colorAtScratchPoint(3, -2)).WillOnce(Return(color3));
1220+
EXPECT_CALL(target2, colorAtScratchPoint(1, -1)).WillOnce(Return(color3));
1221+
EXPECT_CALL(target2, colorAtScratchPoint(2, -1)).WillOnce(Return(color3));
12231222
EXPECT_CALL(target2, colorAtScratchPoint(3, -1)).WillOnce(Return(color4));
12241223
EXPECT_CALL(target1, colorAtScratchPoint(3, -1)).WillOnce(Return(color1));
12251224
ASSERT_FALSE(target.touchingColor(color1));

test/target_models/spritemodel_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ TEST(SpriteModelTest, TouchingColor)
393393
RenderedTargetMock renderedTarget;
394394
model.setRenderedTarget(&renderedTarget);
395395

396-
Value color1 = 123, color2 = 456;
396+
Rgb color1 = 123, color2 = 456;
397397
EXPECT_CALL(renderedTarget, touchingColor(color1)).WillOnce(Return(false));
398398
ASSERT_FALSE(model.touchingColor(color1));
399399

test/target_models/stagemodel_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ TEST(StageModelTest, TouchingColor)
186186
RenderedTargetMock renderedTarget;
187187
model.setRenderedTarget(&renderedTarget);
188188

189-
Value color1 = 123, color2 = 456;
189+
Rgb color1 = 123, color2 = 456;
190190
EXPECT_CALL(renderedTarget, touchingColor(color1)).WillOnce(Return(false));
191191
ASSERT_FALSE(model.touchingColor(color1));
192192

0 commit comments

Comments
 (0)