github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/image/jxr/jxrlib/src/jxr.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.h"
     6  #include "jxr_private.h"
     7  
     8  jxr_bool_t jxr_decode_config(
     9  	const char* data, int size,
    10  	int* width, int* height, int* channels, int* depth,
    11  	jxr_data_type_t* type
    12  ) {
    13  	jxr_decoder_t* p = jxr_decoder_new();
    14  	if(!p) return jxr_false;
    15  
    16  	if(!jxr_decoder_init(p, data, size)) {
    17  		jxr_decoder_delete(p);
    18  		return jxr_false;
    19  	}
    20  
    21  	if(width != NULL) *width = jxr_decoder_width(p);
    22  	if(height != NULL) *height = jxr_decoder_height(p);
    23  	if(channels != NULL) *channels = jxr_decoder_channels(p);
    24  	if(depth != NULL) *depth = jxr_decoder_depth(p);
    25  	if(type != NULL) *type = jxr_decoder_data_type(p);
    26  
    27  	jxr_decoder_delete(p);
    28  	return jxr_true;
    29  }
    30  
    31  jxr_bool_t jxr_decode(
    32  	char* buf, int buf_len, int stride, const char* data, int size,
    33  	int* width, int* height, int* channels, int* depth,
    34  	jxr_data_type_t* type
    35  ) {
    36  	jxr_decoder_t* p = jxr_decoder_new();
    37  	if(!p) return jxr_false;
    38  
    39  	if(!jxr_decoder_init(p, data, size)) {
    40  		jxr_decoder_delete(p);
    41  		return jxr_false;
    42  	}
    43  
    44  	// set stride size
    45  	if(stride <= 0) {
    46  		stride = jxr_decoder_width(p)*jxr_decoder_channels(p)*jxr_decoder_depth(p)/8;
    47  	}
    48  	if(stride < (jxr_decoder_width(p)*jxr_decoder_channels(p)*jxr_decoder_depth(p)/8)) {
    49  		jxr_decoder_delete(p);
    50  		return jxr_false;
    51  	}
    52  
    53  	// check buffer size
    54  	if(buf_len < stride*jxr_decoder_height(p)) {
    55  		jxr_decoder_delete(p);
    56  		return jxr_false;
    57  	}
    58  
    59  	// decode all
    60  	if(!jxr_decoder_decode(p, NULL, buf, stride)) {
    61  		jxr_decoder_delete(p);
    62  		return jxr_false;
    63  	}
    64  
    65  	if(width != NULL) *width = jxr_decoder_width(p);
    66  	if(height != NULL) *height = jxr_decoder_height(p);
    67  	if(channels != NULL) *channels = jxr_decoder_channels(p);
    68  	if(depth != NULL) *depth = jxr_decoder_depth(p);
    69  	if(type != NULL) *type = jxr_decoder_data_type(p);
    70  
    71  	jxr_decoder_delete(p);
    72  	return jxr_true;
    73  }
    74  
    75  jxr_bool_t jxr_encode_len(
    76  	const char* data, int data_size, int stride,
    77  	int width, int height, int channels, int depth,
    78  	int quality, jxr_data_type_t type,
    79  	int* size
    80  ) {
    81  	jxr_encoder_t* p = jxr_encoder_new();
    82  	if(!p) return jxr_false;
    83  
    84  	if(!jxr_encoder_init(
    85  		p, data, data_size, stride,
    86  		width, height, channels, depth,
    87  		quality, type
    88  	)) {
    89  		jxr_encoder_delete(p);
    90  		return jxr_false;
    91  	}
    92  	if(!jxr_encoder_need_buffer_size(p, size)) {
    93  		jxr_encoder_delete(p);
    94  		return jxr_false;
    95  	}
    96  
    97  	jxr_encoder_delete(p);
    98  	return jxr_true;
    99  }
   100  
   101  jxr_bool_t jxr_encode(
   102  	char* buf, int buf_len,
   103  	const char* data, int data_size, int stride,
   104  	int width, int height, int channels, int depth,
   105  	int quality, jxr_data_type_t type,
   106  	int* size
   107  ) {
   108  	int need_buf_size;
   109  
   110  	jxr_encoder_t* p = jxr_encoder_new();
   111  	if(!p) return jxr_false;
   112  
   113  	if(!jxr_encoder_init(
   114  		p, data, data_size, stride,
   115  		width, height, channels, depth,
   116  		quality, type
   117  	)) {
   118  		jxr_encoder_delete(p);
   119  		return jxr_false;
   120  	}
   121  	if(!jxr_encoder_need_buffer_size(p, &need_buf_size)) {
   122  		jxr_encoder_delete(p);
   123  		return jxr_false;
   124  	}
   125  
   126  	if(buf_len < need_buf_size) {
   127  		jxr_encoder_delete(p);
   128  		return jxr_false;
   129  	}
   130  	if(!jxr_encoder_encode(p, buf, buf_len, size)) {
   131  		jxr_encoder_delete(p);
   132  		return jxr_false;
   133  	}
   134  
   135  	jxr_encoder_delete(p);
   136  	return jxr_true;
   137  }
   138