From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> --- server/Makefile.am | 2 +- server/red_bitmap_utils.h | 157 ----------------------------------------- server/red_bitmap_utils_tmpl.c | 157 +++++++++++++++++++++++++++++++++++++++++ server/red_worker.c | 6 +- 4 files changed, 161 insertions(+), 161 deletions(-) delete mode 100644 server/red_bitmap_utils.h create mode 100644 server/red_bitmap_utils_tmpl.c diff --git a/server/Makefile.am b/server/Makefile.am index 19ff3c8..dc2fbc5 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -85,7 +85,6 @@ libspice_server_la_SOURCES = \ main_channel.h \ mjpeg_encoder.c \ mjpeg_encoder.h \ - red_bitmap_utils.h \ red_channel.c \ red_channel.h \ red_common.h \ @@ -149,6 +148,7 @@ libspice_server_la_SOURCES += \ endif EXTRA_DIST = \ + red_bitmap_utils_tmpl.c \ cache_item.tmpl.c \ glz_encode_match_tmpl.c \ glz_encode_tmpl.c \ diff --git a/server/red_bitmap_utils.h b/server/red_bitmap_utils.h deleted file mode 100644 index df13c81..0000000 --- a/server/red_bitmap_utils.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - Copyright (C) 2009 Red Hat, Inc. - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see <http://www.gnu.org/licenses/>. -*/ - -#ifdef RED_BITMAP_UTILS_RGB16 -#define PIXEL rgb16_pixel_t -#define FNAME(name) name##_rgb16 -#define GET_r(pix) (((pix) >> 10) & 0x1f) -#define GET_g(pix) (((pix) >> 5) & 0x1f) -#define GET_b(pix) ((pix) & 0x1f) -#endif - -#if defined(RED_BITMAP_UTILS_RGB24) || defined(RED_BITMAP_UTILS_RGB32) -#define GET_r(pix) ((pix).r) -#define GET_g(pix) ((pix).g) -#define GET_b(pix) ((pix).b) -#endif - -#ifdef RED_BITMAP_UTILS_RGB24 -#define PIXEL rgb24_pixel_t -#define FNAME(name) name##_rgb24 -#endif - -#ifdef RED_BITMAP_UTILS_RGB32 -#define PIXEL rgb32_pixel_t -#define FNAME(name) name##_rgb32 -#endif - - -#define SAME_PIXEL_WEIGHT 0.5 -#define NOT_CONTRAST_PIXELS_WEIGHT -0.25 -#define CONTRAST_PIXELS_WEIGHT 1.0 - -#ifndef RED_BITMAP_UTILS_RGB16 -#define CONTRAST_TH 60 -#else -#define CONTRAST_TH 8 -#endif -#define CONTRASTING(n) ((n) <= -CONTRAST_TH || (n) >= CONTRAST_TH) - - -#define SAMPLE_JUMP 15 - -static const double FNAME(PIX_PAIR_SCORE)[] = { - SAME_PIXEL_WEIGHT, - CONTRAST_PIXELS_WEIGHT, - NOT_CONTRAST_PIXELS_WEIGHT, -}; - -// return 0 - equal, 1 - for contrast, 2 for no contrast (PIX_PAIR_SCORE is defined accordingly) -static inline int FNAME(pixelcmp)(PIXEL p1, PIXEL p2) -{ - int diff, any_different; - - diff = GET_r(p1) - GET_r(p2); - any_different = diff; - if (CONTRASTING(diff)) { - return 1; - } - - diff = GET_g(p1) - GET_g(p2); - any_different |= diff; - if (CONTRASTING(diff)) { - return 1; - } - - diff = GET_b(p1) - GET_b(p2); - any_different |= diff; - if (CONTRASTING(diff)) { - return 1; - } - - if (!any_different) { - return 0; - } else { - return 2; - } -} - -static inline double FNAME(pixels_square_score)(PIXEL *line1, PIXEL *line2) -{ - double ret; - int any_different = 0; - int cmp_res; - cmp_res = FNAME(pixelcmp)(*line1, line1[1]); - any_different |= cmp_res; - ret = FNAME(PIX_PAIR_SCORE)[cmp_res]; - cmp_res = FNAME(pixelcmp)(*line1, *line2); - any_different |= cmp_res; - ret += FNAME(PIX_PAIR_SCORE)[cmp_res]; - cmp_res = FNAME(pixelcmp)(*line1, line2[1]); - any_different |= cmp_res; - ret += FNAME(PIX_PAIR_SCORE)[cmp_res]; - - // ignore squares where all pixels are identical - if (!any_different) { - ret = 0; - } - - return ret; -} - -static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_lines, - double *o_samples_sum_score, int *o_num_samples) -{ - int jump = (SAMPLE_JUMP % width) ? SAMPLE_JUMP : SAMPLE_JUMP - 1; - PIXEL *cur_pix = lines + width / 2; - PIXEL *bottom_pix; - PIXEL *last_line = lines + (num_lines - 1) * width; - - if ((width <= 1) || (num_lines <= 1)) { - *o_num_samples = 1; - *o_samples_sum_score = 1.0; - return; - } - - *o_samples_sum_score = 0; - *o_num_samples = 0; - - while (cur_pix < last_line) { - if ((cur_pix + 1 - lines) % width == 0) { // last pixel in the row - cur_pix--; // jump is bigger than 1 so we will not enter endless loop - } - bottom_pix = cur_pix + width; - (*o_samples_sum_score) += FNAME(pixels_square_score)(cur_pix, bottom_pix); - (*o_num_samples)++; - cur_pix += jump; - } - - (*o_num_samples) *= 3; -} - -#undef PIXEL -#undef FNAME -#undef GET_r -#undef GET_g -#undef GET_b -#undef RED_BITMAP_UTILS_RGB16 -#undef RED_BITMAP_UTILS_RGB24 -#undef RED_BITMAP_UTILS_RGB32 -#undef SAMPLE_JUMP -#undef CONTRAST_TH -#undef SAME_PIXEL_WEIGHT -#undef NOT_CONTRAST_PIXELS_WEIGHT diff --git a/server/red_bitmap_utils_tmpl.c b/server/red_bitmap_utils_tmpl.c new file mode 100644 index 0000000..df13c81 --- /dev/null +++ b/server/red_bitmap_utils_tmpl.c @@ -0,0 +1,157 @@ +/* + Copyright (C) 2009 Red Hat, Inc. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, see <http://www.gnu.org/licenses/>. +*/ + +#ifdef RED_BITMAP_UTILS_RGB16 +#define PIXEL rgb16_pixel_t +#define FNAME(name) name##_rgb16 +#define GET_r(pix) (((pix) >> 10) & 0x1f) +#define GET_g(pix) (((pix) >> 5) & 0x1f) +#define GET_b(pix) ((pix) & 0x1f) +#endif + +#if defined(RED_BITMAP_UTILS_RGB24) || defined(RED_BITMAP_UTILS_RGB32) +#define GET_r(pix) ((pix).r) +#define GET_g(pix) ((pix).g) +#define GET_b(pix) ((pix).b) +#endif + +#ifdef RED_BITMAP_UTILS_RGB24 +#define PIXEL rgb24_pixel_t +#define FNAME(name) name##_rgb24 +#endif + +#ifdef RED_BITMAP_UTILS_RGB32 +#define PIXEL rgb32_pixel_t +#define FNAME(name) name##_rgb32 +#endif + + +#define SAME_PIXEL_WEIGHT 0.5 +#define NOT_CONTRAST_PIXELS_WEIGHT -0.25 +#define CONTRAST_PIXELS_WEIGHT 1.0 + +#ifndef RED_BITMAP_UTILS_RGB16 +#define CONTRAST_TH 60 +#else +#define CONTRAST_TH 8 +#endif +#define CONTRASTING(n) ((n) <= -CONTRAST_TH || (n) >= CONTRAST_TH) + + +#define SAMPLE_JUMP 15 + +static const double FNAME(PIX_PAIR_SCORE)[] = { + SAME_PIXEL_WEIGHT, + CONTRAST_PIXELS_WEIGHT, + NOT_CONTRAST_PIXELS_WEIGHT, +}; + +// return 0 - equal, 1 - for contrast, 2 for no contrast (PIX_PAIR_SCORE is defined accordingly) +static inline int FNAME(pixelcmp)(PIXEL p1, PIXEL p2) +{ + int diff, any_different; + + diff = GET_r(p1) - GET_r(p2); + any_different = diff; + if (CONTRASTING(diff)) { + return 1; + } + + diff = GET_g(p1) - GET_g(p2); + any_different |= diff; + if (CONTRASTING(diff)) { + return 1; + } + + diff = GET_b(p1) - GET_b(p2); + any_different |= diff; + if (CONTRASTING(diff)) { + return 1; + } + + if (!any_different) { + return 0; + } else { + return 2; + } +} + +static inline double FNAME(pixels_square_score)(PIXEL *line1, PIXEL *line2) +{ + double ret; + int any_different = 0; + int cmp_res; + cmp_res = FNAME(pixelcmp)(*line1, line1[1]); + any_different |= cmp_res; + ret = FNAME(PIX_PAIR_SCORE)[cmp_res]; + cmp_res = FNAME(pixelcmp)(*line1, *line2); + any_different |= cmp_res; + ret += FNAME(PIX_PAIR_SCORE)[cmp_res]; + cmp_res = FNAME(pixelcmp)(*line1, line2[1]); + any_different |= cmp_res; + ret += FNAME(PIX_PAIR_SCORE)[cmp_res]; + + // ignore squares where all pixels are identical + if (!any_different) { + ret = 0; + } + + return ret; +} + +static void FNAME(compute_lines_gradual_score)(PIXEL *lines, int width, int num_lines, + double *o_samples_sum_score, int *o_num_samples) +{ + int jump = (SAMPLE_JUMP % width) ? SAMPLE_JUMP : SAMPLE_JUMP - 1; + PIXEL *cur_pix = lines + width / 2; + PIXEL *bottom_pix; + PIXEL *last_line = lines + (num_lines - 1) * width; + + if ((width <= 1) || (num_lines <= 1)) { + *o_num_samples = 1; + *o_samples_sum_score = 1.0; + return; + } + + *o_samples_sum_score = 0; + *o_num_samples = 0; + + while (cur_pix < last_line) { + if ((cur_pix + 1 - lines) % width == 0) { // last pixel in the row + cur_pix--; // jump is bigger than 1 so we will not enter endless loop + } + bottom_pix = cur_pix + width; + (*o_samples_sum_score) += FNAME(pixels_square_score)(cur_pix, bottom_pix); + (*o_num_samples)++; + cur_pix += jump; + } + + (*o_num_samples) *= 3; +} + +#undef PIXEL +#undef FNAME +#undef GET_r +#undef GET_g +#undef GET_b +#undef RED_BITMAP_UTILS_RGB16 +#undef RED_BITMAP_UTILS_RGB24 +#undef RED_BITMAP_UTILS_RGB32 +#undef SAMPLE_JUMP +#undef CONTRAST_TH +#undef SAME_PIXEL_WEIGHT +#undef NOT_CONTRAST_PIXELS_WEIGHT diff --git a/server/red_worker.c b/server/red_worker.c index 3aa05d8..0568cdf 100644 --- a/server/red_worker.c +++ b/server/red_worker.c @@ -5142,11 +5142,11 @@ G_STATIC_ASSERT(sizeof(rgb24_pixel_t) == 3); typedef uint16_t rgb16_pixel_t; #define RED_BITMAP_UTILS_RGB16 -#include "red_bitmap_utils.h" +#include "red_bitmap_utils_tmpl.c" #define RED_BITMAP_UTILS_RGB24 -#include "red_bitmap_utils.h" +#include "red_bitmap_utils_tmpl.c" #define RED_BITMAP_UTILS_RGB32 -#include "red_bitmap_utils.h" +#include "red_bitmap_utils_tmpl.c" #define GRADUAL_HIGH_RGB24_TH -0.03 #define GRADUAL_HIGH_RGB16_TH 0 -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel