1. David Beitey
  2. pygame

Commits

pygame  committed cf2bd97

surfarray.blit_array supports all depths

  • Participants
  • Parent commits 790be23
  • Branches default

Comments (0)

Files changed (3)

File WHATSNEW

View file
  • Ignore whitespace
 	Release the Python Global Interpreter Lock on delays and IO
 	Added timer events to pygame.time (vgrade example demonstrates)
 	Documentation reorganized, 1st tutorial added
+	surfarray.blit_array() supports all bit depths
 
      Nov 11, 2000
 	BUG: pygame.display.set_mode() uses int, not short, for size

File examples/vgrade.py

View file
  • Ignore whitespace
     column = topcolor + (diff * column).astype(Int)
     # make the column a 3d image column by adding X
     column = column.astype(UnsignedInt8)[NewAxis,:,:]
+    #3d array into 2d array
+    column = pygame.surfarray.map_array(surf, column)
     # stretch the column into a full image
-    return resize(column, (width, height, 3))
+    return resize(column, (width, height))
 
 
 
 
 def main():
     pygame.init()
-    size = (640, 480)
-    screen = pygame.display.set_mode(size, 0, 32)
-    finished = 0
+    size = 640, 480
+    screen = pygame.display.set_mode(size, 0, 24)
+
     pygame.event.set_blocked(MOUSEMOTION) #keep our queue cleaner
-    pygame.time.set_timer(500, USEREVENT+5)
+    pygame.time.set_timer(500, USEREVENT)
+
     while 1:
         event = pygame.event.poll()
         if event.type in (QUIT, KEYDOWN, MOUSEBUTTONDOWN):
             break
-        elif event.type == USEREVENT+5:
+        elif event.type == USEREVENT:
             DisplayGradient(screen)
 
     

File src/surfarray.c

View file
  • Ignore whitespace
 
 
 
+
+/*macros used to blit arrays*/
+
+
+#define COPYMACRO_2D(DST, SRC) \
+	for(loopy = 0; loopy < sizey; ++loopy) { \
+		DST* imgrow = (DST*)(((char*)surf->pixels)+loopy*surf->pitch); \
+		char* datarow = array->data + stridey * loopy; \
+		for(loopx = 0; loopx < sizex; ++loopx) \
+			*(imgrow + loopx) = (DST)*(SRC*)(datarow + stridex * loopx); \
+	}
+
+
+#define COPYMACRO_2D_24(SRC) \
+	for(loopy = 0; loopy < sizey-1; ++loopy) { \
+		char* imgrow = ((char*)surf->pixels)+loopy*surf->pitch; \
+		char* datarow = array->data + stridey * loopy; \
+		for(loopx = 0; loopx < sizex; ++loopx) \
+			*(int*)(imgrow + loopx*3) = (int)*(SRC*)(datarow + stridex * loopx)<<8; \
+	}{ \
+	char* imgrow = ((char*)surf->pixels)+loopy*surf->pitch; \
+	char* datarow = array->data + stridey * loopy; \
+	for(loopx = 0; loopx < sizex-1; ++loopx) \
+		*(int*)(imgrow + loopx*3) = ((int)*(SRC*)(datarow + stridex * loopx))<<8; \
+	}
+
+
+#define COPYMACRO_3D(DST, SRC) \
+	for(loopy = 0; loopy < sizey; ++loopy) { \
+		DST* data = (DST*)(((char*)surf->pixels) + surf->pitch * loopy); \
+		char* pix = array->data + stridey * loopy; \
+		for(loopx = 0; loopx < sizex; ++loopx) { \
+			*data++ = (DST)(*(SRC*)(pix) >> Rloss << Rshift) | \
+					(*(SRC*)(pix+stridez) >> Gloss << Gshift) | \
+					(*(SRC*)(pix+stridez2) >> Bloss << Bshift); \
+			pix += stridex; \
+	}	}
+
+
+#define COPYMACRO_3D_24(SRC) \
+	for(loopy = 0; loopy < sizey; ++loopy) { \
+		char* data = ((char*)surf->pixels) + surf->pitch * loopy; \
+		char* pix = array->data + stridey * loopy; \
+		for(loopx = 0; loopx < sizex; ++loopx) { \
+			*data++ = (char)*(SRC*)(pix); \
+			*data++ = (char)*(SRC*)(pix+stridez); \
+			*data++ = (char)*(SRC*)(pix+stridez2); \
+			pix += stridex; \
+	}	}
+
+
+
+
     /*DOC*/ static char doc_blit_array[] =
     /*DOC*/    "pygame.surfarray.blit_array(surf, array) -> None\n"
     /*DOC*/    "quickly transfer an array to a Surface\n"
 	switch(surf->format->BytesPerPixel)
 	{
 	case 1:
-	case 2:
-	case 3:
-		return RAISE(PyExc_RuntimeError, "unsupported bit depth for image");
-	case 4:
-		{
-			if(array->nd == 2)
-			{
-				if(array->descr->elsize == sizeof(char))
-				{
-					for(loopy = 0; loopy < sizey; ++loopy)
-					{
-						int* imgrow = (int*)(((char*)surf->pixels)+loopy*surf->pitch);
-						char* datarow = array->data + stridey * loopy;
-						for(loopx = 0; loopx < sizex; ++loopx)
-						{
-							int* pix = imgrow + loopx;
-							char* data = datarow + stridex * loopx;
-							*(imgrow + loopx) = (int)*(unsigned char*)(datarow + stridex * loopx);
-						}
-					}
-				}
-				else if(array->descr->elsize == sizeof(int))
-				{
-					for(loopy = 0; loopy < sizey; ++loopy)
-					{
-						int* imgrow = (int*)(((char*)surf->pixels)+loopy*surf->pitch);
-						char* datarow = array->data + stridey * loopy;
-						for(loopx = 0; loopx < sizex; ++loopx)
-						{
-							int* pix = imgrow + loopx;
-							char* data = datarow + stridex * loopx;
-							*(imgrow + loopx) = (int)*(int*)(datarow + stridex * loopx);
-						}
-					}
-				}
-			}
-			else
-			{
-				switch(array->descr->elsize)
-				{
-				case sizeof(char):
-					for(loopy = 0; loopy < sizey; ++loopy)
-					{
-						int* data = (int*)(((char*)surf->pixels) + surf->pitch * loopy);
-						char* pix = array->data + stridey * loopy;
-						for(loopx = 0; loopx < sizex; ++loopx)
-						{
-							*data++ = (*((unsigned char*)(pix)) >> Rloss << Rshift) |
-									((*((unsigned char*)(pix+stridez))) >> Gloss << Gshift) |
-									((*((unsigned char*)(pix+stridez2))) >> Bloss << Bshift);
-							pix += stridex;
-						}
-					}break;
-				case sizeof(int):
-					for(loopy = 0; loopy < sizey; ++loopy)
-					{
-						int* data = (int*)(((char*)surf->pixels) + surf->pitch * loopy);
-						char* pix = array->data + stridey * loopy;
-						for(loopx = 0; loopx < sizex; ++loopx)
-						{
-							*data++ = (*((unsigned int*)(pix)) >> Rloss << Rshift) |
-									((*((unsigned int*)(pix+stridez))) >> Gloss << Gshift) |
-									((*((unsigned int*)(pix+stridez2))) >> Bloss << Bshift);
-							pix += stridex;
-						}
-					}break;
+		if(array->nd == 2) {
+			switch(array->descr->elsize) {
+				case sizeof(char):  COPYMACRO_2D(unsigned char, unsigned char)  break;
+				case sizeof(short): COPYMACRO_2D(unsigned char, short)  break;
+				case sizeof(int):   COPYMACRO_2D(unsigned char, int)  break;
 				default: 
 					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
-				}
 			}
-		}break;
+		}
+		break;
+	case 2:
+		if(array->nd == 2) {
+			switch(array->descr->elsize) {
+				case sizeof(char):  COPYMACRO_2D(short, unsigned char)  break;
+				case sizeof(short): COPYMACRO_2D(short, short)  break;
+				case sizeof(int):   COPYMACRO_2D(short, int)  break;
+				default: 
+					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
+			}
+		} else {
+			switch(array->descr->elsize) {
+				case sizeof(char): COPYMACRO_3D(short, unsigned char)  break;
+				case sizeof(short):COPYMACRO_3D(short, short)  break;
+				case sizeof(int):  COPYMACRO_3D(short, int)  break;
+				default: 
+					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
+			}
+		}
+		break;
+	case 3:
+		if(array->nd == 2) {
+			switch(array->descr->elsize) {
+				case sizeof(char):  COPYMACRO_2D_24(unsigned char)  break;
+				case sizeof(short): COPYMACRO_2D_24(short)  break;
+				case sizeof(int):   COPYMACRO_2D_24(int)  break;
+				default: 
+					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
+			}
+		} else {
+			switch(array->descr->elsize) {
+				case sizeof(char): COPYMACRO_3D_24(unsigned char)  break;
+				case sizeof(short):COPYMACRO_3D_24(short)  break;
+				case sizeof(int):  COPYMACRO_3D_24(int)  break;
+				default: 
+					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
+			}
+		}
+		break;
+	case 4:
+		if(array->nd == 2) {
+			switch(array->descr->elsize) {
+				case sizeof(char):  COPYMACRO_2D(int, unsigned char)  break;
+				case sizeof(short): COPYMACRO_2D(int, short)  break;
+				case sizeof(int):   COPYMACRO_2D(int, int)  break;
+			default: 
+					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
+			}
+		} else {
+			switch(array->descr->elsize) {
+				case sizeof(char): COPYMACRO_3D(int, unsigned char)  break;
+				case sizeof(short):COPYMACRO_3D(int, short)  break;
+				case sizeof(int):  COPYMACRO_3D(int, int)  break;
+				default: 
+					return RAISE(PyExc_ValueError, "unsupported datatype for array\n");
+			}
+		}
+		break;
+	default:
+		return RAISE(PyExc_RuntimeError, "unsupported bit depth for image");
 	}
-
 	RETURN_NONE;
 }