コード例 #1
0
ファイル: hdr.c プロジェクト: Craxic/Psiga
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;
	}
}
コード例 #2
0
ファイル: file-info.c プロジェクト: TheRealDF/detex
// 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;
}