Merge pull request #102 from glyptodon/memory-madness
GUAC-1471: Properly calculate heat map dimensions.
This commit is contained in:
commit
6c0862e82d
@ -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) {
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user