Skip to content

Commit c32b09e

Browse files
committed
Add textureContainsPoint() method to CpuTextureManager
1 parent 748d9b8 commit c32b09e

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

src/cputexturemanager.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ const std::vector<QPoint> &CpuTextureManager::getTextureConvexHullPoints(const T
5151
return it->second;
5252
}
5353

54+
bool CpuTextureManager::textureContainsPoint(const Texture &texture, const QPointF &localPoint)
55+
{
56+
// https://github.com/scratchfoundation/scratch-render/blob/7b823985bc6fe92f572cc3276a8915e550f7c5e6/src/Silhouette.js#L219-L226
57+
return getPointAlpha(texture, localPoint.x(), localPoint.y()) > 0;
58+
}
59+
5460
void CpuTextureManager::removeTexture(const Texture &texture)
5561
{
5662
if (!texture.isValid())
@@ -131,3 +137,12 @@ bool CpuTextureManager::addTexture(const Texture &texture)
131137

132138
return true;
133139
}
140+
141+
int CpuTextureManager::getPointAlpha(const Texture &texture, int x, int y)
142+
{
143+
if ((x < 0 || x >= texture.width()) || (y < 0 || y >= texture.height()))
144+
return 0;
145+
146+
GLubyte *pixels = getTextureData(texture);
147+
return pixels[(y * texture.width() + x) * 4 + 3];
148+
}

src/cputexturemanager.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ class CpuTextureManager
2020
GLubyte *getTextureData(const Texture &texture);
2121
const std::vector<QPoint> &getTextureConvexHullPoints(const Texture &texture);
2222

23+
bool textureContainsPoint(const Texture &texture, const QPointF &localPoint);
24+
2325
void removeTexture(const Texture &texture);
2426

2527
private:
2628
bool addTexture(const Texture &texture);
29+
int getPointAlpha(const Texture &texture, int x, int y);
2730

2831
std::unordered_map<GLuint, GLubyte *> m_textureData;
2932
std::unordered_map<GLuint, std::vector<QPoint>> m_convexHullPoints;

test/texture/cputexturemanager_test.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,3 +129,44 @@ TEST_F(CpuTextureManagerTest, TextureDataAndHullPoints)
129129
// Cleanup
130130
context.doneCurrent();
131131
}
132+
133+
TEST_F(CpuTextureManagerTest, TextureContainsPoint)
134+
{
135+
// Create OpenGL context
136+
QOpenGLContext context;
137+
QOffscreenSurface surface;
138+
createContextAndSurface(&context, &surface);
139+
140+
// Paint
141+
QNanoPainter painter;
142+
ImagePainter imgPainter(&painter, "image.png");
143+
144+
// Read texture data
145+
Texture texture(imgPainter.fbo()->texture(), imgPainter.fbo()->size());
146+
147+
// Test
148+
CpuTextureManager manager;
149+
ASSERT_FALSE(manager.textureContainsPoint(texture, { 0, 0 }));
150+
ASSERT_FALSE(manager.textureContainsPoint(texture, { 1, 0 }));
151+
ASSERT_FALSE(manager.textureContainsPoint(texture, { 2, 0 }));
152+
ASSERT_FALSE(manager.textureContainsPoint(texture, { 3, 0 }));
153+
154+
ASSERT_FALSE(manager.textureContainsPoint(texture, { 0, 1 }));
155+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 1, 1 }));
156+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 1.4, 1.25 }));
157+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 2, 1 }));
158+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 3, 1 }));
159+
160+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 1, 2 }));
161+
ASSERT_FALSE(manager.textureContainsPoint(texture, { 2, 2 }));
162+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 3, 2 }));
163+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 3.5, 2.1 }));
164+
165+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 1, 3 }));
166+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 2, 3 }));
167+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 3, 3 }));
168+
ASSERT_TRUE(manager.textureContainsPoint(texture, { 3.3, 3.5 }));
169+
170+
// Cleanup
171+
context.doneCurrent();
172+
}

0 commit comments

Comments
 (0)