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