[PATCH xts] Remove pad adjustments from Xproto/GetImage/PutImage

Aaron Plattner aplattner at nvidia.com
Tue Feb 19 13:39:05 PST 2013


On 12/17/2012 12:38 PM, Peter Harris wrote:
> GetImage adjusts the length field incorrectly, and PutImage does not
> adjust the length field at all.
>
> Since the only stored images are those from GetImage, it makes more
> sense to remove the pad code entirely than to fix it.
>
> Signed-off-by: Peter Harris <pharris at opentext.com>
> ---

Pushed, 6fc68f..f98e350.

> Xtest defaults to using half the width of your monitor for the pPutImage
> test. Nobody noticed the bug before now because the noop pad adjustment
> case is the common case. 640, 800, 1024, and 1280 are all an even
> multiple of 32.
>
> I noticed because my monitor in portrait mode has a width of 1050.
>
>   xts5/src/libproto/RcvRep.c  |   34 +++++++---------------------------
>   xts5/src/libproto/SendReq.c |   38 ++++----------------------------------
>   2 files changed, 11 insertions(+), 61 deletions(-)
>
> diff --git a/xts5/src/libproto/RcvRep.c b/xts5/src/libproto/RcvRep.c
> index fca2265..c375d5a 100644
> --- a/xts5/src/libproto/RcvRep.c
> +++ b/xts5/src/libproto/RcvRep.c
> @@ -507,26 +507,16 @@ int client;   /* */
>   	case X_GetImage:
>   		{
>   /*
> - *	Images are stored in the test programs in client byte order and
> - *	unpadded.  This allows images to be independent of the server.
> - *	However the server will send images in server byte order and
> - *	padded.  This routine unpacks from server form into client-normal
> - *	form.  Note that we're assuming client-normal images are padded to
> - *	byte boundary; otherwise the translation is more complicated.
> - *	Similarly, left-pad must be zero.
> + *	Images are stored in the test programs in server byte order and
> + *	padding.
>    */
>
> -		int row, col = 1;
> -		unsigned char my_sex = *((unsigned char *) &col) ^ 1;
> -		unsigned char server_sex =
> -			(Xst_clients[client].cl_dpy) -> byte_order;
> -		long flip = my_sex ^ server_sex;  /* assume MSBFirst == 1 */
>   		int server_pad = (Xst_clients[client].cl_dpy) -> bitmap_pad;
> -		int dst_width /*in bytes*/ =
> +		int byte_width /*in bytes*/ =
>   			(Xst_clients[client].cl_imagewidth + 7) >> 3;
> -		int src_width /*in bytes*/ = dst_width +
> -			((dst_width % (server_pad>>3)) == 0 ? 0 :
> -			 (server_pad>>3) - dst_width % (server_pad>>3));
> +		int src_width /*in bytes*/ = byte_width +
> +			((byte_width % (server_pad>>3)) == 0 ? 0 :
> +			 (server_pad>>3) - byte_width % (server_pad>>3));
>   			
>   		char *dst = (char *)rp + sizeof(xReply);
>
> @@ -540,17 +530,7 @@ int client;   /* */
>   	                    break;
>                   }
>
> -		rp->generic.length =
> -			(dst_width * Xst_clients[client].cl_imageheight) >> 2;
> -
> -		for (row = 0; row < Xst_clients[client].cl_imageheight; row++)
> -			for(col = 0; col < src_width; col++)
> -
> -				if (col < dst_width)  {
> -				    *(dst++) = *((char *)((long)rbp++ ^ flip));
> -				}  else  {
> -					rbp++;
> -				}
> +		memcpy(dst, rbp, calculated_length * 4);
>   	        }
>   		break;
>   	case X_ListInstalledColormaps:
> diff --git a/xts5/src/libproto/SendReq.c b/xts5/src/libproto/SendReq.c
> index 0320594..4677a31 100644
> --- a/xts5/src/libproto/SendReq.c
> +++ b/xts5/src/libproto/SendReq.c
> @@ -876,34 +876,12 @@ int pollreq;
>   	case X_PutImage:
>   		{
>   /*
> - *	Images are stored in the test programs in client byte order and
> - *	unpadded.  This allows images to be independent of the server.
> - *	However the server will expect images in server byte order and
> - *	padded.  This routine sends an altered xPutImageReq which the server
> - *	will like.  Note that we're assuming client-normal form means that
> - *	rows are padded to a byte boundary; otherwise the translation is
> - *	more complex.  Similarly, left-pad must be zero.
> + *	Images are stored in the test programs in server byte order and
> + *	padding.
>    */
>
> -		int row, col = 1;
> -		unsigned char my_sex = *((unsigned char *) &col) ^ 1;
> -		unsigned char server_sex =
> -			(Xst_clients[client].cl_dpy) -> byte_order;
> -		long flip = my_sex ^ server_sex;  /* assume MSBFirst == 1 */
> -		int server_pad = (Xst_clients[client].cl_dpy) -> bitmap_pad;
> -		int src_width /*in bytes*/ =
> -			(int)(((xPutImageReq *)rp)->width + 7) >> 3;
> -		int dst_width /*in bytes*/ = src_width +
> -			((src_width % (server_pad>>3)) == 0 ? 0 :
> -			 (server_pad>>3) - src_width % (server_pad>>3));
>   		char *src = (char *)rp + sizeof(xPutImageReq);
>   		char **dst = (&(Get_Display(client)->bufptr));
> -		char *drop;
> -
> -		if (((xPutImageReq *)rp)->leftPad != 0)  {
> -			Log_Err("leftPad != 0; not supported in Send_Req()\n");
> -			Abort();
> -		}
>
>   		send1(client,(long) ((xPutImageReq *)rp)->reqType);
>   		send1(client,(long) ((xPutImageReq *)rp)->format);
> @@ -929,16 +907,8 @@ int pollreq;
>   			break;
>   		}
>   		squeeze_me_in(client, n);
> -		for (row = 0; n > 0 && row < (int)((xPutImageReq *)rp)->height; row++)
> -			for(col = 0; col < dst_width; col++) {
> -				if (col < src_width)  {
> -					drop = (char *)((long)(*dst)++ ^ flip);
> -					*drop = *(src++);
> -				}  else  {
> -					(*dst)++;
> -				}
> -				n--;
> -			}
> +		memcpy(*dst, src, n);
> +		(*dst) += n;
>   	        }
>   		break;
>   	case X_GetImage:
>


-- 
Aaron


More information about the xorg-devel mailing list