bool detexCalculateDynamicRange(uint8_t *pixel_buffer, int nu_pixels, uint32_t pixel_format, float *range_min_out, float *range_max_out) { if (~(pixel_format & DETEX_PIXEL_FORMAT_FLOAT_BIT)) { detexSetErrorMessage("detexCalculateDynamicRange: Pixel buffer not in float format"); return false; } if (pixel_format & DETEX_PIXEL_FORMAT_16BIT_COMPONENT_BIT) { CalculateRangeHalfFloat((uint16_t *)pixel_buffer, nu_pixels * detexGetPixelSize(pixel_format) / 2, range_min_out, range_max_out); return true; } else if (pixel_format & DETEX_PIXEL_FORMAT_32BIT_COMPONENT_BIT) { CalculateRangeFloat((float *)pixel_buffer, nu_pixels * detexGetPixelSize(pixel_format) / 4, range_min_out, range_max_out); return true; } else { detexSetErrorMessage("detexCalculateDynamicRange: Unable to handle pixel buffer format"); return false; } }
// Look-up texture file info for DDS file format based on DX format parameters. const detexTextureFileInfo *detexLookupDDSFileInfo(const char *four_cc, int dx10_format, uint32_t pixel_format_flags, int bitcount, uint32_t red_mask, uint32_t green_mask, uint32_t blue_mask, uint32_t alpha_mask) { for (int i = 0; i < DETEX_NU_TEXTURE_INFO_ENTRIES; i++) if (strncmp(four_cc, "DX10", 4) == 0) { if (texture_info[i].dx10_format == dx10_format) return &texture_info[i]; } else if (texture_info[i].dx_four_cc[0] != '\0' && strncmp(texture_info[i].dx_four_cc, four_cc, 4) == 0) return &texture_info[i]; else { uint32_t format = texture_info[i].texture_format; if ((pixel_format_flags & DDPF_RGB) && !detexFormatIsCompressed(format)) { // Uncompressed format. Match component masks. if (bitcount <= 32) { int format_bitcount = detexGetPixelSize(format) * 8; uint64_t format_red_mask, format_green_mask, format_blue_mask, format_alpha_mask; detexGetComponentMasks(format, &format_red_mask, &format_green_mask, &format_blue_mask, &format_alpha_mask); if (format_bitcount == bitcount && format_red_mask == red_mask && format_green_mask == green_mask && format_blue_mask == blue_mask && ((pixel_format_flags & DDPF_ALPHAPIXELS) == 0 || format_alpha_mask == alpha_mask)) return &texture_info[i]; } } // Detect old alpha format. if ((pixel_format_flags & DDPF_ALPHA) && bitcount == 8 && format == DETEX_PIXEL_FORMAT_A8) return &texture_info[i]; } for (int i = 0; i < DETEX_NU_DDS_SYNONYMS; i++) if (strncmp(four_cc, "DX10", 4) == 0) { if (dds_synonym[i].dx10_format == dx10_format) return detexLookupTextureFormatFileInfo(dds_synonym[i].texture_format); } else if (dds_synonym[i].dx10_four_cc[0] != '\0' && strncmp(dds_synonym[i].dx10_four_cc, four_cc, 4) == 0) return detexLookupTextureFormatFileInfo(dds_synonym[i].texture_format); return NULL; }