diff --git a/src/modules/graphics/opengl/Canvas.cpp b/src/modules/graphics/opengl/Canvas.cpp index b863a4dbb..262d7dd83 100644 --- a/src/modules/graphics/opengl/Canvas.cpp +++ b/src/modules/graphics/opengl/Canvas.cpp @@ -458,6 +458,18 @@ love::image::ImageData *Canvas::getImageData(love::image::Image *image) return img; } +void Canvas::getPixel(unsigned char* pixel_rgba, int x, int y) +{ + strategy->bindFBO( fbo ); + + glReadPixels(x, height - y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixel_rgba); + + if (current) + strategy->bindFBO( current->fbo ); + else + strategy->bindFBO( 0 ); +} + void Canvas::setFilter(const Image::Filter &f) { bindTexture(img); diff --git a/src/modules/graphics/opengl/Canvas.h b/src/modules/graphics/opengl/Canvas.h index 0da184631..aa14008eb 100644 --- a/src/modules/graphics/opengl/Canvas.h +++ b/src/modules/graphics/opengl/Canvas.h @@ -65,6 +65,8 @@ public: love::image::ImageData *getImageData(love::image::Image *image); + void getPixel(unsigned char* pixel_rgba, int x, int y); + void setFilter(const Image::Filter &f); Image::Filter getFilter() const; diff --git a/src/modules/graphics/opengl/wrap_Canvas.cpp b/src/modules/graphics/opengl/wrap_Canvas.cpp index 10ff83f6d..2f5e43b8d 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.cpp +++ b/src/modules/graphics/opengl/wrap_Canvas.cpp @@ -64,6 +64,27 @@ int w_Canvas_getImageData(lua_State *L) return 1; } +int w_Canvas_getPixel(lua_State * L) +{ + Canvas * canvas = luax_checkcanvas(L, 1); + int x = luaL_checkint(L, 2); + int y = luaL_checkint(L, 3); + unsigned char c[4]; + try + { + canvas->getPixel(c, x, y); + } + catch (love::Exception & e) + { + return luaL_error(L, "%s", e.what()); + } + lua_pushnumber(L, c[0]); + lua_pushnumber(L, c[1]); + lua_pushnumber(L, c[2]); + lua_pushnumber(L, c[3]); + return 4; +} + int w_Canvas_setFilter(lua_State *L) { Canvas *canvas = luax_checkcanvas(L, 1); @@ -202,6 +223,7 @@ static const luaL_Reg functions[] = { { "renderTo", w_Canvas_renderTo }, { "getImageData", w_Canvas_getImageData }, + { "getPixel", w_Canvas_getPixel }, { "setFilter", w_Canvas_setFilter }, { "getFilter", w_Canvas_getFilter }, { "setWrap", w_Canvas_setWrap }, diff --git a/src/modules/graphics/opengl/wrap_Canvas.h b/src/modules/graphics/opengl/wrap_Canvas.h index 924fe833a..5cdd2c2a8 100644 --- a/src/modules/graphics/opengl/wrap_Canvas.h +++ b/src/modules/graphics/opengl/wrap_Canvas.h @@ -36,6 +36,7 @@ namespace opengl Canvas *luax_checkcanvas(lua_State *L, int idx); int w_Canvas_renderTo(lua_State *L); int w_Canvas_getImageData(lua_State *L); +int w_Canvas_getPixel(lua_State * L); int w_Canvas_setFilter(lua_State *L); int w_Canvas_getFilter(lua_State *L); int w_Canvas_setWrap(lua_State *L);