/** * Creates a new matrix of tiles. * * The tile matrix is responsible for keeping tiles around and * providing fast access to them. One can use it to retrieve new or * existing tiles and give them back, allowing them to be * freed/replaced by the cache. * * @param tuc cache of unused tiles or @c NULL to create one * automatically. * @param cols number of columns in the matrix. * @param rows number of rows in the matrix. * @param cspace the color space used to create tiles in this matrix. * @param render_cb function used to render given tile update. * @param data context to give back to @a render_cb. * * @return newly allocated instance on success, @c NULL on failure. */ Ewk_Tile_Matrix *ewk_tile_matrix_new(Ewk_Tile_Unused_Cache *tuc, unsigned long cols, unsigned long rows, Evas_Colorspace cspace, void (*render_cb)(void *data, Ewk_Tile *t, const Eina_Rectangle *update), const void *data) { Ewk_Tile_Matrix *tm; CALLOC_OR_OOM_RET(tm, sizeof(Ewk_Tile_Matrix), NULL); tm->matrix = eina_matrixsparse_new(rows, cols, _ewk_tile_matrix_cell_free, tm); if (!tm->matrix) { ERR("could not create sparse matrix."); free(tm); return NULL; } if (tuc) tm->tuc = ewk_tile_unused_cache_ref(tuc); else { tm->tuc = ewk_tile_unused_cache_new(40960000); if (!tm->tuc) { ERR("no cache of unused tile!"); eina_matrixsparse_free(tm->matrix); free(tm); return NULL; } } tm->cspace = cspace; tm->render.cb = render_cb; tm->render.data = (void *)data; return tm; }
END_TEST START_TEST(eina_test_iterators) { Eina_Matrixsparse *matrix = NULL; Eina_Matrixsparse_Cell *cell = NULL; Eina_Iterator *it = NULL; Eina_Bool r; long *test1, value; unsigned long i, j; unsigned long row, col; long data[MAX_ROWS][MAX_COLS]; value = 0; for (i = 0; i < MAX_ROWS; i++) { for (j = 0; j < MAX_COLS; j++) { data[i][j] = value++; printf("%4ld ", data[i][j]); } printf("\n"); } eina_init(); matrix = eina_matrixsparse_new(MAX_ROWS, MAX_COLS, eina_matrixsparse_free_cell_cb, data); fail_if(matrix == NULL); r = eina_matrixsparse_data_idx_set(matrix, 3, 5, &data[3][5]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 3, 6, &data[3][6]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 3, 7, &data[3][7]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 3, 9, &data[3][9]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 3, 0, &data[3][0]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 4, 6, &data[4][6]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 4, 8, &data[4][8]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 4, 2, &data[4][2]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 4, 3, &data[4][3]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 4, 7, &data[4][7]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 6, 4, &data[6][4]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 5, 3, &data[5][3]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 6, 3, &data[6][3]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 7, 3, &data[7][3]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 0, 3, &data[0][3]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 1, 3, &data[1][3]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 1, 6, &data[1][6]); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 1, 9, &data[1][9]); fail_if(r == EINA_FALSE); it = eina_matrixsparse_iterator_new(matrix); fail_if(it == NULL); EINA_ITERATOR_FOREACH(it, cell) { fail_if(cell == NULL); r = eina_matrixsparse_cell_position_get(cell, &row, &col); fail_if(r == EINA_FALSE); test1 = eina_matrixsparse_cell_data_get(cell); fail_if(test1 == NULL || *test1 != data[row][col]); }
END_TEST START_TEST(eina_test_resize) { Eina_Matrixsparse *matrix = NULL; Eina_Bool r; unsigned long i, j; unsigned long nrows, ncols; long data[MAX_ROWS][MAX_COLS]; for (i = 0; i < MAX_ROWS; i++) for (j = 0; j < MAX_COLS; j++) data[i][j] = 0; eina_init(); matrix = eina_matrixsparse_new(MAX_ROWS, MAX_COLS, eina_matrixsparse_free_cell_cb, data); fail_if(matrix == NULL); /* cell insertion */ data[0][5] = 5; data[1][0] = 10; data[1][3] = 13; data[1][6] = 16; data[1][9] = 19; data[1][8] = 18; data[1][7] = 17; data[2][8] = 28; data[2][7] = 27; data[2][6] = 26; data[3][0] = 30; data[3][5] = 35; data[3][6] = 36; data[3][7] = 37; data[3][9] = 39; data[3][0] = 30; data[4][8] = 48; data[4][2] = 42; data[4][3] = 43; data[4][7] = 47; data[4][6] = 46; data[5][3] = 53; data[6][3] = 63; data[6][4] = 64; data[6][6] = 66; data[7][3] = 73; data[7][7] = 77; data[8][8] = 88; matrixsparse_initialize(matrix, data, MAX_ROWS, MAX_COLS); eina_matrixsparse_size_get(matrix, &nrows, &ncols); fail_if(nrows != MAX_ROWS || ncols != MAX_COLS); r = eina_matrixsparse_size_set(matrix, nrows - 2, ncols - 2); fail_if(r == EINA_FALSE); data[1][9] = 0; data[1][8] = 0; data[2][8] = 0; data[3][9] = 0; data[4][8] = 0; data[8][8] = 0; matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS); r = eina_matrixsparse_size_set(matrix, 5, 1); fail_if(r == EINA_FALSE); data[0][5] = 0; data[1][3] = 0; data[1][6] = 0; data[1][7] = 0; data[2][7] = 0; data[2][6] = 0; data[3][5] = 0; data[3][6] = 0; data[3][7] = 0; data[4][2] = 0; data[4][3] = 0; data[4][7] = 0; data[4][6] = 0; data[5][3] = 0; data[6][3] = 0; data[6][4] = 0; data[6][6] = 0; data[7][3] = 0; data[7][7] = 0; matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS); r = eina_matrixsparse_size_set(matrix, 1, 1); fail_if(r == EINA_FALSE); data[3][0] = 0; data[1][0] = 0; matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS); r = eina_matrixsparse_size_set(matrix, 5, 4); fail_if(r == EINA_FALSE); r = eina_matrixsparse_data_idx_set(matrix, 4, 2, &data[4][2]); fail_if(r == EINA_FALSE); data[4][2] = 42; matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS); r = eina_matrixsparse_size_set(matrix, 5, 1); fail_if(r == EINA_FALSE); data[4][2] = 0; matrixsparse_check(matrix, data, MAX_ROWS, MAX_COLS); eina_matrixsparse_free(matrix); eina_shutdown(); }