mirror of https://github.com/GNOME/gimp.git
app: Add /gimptilebackendtilemanager/basic_write unit test
Rename the 'basic_usage' test to 'basic_read' and add 'basic_write' test. Implement GimpTileBackendTileManagerPrivate enough to make them pass. Note that these tests currently do not work with GIMP's "effective tile size" optimization.
This commit is contained in:
parent
f1d4dde36a
commit
e4d6726bde
|
@ -37,7 +37,7 @@
|
|||
#include "gimp-gegl-utils.h"
|
||||
|
||||
|
||||
struct _GimpTileBackendTileManagerPrivate
|
||||
struct _GimpTileBackendTileManagerPrivate
|
||||
{
|
||||
GHashTable *entries;
|
||||
TileManager *tile_manager;
|
||||
|
@ -176,29 +176,23 @@ gimp_tile_backend_tile_manager_command (GeglTileSource *tile_store,
|
|||
case GEGL_TILE_GET:
|
||||
{
|
||||
GeglTile *tile;
|
||||
gint tile_size;
|
||||
Tile *gimp_tile;
|
||||
gint tile_stride;
|
||||
gint gimp_tile_stride;
|
||||
int row;
|
||||
|
||||
gimp_tile = tile_manager_get_at (backend_tm->priv->tile_manager,
|
||||
x, y, TRUE, FALSE);
|
||||
|
||||
g_return_val_if_fail (gimp_tile != NULL, NULL);
|
||||
|
||||
tile_size = gegl_tile_backend_get_tile_size (backend);
|
||||
tile_stride = TILE_WIDTH * tile_bpp (gimp_tile);
|
||||
gimp_tile_stride = tile_ewidth (gimp_tile) * tile_bpp (gimp_tile);
|
||||
|
||||
/* XXX: Point to Tile data directly instead of using memcpy */
|
||||
tile = gegl_tile_new (tile_size);
|
||||
for (row = 0; row < tile_eheight (gimp_tile); row++)
|
||||
if (tile_ewidth (gimp_tile) != TILE_WIDTH ||
|
||||
tile_eheight (gimp_tile) != TILE_HEIGHT)
|
||||
{
|
||||
memcpy (gegl_tile_get_data (tile) + row * tile_stride,
|
||||
tile_data_pointer (gimp_tile, 0, row),
|
||||
gimp_tile_stride);
|
||||
g_warning ("GimpTileBackendTileManager does not support != %dx%d tiles yet",
|
||||
TILE_WIDTH, TILE_HEIGHT);
|
||||
}
|
||||
tile = gegl_tile_new_bare ();
|
||||
gegl_tile_set_data (tile,
|
||||
tile_data_pointer (gimp_tile, 0, 0),
|
||||
tile_size (gimp_tile));
|
||||
|
||||
return tile;
|
||||
}
|
||||
|
|
|
@ -51,22 +51,30 @@ typedef struct
|
|||
} GimpTestFixture;
|
||||
|
||||
|
||||
static const guchar opaque_magenta8[4] = { 0xff, 0x00, 0xff, 0xff };
|
||||
static const guchar transparent_black8[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||
|
||||
static const guint16 opaque_magenta16[4] = { 0xffff, 0x0000, 0xffff, 0xffff };
|
||||
|
||||
/* FIXME: Add tests for non-tile sized rects, they currently won't
|
||||
* pass
|
||||
*/
|
||||
static const GeglRectangle rect = { 0, 0, 64, 64 };
|
||||
static const GeglRectangle center_pixel = { 5, 5, 1, 1 };
|
||||
|
||||
|
||||
/**
|
||||
* basic_usage:
|
||||
* basic_read:
|
||||
* @fixture:
|
||||
* @data:
|
||||
*
|
||||
* Test basic usage.
|
||||
* Test that the backend can be used for basic reading of TileManager
|
||||
* data.
|
||||
**/
|
||||
static void
|
||||
basic_usage (GimpTestFixture *fixture,
|
||||
gconstpointer data)
|
||||
basic_read (GimpTestFixture *fixture,
|
||||
gconstpointer data)
|
||||
{
|
||||
GeglRectangle rect = { 0, 0, 10, 10 };
|
||||
GeglRectangle pixel_rect = { 5, 5, 1, 1 };
|
||||
guchar opaque_magenta8[4] = { 0xff, 0, 0xff, 0xff };
|
||||
guint16 opaque_magenta16[4] = { 0xffff, 0, 0xffff, 0xffff };
|
||||
|
||||
PixelRegion pr;
|
||||
TileManager *tm;
|
||||
GeglTileBackend *backend;
|
||||
|
@ -84,8 +92,59 @@ basic_usage (GimpTestFixture *fixture,
|
|||
*/
|
||||
backend = gimp_tile_backend_tile_manager_new (tm);
|
||||
buffer = gegl_buffer_new_for_backend (NULL, backend);
|
||||
gegl_buffer_get (buffer, 1.0 /*scale*/, &pixel_rect, babl_format ("RGBA u16"), actual_data, GEGL_AUTO_ROWSTRIDE);
|
||||
g_assert_cmpint (0, ==, memcmp (opaque_magenta16, actual_data, sizeof (actual_data)));
|
||||
gegl_buffer_get (buffer, 1.0 /*scale*/, ¢er_pixel,
|
||||
babl_format ("RGBA u16"), actual_data,
|
||||
GEGL_AUTO_ROWSTRIDE);
|
||||
g_assert_cmpint (0, ==, memcmp (opaque_magenta16,
|
||||
actual_data,
|
||||
sizeof (actual_data)));
|
||||
}
|
||||
|
||||
/**
|
||||
* basic_write:
|
||||
* @fixture:
|
||||
* @data:
|
||||
*
|
||||
* Test that the backend can be used for basic writing of TileManager
|
||||
* data.
|
||||
**/
|
||||
static void
|
||||
basic_write (GimpTestFixture *fixture,
|
||||
gconstpointer data)
|
||||
{
|
||||
PixelRegion pr;
|
||||
TileManager *tm;
|
||||
GeglTileBackend *backend;
|
||||
GeglBuffer *buffer;
|
||||
guchar actual_data[4];
|
||||
gint x, y;
|
||||
|
||||
/* Clear the TileManager */
|
||||
tm = tile_manager_new (rect.width, rect.height, 4);
|
||||
pixel_region_init (&pr, tm, rect.x, rect.y, rect.width, rect.height, TRUE);
|
||||
color_region (&pr, transparent_black8);
|
||||
|
||||
/* Write some data using the GeglBuffer and the backend. Use u16 to
|
||||
* complicate code paths, decreasing risk of the test accidentally
|
||||
* passing
|
||||
*/
|
||||
backend = gimp_tile_backend_tile_manager_new (tm);
|
||||
buffer = gegl_buffer_new_for_backend (NULL, backend);
|
||||
for (y = 0; y < rect.height; y++)
|
||||
for (x = 0; x < rect.width; x++)
|
||||
{
|
||||
GeglRectangle moving_rect = { x, y, 1, 1 };
|
||||
gegl_buffer_set (buffer, &moving_rect,
|
||||
babl_format ("RGBA u16"), (gpointer) opaque_magenta16,
|
||||
GEGL_AUTO_ROWSTRIDE);
|
||||
}
|
||||
|
||||
/* Make sure we can read the written data from the TileManager */
|
||||
tile_manager_read_pixel_data_1 (tm, center_pixel.x, center_pixel.y,
|
||||
actual_data);
|
||||
g_assert_cmpint (0, ==, memcmp (opaque_magenta8,
|
||||
actual_data,
|
||||
sizeof (actual_data)));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -97,7 +156,8 @@ main (int argc,
|
|||
gegl_init (&argc, &argv);
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
|
||||
ADD_TEST (basic_usage);
|
||||
ADD_TEST (basic_read);
|
||||
ADD_TEST (basic_write);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue