- if(config.mode == AffineEngine::STRETCH)
- {
-#define RESAMPLE(type, components, chroma_offset) \
-{ \
- for(int i = 0; i < h; i++) \
- { \
- type *out_row = (type*)output->get_rows()[i]; \
- type *in_row1 = (type*)temp->get_rows()[i * AFFINE_OVERSAMPLE]; \
- type *in_row2 = (type*)temp->get_rows()[i * AFFINE_OVERSAMPLE + 1]; \
- for(int j = 0; j < w; j++) \
- { \
- out_row[0] = (in_row1[0] + \
- in_row1[components] + \
- in_row2[0] + \
- in_row2[components]) / \
- AFFINE_OVERSAMPLE / \
- AFFINE_OVERSAMPLE; \
- out_row[1] = ((in_row1[1] + \
- in_row1[components + 1] + \
- in_row2[1] + \
- in_row2[components + 1]) - \
- chroma_offset * \
- AFFINE_OVERSAMPLE * \
- AFFINE_OVERSAMPLE) / \
- AFFINE_OVERSAMPLE / \
- AFFINE_OVERSAMPLE + \
- chroma_offset; \
- out_row[2] = ((in_row1[2] + \
- in_row1[components + 2] + \
- in_row2[2] + \
- in_row2[components + 2]) - \
- chroma_offset * \
- AFFINE_OVERSAMPLE * \
- AFFINE_OVERSAMPLE) / \
- AFFINE_OVERSAMPLE / \
- AFFINE_OVERSAMPLE + \
- chroma_offset; \
- if(components == 4) \
- { \
- out_row[3] = (in_row1[3] + \
- in_row1[components + 3] + \
- in_row2[3] + \
- in_row2[components + 3]) / \
- AFFINE_OVERSAMPLE / \
- AFFINE_OVERSAMPLE; \
- } \
- out_row += components; \
- in_row1 += components * AFFINE_OVERSAMPLE; \
- in_row2 += components * AFFINE_OVERSAMPLE; \
- } \
- } \
-}
-
- switch(frame->get_color_model())
- {
- case BC_RGB_FLOAT:
- RESAMPLE(float, 3, 0)
- break;
- case BC_RGB888:
- RESAMPLE(unsigned char, 3, 0)
- break;
- case BC_RGBA_FLOAT:
- RESAMPLE(float, 4, 0)
- break;
- case BC_RGBA8888:
- RESAMPLE(unsigned char, 4, 0)
- break;
- case BC_YUV888:
- RESAMPLE(unsigned char, 3, 0x80)
- break;
- case BC_YUVA8888:
- RESAMPLE(unsigned char, 4, 0x80)
- break;
- case BC_RGB161616:
- RESAMPLE(uint16_t, 3, 0)
- break;
- case BC_RGBA16161616:
- RESAMPLE(uint16_t, 4, 0)
- break;
- case BC_YUV161616:
- RESAMPLE(uint16_t, 3, 0x8000)
- break;
- case BC_YUVA16161616:
- RESAMPLE(uint16_t, 4, 0x8000)
- break;
+ if( config.mode == AffineEngine::STRETCH ) {
+
+#define RESAMPLE(tag, type, components, chroma_offset) \
+case tag: { \
+ int os = AFFINE_OVERSAMPLE, os2 = os*os; \
+ for( int i=0; i<h; ++i ) { \
+ type *out_row = (type*)output->get_rows()[i]; \
+ type *in_row1 = (type*)temp->get_rows()[i * os]; \
+ type *in_row2 = (type*)temp->get_rows()[i * os + 1]; \
+ for( int j=0; j<w; ++j ) { \
+ out_row[0] = \
+ ( in_row1[0] + in_row1[components + 0] + \
+ in_row2[0] + in_row2[components + 0] ) / os2; \
+ out_row[1] = \
+ ( in_row1[1] + in_row1[components + 1] + \
+ in_row2[1] + in_row2[components + 1] ) / os2; \
+ out_row[2] = \
+ ( in_row1[2] + in_row1[components + 2] + \
+ in_row2[2] + in_row2[components + 2] ) / os2; \
+ if( components == 4 ) { \
+ out_row[3] = \
+ ( in_row1[3] + in_row1[components + 3] + \
+ in_row2[3] + in_row2[components + 3] ) / os2; \
+ } \
+ out_row += components; \
+ in_row1 += components * os; \
+ in_row2 += components * os; \
+ } \
+ } \
+} break
+
+ switch( frame->get_color_model() ) {
+ RESAMPLE( BC_RGB_FLOAT, float, 3, 0 );
+ RESAMPLE( BC_RGB888, unsigned char, 3, 0 );
+ RESAMPLE( BC_RGBA_FLOAT, float, 4, 0 );
+ RESAMPLE( BC_RGBA8888, unsigned char, 4, 0 );
+ RESAMPLE( BC_YUV888, unsigned char, 3, 0x80 );
+ RESAMPLE( BC_YUVA8888, unsigned char, 4, 0x80 );
+ RESAMPLE( BC_RGB161616, uint16_t, 3, 0 );
+ RESAMPLE( BC_RGBA16161616, uint16_t, 4, 0 );
+ RESAMPLE( BC_YUV161616, uint16_t, 3, 0x8000 );
+ RESAMPLE( BC_YUVA16161616, uint16_t, 4, 0x8000 );