Merge pull request #102 from glyptodon/memory-madness

GUAC-1471: Properly calculate heat map dimensions.
This commit is contained in:
James Muehlner 2016-01-12 22:54:55 -08:00
commit 6c0862e82d
2 changed files with 31 additions and 6 deletions

View File

@ -280,6 +280,9 @@ static unsigned int __guac_common_surface_calculate_framerate(
int x, y; int x, y;
/* Calculate heat map dimensions */
int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(surface->width);
/* Calculate minimum X/Y coordinates intersecting given rect */ /* Calculate minimum X/Y coordinates intersecting given rect */
int min_x = rect->x / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int min_x = rect->x / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE;
int min_y = rect->y / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int min_y = rect->y / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE;
@ -293,7 +296,7 @@ static unsigned int __guac_common_surface_calculate_framerate(
/* Get start of buffer at given coordinates */ /* Get start of buffer at given coordinates */
const guac_common_surface_heat_cell* heat_row = const guac_common_surface_heat_cell* heat_row =
surface->heat_map + min_y * surface->width + min_x; surface->heat_map + min_y * heat_width + min_x;
/* Iterate over all the heat map cells for the area /* Iterate over all the heat map cells for the area
* and calculate the average framerate */ * and calculate the average framerate */
@ -327,7 +330,7 @@ static unsigned int __guac_common_surface_calculate_framerate(
} }
/* Next heat map row */ /* Next heat map row */
heat_row += surface->width; heat_row += heat_width;
} }
@ -492,6 +495,9 @@ static void __guac_common_surface_touch_rect(guac_common_surface* surface,
int x, y; int x, y;
/* Calculate heat map dimensions */
int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(surface->width);
/* Calculate minimum X/Y coordinates intersecting given rect */ /* Calculate minimum X/Y coordinates intersecting given rect */
int min_x = rect->x / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int min_x = rect->x / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE;
int min_y = rect->y / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE; int min_y = rect->y / GUAC_COMMON_SURFACE_HEAT_CELL_SIZE;
@ -502,7 +508,7 @@ static void __guac_common_surface_touch_rect(guac_common_surface* surface,
/* Get start of buffer at given coordinates */ /* Get start of buffer at given coordinates */
guac_common_surface_heat_cell* heat_row = guac_common_surface_heat_cell* heat_row =
surface->heat_map + min_y * surface->width + min_x; surface->heat_map + min_y * heat_width + min_x;
/* Update all heat map cells which intersect with rectangle */ /* Update all heat map cells which intersect with rectangle */
for (y = min_y; y <= max_y; y++) { for (y = min_y; y <= max_y; y++) {
@ -528,7 +534,7 @@ static void __guac_common_surface_touch_rect(guac_common_surface* surface,
} }
/* Next heat map row */ /* Next heat map row */
heat_row += surface->width; heat_row += heat_width;
} }
@ -977,6 +983,10 @@ static void __guac_common_surface_transfer(guac_common_surface* src, int* sx, in
guac_common_surface* guac_common_surface_alloc(guac_client* client, guac_common_surface* guac_common_surface_alloc(guac_client* client,
guac_socket* socket, const guac_layer* layer, int w, int h) { guac_socket* socket, const guac_layer* layer, int w, int h) {
/* Calculate heat map dimensions */
int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(w);
int heat_height = GUAC_COMMON_SURFACE_HEAT_DIMENSION(h);
/* Init surface */ /* Init surface */
guac_common_surface* surface = calloc(1, sizeof(guac_common_surface)); guac_common_surface* surface = calloc(1, sizeof(guac_common_surface));
surface->client = client; surface->client = client;
@ -990,7 +1000,8 @@ guac_common_surface* guac_common_surface_alloc(guac_client* client,
surface->buffer = calloc(h, surface->stride); surface->buffer = calloc(h, surface->stride);
/* Create corresponding heat map */ /* Create corresponding heat map */
surface->heat_map = calloc(w*h, sizeof(guac_common_surface_heat_cell)); surface->heat_map = calloc(heat_width * heat_height,
sizeof(guac_common_surface_heat_cell));
/* Reset clipping rect */ /* Reset clipping rect */
guac_common_surface_reset_clip(surface); guac_common_surface_reset_clip(surface);
@ -1032,6 +1043,10 @@ void guac_common_surface_resize(guac_common_surface* surface, int w, int h) {
int sx = 0; int sx = 0;
int sy = 0; int sy = 0;
/* Calculate heat map dimensions */
int heat_width = GUAC_COMMON_SURFACE_HEAT_DIMENSION(w);
int heat_height = GUAC_COMMON_SURFACE_HEAT_DIMENSION(h);
/* Copy old surface data */ /* Copy old surface data */
old_buffer = surface->buffer; old_buffer = surface->buffer;
old_stride = surface->stride; old_stride = surface->stride;
@ -1053,7 +1068,8 @@ void guac_common_surface_resize(guac_common_surface* surface, int w, int h) {
/* Allocate completely new heat map (can safely discard old stats) */ /* Allocate completely new heat map (can safely discard old stats) */
free(surface->heat_map); free(surface->heat_map);
surface->heat_map = calloc(w*h, sizeof(guac_common_surface_heat_cell)); surface->heat_map = calloc(heat_width * heat_height,
sizeof(guac_common_surface_heat_cell));
/* Resize dirty rect to fit new surface dimensions */ /* Resize dirty rect to fit new surface dimensions */
if (surface->dirty) { if (surface->dirty) {

View File

@ -43,6 +43,15 @@
*/ */
#define GUAC_COMMON_SURFACE_HEAT_CELL_SIZE 64 #define GUAC_COMMON_SURFACE_HEAT_CELL_SIZE 64
/**
* The width or height of the heat map (in cells) given the width or height of
* the image (in pixels).
*/
#define GUAC_COMMON_SURFACE_HEAT_DIMENSION(x) ( \
(x + GUAC_COMMON_SURFACE_HEAT_CELL_SIZE - 1) \
/ GUAC_COMMON_SURFACE_HEAT_CELL_SIZE \
)
/** /**
* The number of entries to collect within each heat map cell. Collected * The number of entries to collect within each heat map cell. Collected
* history entries are used to determine the framerate of the region associated * history entries are used to determine the framerate of the region associated