Browse Source

Fixed the mipmaps flag in love.graphics.newImage; cleaned up a bit of vector code in love.math.isConvex.

Alex Szpakowski 7 years ago
parent
commit
d37c53584e
3 changed files with 49 additions and 31 deletions
  1. 4 0
      src/common/Vector.h
  2. 41 25
      src/modules/graphics/wrap_Graphics.cpp
  3. 4 6
      src/modules/math/MathModule.cpp

+ 4 - 0
src/common/Vector.h

@@ -39,6 +39,10 @@ struct Vector2
 		: x(x), y(y)
 	{}
 
+	Vector2(const Vector2 &v)
+		: x(v.x), y(v.y)
+	{}
+
 	/**
 	 * Gets the length of the Vector.
 	 **/

+ 41 - 25
src/modules/graphics/wrap_Graphics.cpp

@@ -695,20 +695,28 @@ static void parseDPIScale(Data *d, float *dpiscale)
 	}
 }
 
-static Image::Settings w__optImageSettings(lua_State *L, int idx, const Image::Settings &s)
+static Image::Settings w__optImageSettings(lua_State *L, int idx, bool &setdpiscale)
 {
-	Image::Settings settings = s;
+	Image::Settings s;
 
+	setdpiscale = false;
 	if (!lua_isnoneornil(L, idx))
 	{
 		luax_checktablefields<Image::SettingType>(L, idx, "image setting name", Image::getConstant);
 
-		settings.mipmaps = luax_boolflag(L, idx, Image::getConstant(Image::SETTING_MIPMAPS), s.mipmaps);
-		settings.linear = luax_boolflag(L, idx, Image::getConstant(Image::SETTING_LINEAR), s.linear);
-		settings.dpiScale = (float) luax_numberflag(L, idx, Image::getConstant(Image::SETTING_DPI_SCALE), s.dpiScale);
+		s.mipmaps = luax_boolflag(L, idx, Image::getConstant(Image::SETTING_MIPMAPS), s.mipmaps);
+		s.linear = luax_boolflag(L, idx, Image::getConstant(Image::SETTING_LINEAR), s.linear);
+
+		lua_getfield(L, idx, Image::getConstant(Image::SETTING_DPI_SCALE));
+		if (lua_isnumber(L, -1))
+		{
+			s.dpiScale = (float) lua_tonumber(L, -1);
+			setdpiscale = true;
+		}
+		lua_pop(L, 1);
 	}
 
-	return settings;
+	return s;
 }
 
 static std::pair<StrongRef<image::ImageData>, StrongRef<image::CompressedImageData>>
@@ -761,13 +769,16 @@ int w_newCubeImage(lua_State *L)
 	luax_checkgraphicscreated(L);
 
 	Image::Slices slices(TEXTURE_CUBE);
-	Image::Settings settings;
+
+	bool dpiscaleset = false;
+	Image::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
+	float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
 
 	auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);
 
 	if (!lua_istable(L, 1))
 	{
-		auto data = getImageData(L, 1, true, &settings.dpiScale);
+		auto data = getImageData(L, 1, true, autodpiscale);
 
 		std::vector<StrongRef<love::image::ImageData>> faces;
 
@@ -801,7 +812,7 @@ int w_newCubeImage(lua_State *L)
 				{
 					lua_rawgeti(L, -1, mip + 1);
 
-					auto data = getImageData(L, -1, true, face == 0 && mip == 0 ? &settings.dpiScale : nullptr);
+					auto data = getImageData(L, -1, true, face == 0 && mip == 0 ? autodpiscale : nullptr);
 					if (data.first.get())
 						slices.set(face, mip, data.first);
 					else
@@ -819,7 +830,7 @@ int w_newCubeImage(lua_State *L)
 			{
 				lua_rawgeti(L, 1, i + 1);
 
-				auto data = getImageData(L, -1, true, i == 0 ? &settings.dpiScale : nullptr);
+				auto data = getImageData(L, -1, true, i == 0 ? autodpiscale : nullptr);
 
 				if (data.first.get())
 				{
@@ -844,7 +855,6 @@ int w_newCubeImage(lua_State *L)
 		lua_pop(L, tlen);
 	}
 
-	settings = w__optImageSettings(L, 2, settings);
 	return w__pushNewImage(L, slices, settings);
 }
 
@@ -853,7 +863,10 @@ int w_newArrayImage(lua_State *L)
 	luax_checkgraphicscreated(L);
 
 	Image::Slices slices(TEXTURE_2D_ARRAY);
-	Image::Settings settings;
+
+	bool dpiscaleset = false;
+	Image::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
+	float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
 
 	if (lua_istable(L, 1))
 	{
@@ -872,7 +885,7 @@ int w_newArrayImage(lua_State *L)
 				{
 					lua_rawgeti(L, -1, mip + 1);
 
-					auto data = getImageData(L, -1, true, slice == 0 && mip == 0 ? &settings.dpiScale : nullptr);
+					auto data = getImageData(L, -1, true, slice == 0 && mip == 0 ? autodpiscale : nullptr);
 					if (data.first.get())
 						slices.set(slice, mip, data.first);
 					else
@@ -887,7 +900,7 @@ int w_newArrayImage(lua_State *L)
 			for (int slice = 0; slice < tlen; slice++)
 			{
 				lua_rawgeti(L, 1, slice + 1);
-				auto data = getImageData(L, -1, true, slice == 0 ? &settings.dpiScale : nullptr);
+				auto data = getImageData(L, -1, true, slice == 0 ? autodpiscale : nullptr);
 				if (data.first.get())
 					slices.set(slice, 0, data.first);
 				else
@@ -899,14 +912,13 @@ int w_newArrayImage(lua_State *L)
 	}
 	else
 	{
-		auto data = getImageData(L, 1, true, &settings.dpiScale);
+		auto data = getImageData(L, 1, true, autodpiscale);
 		if (data.first.get())
 			slices.set(0, 0, data.first);
 		else
 			slices.add(data.second, 0, 0, true, settings.mipmaps);
 	}
 
-	settings = w__optImageSettings(L, 2, settings);
 	return w__pushNewImage(L, slices, settings);
 }
 
@@ -917,7 +929,10 @@ int w_newVolumeImage(lua_State *L)
 	auto imagemodule = Module::getInstance<love::image::Image>(Module::M_IMAGE);
 
 	Image::Slices slices(TEXTURE_VOLUME);
-	Image::Settings settings;
+
+	bool dpiscaleset = false;
+	Image::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
+	float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
 
 	if (lua_istable(L, 1))
 	{
@@ -936,7 +951,7 @@ int w_newVolumeImage(lua_State *L)
 				{
 					lua_rawgeti(L, -1, mip + 1);
 
-					auto data = getImageData(L, -1, true, slice == 0 && mip == 0 ? &settings.dpiScale : nullptr);
+					auto data = getImageData(L, -1, true, slice == 0 && mip == 0 ? autodpiscale : nullptr);
 					if (data.first.get())
 						slices.set(slice, mip, data.first);
 					else
@@ -951,7 +966,7 @@ int w_newVolumeImage(lua_State *L)
 			for (int layer = 0; layer < tlen; layer++)
 			{
 				lua_rawgeti(L, 1, layer + 1);
-				auto data = getImageData(L, -1, true, layer == 0 ? &settings.dpiScale : nullptr);
+				auto data = getImageData(L, -1, true, layer == 0 ? autodpiscale : nullptr);
 				if (data.first.get())
 					slices.set(layer, 0, data.first);
 				else
@@ -963,7 +978,7 @@ int w_newVolumeImage(lua_State *L)
 	}
 	else
 	{
-		auto data = getImageData(L, 1, true, &settings.dpiScale);
+		auto data = getImageData(L, 1, true, autodpiscale);
 
 		if (data.first.get())
 		{
@@ -977,7 +992,6 @@ int w_newVolumeImage(lua_State *L)
 			slices.add(data.second, 0, 0, true, settings.mipmaps);
 	}
 
-	settings = w__optImageSettings(L, 2, settings);
 	return w__pushNewImage(L, slices, settings);
 }
 
@@ -986,7 +1000,10 @@ int w_newImage(lua_State *L)
 	luax_checkgraphicscreated(L);
 
 	Image::Slices slices(TEXTURE_2D);
-	Image::Settings settings;
+
+	bool dpiscaleset = false;
+	Image::Settings settings = w__optImageSettings(L, 2, dpiscaleset);
+	float *autodpiscale = dpiscaleset ? nullptr : &settings.dpiScale;
 
 	if (lua_istable(L, 1))
 	{
@@ -994,7 +1011,7 @@ int w_newImage(lua_State *L)
 		for (int i = 0; i < n; i++)
 		{
 			lua_rawgeti(L, 1, i + 1);
-			auto data = getImageData(L, -1, true, i == 0 ? &settings.dpiScale : nullptr);
+			auto data = getImageData(L, -1, true, i == 0 ? autodpiscale : nullptr);
 			if (data.first.get())
 				slices.set(0, i, data.first);
 			else
@@ -1004,14 +1021,13 @@ int w_newImage(lua_State *L)
 	}
 	else
 	{
-		auto data = getImageData(L, 1, true, &settings.dpiScale);
+		auto data = getImageData(L, 1, true, autodpiscale);
 		if (data.first.get())
 			slices.set(0, 0, data.first);
 		else
 			slices.add(data.second, 0, 0, false, settings.mipmaps);
 	}
 
-	settings = w__optImageSettings(L, 2, settings);
 	return w__pushNewImage(L, slices, settings);
 }
 

+ 4 - 6
src/modules/math/MathModule.cpp

@@ -161,17 +161,15 @@ bool isConvex(const std::vector<love::Vector2> &polygon)
 	// turning direction can be determined using the cross-product of
 	// the forward difference vectors
 	size_t i = polygon.size() - 2, j = polygon.size() - 1, k = 0;
-	Vector2 p(polygon[j].x - polygon[i].x, polygon[j].y - polygon[i].y);
-	Vector2 q(polygon[k].x - polygon[j].x, polygon[k].y - polygon[j].y);
+	Vector2 p(polygon[j] - polygon[i]);
+	Vector2 q(polygon[k] - polygon[j]);
 	float winding = Vector2::cross(p, q);
 
 	while (k+1 < polygon.size())
 	{
 		i = j; j = k; k++;
-		p.x = polygon[j].x - polygon[i].x;
-		p.y = polygon[j].y - polygon[i].y;
-		q.x = polygon[k].x - polygon[j].x;
-		q.y = polygon[k].y - polygon[j].y;
+		p = polygon[j] - polygon[i];
+		q = polygon[k] - polygon[j];
 
 		if (Vector2::cross(p, q) * winding < 0)
 			return false;