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