github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jxr/jxrlib/src/jxr_private.c (about)

     1  // Copyright 2014 <chaishushan{AT}gmail.com>. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  #include "jxr_private.h"
     6  
     7  // fotmat info list
     8  static const struct {
     9  	const char* name;
    10  	const PKPixelFormatGUID* fmt;
    11  	int channels;
    12  	int depth;
    13  	jxr_data_type_t type;
    14  	jxr_bool_t golden;
    15  } fmtInfoList[] = {
    16  #define _JXR_FMT_(fmt) #fmt, &fmt
    17  	{ _JXR_FMT_(GUID_PKPixelFormatBlackWhite), 1, 8, jxr_unsigned, jxr_false },
    18  	{ _JXR_FMT_(GUID_PKPixelFormat8bppGray), 1, 8, jxr_unsigned, jxr_true },            // golden Gray
    19  
    20  	/* 16bpp formats */
    21  	{ _JXR_FMT_(GUID_PKPixelFormat16bppRGB555), 3, 8, jxr_unsigned, jxr_false },
    22  	{ _JXR_FMT_(GUID_PKPixelFormat16bppRGB565), 3, 8, jxr_unsigned, jxr_false },
    23  	{ _JXR_FMT_(GUID_PKPixelFormat16bppGray), 1, 16, jxr_unsigned, jxr_true },          // golden Gray16
    24  
    25  	/* 24bpp formats */
    26  	{ _JXR_FMT_(GUID_PKPixelFormat24bppBGR), 3, 8, jxr_unsigned, jxr_false },
    27  	{ _JXR_FMT_(GUID_PKPixelFormat24bppRGB), 3, 8, jxr_unsigned, jxr_false },           // golden RGB
    28  
    29  	/* 32bpp format */
    30  	{ _JXR_FMT_(GUID_PKPixelFormat32bppBGR), 3, 8, jxr_unsigned, jxr_false },
    31  	{ _JXR_FMT_(GUID_PKPixelFormat32bppBGRA), 4, 8, jxr_unsigned, jxr_false },
    32  	{ _JXR_FMT_(GUID_PKPixelFormat32bppPBGRA), 4, 8, jxr_unsigned, jxr_false },
    33  	{ _JXR_FMT_(GUID_PKPixelFormat32bppGrayFloat), 1, 32, jxr_float, jxr_true },        // golden Gray32f
    34  	{ _JXR_FMT_(GUID_PKPixelFormat32bppRGB), 3, 8, jxr_unsigned, jxr_false },
    35  	{ _JXR_FMT_(GUID_PKPixelFormat32bppRGBA), 4, 8, jxr_unsigned, jxr_true  },          // golden RGBA
    36  	{ _JXR_FMT_(GUID_PKPixelFormat32bppPRGBA), 4, 8, jxr_unsigned, jxr_false },
    37  
    38  	/* 48bpp format */
    39  	{ _JXR_FMT_(GUID_PKPixelFormat48bppRGBFixedPoint), 3, 16, jxr_signed, jxr_true },   // golden RGB48i
    40  
    41  	/* 16bpp format */
    42  	{ _JXR_FMT_(GUID_PKPixelFormat16bppGrayFixedPoint), 1, 16, jxr_signed, jxr_true },  // golden Gray16i
    43  
    44  	/* 32bpp format */
    45  	{ _JXR_FMT_(GUID_PKPixelFormat32bppRGB101010), 3, 8, jxr_unsigned, jxr_false },
    46  
    47  	/* 48bpp format */
    48  	{ _JXR_FMT_(GUID_PKPixelFormat48bppRGB), 3, 8, jxr_unsigned, jxr_true },            // golden RGB48
    49  
    50  	/* 64bpp format */
    51  	{ _JXR_FMT_(GUID_PKPixelFormat64bppRGBA), 4, 16, jxr_unsigned, jxr_true },          // golden RGBA64
    52  	{ _JXR_FMT_(GUID_PKPixelFormat64bppPRGBA), 4, 16, jxr_unsigned, jxr_false },
    53  
    54  	/* 96bpp format */
    55  	{ _JXR_FMT_(GUID_PKPixelFormat96bppRGBFixedPoint), 3, 32, jxr_signed, jxr_false },  // golden RGB96i
    56  	{ _JXR_FMT_(GUID_PKPixelFormat96bppRGBFloat), 3, 32, jxr_float, jxr_false },        // golden RGB96f
    57  
    58  	/* Floating point scRGB formats */
    59  	{ _JXR_FMT_(GUID_PKPixelFormat128bppRGBAFloat), 4, 32, jxr_float, jxr_true },       // golden RGBA128f
    60  	{ _JXR_FMT_(GUID_PKPixelFormat128bppPRGBAFloat), 4, 32, jxr_float, jxr_false },
    61  	{ _JXR_FMT_(GUID_PKPixelFormat128bppRGBFloat), 4, 32, jxr_float, jxr_false },
    62  
    63  	/* CMYK formats. */
    64  	{ _JXR_FMT_(GUID_PKPixelFormat32bppCMYK), 3, 8, jxr_unsigned, jxr_false },
    65  
    66  	/* Photon formats */
    67  	{ _JXR_FMT_(GUID_PKPixelFormat64bppRGBAFixedPoint), 4, 16, jxr_signed, jxr_true },  // golden RGBA64i
    68  	{ _JXR_FMT_(GUID_PKPixelFormat64bppRGBFixedPoint), 3, 16, jxr_signed, jxr_false },
    69  	{ _JXR_FMT_(GUID_PKPixelFormat128bppRGBAFixedPoint), 4, 32, jxr_signed, jxr_true }, // golden RGBA128f
    70  	{ _JXR_FMT_(GUID_PKPixelFormat128bppRGBFixedPoint), 3, 32, jxr_signed, jxr_false },
    71  
    72  	{ _JXR_FMT_(GUID_PKPixelFormat64bppRGBAHalf), 4, 16, jxr_float, jxr_false },
    73  	{ _JXR_FMT_(GUID_PKPixelFormat64bppRGBHalf), 3, 16, jxr_float, jxr_false },
    74  	{ _JXR_FMT_(GUID_PKPixelFormat48bppRGBHalf), 3, 16, jxr_float, jxr_false },
    75  
    76  	{ _JXR_FMT_(GUID_PKPixelFormat32bppRGBE), 3, 8, jxr_unsigned, jxr_false },
    77  
    78  	{ _JXR_FMT_(GUID_PKPixelFormat16bppGrayHalf), 1, 16, jxr_float, jxr_true },         // golden Gray16f
    79  	{ _JXR_FMT_(GUID_PKPixelFormat32bppGrayFixedPoint), 1, 32, jxr_signed, jxr_true },  // golden Gray32i
    80  
    81  	/* YCrCb  from Advanced Profile */
    82  	{ _JXR_FMT_(GUID_PKPixelFormat12bppYCC420), 3, 8, jxr_unsigned, jxr_false },
    83  	{ _JXR_FMT_(GUID_PKPixelFormat16bppYCC422), 3, 8, jxr_unsigned, jxr_false },
    84  	{ _JXR_FMT_(GUID_PKPixelFormat20bppYCC422), 3, 8, jxr_unsigned, jxr_false },
    85  	{ _JXR_FMT_(GUID_PKPixelFormat32bppYCC422), 3, 8, jxr_unsigned, jxr_false },
    86  	{ _JXR_FMT_(GUID_PKPixelFormat24bppYCC444), 3, 8, jxr_unsigned, jxr_false },
    87  	{ _JXR_FMT_(GUID_PKPixelFormat30bppYCC444), 3, 8, jxr_unsigned, jxr_false },
    88  	{ _JXR_FMT_(GUID_PKPixelFormat48bppYCC444), 3, 8, jxr_unsigned, jxr_false },
    89  	{ _JXR_FMT_(GUID_PKPixelFormat16bpp48bppYCC444FixedPoint), 3, 8 , jxr_signed, jxr_false },
    90  
    91  	{ _JXR_FMT_(GUID_PKPixelFormat20bppYCC420Alpha), 3, 8, jxr_unsigned, jxr_false },
    92  	{ _JXR_FMT_(GUID_PKPixelFormat24bppYCC422Alpha), 3, 8, jxr_unsigned, jxr_false },
    93  	{ _JXR_FMT_(GUID_PKPixelFormat30bppYCC422Alpha), 3, 8, jxr_unsigned, jxr_false },
    94  	{ _JXR_FMT_(GUID_PKPixelFormat48bppYCC422Alpha), 3, 8, jxr_unsigned, jxr_false },
    95  	{ _JXR_FMT_(GUID_PKPixelFormat32bppYCC444Alpha), 3, 8, jxr_unsigned, jxr_false },
    96  	{ _JXR_FMT_(GUID_PKPixelFormat40bppYCC444Alpha), 3, 8, jxr_unsigned, jxr_false },
    97  	{ _JXR_FMT_(GUID_PKPixelFormat64bppYCC444Alpha), 3, 8, jxr_unsigned, jxr_false },
    98  	{ _JXR_FMT_(GUID_PKPixelFormat64bppYCC444AlphaFixedPoint), 3, 8, jxr_signed, jxr_false  },
    99  #undef _JXR_FMT_
   100  };
   101  
   102  jxr_bool_t jxr_format_guid_valid(const PKPixelFormatGUID* fmt) {
   103  	int i;
   104  	if(IsEqualGUID(fmt, &GUID_PKPixelFormatDontCare)) {
   105  		return jxr_true;
   106  	}
   107  	for(i = 0; i < sizeof(fmtInfoList)/sizeof(fmtInfoList[0]); ++i) {
   108  		if(IsEqualGUID(fmt, fmtInfoList[i].fmt)) {
   109  			return jxr_true;
   110  		}
   111  	}
   112  	return jxr_false;
   113  }
   114  
   115  jxr_bool_t jxr_parse_format_guid(
   116  	const PKPixelFormatGUID* fmt,
   117  	int* channels, int* depth,
   118  	jxr_data_type_t* type
   119  ) {
   120  	int i;
   121  	for(i = 0; i < sizeof(fmtInfoList)/sizeof(fmtInfoList[0]); ++i) {
   122  		if(IsEqualGUID(fmt, fmtInfoList[i].fmt)) {
   123  			if(channels != NULL) *channels = fmtInfoList[i].channels;
   124  			if(depth != NULL) *depth = fmtInfoList[i].depth;
   125  			if(type != NULL) *type = fmtInfoList[i].type;
   126  			return jxr_true;
   127  		}
   128  	}
   129  	return jxr_false;
   130  }
   131  
   132  jxr_bool_t jxr_golden_format(
   133  	int channels, int depth,
   134  	jxr_data_type_t type,
   135  	const PKPixelFormatGUID** fmt
   136  ) {
   137  	int i;
   138  	for(i = 0; i < sizeof(fmtInfoList)/sizeof(fmtInfoList[0]); ++i) {
   139  		if(!fmtInfoList[i].golden) continue;
   140  		if(fmtInfoList[i].channels != channels) continue;
   141  		if(fmtInfoList[i].depth != depth) continue;
   142  		if(fmtInfoList[i].type != type) continue;
   143  
   144  		*fmt = fmtInfoList[i].fmt;
   145  		return jxr_true;
   146  	}
   147  	return jxr_false;
   148  }
   149