From 6a613907160ad9253e2f680b0839ebc6d566ef98 Mon Sep 17 00:00:00 2001 From: Carlo Baldassi Date: Sun, 19 Apr 2009 20:30:32 +0200 Subject: [PATCH] Removed nrg builtin functions --- lqr/lqr_carver.c | 25 +------- lqr/lqr_carver_priv.h | 1 - lqr/lqr_energy.c | 135 ++++++++++++-------------------------------- lqr/lqr_energy_buffer.c | 14 +++++ lqr/lqr_energy_buffer_pub.h | 3 + lqr/lqr_energy_priv.h | 29 +--------- 6 files changed, 56 insertions(+), 151 deletions(-) diff --git a/lqr/lqr_carver.c b/lqr/lqr_carver.c index e9f2fa6..3bf700e 100644 --- a/lqr/lqr_carver.c +++ b/lqr/lqr_carver.c @@ -83,7 +83,6 @@ LqrCarver * lqr_carver_new_common (gint width, gint height, gint channels) r->w_start = r->w; r->h_start = r->h; - TRY_N_N (r->nrg_builtin = g_try_new (LqrEnergyBuiltin, 1)); r->nrg_buffer = NULL; lqr_carver_set_energy_function_builtin(r, LQR_EF_GRAD_XABS); @@ -164,8 +163,6 @@ lqr_carver_destroy (LqrCarver * r) g_free (r->bias); g_free (r->m); g_free (r->least); - g_free (r->nrg_builtin); - lqr_cursor_destroy (r->c); g_free (r->vpath); g_free (r->vpath_x); @@ -494,26 +491,10 @@ lqr_carver_compute_e (LqrCarver * r, gint x, gint y) { gint data; - /* gfloat ena, enb; */ - data = r->raw[y][x]; - if (r->nrg_builtin_flag) - { - r->en[data] = r->nrg_builtin->ef(r, x, y) + r->bias[data] / r->w_start; - } - else - { - CATCH (lqr_energy_buffer_fill (r->nrg_buffer, r, x, y)); - r->en[data] = r->nrg(x, y, r->w, r->h, r->nrg_buffer, r->nrg_extra_data) + r->bias[data] / r->w_start; - /* - ena = r->nrg(x, y, r->w, r->h, r->nrg_buffer, r->nrg_extra_data); - enb = r->nrg_builtin->ef(r, x, y); - if (fabs(ena - enb) > 1e-10) { - printf("x,y=%i,%i ena=%g enb=%g diff=%g\n", x, y, ena, enb, ena - enb); fflush(stdout); - } - */ - } + CATCH (lqr_energy_buffer_fill (r->nrg_buffer, r, x, y)); + r->en[data] = r->nrg(x, y, r->w, r->h, r->nrg_buffer, r->nrg_extra_data) + r->bias[data] / r->w_start; return LQR_OK; } @@ -707,7 +688,7 @@ lqr_carver_build_vsmap (LqrCarver * r, gint depth) CATCH (lqr_carver_update_mmap (r)); } } else { - lqr_carver_build_emap (r); + CATCH (lqr_carver_build_emap (r)); CATCH (lqr_carver_build_mmap (r)); } } diff --git a/lqr/lqr_carver_priv.h b/lqr/lqr_carver_priv.h index 5b8bf2f..8e4359c 100644 --- a/lqr/lqr_carver_priv.h +++ b/lqr/lqr_carver_priv.h @@ -233,7 +233,6 @@ struct _LqrCarver LqrProgress * progress; /* pointer to progress update functions */ gboolean nrg_builtin_flag; /* flag to determine if the energy function used is builtin */ - LqrEnergyBuiltin *nrg_builtin; /* pointer to a builtin energy function class */ LqrEnergyFunc nrg; /* pointer to a general energy function */ gint nrg_radius; /* energy function radius */ LqrEnergyBuffer * nrg_buffer; /* energy buffer */ diff --git a/lqr/lqr_energy.c b/lqr/lqr_energy.c index 684a1a4..29639c5 100644 --- a/lqr/lqr_energy.c +++ b/lqr/lqr_energy.c @@ -348,81 +348,52 @@ lqr_carver_read_luma_abs (LqrCarver * r, gint x1, gint y1, gint x2, gint y2) } #endif - -/* compute energy at x, y */ gfloat -lqr_energy_builtin (LqrCarver * r, gint x, gint y) +lqr_energy_builtin_grad_all (gint x, gint y, gint img_width, gint img_height, LqrEnergyBuffer * ebuffer, LqrGradFunc gf) { gfloat gx, gy; - if (y == 0) - { - gy = r->nrg_builtin->rf(r, x, y + 1) - r->nrg_builtin->rf(r, x, y); - } - else if (y < r->h - 1) - { - gy = (r->nrg_builtin->rf(r, x, y + 1) - r->nrg_builtin->rf(r, x, y - 1)) / 2; - } - else - { - gy = r->nrg_builtin->rf(r, x, y) - r->nrg_builtin->rf(r, x, y - 1); - } + gfloat (*bread_func) (LqrEnergyBuffer *, gint, gint); - if (x == 0) + switch (lqr_energy_buffer_get_read_t(ebuffer)) { - gx = r->nrg_builtin->rf (r, x + 1, y) - r->nrg_builtin->rf (r, x, y); - } - else if (x < r->w - 1) - { - gx = (r->nrg_builtin->rf(r, x + 1, y) - r->nrg_builtin->rf(r, x - 1, y)) / 2; - } - else - { - gx = r->nrg_builtin->rf(r, x, y) - r->nrg_builtin->rf(r, x - 1, y); + case LQR_ER_BRIGHT: + bread_func = lqr_energy_buffer_read_bright; + break; + case LQR_ER_LUMA: + bread_func = lqr_energy_buffer_read_luma; + break; + default: +#ifdef __LQR_DEBUG__ + assert(0); +#endif /* __LQR_DEBUG__ */ + return 0; } - return r->nrg_builtin->gf(gx, gy); -} - -gfloat -lqr_energy_null (LqrCarver * r, gint x, gint y) -{ - return 0; -} - -gfloat -lqr_energy_builtin_grad_all (gint x, gint y, gint img_width, gint img_height, LqrEnergyBuffer * ebuffer, LqrGradFunc gf) -{ - gfloat ** buffer_float; - - gfloat gx, gy; - - buffer_float = (gfloat**) (ebuffer->buffer); - if (y == 0) { - gy = buffer_float[0][1] - buffer_float[0][0]; + gy = bread_func(ebuffer, 0, 1) - bread_func(ebuffer, 0, 0); } else if (y < img_height - 1) { - gy = (buffer_float[0][1] - buffer_float[0][-1]) / 2; + gy = (bread_func(ebuffer, 0, 1) - bread_func(ebuffer, 0, -1)) / 2; } else { - gy = buffer_float[0][0] - buffer_float[0][-1]; + gy = bread_func(ebuffer, 0, 0) - bread_func(ebuffer, 0, -1); } if (x == 0) { - gx = buffer_float[1][0] - buffer_float[0][0]; + gx = bread_func(ebuffer, 1, 0) - bread_func(ebuffer, 0, 0); } else if (x < img_width - 1) { - gx = (buffer_float[1][0] - buffer_float[-1][0]) / 2; + gx = (bread_func(ebuffer, 1, 0) - bread_func(ebuffer, -1, 0)) / 2; } else { - gx = buffer_float[0][0] - buffer_float[-1][0]; + gx = bread_func(ebuffer, 0, 0) - bread_func(ebuffer, -1, 0); } return gf(gx, gy); @@ -497,88 +468,52 @@ lqr_carver_set_energy_function_builtin (LqrCarver * r, LqrEnergyFuncBuiltinType switch (ef_ind) { case LQR_EF_GRAD_NORM: - r->nrg_builtin->ef = lqr_energy_builtin; - r->nrg_builtin->rf = lqr_carver_read_brightness; - r->nrg_builtin->gf = lqr_grad_norm; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_grad_norm, 1, LQR_ER_BRIGHT, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_grad_norm, 1, LQR_ER_BRIGHT, NULL)); break; case LQR_EF_GRAD_SUMABS: - r->nrg_builtin->ef = lqr_energy_builtin; - r->nrg_builtin->rf = lqr_carver_read_brightness; - r->nrg_builtin->gf = lqr_grad_sumabs; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_grad_sumabs, 1, LQR_ER_BRIGHT, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_grad_sumabs, 1, LQR_ER_BRIGHT, NULL)); break; case LQR_EF_GRAD_XABS: - r->nrg_builtin->ef = lqr_energy_builtin; - r->nrg_builtin->rf = lqr_carver_read_brightness; - r->nrg_builtin->gf = lqr_grad_xabs; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_grad_xabs, 1, LQR_ER_BRIGHT, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_grad_xabs, 1, LQR_ER_BRIGHT, NULL)); break; case LQR_EF_LUMA_GRAD_NORM: - r->nrg_builtin->ef = lqr_energy_builtin; - r->nrg_builtin->rf = lqr_carver_read_luma; - r->nrg_builtin->gf = lqr_grad_norm; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_grad_norm, 1, LQR_ER_LUMA, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_grad_norm, 1, LQR_ER_LUMA, NULL)); break; case LQR_EF_LUMA_GRAD_SUMABS: - r->nrg_builtin->ef = lqr_energy_builtin; - r->nrg_builtin->rf = lqr_carver_read_luma; - r->nrg_builtin->gf = lqr_grad_sumabs; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_grad_sumabs, 1, LQR_ER_LUMA, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_grad_sumabs, 1, LQR_ER_LUMA, NULL)); break; case LQR_EF_LUMA_GRAD_XABS: - r->nrg_builtin->ef = lqr_energy_builtin; - r->nrg_builtin->rf = lqr_carver_read_luma; - r->nrg_builtin->gf = lqr_grad_xabs; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_grad_xabs, 1, LQR_ER_LUMA, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_grad_xabs, 1, LQR_ER_LUMA, NULL)); break; case LQR_EF_NULL: - r->nrg_builtin->ef = lqr_energy_null; - CATCH (lqr_carver_set_energy_function_priv (r, lqr_energy_builtin_null, 0, LQR_ER_BRIGHT, NULL, TRUE)); + CATCH (lqr_carver_set_energy_function (r, lqr_energy_builtin_null, 0, LQR_ER_BRIGHT, NULL)); break; default: return LQR_ERROR; } - r->nrg_builtin_flag = TRUE; + r->nrg_builtin_flag = TRUE; return LQR_OK; } +LQR_PUBLIC LqrRetVal -lqr_carver_set_energy_function_priv (LqrCarver * r, LqrEnergyFunc en_func, gint radius, - LqrEnergyReaderType reader_type, gpointer extra_data, gboolean builtin) +lqr_carver_set_energy_function (LqrCarver * r, LqrEnergyFunc en_func, gint radius, + LqrEnergyReaderType reader_type, gpointer extra_data) { + CATCH_F (r->root == NULL); + r->nrg = en_func; r->nrg_radius = radius; r->nrg_read_t = reader_type; r->nrg_extra_data = extra_data; - /* builtin = FALSE; */ - - r->nrg_builtin_flag = builtin; + r->nrg_builtin_flag = FALSE; lqr_energy_buffer_destroy (r->nrg_buffer); - if (builtin) - { - r->nrg_buffer = NULL; - } - else - { - r->nrg_buffer = lqr_energy_buffer_new (radius, reader_type); - } - - return LQR_OK; -} - -LQR_PUBLIC -LqrRetVal -lqr_carver_set_energy_function (LqrCarver * r, LqrEnergyFunc en_func, gint radius, LqrEnergyReaderType reader_type, gpointer extra_data) -{ - CATCH_F (r->root == NULL); - - CATCH (lqr_carver_set_energy_function_priv (r, en_func, radius, reader_type, extra_data, FALSE)); + r->nrg_buffer = lqr_energy_buffer_new (radius, reader_type); return LQR_OK; } diff --git a/lqr/lqr_energy_buffer.c b/lqr/lqr_energy_buffer.c index a269d7c..7b41642 100644 --- a/lqr/lqr_energy_buffer.c +++ b/lqr/lqr_energy_buffer.c @@ -305,4 +305,18 @@ lqr_energy_buffer_read_custom (LqrEnergyBuffer * ebuffer, gint x, gint y, gint c return NULL; } +LQR_PUBLIC +LqrEnergyReaderType +lqr_energy_buffer_get_read_t (LqrEnergyBuffer * ebuffer) +{ + return ebuffer->read_t; +} + +LQR_PUBLIC +gint +lqr_energy_buffer_get_radius (LqrEnergyBuffer * ebuffer) +{ + return ebuffer->radius; +} + diff --git a/lqr/lqr_energy_buffer_pub.h b/lqr/lqr_energy_buffer_pub.h index 04c8290..ae08dee 100644 --- a/lqr/lqr_energy_buffer_pub.h +++ b/lqr/lqr_energy_buffer_pub.h @@ -47,5 +47,8 @@ gfloat lqr_energy_buffer_read_luma (LqrEnergyBuffer * ebuffer, gint x, gint y); gfloat lqr_energy_buffer_read_rgba (LqrEnergyBuffer * ebuffer, gint x, gint y, gint channel); void * lqr_energy_buffer_read_custom (LqrEnergyBuffer * ebuffer, gint x, gint y, gint channel); +LqrEnergyReaderType lqr_energy_buffer_get_read_t (LqrEnergyBuffer * ebuffer); +gint lqr_energy_buffer_get_radius (LqrEnergyBuffer * ebuffer); + #endif /* __LQR_ENERGY_BUFFER_PUB_H__ */ diff --git a/lqr/lqr_energy_priv.h b/lqr/lqr_energy_priv.h index de2bb4b..a7188aa 100644 --- a/lqr/lqr_energy_priv.h +++ b/lqr/lqr_energy_priv.h @@ -37,41 +37,17 @@ #endif /* __LQR_ENERGY_BUFFER_PUB_H__ */ -typedef gfloat (*LqrEnergyFuncBuiltin) (LqrCarver*, gint, gint); typedef gfloat (*LqrReadFunc) (LqrCarver*, gint, gint); /* typedef glfoat (*LqrReadFuncAbs) (LqrCarver*, gint, gint, gint, gint); */ -struct _LqrEnergyBuiltin -{ - LqrEnergyFuncBuiltin ef; - LqrReadFunc rf; - LqrGradFunc gf; - //LqrReadFuncAbs rfabs; -}; - -typedef struct _LqrEnergyBuiltin LqrEnergyBuiltin; - inline gfloat lqr_pixel_get_norm (void * src, gint src_ind, LqrColDepth col_depth); inline gfloat lqr_pixel_get_rgbcol (void *rgb, gint rgb_ind, LqrColDepth col_depth, LqrImageType image_type, gint channel); -inline gfloat lqr_carver_read_brightness_std (LqrCarver * r, gint x, gint y); inline gfloat lqr_carver_read_brightness_grey (LqrCarver * r, gint x, gint y); +inline gfloat lqr_carver_read_brightness_std (LqrCarver * r, gint x, gint y); gfloat lqr_carver_read_brightness_custom (LqrCarver * r, gint x, gint y); inline gfloat lqr_carver_read_brightness (LqrCarver * r, gint x, gint y); inline gfloat lqr_carver_read_luma_std (LqrCarver * r, gint x, gint y); inline gfloat lqr_carver_read_luma (LqrCarver * r, gint x, gint y); -gfloat lqr_energy_builtin (LqrCarver * r, gint x, gint y); -gfloat lqr_energy_null (LqrCarver * r, gint x, gint y); - -LqrRetVal lqr_energy_buffer_fill_std (LqrEnergyBuffer * ebuffer, LqrCarver * r, gint x, gint y); -LqrRetVal lqr_energy_buffer_fill_rgba (LqrEnergyBuffer * ebuffer, LqrCarver * r, gint x, gint y); -LqrRetVal lqr_energy_buffer_fill_custom (LqrEnergyBuffer * ebuffer, LqrCarver * r, gint x, gint y); -LqrRetVal lqr_energy_buffer_fill (LqrEnergyBuffer * ebuffer, LqrCarver * r, gint x, gint y); - -LqrEnergyBuffer * lqr_energy_buffer_new_std (gint radius, LqrEnergyReaderType read_func_type); -LqrEnergyBuffer * lqr_energy_buffer_new_rgba (gint radius, LqrEnergyReaderType read_func_type); -LqrEnergyBuffer * lqr_energy_buffer_new_custom (gint radius, LqrEnergyReaderType read_func_type); -LqrEnergyBuffer * lqr_energy_buffer_new (gint radius, LqrEnergyReaderType read_func_type); -void lqr_energy_buffer_destroy (LqrEnergyBuffer * ebuffer); gfloat lqr_energy_builtin_grad_all (gint x, gint y, gint img_width, gint img_height, LqrEnergyBuffer * ebuffer, LqrGradFunc gf); gfloat lqr_energy_builtin_grad_norm (gint x, gint y, gint img_width, gint img_height, LqrEnergyBuffer * ebuffer, gpointer extra_data); @@ -79,7 +55,4 @@ gfloat lqr_energy_builtin_grad_sumabs (gint x, gint y, gint img_width, gint img_ gfloat lqr_energy_builtin_grad_xabs (gint x, gint y, gint img_width, gint img_height, LqrEnergyBuffer * ebuffer, gpointer extra_data); gfloat lqr_energy_builtin_null (gint x, gint y, gint img_width, gint img_height, LqrEnergyBuffer * ebuffer, gpointer extra_data); -LqrRetVal lqr_carver_set_energy_function_priv (LqrCarver * r, LqrEnergyFunc en_func, gint radius, - LqrEnergyReaderType reader_type, gpointer extra_data, gboolean builtin); - #endif /* __LQR_ENERGY_PRIV_H__ */ -- 2.11.4.GIT