Several optimizations and speed improvements.
cstubs: Use Matrix type instead of float[4][4].
diff --git a/Modules/cstubs b/Modules/cstubs
index d8f2d90..7e99a82 100644
--- a/Modules/cstubs
+++ b/Modules/cstubs
@@ -529,21 +529,21 @@
 	object *self;
 	object *args;
 {
-	float arg1 [ 16 ] ;
+	Matrix arg1;
 	object *v, *w;
-	int i;
+	int i, j;
 	getmatrix( arg1 );
 	v = newlistobject(16);
 	if (v == NULL) {
 		return err_nomem();
 	}
-	for (i = 0; i < 16; i++) {
-		w = mknewfloatobject(arg1[i]);
+	for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) {
+		w = mknewfloatobject(arg1[i][j]);
 		if (w == NULL) {
 			DECREF(v);
 			return NULL;
 		}
-		setlistitem(v, i, w);
+		setlistitem(v, i*4+j, w);
 	}
 	return v;
 }
@@ -559,7 +559,7 @@
 	object *self;
 	object *args;
 {
-	float arg1 [ 4 ] [ 4 ] ;
+	Matrix arg1;
 	object *v, *w;
 	int i, j;
 	getmatrix( arg1 );
@@ -742,7 +742,7 @@
 	if (packed == NULL)
 		return NULL;
 	parray = (unsigned long *) getstringvalue(unpacked);
-	p = getstringvalue(packed);
+	p = (unsigned char *) getstringvalue(packed);
 	for (y = 0; y < height; y += packfactor, parray += packfactor*width) {
 		for (x = 0; x < width; x += packfactor) {
 			pixel = parray[x];
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index 6686abf..3a941a8 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -254,24 +254,26 @@
 	object *self; /* Not used */
 	object *args;
 {
-	char *s;
+	char *s, *s_new;
 	int i, n;
 	object *new;
 	int changed;
 
 	if (!getargs(args, "s#", &s, &n))
 		return NULL;
-	new = newsizedstringobject(s, n);
+	new = newsizedstringobject(NULL, n);
 	if (new == NULL)
 		return NULL;
-	s = getstringvalue(new);
+	s_new = getstringvalue(new);
 	changed = 0;
 	for (i = 0; i < n; i++) {
-		char c = s[i];
+		char c = *s++;
 		if (isupper(c)) {
 			changed = 1;
-			s[i] = tolower(c);
-		}
+			*s_new = tolower(c);
+		} else
+			*s_new = c;
+		s_new++;
 	}
 	if (!changed) {
 		DECREF(new);
@@ -287,24 +289,26 @@
 	object *self; /* Not used */
 	object *args;
 {
-	char *s;
+	char *s, *s_new;
 	int i, n;
 	object *new;
 	int changed;
 
 	if (!getargs(args, "s#", &s, &n))
 		return NULL;
-	new = newsizedstringobject(s, n);
+	new = newsizedstringobject(NULL, n);
 	if (new == NULL)
 		return NULL;
-	s = getstringvalue(new);
+	s_new = getstringvalue(new);
 	changed = 0;
 	for (i = 0; i < n; i++) {
-		char c = s[i];
+		char c = *s++;
 		if (islower(c)) {
 			changed = 1;
-			s[i] = toupper(c);
-		}
+			*s_new = toupper(c);
+		} else
+			*s_new = c;
+		s_new++;
 	}
 	if (!changed) {
 		DECREF(new);
@@ -320,28 +324,31 @@
 	object *self; /* Not used */
 	object *args;
 {
-	char *s;
+	char *s, *s_new;
 	int i, n;
 	object *new;
 	int changed;
 
 	if (!getargs(args, "s#", &s, &n))
 		return NULL;
-	new = newsizedstringobject(s, n);
+	new = newsizedstringobject(NULL, n);
 	if (new == NULL)
 		return NULL;
-	s = getstringvalue(new);
+	s_new = getstringvalue(new);
 	changed = 0;
 	for (i = 0; i < n; i++) {
-		char c = s[i];
+		char c = *s++;
 		if (islower(c)) {
 			changed = 1;
-			s[i] = toupper(c);
+			*s_new = toupper(c);
 		}
 		else if (isupper(c)) {
 			changed = 1;
-			s[i] = tolower(c);
+			*s_new = tolower(c);
 		}
+		else
+			*s_new = c;
+		s_new++;
 	}
 	if (!changed) {
 		DECREF(new);