diff --git a/libguac/include/hash.h b/libguac/include/hash.h index 61115eb2..4a4dc865 100644 --- a/libguac/include/hash.h +++ b/libguac/include/hash.h @@ -53,5 +53,7 @@ */ unsigned int guac_hash_surface(cairo_surface_t* surface); +int guac_surface_cmp(cairo_surface_t* a, cairo_surface_t* b); + #endif diff --git a/libguac/src/hash.c b/libguac/src/hash.c index 6b21e1e5..0fc8aaff 100644 --- a/libguac/src/hash.c +++ b/libguac/src/hash.c @@ -37,6 +37,7 @@ #include +#include #include /* @@ -111,3 +112,40 @@ unsigned int guac_hash_surface(cairo_surface_t* surface) { } +int guac_surface_cmp(cairo_surface_t* a, cairo_surface_t* b) { + + /* Surface A metrics */ + unsigned char* data_a = cairo_image_surface_get_data(a); + int width_a = cairo_image_surface_get_width(a); + int height_a = cairo_image_surface_get_height(a); + int stride_a = cairo_image_surface_get_stride(a); + + /* Surface B metrics */ + unsigned char* data_b = cairo_image_surface_get_data(b); + int width_b = cairo_image_surface_get_width(b); + int height_b = cairo_image_surface_get_height(b); + int stride_b = cairo_image_surface_get_stride(b); + + int y; + + /* If core dimensions differ, just compare those. Done. */ + if (width_a != width_b) return width_a - width_b; + if (height_a != height_b) return height_a - height_b; + + for (y=0; y