Browse Source

Added an optional third argument to the width/height variant of love.image.newImageData. The new argument is a string containing raw byte pixel data to copy to the new ImageData (e.g. the result of a previous ImageData:getString with an ImageData of the same width and height..)

Alex Szpakowski 10 years ago
parent
commit
7e42d82308
2 changed files with 18 additions and 1 deletions
  1. 1 1
      src/modules/graphics/opengl/Graphics.h
  2. 17 0
      src/modules/image/wrap_Image.cpp

+ 1 - 1
src/modules/graphics/opengl/Graphics.h

@@ -391,7 +391,7 @@ public:
 	void circle(DrawMode mode, float x, float y, float radius, int points = 10);
 
 	/**
-	 * Draws an eclipse using the specified arguments.
+	 * Draws an ellipse using the specified arguments.
 	 * @param mode The mode of drawing (line/filled).
 	 * @param x X-coordinate of center
 	 * @param y Y-coordinate of center

+ 17 - 0
src/modules/image/wrap_Image.cpp

@@ -44,9 +44,26 @@ int w_newImageData(lua_State *L)
 		if (w <= 0 || h <= 0)
 			return luaL_error(L, "Invalid image size.");
 
+		size_t numbytes = 0;
+		const char *bytes = nullptr;
+
+		if (!lua_isnoneornil(L, 3))
+			bytes = luaL_checklstring(L, 3, &numbytes);
+
 		ImageData *t = nullptr;
 		luax_catchexcept(L, [&](){ t = instance()->newImageData(w, h); });
 
+		if (bytes)
+		{
+			if (numbytes != t->getSize())
+			{
+				t->release();
+				return luaL_error(L, "The size of the raw byte string must match the ImageData's actual size in bytes.");
+			}
+
+			memcpy(t->getData(), bytes, t->getSize());
+		}
+
 		luax_pushtype(L, IMAGE_IMAGE_DATA_ID, t);
 		t->release();
 		return 1;