Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright (C) 2011 Red Hat Inc.
  4.  *
  5.  * Permission is hereby granted, free of charge, to any person obtaining a
  6.  * copy of this software and associated documentation files (the "Software"),
  7.  * to deal in the Software without restriction, including without limitation
  8.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9.  * and/or sell copies of the Software, and to permit persons to whom the
  10.  * Software is furnished to do so, subject to the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice shall be included
  13.  * in all copies or substantial portions of the Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  16.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21.  * OTHER DEALINGS IN THE SOFTWARE.
  22.  *
  23.  **************************************************************************/
  24.  
  25. #include <stdio.h>
  26. #include "u_math.h"
  27. #include "u_format.h"
  28. #include "u_format_rgtc.h"
  29. #include "u_format_latc.h"
  30. #include "util/rgtc.h"
  31.  
  32. void
  33. util_format_latc1_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
  34. {
  35.    /* Fix warnings here: */
  36.    (void) util_format_unsigned_encode_rgtc_ubyte;
  37.    (void) util_format_signed_encode_rgtc_ubyte;
  38.  
  39.    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 1);
  40.    dst[1] = dst[0];
  41.    dst[2] = dst[0];
  42.    dst[3] = 255;
  43. }
  44.  
  45. void
  46. util_format_latc1_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  47. {
  48.    util_format_rgtc1_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
  49. }
  50.  
  51. void
  52. util_format_latc1_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row,
  53.                                          unsigned src_stride, unsigned width, unsigned height)
  54. {
  55.    util_format_rgtc1_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
  56. }
  57.  
  58. void
  59. util_format_latc1_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  60. {
  61.    unsigned x, y, i, j;
  62.    int block_size = 8;
  63.  
  64.    for(y = 0; y < height; y += 4) {
  65.       const uint8_t *src = src_row;
  66.       for(x = 0; x < width; x += 4) {
  67.          for(j = 0; j < 4; ++j) {
  68.             for(i = 0; i < 4; ++i) {
  69.                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
  70.                uint8_t tmp_r;
  71.                util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
  72.                dst[0] =
  73.                dst[1] =
  74.                dst[2] = ubyte_to_float(tmp_r);
  75.                dst[3] = 1.0;
  76.             }
  77.          }
  78.          src += block_size;
  79.       }
  80.       src_row += src_stride;
  81.    }
  82. }
  83.  
  84. void
  85. util_format_latc1_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  86. {
  87.    util_format_rgtc1_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
  88. }
  89.  
  90. void
  91. util_format_latc1_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  92. {
  93.    uint8_t tmp_r;
  94.  
  95.    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
  96.    dst[0] =
  97.    dst[1] =
  98.    dst[2] = ubyte_to_float(tmp_r);
  99.    dst[3] = 1.0;
  100. }
  101.  
  102. void
  103. util_format_latc1_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
  104. {
  105.    fprintf(stderr,"%s\n", __func__);
  106. }
  107.  
  108. void
  109. util_format_latc1_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  110. {
  111.    fprintf(stderr,"%s\n", __func__);
  112. }
  113.  
  114. void
  115. util_format_latc1_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  116. {
  117.    fprintf(stderr,"%s\n", __func__);
  118. }
  119.  
  120. void
  121. util_format_latc1_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  122. {
  123.    util_format_rgtc1_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height);
  124. }
  125.  
  126. void
  127. util_format_latc1_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  128. {
  129.    unsigned x, y, i, j;
  130.    int block_size = 8;
  131.  
  132.    for(y = 0; y < height; y += 4) {
  133.       const int8_t *src = (int8_t *)src_row;
  134.       for(x = 0; x < width; x += 4) {
  135.          for(j = 0; j < 4; ++j) {
  136.             for(i = 0; i < 4; ++i) {
  137.                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
  138.                int8_t tmp_r;
  139.                util_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 1);
  140.                dst[0] =
  141.                dst[1] =
  142.                dst[2] = byte_to_float_tex(tmp_r);
  143.                dst[3] = 1.0;
  144.             }
  145.          }
  146.          src += block_size;
  147.       }
  148.       src_row += src_stride;
  149.    }
  150. }
  151.  
  152. void
  153. util_format_latc1_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  154. {
  155.    int8_t tmp_r;
  156.  
  157.    util_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 1);
  158.    dst[0] =
  159.    dst[1] =
  160.    dst[2] = byte_to_float_tex(tmp_r);
  161.    dst[3] = 1.0;
  162. }
  163.  
  164.  
  165. void
  166. util_format_latc2_unorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
  167. {
  168.    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, dst, 2);
  169.    dst[1] = dst[0];
  170.    dst[2] = dst[0];
  171.    util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, dst + 3, 2);
  172. }
  173.  
  174. void
  175. util_format_latc2_unorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  176. {
  177.    util_format_rgtc2_unorm_unpack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
  178. }
  179.  
  180. void
  181. util_format_latc2_unorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  182. {
  183.    util_format_rgtc2_unorm_pack_rgba_8unorm(dst_row, dst_stride, src_row, src_stride, width, height);
  184. }
  185.  
  186. void
  187. util_format_latc2_unorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  188. {
  189.    util_format_rxtc2_unorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3);
  190. }
  191.  
  192. void
  193. util_format_latc2_unorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  194. {
  195.    unsigned x, y, i, j;
  196.    int block_size = 16;
  197.  
  198.    for(y = 0; y < height; y += 4) {
  199.       const uint8_t *src = src_row;
  200.       for(x = 0; x < width; x += 4) {
  201.          for(j = 0; j < 4; ++j) {
  202.             for(i = 0; i < 4; ++i) {
  203.                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
  204.                uint8_t tmp_r, tmp_g;
  205.                util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
  206.                util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
  207.                dst[0] =
  208.                dst[1] =
  209.                dst[2] = ubyte_to_float(tmp_r);
  210.                dst[3] = ubyte_to_float(tmp_g);
  211.             }
  212.          }
  213.          src += block_size;
  214.       }
  215.       src_row += src_stride;
  216.    }
  217. }
  218.  
  219. void
  220. util_format_latc2_unorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  221. {
  222.    uint8_t tmp_r, tmp_g;
  223.  
  224.    util_format_unsigned_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
  225.    util_format_unsigned_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
  226.    dst[0] =
  227.    dst[1] =
  228.    dst[2] = ubyte_to_float(tmp_r);
  229.    dst[3] = ubyte_to_float(tmp_g);
  230. }
  231.  
  232.  
  233. void
  234. util_format_latc2_snorm_fetch_rgba_8unorm(uint8_t *dst, const uint8_t *src, unsigned i, unsigned j)
  235. {
  236.    fprintf(stderr,"%s\n", __func__);
  237. }
  238.  
  239. void
  240. util_format_latc2_snorm_unpack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  241. {
  242.    fprintf(stderr,"%s\n", __func__);
  243. }
  244.  
  245. void
  246. util_format_latc2_snorm_pack_rgba_8unorm(uint8_t *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  247. {
  248.    fprintf(stderr,"%s\n", __func__);
  249. }
  250.  
  251. void
  252. util_format_latc2_snorm_unpack_rgba_float(float *dst_row, unsigned dst_stride, const uint8_t *src_row, unsigned src_stride, unsigned width, unsigned height)
  253. {
  254.    unsigned x, y, i, j;
  255.    int block_size = 16;
  256.  
  257.    for(y = 0; y < height; y += 4) {
  258.       const int8_t *src = (int8_t *)src_row;
  259.       for(x = 0; x < width; x += 4) {
  260.          for(j = 0; j < 4; ++j) {
  261.             for(i = 0; i < 4; ++i) {
  262.                float *dst = dst_row + (y + j)*dst_stride/sizeof(*dst_row) + (x + i)*4;
  263.                int8_t tmp_r, tmp_g;
  264.                util_format_signed_fetch_texel_rgtc(0, src, i, j, &tmp_r, 2);
  265.                util_format_signed_fetch_texel_rgtc(0, src + 8, i, j, &tmp_g, 2);
  266.                dst[0] =
  267.                dst[1] =
  268.                dst[2] = byte_to_float_tex(tmp_r);
  269.                dst[3] = byte_to_float_tex(tmp_g);
  270.             }
  271.          }
  272.          src += block_size;
  273.       }
  274.       src_row += src_stride;
  275.    }
  276. }
  277.  
  278. void
  279. util_format_latc2_snorm_pack_rgba_float(uint8_t *dst_row, unsigned dst_stride, const float *src_row, unsigned src_stride, unsigned width, unsigned height)
  280. {
  281.    util_format_rxtc2_snorm_pack_rgba_float(dst_row, dst_stride, src_row, src_stride, width, height, 3);
  282. }
  283.  
  284. void
  285. util_format_latc2_snorm_fetch_rgba_float(float *dst, const uint8_t *src, unsigned i, unsigned j)
  286. {
  287.    int8_t tmp_r, tmp_g;
  288.  
  289.    util_format_signed_fetch_texel_rgtc(0, (int8_t *)src, i, j, &tmp_r, 2);
  290.    util_format_signed_fetch_texel_rgtc(0, (int8_t *)src + 8, i, j, &tmp_g, 2);
  291.    dst[0] =
  292.    dst[1] =
  293.    dst[2] = byte_to_float_tex(tmp_r);
  294.    dst[3] = byte_to_float_tex(tmp_g);
  295. }
  296.  
  297.