u_rect.c revision fe1e39afbb147deab60ecc932c24f921b46f1364
1e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer/**************************************************************************
2e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer *
3e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * All Rights Reserved.
5e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer *
6e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * Permission is hereby granted, free of charge, to any person obtaining a
7e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * copy of this software and associated documentation files (the
8e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * "Software"), to deal in the Software without restriction, including
9e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * without limitation the rights to use, copy, modify, merge, publish,
10e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * distribute, sub license, and/or sell copies of the Software, and to
11e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * permit persons to whom the Software is furnished to do so, subject to
12e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * the following conditions:
13e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer *
14e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * The above copyright notice and this permission notice (including the
15e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * next paragraph) shall be included in all copies or substantial portions
16e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * of the Software.
17e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer *
18e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer *
26e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer **************************************************************************/
27e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
28e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer/**
29e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * Miscellaneous utility functions.
30e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer */
31e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
32e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
33e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer#include "pipe/p_defines.h"
34e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer#include "pipe/p_util.h"
354ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca#include "pipe/p_format.h"
36fe1e39afbb147deab60ecc932c24f921b46f1364Brian Paul#include "util/u_rect.h"
37e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
38e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
39e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer/**
40e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * Copy 2D rect from one place to another.
41e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer * Position and sizes are in pixels.
42f738c3acaca235c68a26c7b7d41903c64a36ae9fBrian Paul * src_pitch may be negative to do vertical flip of pixels from source.
43e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer */
44e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzervoid
45e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzerpipe_copy_rect(ubyte * dst,
464ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               const struct pipe_format_block *block,
474ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               unsigned dst_stride,
48e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer               unsigned dst_x,
49e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer               unsigned dst_y,
50e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer               unsigned width,
51e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer               unsigned height,
52e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer               const ubyte * src,
534ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               int src_stride,
54e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer               unsigned src_x,
55e922adbe1d6c1764968377658ea92ae6de0585dbMichel Dänzer               int src_y)
56e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer{
57e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer   unsigned i;
584ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   int src_stride_pos = src_stride < 0 ? -src_stride : src_stride;
59e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
604ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(block->size > 0);
614ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(block->width > 0);
624ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(block->height > 0);
63016dbb0cf395702cfad046f827e3cc4541ae5818Brian Paul   assert(src_x >= 0);
64016dbb0cf395702cfad046f827e3cc4541ae5818Brian Paul   assert(src_y >= 0);
65016dbb0cf395702cfad046f827e3cc4541ae5818Brian Paul   assert(dst_x >= 0);
66016dbb0cf395702cfad046f827e3cc4541ae5818Brian Paul   assert(dst_y >= 0);
67016dbb0cf395702cfad046f827e3cc4541ae5818Brian Paul
684ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst_x /= block->width;
694ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst_y /= block->height;
704ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   width = (width + block->width - 1)/block->width;
714ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   height = (height + block->height - 1)/block->height;
724ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   src_x /= block->width;
734ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   src_y /= block->height;
744ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca
754ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst += dst_x * block->size;
764ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   src += src_x * block->size;
774ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst += dst_y * dst_stride;
784ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   src += src_y * src_stride_pos;
794ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   width *= block->size;
80e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer
814ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   if (width == dst_stride && width == src_stride)
82e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer      memcpy(dst, src, height * width);
83e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer   else {
84e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer      for (i = 0; i < height; i++) {
85e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer         memcpy(dst, src, width);
864ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca         dst += dst_stride;
874ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca         src += src_stride;
88e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer      }
89e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer   }
90e44bdcf9789caf9971c3c94605fbff7ce66af7baMichel Dänzer}
914ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca
924ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonsecavoid
934ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonsecapipe_fill_rect(ubyte * dst,
944ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               const struct pipe_format_block *block,
954ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               unsigned dst_stride,
964ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               unsigned dst_x,
974ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               unsigned dst_y,
984ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               unsigned width,
994ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               unsigned height,
1004ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca               uint32_t value)
1014ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca{
1024ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   unsigned i, j;
1034ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   unsigned width_size;
1044ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca
1054ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(block->size > 0);
1064ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(block->width > 0);
1074ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(block->height > 0);
1084ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(dst_x >= 0);
1094ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   assert(dst_y >= 0);
1104ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca
1114ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst_x /= block->width;
1124ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst_y /= block->height;
1134ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   width = (width + block->width - 1)/block->width;
1144ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   height = (height + block->height - 1)/block->height;
1154ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca
1164ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst += dst_x * block->size;
1174ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   dst += dst_y * dst_stride;
1184ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   width_size = width * block->size;
1194ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca
1204ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   switch (block->size) {
1214ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   case 1:
1224ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      if(dst_stride == width_size)
1234ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 memset(dst, (ubyte) value, height * width_size);
1244ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      else {
1254ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 for (i = 0; i < height; i++) {
1264ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	    memset(dst, (ubyte) value, width_size);
1274ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	    dst += dst_stride;
1284ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 }
1294ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      }
1304ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      break;
1314ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   case 2:
1324ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      for (i = 0; i < height; i++) {
1334ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 uint16_t *row = (uint16_t *)dst;
1344ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 for (j = 0; j < width; j++)
1354ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	    *row++ = (uint16_t) value;
1364ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 dst += dst_stride;
1374ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      }
1384ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      break;
1394ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   case 4:
1404ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      for (i = 0; i < height; i++) {
1414ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 uint32_t *row = (uint32_t *)dst;
1424ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 for (j = 0; j < width; j++)
1434ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	    *row++ = value;
1444ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 dst += dst_stride;
1454ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      }
1464ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca      break;
1474ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   default:
1484ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 assert(0);
1494ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca	 break;
1504ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca   }
1514ddd65967915ca4846f2831bc676c878a29dae4aJosé Fonseca}
152