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; } }