Depth8Image.st
changeset 2184 b8daa402967f
parent 2044 9ea84b4ba249
child 2202 03d4cf38f4a5
--- a/Depth8Image.st	Mon Jul 27 09:50:21 1998 +0200
+++ b/Depth8Image.st	Mon Jul 27 10:11:08 1998 +0200
@@ -1458,7 +1458,7 @@
 !
 
 magnifyRowFrom:srcBytes offset:srcStart  
-	  into:dstBytes offset:dstStart factor:mX
+          into:dstBytes offset:dstStart factor:mX
 
     "magnify a single pixel row - can only magnify by integer factors.
      Specially tuned for factors 2,3 and 4."
@@ -1466,6 +1466,7 @@
 %{
     REGISTER unsigned char *srcP, *dstP;
     REGISTER unsigned char _byte;
+    unsigned _word;
     int _mag;
     REGISTER int i;
     int _pixels;
@@ -1474,54 +1475,85 @@
     if (__bothSmallInteger(srcStart, dstStart)
      && __bothSmallInteger(w, mX)
      && __isByteArray(srcBytes) && __isByteArray(dstBytes)) {
-	_mag = __intVal(mX);
-	srcP = __ByteArrayInstPtr(srcBytes)->ba_element - 1 + __intVal(srcStart);
-	dstP = __ByteArrayInstPtr(dstBytes)->ba_element - 1 + __intVal(dstStart);
-	_pixels = __intVal(w);
+        _mag = __intVal(mX);
+        srcP = __ByteArrayInstPtr(srcBytes)->ba_element - 1 + __intVal(srcStart);
+        dstP = __ByteArrayInstPtr(dstBytes)->ba_element - 1 + __intVal(dstStart);
+        _pixels = __intVal(w);
 
-	switch (_mag) {
-	    case 1:
-		break;
+        switch (_mag) {
+            case 1:
+                break;
 
-	    case 2:
-		/* special code for common case */
-		while (_pixels--) {
-		    _byte = *srcP++;
-		    *dstP++ = _byte;
-		    *dstP++ = _byte;
-		}
-		break;
+            case 2:
+                /* special code for common case */
+                if (((INT)dstP & 1) == 0) {
+                    while (_pixels--) {
+                        _byte = *srcP++;
+                        _word = (_byte<<8) | _byte;
+                        ((short *)dstP)[0] = _word;
+                        dstP += 2;
+                    }
+                } else {
+                    while (_pixels--) {
+                        _byte = *srcP++;
+                        *dstP++ = _byte;
+                        *dstP++ = _byte;
+                    }
+                }
+                break;
+
+            case 3:
+                /* special code for common case */
+                while (_pixels--) {
+                    _byte = *srcP++;
+                    *dstP++ = _byte;
+                    *dstP++ = _byte;
+                    *dstP++ = _byte;
+                }
+                break;
 
-	    case 3:
-		/* special code for common case */
-		while (_pixels--) {
-		    _byte = *srcP++;
-		    *dstP++ = _byte;
-		    *dstP++ = _byte;
-		    *dstP++ = _byte;
-		}
-		break;
+            case 4:
+                /* special code for common case */
+                if (((INT)dstP & 3) == 0) {
+                    while (_pixels--) {
+                        _byte = *srcP++;
+                        _word = (_byte<<8) | _byte;
+                        _word = (_word<<16) | _word;
+                        ((int *)dstP)[0] = _word;
+                        dstP += 4;
+                    }
+                } else {
+                    while (_pixels--) {
+                        _byte = *srcP++;
+                        *dstP++ = _byte;
+                        *dstP++ = _byte;
+                        *dstP++ = _byte;
+                        *dstP++ = _byte;
+                    }
+                }
+                break;
 
-	    case 4:
-		/* special code for common case */
-		while (_pixels--) {
-		    _byte = *srcP++;
-		    *dstP++ = _byte;
-		    *dstP++ = _byte;
-		    *dstP++ = _byte;
-		    *dstP++ = _byte;
-		}
-		break;
-
-	    default:
-		while (_pixels--) {
-		    _byte = *srcP++;
-		    for (i=_mag; i>0; i--)
-			*dstP++ = _byte;
-		}
-		break;
-	}
-	RETURN (self);
+            default:
+                if ((((INT)dstP & 1) == 0) 
+                 && ((_mag & 1) == 0)) {
+                    while (_pixels--) {
+                        _byte = *srcP++;
+                        _word = (_byte<<8) | _byte;
+                        for (i=_mag; i>0; i-=2) {
+                            ((short *)dstP)[0] = _word;
+                            dstP += 2;
+                        }
+                    }
+                } else {
+                    while (_pixels--) {
+                        _byte = *srcP++;
+                        for (i=_mag; i>0; i--)
+                            *dstP++ = _byte;
+                    }
+                }
+                break;
+        }
+        RETURN (self);
     }
 %}
 .
@@ -1779,5 +1811,5 @@
 !Depth8Image class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libview/Depth8Image.st,v 1.82 1998-02-05 14:30:32 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libview/Depth8Image.st,v 1.83 1998-07-27 08:11:08 cg Exp $'
 ! !