void gegl_buffer_iterator_stop (GeglBufferIterator *iter) { int index; GeglBufferIteratorPriv *priv = iter->priv; priv->state = GeglIteratorState_Invalid; for (index = 0; index < priv->num_buffers; index++) { SubIterState *sub = &priv->sub_iter[index]; if (sub->current_tile_mode != GeglIteratorTileMode_Empty) release_tile (iter, index); if (sub->linear_tile) { if (sub->access_mode & GEGL_ACCESS_WRITE) gegl_tile_unlock (sub->linear_tile); gegl_tile_unref (sub->linear_tile); } gegl_buffer_unlock (sub->buffer); if (sub->access_mode & GEGL_ACCESS_WRITE) gegl_buffer_emit_changed_signal (sub->buffer, &sub->full_rect); } g_slice_free (GeglBufferIteratorPriv, iter->priv); g_slice_free (GeglBufferIterator, iter); }
gboolean gegl_buffer_iterator_next (GeglBufferIterator *iter) { GeglBufferIteratorPriv *priv = iter->priv; if (priv->state == GeglIteratorState_Start) { int index; GeglBuffer *primary = priv->sub_iter[0].buffer; if (primary->tile_width == primary->extent.width && primary->tile_height == primary->extent.height && priv->sub_iter[0].full_rect.width == primary->tile_width && priv->sub_iter[0].full_rect.height == primary->tile_height && priv->sub_iter[0].full_rect.x == primary->extent.x && priv->sub_iter[0].full_rect.y == primary->extent.y && priv->sub_iter[0].buffer->extent.x == iter->roi[0].x && priv->sub_iter[0].buffer->extent.y == iter->roi[0].y && FALSE) /* XXX: conditions are not strict enough, GIMPs TIFF plug-in fails; but GEGLs buffer test suite passes */ { if (gegl_cl_is_accelerated ()) for (index = 0; index < priv->num_buffers; index++) { SubIterState *sub = &priv->sub_iter[index]; gegl_buffer_cl_cache_flush (sub->buffer, &sub->full_rect); } linear_shortcut (iter); return TRUE; } prepare_iteration (iter); if (gegl_cl_is_accelerated ()) for (index = 0; index < priv->num_buffers; index++) { SubIterState *sub = &priv->sub_iter[index]; gegl_buffer_cl_cache_flush (sub->buffer, &sub->full_rect); } initialize_rects (iter); load_rects (iter); return TRUE; } else if (priv->state == GeglIteratorState_InRows) { int index; for (index = 0; index < priv->num_buffers; index++) { iter->data[index] = ((char *)iter->data[index]) + priv->sub_iter[index].row_stride; iter->roi[index].y += 1; } priv->remaining_rows -= 1; if (priv->remaining_rows == 0) priv->state = GeglIteratorState_InTile; return TRUE; } else if (priv->state == GeglIteratorState_InTile) { int index; for (index = 0; index < priv->num_buffers; index++) { release_tile (iter, index); } if (increment_rects (iter) == FALSE) { gegl_buffer_iterator_stop (iter); return FALSE; } load_rects (iter); return TRUE; } else { gegl_buffer_iterator_stop (iter); return FALSE; } }
gboolean gegl_buffer_iterator_next (GeglBufferIterator *iter) { GeglBufferIteratorPriv *priv = iter->priv; if (priv->state == GeglIteratorState_Start) { int index; prepare_iteration (iter); if (gegl_cl_is_accelerated ()) for (index = 0; index < priv->num_buffers; index++) { SubIterState *sub = &priv->sub_iter[index]; gegl_buffer_cl_cache_flush (sub->buffer, &sub->full_rect); } initialize_rects (iter); load_rects (iter); return TRUE; } else if (priv->state == GeglIteratorState_InRows) { int index; for (index = 0; index < priv->num_buffers; index++) { iter->data[index] = ((char *)iter->data[index]) + priv->sub_iter[index].row_stride; iter->roi[index].y += 1; } priv->remaining_rows -= 1; if (priv->remaining_rows == 0) priv->state = GeglIteratorState_InTile; return TRUE; } else if (priv->state == GeglIteratorState_InTile) { int index; for (index = 0; index < priv->num_buffers; index++) { release_tile (iter, index); } if (increment_rects (iter) == FALSE) { gegl_buffer_iterator_stop (iter); return FALSE; } load_rects (iter); return TRUE; } else { gegl_buffer_iterator_stop (iter); return FALSE; } }