Subversion Repositories Kolibri OS

Rev

Rev 4104 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4104 Rev 5060
Line 291... Line 291...
291
			      r->y1 >> 16, ((r->y1 & 0xffff) * 15625) >> 10);
291
			      r->y1 >> 16, ((r->y1 & 0xffff) * 15625) >> 10);
292
	else
292
	else
293
		DRM_DEBUG_KMS("%dx%d%+d%+d\n", w, h, r->x1, r->y1);
293
		DRM_DEBUG_KMS("%dx%d%+d%+d\n", w, h, r->x1, r->y1);
294
}
294
}
295
EXPORT_SYMBOL(drm_rect_debug_print);
295
EXPORT_SYMBOL(drm_rect_debug_print);
-
 
296
 
-
 
297
/**
-
 
298
 * drm_rect_rotate - Rotate the rectangle
-
 
299
 * @r: rectangle to be rotated
-
 
300
 * @width: Width of the coordinate space
-
 
301
 * @height: Height of the coordinate space
-
 
302
 * @rotation: Transformation to be applied
-
 
303
 *
-
 
304
 * Apply @rotation to the coordinates of rectangle @r.
-
 
305
 *
-
 
306
 * @width and @height combined with @rotation define
-
 
307
 * the location of the new origin.
-
 
308
 *
-
 
309
 * @width correcsponds to the horizontal and @height
-
 
310
 * to the vertical axis of the untransformed coordinate
-
 
311
 * space.
-
 
312
 */
-
 
313
void drm_rect_rotate(struct drm_rect *r,
-
 
314
		     int width, int height,
-
 
315
		     unsigned int rotation)
-
 
316
{
-
 
317
	struct drm_rect tmp;
-
 
318
 
-
 
319
	if (rotation & (BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y))) {
-
 
320
		tmp = *r;
-
 
321
 
-
 
322
		if (rotation & BIT(DRM_REFLECT_X)) {
-
 
323
			r->x1 = width - tmp.x2;
-
 
324
			r->x2 = width - tmp.x1;
-
 
325
		}
-
 
326
 
-
 
327
		if (rotation & BIT(DRM_REFLECT_Y)) {
-
 
328
			r->y1 = height - tmp.y2;
-
 
329
			r->y2 = height - tmp.y1;
-
 
330
		}
-
 
331
	}
-
 
332
 
-
 
333
	switch (rotation & 0xf) {
-
 
334
	case BIT(DRM_ROTATE_0):
-
 
335
		break;
-
 
336
	case BIT(DRM_ROTATE_90):
-
 
337
		tmp = *r;
-
 
338
		r->x1 = tmp.y1;
-
 
339
		r->x2 = tmp.y2;
-
 
340
		r->y1 = width - tmp.x2;
-
 
341
		r->y2 = width - tmp.x1;
-
 
342
		break;
-
 
343
	case BIT(DRM_ROTATE_180):
-
 
344
		tmp = *r;
-
 
345
		r->x1 = width - tmp.x2;
-
 
346
		r->x2 = width - tmp.x1;
-
 
347
		r->y1 = height - tmp.y2;
-
 
348
		r->y2 = height - tmp.y1;
-
 
349
		break;
-
 
350
	case BIT(DRM_ROTATE_270):
-
 
351
		tmp = *r;
-
 
352
		r->x1 = height - tmp.y2;
-
 
353
		r->x2 = height - tmp.y1;
-
 
354
		r->y1 = tmp.x1;
-
 
355
		r->y2 = tmp.x2;
-
 
356
		break;
-
 
357
	default:
-
 
358
		break;
-
 
359
	}
-
 
360
}
-
 
361
EXPORT_SYMBOL(drm_rect_rotate);
-
 
362
 
-
 
363
/**
-
 
364
 * drm_rect_rotate_inv - Inverse rotate the rectangle
-
 
365
 * @r: rectangle to be rotated
-
 
366
 * @width: Width of the coordinate space
-
 
367
 * @height: Height of the coordinate space
-
 
368
 * @rotation: Transformation whose inverse is to be applied
-
 
369
 *
-
 
370
 * Apply the inverse of @rotation to the coordinates
-
 
371
 * of rectangle @r.
-
 
372
 *
-
 
373
 * @width and @height combined with @rotation define
-
 
374
 * the location of the new origin.
-
 
375
 *
-
 
376
 * @width correcsponds to the horizontal and @height
-
 
377
 * to the vertical axis of the original untransformed
-
 
378
 * coordinate space, so that you never have to flip
-
 
379
 * them when doing a rotatation and its inverse.
-
 
380
 * That is, if you do:
-
 
381
 *
-
 
382
 * drm_rotate(&r, width, height, rotation);
-
 
383
 * drm_rotate_inv(&r, width, height, rotation);
-
 
384
 *
-
 
385
 * you will always get back the original rectangle.
-
 
386
 */
-
 
387
void drm_rect_rotate_inv(struct drm_rect *r,
-
 
388
			 int width, int height,
-
 
389
			 unsigned int rotation)
-
 
390
{
-
 
391
	struct drm_rect tmp;
-
 
392
 
-
 
393
	switch (rotation & 0xf) {
-
 
394
	case BIT(DRM_ROTATE_0):
-
 
395
		break;
-
 
396
	case BIT(DRM_ROTATE_90):
-
 
397
		tmp = *r;
-
 
398
		r->x1 = width - tmp.y2;
-
 
399
		r->x2 = width - tmp.y1;
-
 
400
		r->y1 = tmp.x1;
-
 
401
		r->y2 = tmp.x2;
-
 
402
		break;
-
 
403
	case BIT(DRM_ROTATE_180):
-
 
404
		tmp = *r;
-
 
405
		r->x1 = width - tmp.x2;
-
 
406
		r->x2 = width - tmp.x1;
-
 
407
		r->y1 = height - tmp.y2;
-
 
408
		r->y2 = height - tmp.y1;
-
 
409
		break;
-
 
410
	case BIT(DRM_ROTATE_270):
-
 
411
		tmp = *r;
-
 
412
		r->x1 = tmp.y1;
-
 
413
		r->x2 = tmp.y2;
-
 
414
		r->y1 = height - tmp.x2;
-
 
415
		r->y2 = height - tmp.x1;
-
 
416
		break;
-
 
417
	default:
-
 
418
		break;
-
 
419
	}
-
 
420
 
-
 
421
	if (rotation & (BIT(DRM_REFLECT_X) | BIT(DRM_REFLECT_Y))) {
-
 
422
		tmp = *r;
-
 
423
 
-
 
424
		if (rotation & BIT(DRM_REFLECT_X)) {
-
 
425
			r->x1 = width - tmp.x2;
-
 
426
			r->x2 = width - tmp.x1;
-
 
427
		}
-
 
428
 
-
 
429
		if (rotation & BIT(DRM_REFLECT_Y)) {
-
 
430
			r->y1 = height - tmp.y2;
-
 
431
			r->y2 = height - tmp.y1;
-
 
432
		}
-
 
433
	}
-
 
434
}
-
 
435
EXPORT_SYMBOL(drm_rect_rotate_inv);