[nexuiz-commits] r8404 - trunk/data/qcsrc/menu

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Fri Dec 18 07:27:12 EST 2009


Author: div0
Date: 2009-12-18 07:27:11 -0500 (Fri, 18 Dec 2009)
New Revision: 8404

Modified:
   trunk/data/qcsrc/menu/menu.qc
Log:
refactored the scaling to a separate function to allow different size images


Modified: trunk/data/qcsrc/menu/menu.qc
===================================================================
--- trunk/data/qcsrc/menu/menu.qc	2009-12-18 10:34:31 UTC (rev 8403)
+++ trunk/data/qcsrc/menu/menu.qc	2009-12-18 12:27:11 UTC (rev 8404)
@@ -226,81 +226,87 @@
 	if(key == K_SHIFT) menuShiftState |= S_SHIFT;
 };
 
-void(string img, float a, string algn, float force1) drawBackground =
+float SCALEMODE_CROP = 0;
+float SCALEMODE_LETTERBOX = 1;
+float SCALEMODE_WIDTH = 2;
+float SCALEMODE_HEIGHT = 3;
+float SCALEMODE_STRETCH = 4;
+void draw_Picture_Aligned(vector algn, float scalemode, string img, float a)
 {
-	vector sz;
+	vector sz, org, isz, isz_w, isz_h;
 	float width_is_larger;
-	vector isz_w;
-	vector isz_h;
-	vector tl, ce, br, isz;
-	vector v;
-	float i, l;
-	string c;
+
 	sz = draw_PictureSize(img);
-	// keep aspect of image
 	width_is_larger = (sz_x * draw_scale_y >= sz_y * draw_scale_x);
-
 	isz_w = '1 0 0' + '0 1 0' * ((sz_y / sz_x) * (draw_scale_x / draw_scale_y)); 
 	isz_h = '0 1 0' + '1 0 0' * ((sz_x / sz_y) * (draw_scale_y / draw_scale_x)); 
 
+	switch(scalemode)
+	{
+		default:
+		case SCALEMODE_CROP:
+			isz = (width_is_larger ? isz_h : isz_w);
+			break;
+		case SCALEMODE_LETTERBOX:
+			isz = (width_is_larger ? isz_w : isz_h);
+			break;
+		case SCALEMODE_WIDTH:
+			isz = isz_w;
+			break;
+		case SCALEMODE_HEIGHT:
+			isz = isz_h;
+			break;
+		case SCALEMODE_STRETCH:
+			isz = '1 1 0';
+			break;
+	}
+
+	org = eX * (algn_x * (1 - isz_x)) + eY * (algn_y * (1 - isz_y));
+	draw_Picture(org, img, isz, '1 1 1', a);
+}
+
+void(string img, float a, string algn, float force1) drawBackground =
+{
+	vector v;
+	float i, l;
+	string c;
+	float scalemode;
+
 	v_z = 0;
 
-	// mode "c"
-	if(width_is_larger)
-		isz = isz_h;
-	else
-		isz = isz_w;
+	scalemode = SCALEMODE_CROP;
 
 	for(i = 0; i < strlen(algn); ++i)
 	{
-		br = '1 1 0' - isz;
-		tl = '0 0 0';
-		ce = 0.5 * (tl + br);
 		c = substring(algn, i, 1);
 		switch(c)
 		{
-			case "c": // crop
-				if(width_is_larger)
-					isz = isz_h;
-				else
-					isz = isz_w;
-				goto nopic;
-			case "l": // letterbox
-				if(width_is_larger)
-					isz = isz_w;
-				else
-					isz = isz_h;
-				goto nopic;
-			case "h": // height
-				isz = isz_h;
-				goto nopic;
-			case "w": // width
-				isz = isz_w;
-				goto nopic;
-			case "s": // stretch
-				isz = '1 1 0';
-				goto nopic;
-			case "1": case "4": case "7": v_x = tl_x; break;
-			case "2": case "5": case "8": v_x = ce_x; break;
-			case "3": case "6": case "9": v_x = br_x; break;
-			default: v_x = tl_x + (br_x - tl_x) * random(); break;
+			case "c": scalemode = SCALEMODE_CROP; goto nopic;
+			case "l": scalemode = SCALEMODE_LETTERBOX; goto nopic;
+			case "h": scalemode = SCALEMODE_HEIGHT; goto nopic;
+			case "w": scalemode = SCALEMODE_WIDTH; goto nopic;
+			case "s": scalemode = SCALEMODE_STRETCH; goto nopic;
+			case "1": case "4": case "7": v_x = 0.0; break;
+			case "2": case "5": case "8": v_x = 0.5; break;
+			case "3": case "6": case "9": v_x = 1.0; break;
+			default: v_x = random(); break;
 		}
 		switch(c)
 		{
-			case "7": case "8": case "9": v_y = tl_y; break;
-			case "4": case "5": case "6": v_y = ce_y; break;
-			case "1": case "2": case "3": v_y = br_y; break;
-			default: v_y = tl_y + (br_y - tl_y) * random(); break;
+			case "7": case "8": case "9": v_y = 0.0; break;
+			case "4": case "5": case "6": v_y = 0.5; break;
+			case "1": case "2": case "3": v_y = 1.0; break;
+			default: v_y = random(); break;
 		}
 		if(l == 0)
-			draw_Picture(v, img, isz, '1 1 1', a);
+			draw_Picture_Aligned(v, scalemode, img, a);
 		else if(force1)
 			// force all secondary layers to use alpha 1. Prevents ugly issues
 			// with overlap. It's a flag because it cannot be used for the
 			// ingame background
-			draw_Picture(v, strcat(img, "_l", ftos(l+1)), isz, '1 1 1', 1);
+			draw_Picture_Aligned(v, scalemode, strcat(img, "_l", ftos(l+1)), 1);
 		else
-			draw_Picture(v, strcat(img, "_l", ftos(l+1)), isz, '1 1 1', a);
+			draw_Picture_Aligned(v, scalemode, strcat(img, "_l", ftos(l+1)), a);
 		++l;
 :nopic
 	}



More information about the nexuiz-commits mailing list