1 /*
2  * jcext.c
3  *
4  * Copyright (C) 2014, D. R. Commander.
5  * Copyright (C) 2014, Mozilla Corporation.
6  * For conditions of distribution and use, see the accompanying README file.
7  *
8  * This file contains accessor functions for extension parameters.  These
9  * allow for extending the functionality of the libjpeg API without breaking
10  * backward ABI compatibility.
11  */
12 
13 #define JPEG_INTERNALS
14 #include "jinclude.h"
15 #include "jpeglib.h"
16 
17 
18 GLOBAL(boolean)
jpeg_c_bool_param_supported(const j_compress_ptr cinfo,J_BOOLEAN_PARAM param)19 jpeg_c_bool_param_supported (const j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
20 {
21   switch (param) {
22   case JBOOLEAN_OPTIMIZE_SCANS:
23   case JBOOLEAN_TRELLIS_QUANT:
24   case JBOOLEAN_TRELLIS_QUANT_DC:
25   case JBOOLEAN_TRELLIS_EOB_OPT:
26   case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
27   case JBOOLEAN_USE_SCANS_IN_TRELLIS:
28   case JBOOLEAN_TRELLIS_Q_OPT:
29   case JBOOLEAN_OVERSHOOT_DERINGING:
30     return TRUE;
31   }
32 
33   return FALSE;
34 }
35 
36 
37 GLOBAL(void)
jpeg_c_set_bool_param(j_compress_ptr cinfo,J_BOOLEAN_PARAM param,boolean value)38 jpeg_c_set_bool_param (j_compress_ptr cinfo, J_BOOLEAN_PARAM param,
39                        boolean value)
40 {
41   switch(param) {
42   case JBOOLEAN_OPTIMIZE_SCANS:
43     cinfo->master->optimize_scans = value;
44     break;
45   case JBOOLEAN_TRELLIS_QUANT:
46     cinfo->master->trellis_quant = value;
47     break;
48   case JBOOLEAN_TRELLIS_QUANT_DC:
49     cinfo->master->trellis_quant_dc = value;
50     break;
51   case JBOOLEAN_TRELLIS_EOB_OPT:
52     cinfo->master->trellis_eob_opt = value;
53     break;
54   case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
55     cinfo->master->use_lambda_weight_tbl = value;
56     break;
57   case JBOOLEAN_USE_SCANS_IN_TRELLIS:
58     cinfo->master->use_scans_in_trellis = value;
59     break;
60   case JBOOLEAN_TRELLIS_Q_OPT:
61     cinfo->master->trellis_q_opt = value;
62     break;
63   case JBOOLEAN_OVERSHOOT_DERINGING:
64     cinfo->master->overshoot_deringing = value;
65     break;
66   default:
67     ERREXIT(cinfo, JERR_BAD_PARAM);
68   }
69 }
70 
71 
72 GLOBAL(boolean)
jpeg_c_get_bool_param(const j_compress_ptr cinfo,J_BOOLEAN_PARAM param)73 jpeg_c_get_bool_param (const j_compress_ptr cinfo, J_BOOLEAN_PARAM param)
74 {
75   switch(param) {
76   case JBOOLEAN_OPTIMIZE_SCANS:
77     return cinfo->master->optimize_scans;
78   case JBOOLEAN_TRELLIS_QUANT:
79     return cinfo->master->trellis_quant;
80   case JBOOLEAN_TRELLIS_QUANT_DC:
81     return cinfo->master->trellis_quant_dc;
82   case JBOOLEAN_TRELLIS_EOB_OPT:
83     return cinfo->master->trellis_eob_opt;
84   case JBOOLEAN_USE_LAMBDA_WEIGHT_TBL:
85     return cinfo->master->use_lambda_weight_tbl;
86   case JBOOLEAN_USE_SCANS_IN_TRELLIS:
87     return cinfo->master->use_scans_in_trellis;
88   case JBOOLEAN_TRELLIS_Q_OPT:
89     return cinfo->master->trellis_q_opt;
90   case JBOOLEAN_OVERSHOOT_DERINGING:
91     return cinfo->master->overshoot_deringing;
92   default:
93     ERREXIT(cinfo, JERR_BAD_PARAM);
94   }
95 
96   return FALSE;
97 }
98 
99 
100 GLOBAL(boolean)
jpeg_c_float_param_supported(const j_compress_ptr cinfo,J_FLOAT_PARAM param)101 jpeg_c_float_param_supported (const j_compress_ptr cinfo, J_FLOAT_PARAM param)
102 {
103   switch (param) {
104   case JFLOAT_LAMBDA_LOG_SCALE1:
105   case JFLOAT_LAMBDA_LOG_SCALE2:
106   case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
107     return TRUE;
108   }
109 
110   return FALSE;
111 }
112 
113 
114 GLOBAL(void)
jpeg_c_set_float_param(j_compress_ptr cinfo,J_FLOAT_PARAM param,float value)115 jpeg_c_set_float_param (j_compress_ptr cinfo, J_FLOAT_PARAM param, float value)
116 {
117   switch (param) {
118   case JFLOAT_LAMBDA_LOG_SCALE1:
119     cinfo->master->lambda_log_scale1 = value;
120     break;
121   case JFLOAT_LAMBDA_LOG_SCALE2:
122     cinfo->master->lambda_log_scale2 = value;
123     break;
124   case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
125     cinfo->master->trellis_delta_dc_weight = value;
126     break;
127   default:
128     ERREXIT(cinfo, JERR_BAD_PARAM);
129   }
130 }
131 
132 
133 GLOBAL(float)
jpeg_c_get_float_param(const j_compress_ptr cinfo,J_FLOAT_PARAM param)134 jpeg_c_get_float_param (const j_compress_ptr cinfo, J_FLOAT_PARAM param)
135 {
136   switch (param) {
137   case JFLOAT_LAMBDA_LOG_SCALE1:
138     return cinfo->master->lambda_log_scale1;
139   case JFLOAT_LAMBDA_LOG_SCALE2:
140     return cinfo->master->lambda_log_scale2;
141   case JFLOAT_TRELLIS_DELTA_DC_WEIGHT:
142     return cinfo->master->trellis_delta_dc_weight;
143   default:
144     ERREXIT(cinfo, JERR_BAD_PARAM);
145   }
146 
147   return -1;
148 }
149 
150 
151 GLOBAL(boolean)
jpeg_c_int_param_supported(const j_compress_ptr cinfo,J_INT_PARAM param)152 jpeg_c_int_param_supported (const j_compress_ptr cinfo, J_INT_PARAM param)
153 {
154   switch (param) {
155   case JINT_COMPRESS_PROFILE:
156   case JINT_TRELLIS_FREQ_SPLIT:
157   case JINT_TRELLIS_NUM_LOOPS:
158   case JINT_BASE_QUANT_TBL_IDX:
159   case JINT_DC_SCAN_OPT_MODE:
160     return TRUE;
161   }
162 
163   return FALSE;
164 }
165 
166 
167 GLOBAL(void)
jpeg_c_set_int_param(j_compress_ptr cinfo,J_INT_PARAM param,int value)168 jpeg_c_set_int_param (j_compress_ptr cinfo, J_INT_PARAM param, int value)
169 {
170   switch (param) {
171   case JINT_COMPRESS_PROFILE:
172     switch (value) {
173     case JCP_MAX_COMPRESSION:
174     case JCP_FASTEST:
175       cinfo->master->compress_profile = value;
176       break;
177     default:
178       ERREXIT(cinfo, JERR_BAD_PARAM_VALUE);
179     }
180     break;
181   case JINT_TRELLIS_FREQ_SPLIT:
182     cinfo->master->trellis_freq_split = value;
183     break;
184   case JINT_TRELLIS_NUM_LOOPS:
185     cinfo->master->trellis_num_loops = value;
186     break;
187   case JINT_BASE_QUANT_TBL_IDX:
188     if (value >= 0 && value <= 8)
189       cinfo->master->quant_tbl_master_idx = value;
190     break;
191   case JINT_DC_SCAN_OPT_MODE:
192     cinfo->master->dc_scan_opt_mode = value;
193     break;
194   default:
195     ERREXIT(cinfo, JERR_BAD_PARAM);
196   }
197 }
198 
199 
200 GLOBAL(int)
jpeg_c_get_int_param(const j_compress_ptr cinfo,J_INT_PARAM param)201 jpeg_c_get_int_param (const j_compress_ptr cinfo, J_INT_PARAM param)
202 {
203   switch (param) {
204   case JINT_COMPRESS_PROFILE:
205     return cinfo->master->compress_profile;
206   case JINT_TRELLIS_FREQ_SPLIT:
207     return cinfo->master->trellis_freq_split;
208   case JINT_TRELLIS_NUM_LOOPS:
209     return cinfo->master->trellis_num_loops;
210   case JINT_BASE_QUANT_TBL_IDX:
211     return cinfo->master->quant_tbl_master_idx;
212   case JINT_DC_SCAN_OPT_MODE:
213     return cinfo->master->dc_scan_opt_mode;
214   default:
215     ERREXIT(cinfo, JERR_BAD_PARAM);
216   }
217 
218   return -1;
219 }
220