00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <string.h>
00023 #include "flgrCoreData.h"
00024 #include "flgrCoreDispatch.h"
00025 #include "flgrCoreIO.h"
00026 #include "flgrCoreSampling.h"
00027
00035
00036
00037 #define FLGR_MACRO_DOWNSAMPLE_1D(dtype) \
00038 dtype *dest = (dtype*) datdest->array; \
00039 dtype *src = (dtype*) datsrc->array; \
00040 dtype val; \
00041 int i,k,l,m,x; \
00042 int spp = datsrc->spp; \
00043 int length = datsrc->length*spp; \
00044 \
00045 for(i=0,m=0 ; i<length ; i+=factor*spp,m+=spp) { \
00046 for(x=0,k=i,l=m ; x<datsrc->spp ; x++,k++,l++) { \
00047 val = flgr_get_array_##dtype(src,k); \
00048 flgr_set_array_##dtype(dest,l,val); \
00049 } \
00050 } \
00051 \
00052 return
00053
00054
00055
00056 void flgr1d_downsample_fgBIT(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00057 FLGR_MACRO_DOWNSAMPLE_1D(fgBIT);
00058 }
00059 void flgr1d_downsample_fgUINT8(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00060 FLGR_MACRO_DOWNSAMPLE_1D(fgUINT8);
00061 }
00062 void flgr1d_downsample_fgUINT16(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00063 FLGR_MACRO_DOWNSAMPLE_1D(fgUINT16);
00064 }
00065 void flgr1d_downsample_fgUINT32(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00066 FLGR_MACRO_DOWNSAMPLE_1D(fgUINT32);
00067 }
00068 void flgr1d_downsample_fgINT8(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00069 FLGR_MACRO_DOWNSAMPLE_1D(fgINT8);
00070 }
00071 void flgr1d_downsample_fgINT16(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00072 FLGR_MACRO_DOWNSAMPLE_1D(fgINT16);
00073 }
00074 void flgr1d_downsample_fgINT32(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00075 FLGR_MACRO_DOWNSAMPLE_1D(fgINT32);
00076 }
00077 void flgr1d_downsample_fgFLOAT32(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00078 FLGR_MACRO_DOWNSAMPLE_1D(fgFLOAT32);
00079 }
00080 void flgr1d_downsample_fgFLOAT64(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00081 FLGR_MACRO_DOWNSAMPLE_1D(fgFLOAT64);
00082 }
00083
00084
00086
00092
00093 FLGR_Ret flgr1d_downsample(FLGR_Data1D *datdest, FLGR_Data1D *datsrc, int factor) {
00094 FLGR_Ret ret;
00095
00096
00097
00098 if((datdest==NULL) || (datsrc==NULL)) {
00099 POST_ERROR("Null objects!\n");
00100 return FLGR_RET_NULL_OBJECT;
00101 }
00102
00103 if( (ret=flgr1d_is_data_same_type(datsrc,datdest)) != FLGR_RET_OK ) {
00104 POST_ERROR("src and destination have different or illegal types");
00105 return ret;
00106 }
00107
00108 if( (ret=flgr1d_is_data_same_spp(datsrc,datdest)) != FLGR_RET_OK ) {
00109 POST_ERROR("src and destination have different sample per pixels");
00110 return ret;
00111 }
00112
00113 if( ((datsrc->length)/factor) != datdest->length ) {
00114 POST_ERROR("src does not fit in dest\n");
00115 return FLGR_RET_SIZE_ERROR;
00116 }
00117
00118 FLGR_DISPATCH_PROCEDURE(datsrc->type,flgr1d_downsample,datdest,datsrc,factor);
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128 #define FLGR_MACRO_DOWNSAMPLE_2D(dtype) \
00129 int i; \
00130 FLGR_Data1D **dest = datdest->row; \
00131 FLGR_Data1D **src = datsrc->row; \
00132 \
00133 \
00134 for(i=0 ; i<datsrc->size_y ; i+=factor_y) { \
00135 flgr1d_downsample_##dtype(*dest,*src,factor_x); \
00136 dest++; src+=factor_y; \
00137 } \
00138 \
00139 return
00140
00141
00142
00143 void flgr2d_downsample_fgBIT(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00144 FLGR_MACRO_DOWNSAMPLE_2D(fgBIT);
00145 }
00146 void flgr2d_downsample_fgUINT8(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00147 FLGR_MACRO_DOWNSAMPLE_2D(fgUINT8);
00148 }
00149 void flgr2d_downsample_fgUINT16(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00150 FLGR_MACRO_DOWNSAMPLE_2D(fgUINT16);
00151 }
00152 void flgr2d_downsample_fgUINT32(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00153 FLGR_MACRO_DOWNSAMPLE_2D(fgUINT32);
00154 }
00155 void flgr2d_downsample_fgINT8(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00156 FLGR_MACRO_DOWNSAMPLE_2D(fgINT8);
00157 }
00158 void flgr2d_downsample_fgINT16(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00159 FLGR_MACRO_DOWNSAMPLE_2D(fgINT16);
00160 }
00161 void flgr2d_downsample_fgINT32(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00162 FLGR_MACRO_DOWNSAMPLE_2D(fgINT32);
00163 }
00164 void flgr2d_downsample_fgFLOAT32(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00165 FLGR_MACRO_DOWNSAMPLE_2D(fgFLOAT32);
00166 }
00167 void flgr2d_downsample_fgFLOAT64(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00168 FLGR_MACRO_DOWNSAMPLE_2D(fgFLOAT64);
00169 }
00170
00171
00173
00180
00181 FLGR_Ret flgr2d_downsample(FLGR_Data2D *datdest, FLGR_Data2D *datsrc, int factor_x, int factor_y) {
00182 FLGR_Ret ret;
00183
00184
00185
00186 if((datdest==NULL) || (datsrc==NULL)) {
00187 POST_ERROR("Null objects!\n");
00188 return FLGR_RET_NULL_OBJECT;
00189 }
00190
00191 if( (ret=flgr2d_is_data_same_type(datsrc,datdest)) != FLGR_RET_OK ) {
00192 POST_ERROR("src and destination have different or illegal types");
00193 return ret;
00194 }
00195
00196 if( (ret=flgr2d_is_data_same_spp(datsrc,datdest)) != FLGR_RET_OK ) {
00197 POST_ERROR("src and destination have different sample per pixels");
00198 return ret;
00199 }
00200
00201 if( ((datsrc->size_x)/factor_x) != datdest->size_x ) {
00202 POST_ERROR("src does not fit in dest\n");
00203 return FLGR_RET_SIZE_ERROR;
00204 }
00205
00206 if( ((datsrc->size_y)/factor_y) != datdest->size_y ) {
00207 POST_ERROR("src does not fit in dest\n");
00208 return FLGR_RET_SIZE_ERROR;
00209 }
00210
00211 FLGR_DISPATCH_PROCEDURE(datsrc->type,flgr2d_downsample,datdest,datsrc,factor_x,factor_y);
00212 }
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00229
00230
00231
00232
00233