u_format.c revision c5d4a44f449a8203a8b1da9b18806a718d80f131
1e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/************************************************************************** 2e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 3e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Copyright 2010 VMware, Inc. 4e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * All Rights Reserved. 5e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 6e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Permission is hereby granted, free of charge, to any person obtaining a 7e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * copy of this software and associated documentation files (the 8e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * "Software"), to deal in the Software without restriction, including 9e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * without limitation the rights to use, copy, modify, merge, publish, 10e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * distribute, sub license, and/or sell copies of the Software, and to 11e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * permit persons to whom the Software is furnished to do so, subject to 12e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * the following conditions: 13e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 14e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * The above copyright notice and this permission notice (including the 15e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * next paragraph) shall be included in all copies or substantial portions 16e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * of the Software. 17e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 18e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 26e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat **************************************************************************/ 27e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 28e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat/** 29e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * @file 30e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * Pixel format accessor functions. 31e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * 32e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat * @author Jose Fonseca <jfonseca@vmware.com> 33e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat */ 34e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 35e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat#include "u_format.h" 36e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 37e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat 38e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatvoid 39e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehatutil_format_read_4f(enum pipe_format format, 40e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat float *dst, unsigned dst_stride, 41e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat const void *src, unsigned src_stride, 42e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat unsigned x, unsigned y, unsigned w, unsigned h) 43e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat{ 44e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat const struct util_format_description *format_desc; 45e20e1347b9914aa05e30548c15d7cd5e412cc0e2San Mehat const uint8_t *src_row; 46 float *dst_row; 47 unsigned row_blocks; 48 unsigned i; 49 50 format_desc = util_format_description(format); 51 52 assert(x % format_desc->block.width == 0); 53 assert(y % format_desc->block.height == 0); 54 55 src_row = (const uint8_t *)src + y*src_stride + x*(format_desc->block.bits/8); 56 dst_row = dst; 57 row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; 58 59 for (i = 0; i < h; i += format_desc->block.height) { 60 format_desc->unpack_float(dst_row, src_row, row_blocks); 61 src_row += src_stride; 62 dst_row += dst_stride/sizeof(*dst_row); 63 } 64} 65 66 67void 68util_format_write_4f(enum pipe_format format, 69 const float *src, unsigned src_stride, 70 void *dst, unsigned dst_stride, 71 unsigned x, unsigned y, unsigned w, unsigned h) 72{ 73 const struct util_format_description *format_desc; 74 uint8_t *dst_row; 75 const float *src_row; 76 unsigned row_blocks; 77 unsigned i; 78 79 format_desc = util_format_description(format); 80 81 assert(x % format_desc->block.width == 0); 82 assert(y % format_desc->block.height == 0); 83 84 dst_row = (uint8_t *)dst + y*dst_stride + x*(format_desc->block.bits/8); 85 src_row = src; 86 row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; 87 88 for (i = 0; i < h; i += format_desc->block.height) { 89 format_desc->pack_float(dst_row, src_row, row_blocks); 90 dst_row += dst_stride; 91 src_row += src_stride/sizeof(*src_row); 92 } 93} 94 95 96void 97util_format_read_4ub(enum pipe_format format, uint8_t *dst, unsigned dst_stride, const void *src, unsigned src_stride, unsigned x, unsigned y, unsigned w, unsigned h) 98{ 99 const struct util_format_description *format_desc; 100 const uint8_t *src_row; 101 uint8_t *dst_row; 102 unsigned row_blocks; 103 unsigned i; 104 105 format_desc = util_format_description(format); 106 107 assert(x % format_desc->block.width == 0); 108 assert(y % format_desc->block.height == 0); 109 110 src_row = (const uint8_t *)src + y*src_stride + x*(format_desc->block.bits/8); 111 dst_row = dst; 112 row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; 113 114 for (i = 0; i < h; i += format_desc->block.height) { 115 format_desc->unpack_8unorm(dst_row, src_row, row_blocks); 116 src_row += src_stride; 117 dst_row += dst_stride/sizeof(*dst_row); 118 } 119} 120 121 122void 123util_format_write_4ub(enum pipe_format format, const uint8_t *src, unsigned src_stride, void *dst, unsigned dst_stride, unsigned x, unsigned y, unsigned w, unsigned h) 124{ 125 const struct util_format_description *format_desc; 126 uint8_t *dst_row; 127 const uint8_t *src_row; 128 unsigned row_blocks; 129 unsigned i; 130 131 format_desc = util_format_description(format); 132 133 assert(x % format_desc->block.width == 0); 134 assert(y % format_desc->block.height == 0); 135 136 dst_row = (uint8_t *)dst + y*dst_stride + x*(format_desc->block.bits/8); 137 src_row = src; 138 row_blocks = (w + format_desc->block.width - 1) / format_desc->block.width; 139 140 for (i = 0; i < h; i += format_desc->block.height) { 141 format_desc->pack_8unorm(dst_row, src_row, row_blocks); 142 dst_row += dst_stride; 143 src_row += src_stride/sizeof(*src_row); 144 } 145} 146 147