+ return tileMatrix;
+}
+
+void ewk_tile_matrix_zoom_level_set(Ewk_Tile_Matrix* tileMatrix, float zoom)
+{
+ EINA_SAFETY_ON_NULL_RETURN(tileMatrix);
+ Ewk_Tile_Matrix_Entry* iterator = 0;
+ Ewk_Tile_Matrix_Entry* entry = 0;
+ unsigned long rows = 0, columns = 0;
+
+ eina_matrixsparse_size_get(tileMatrix->matrix, &rows, &columns);
+
+ EINA_INLIST_FOREACH(tileMatrix->matrices, iterator) {
+ if (iterator->zoom != zoom)
+ continue;
+ entry = iterator;
+ tileMatrix->matrices = eina_inlist_promote(tileMatrix->matrices, EINA_INLIST_GET(entry));
+ eina_matrixsparse_size_set(entry->matrix, rows, columns);
+ }
+
+ if (!entry) {
+ entry = static_cast<Ewk_Tile_Matrix_Entry*>(calloc(1, sizeof(Ewk_Tile_Matrix_Entry)));
+ entry->zoom = zoom;
+ entry->matrix = eina_matrixsparse_new(rows, columns, _ewk_tile_matrix_cell_free, tileMatrix);
+ if (!entry->matrix) {
+ ERR("could not create sparse matrix.");
+ free(entry);
+ return;
+ }
+ tileMatrix->matrices = eina_inlist_prepend(tileMatrix->matrices, EINA_INLIST_GET(entry));
+ }
+
+ tileMatrix->matrix = entry->matrix;
+}
+
+void ewk_tile_matrix_invalidate(Ewk_Tile_Matrix* tileMatrix)
+{
+ EINA_SAFETY_ON_NULL_RETURN(tileMatrix);
+ Ewk_Tile_Matrix_Entry* iterator;
+ Eina_Inlist* matrixList;
+
+ matrixList = tileMatrix->matrices;
+ while (matrixList) {
+ iterator = EINA_INLIST_CONTAINER_GET(matrixList, Ewk_Tile_Matrix_Entry);
+ Eina_Inlist *next = (matrixList->next) ? matrixList->next : 0;
+
+ if (iterator->matrix != tileMatrix->matrix) {
+ eina_matrixsparse_free(iterator->matrix);
+ tileMatrix->matrices = eina_inlist_remove(tileMatrix->matrices, matrixList);
+ free(iterator);
+ }
+
+ matrixList = next;
+ }