105 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright © 2010 Keith Packard
 | |
|  *
 | |
|  * Permission to use, copy, modify, distribute, and sell this software and its
 | |
|  * documentation for any purpose is hereby granted without fee, provided that
 | |
|  * the above copyright notice appear in all copies and that both that copyright
 | |
|  * notice and this permission notice appear in supporting documentation, and
 | |
|  * that the name of the copyright holders not be used in advertising or
 | |
|  * publicity pertaining to distribution of the software without specific,
 | |
|  * written prior permission.  The copyright holders make no representations
 | |
|  * about the suitability of this software for any purpose.  It is provided "as
 | |
|  * is" without express or implied warranty.
 | |
|  *
 | |
|  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | |
|  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 | |
|  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | |
|  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 | |
|  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 | |
|  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
 | |
|  * OF THIS SOFTWARE.
 | |
|  */
 | |
| 
 | |
| #include "randrstr.h"
 | |
| #include "swaprep.h"
 | |
| 
 | |
| void
 | |
| RRCrtcSpriteTransformSet(RRCrtcPtr crtc,
 | |
| 			 PictTransform *position_transform,
 | |
| 			 PictTransform *image_transform,
 | |
| 			 struct pict_f_transform *f_position_transform,
 | |
| 			 struct pict_f_transform *f_image_transform)
 | |
| {
 | |
|     ScreenPtr			pScreen;
 | |
|     rrScrPrivPtr		pScrPriv;
 | |
| 
 | |
|     pScreen = crtc->pScreen;
 | |
|     pScrPriv = rrGetScrPriv(pScreen);
 | |
|     crtc->client_sprite_position_transform = *position_transform;
 | |
|     crtc->client_sprite_image_transform = *image_transform;
 | |
|     crtc->client_sprite_f_position_transform = *f_position_transform;
 | |
|     crtc->client_sprite_f_image_transform = *f_image_transform;
 | |
|     if (pScrPriv->rrSetCrtcSpriteTransform)
 | |
| 	(*pScrPriv->rrSetCrtcSpriteTransform) (pScreen, crtc,
 | |
| 					       &crtc->client_sprite_f_position_transform,
 | |
| 					       &crtc->client_sprite_f_image_transform);
 | |
| }
 | |
| 
 | |
| int
 | |
| ProcRRSetCrtcSpriteTransform (ClientPtr client)
 | |
| {
 | |
|     REQUEST(xRRSetCrtcSpriteTransformReq);
 | |
|     RRCrtcPtr		    crtc;
 | |
|     PictTransform	    position_transform, image_transform;
 | |
|     struct pixman_f_transform f_position_transform, f_image_transform;
 | |
| 
 | |
|     REQUEST_AT_LEAST_SIZE(xRRSetCrtcSpriteTransformReq);
 | |
|     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 | |
| 
 | |
|     PictTransform_from_xRenderTransform (&position_transform, &stuff->positionTransform);
 | |
|     PictTransform_from_xRenderTransform (&image_transform, &stuff->imageTransform);
 | |
|     pixman_f_transform_from_pixman_transform (&f_position_transform, &position_transform);
 | |
|     pixman_f_transform_from_pixman_transform (&f_image_transform, &image_transform);
 | |
| 
 | |
|     RRCrtcSpriteTransformSet (crtc, &position_transform, &image_transform,
 | |
| 			      &f_position_transform, &f_image_transform);
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| #define CrtcSpriteTransformExtra	(SIZEOF(xRRGetCrtcSpriteTransformReply) - 32)
 | |
| 
 | |
| int
 | |
| ProcRRGetCrtcSpriteTransform (ClientPtr client)
 | |
| {
 | |
|     REQUEST(xRRGetCrtcSpriteTransformReq);
 | |
|     xRRGetCrtcSpriteTransformReply	*reply;
 | |
|     RRCrtcPtr			crtc;
 | |
|     int				n;
 | |
|     char			*extra;
 | |
| 
 | |
|     REQUEST_SIZE_MATCH (xRRGetCrtcSpriteTransformReq);
 | |
|     VERIFY_RR_CRTC(stuff->crtc, crtc, DixReadAccess);
 | |
| 
 | |
|     reply = malloc(sizeof (xRRGetCrtcSpriteTransformReply));
 | |
|     if (!reply)
 | |
| 	return BadAlloc;
 | |
| 
 | |
|     extra = (char *) (reply + 1);
 | |
|     reply->type = X_Reply;
 | |
|     reply->sequenceNumber = client->sequence;
 | |
|     reply->length = bytes_to_int32(CrtcSpriteTransformExtra);
 | |
| 
 | |
|     xRenderTransform_from_PictTransform(&reply->positionTransform, &crtc->client_sprite_position_transform);
 | |
|     xRenderTransform_from_PictTransform(&reply->imageTransform, &crtc->client_sprite_image_transform);
 | |
| 
 | |
|     if (client->swapped) {
 | |
| 	swaps (&reply->sequenceNumber, n);
 | |
| 	swapl (&reply->length, n);
 | |
| 	SwapLongs((CARD32 *) &reply->positionTransform, bytes_to_int32(sizeof(xRenderTransform)));
 | |
| 	SwapLongs((CARD32 *) &reply->imageTransform, bytes_to_int32(sizeof(xRenderTransform)));
 | |
|     }
 | |
|     WriteToClient (client, sizeof (xRRGetCrtcSpriteTransformReply), (char *) reply);
 | |
|     free(reply);
 | |
|     return Success;
 | |
| }
 |