region: Move RegionIterator to Mtk
Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3501>
This commit is contained in:
parent
cf8eb4944a
commit
9953704ceb
@ -468,3 +468,50 @@ mtk_region_apply_matrix_transform_expand (const MtkRegion *region,
|
|||||||
|
|
||||||
return transformed_region;
|
return transformed_region;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mtk_region_iterator_init (MtkRegionIterator *iter,
|
||||||
|
MtkRegion *region)
|
||||||
|
{
|
||||||
|
iter->region = region;
|
||||||
|
iter->i = 0;
|
||||||
|
iter->n_rectangles = mtk_region_num_rectangles (region);
|
||||||
|
iter->line_start = TRUE;
|
||||||
|
|
||||||
|
if (iter->n_rectangles > 1)
|
||||||
|
{
|
||||||
|
iter->rectangle = mtk_region_get_rectangle (region, 0);
|
||||||
|
iter->next_rectangle = mtk_region_get_rectangle (region, 1);
|
||||||
|
|
||||||
|
iter->line_end = iter->next_rectangle.y != iter->rectangle.y;
|
||||||
|
}
|
||||||
|
else if (iter->n_rectangles > 0)
|
||||||
|
{
|
||||||
|
iter->rectangle = mtk_region_get_rectangle (region, 0);
|
||||||
|
iter->line_end = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
mtk_region_iterator_at_end (MtkRegionIterator *iter)
|
||||||
|
{
|
||||||
|
return iter->i >= iter->n_rectangles;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
mtk_region_iterator_next (MtkRegionIterator *iter)
|
||||||
|
{
|
||||||
|
iter->i++;
|
||||||
|
iter->rectangle = iter->next_rectangle;
|
||||||
|
iter->line_start = iter->line_end;
|
||||||
|
|
||||||
|
if (iter->i + 1 < iter->n_rectangles)
|
||||||
|
{
|
||||||
|
iter->next_rectangle = mtk_region_get_rectangle (iter->region, iter->i + 1);
|
||||||
|
iter->line_end = iter->next_rectangle.y != iter->rectangle.y;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
iter->line_end = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -129,3 +129,50 @@ MtkRegion * mtk_region_apply_matrix_transform_expand (const MtkRegion *region,
|
|||||||
graphene_matrix_t *transform);
|
graphene_matrix_t *transform);
|
||||||
|
|
||||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MtkRegion, mtk_region_unref)
|
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MtkRegion, mtk_region_unref)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MtkRegionIterator:
|
||||||
|
* @region: region being iterated
|
||||||
|
* @rectangle: current rectangle
|
||||||
|
* @line_start: whether the current rectangle starts a horizontal band
|
||||||
|
* @line_end: whether the current rectangle ends a horizontal band
|
||||||
|
*
|
||||||
|
* MtkRegion is a yx banded region; sometimes its useful to iterate through
|
||||||
|
* such a region treating the start and end of each horizontal band in a distinct
|
||||||
|
* fashion.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
*
|
||||||
|
* ```c
|
||||||
|
* MtkRegionIterator iter;
|
||||||
|
* for (mtk_region_iterator_init (&iter, region);
|
||||||
|
* !mtk_region_iterator_at_end (&iter);
|
||||||
|
* mtk_region_iterator_next (&iter))
|
||||||
|
* {
|
||||||
|
* [ Use iter.rectangle, iter.line_start, iter.line_end ]
|
||||||
|
* }
|
||||||
|
*```
|
||||||
|
*/
|
||||||
|
typedef struct MtkaRegionIterator MtkRegionIterator;
|
||||||
|
|
||||||
|
struct MtkaRegionIterator {
|
||||||
|
MtkRegion *region;
|
||||||
|
MtkRectangle rectangle;
|
||||||
|
gboolean line_start;
|
||||||
|
gboolean line_end;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*< private >*/
|
||||||
|
int n_rectangles;
|
||||||
|
MtkRectangle next_rectangle;
|
||||||
|
};
|
||||||
|
|
||||||
|
MTK_EXPORT
|
||||||
|
void mtk_region_iterator_init (MtkRegionIterator *iter,
|
||||||
|
MtkRegion *region);
|
||||||
|
|
||||||
|
MTK_EXPORT
|
||||||
|
gboolean mtk_region_iterator_at_end (MtkRegionIterator *iter);
|
||||||
|
|
||||||
|
MTK_EXPORT
|
||||||
|
void mtk_region_iterator_next (MtkRegionIterator *iter);
|
||||||
|
@ -754,7 +754,7 @@ expand_region_inverse (MtkRegion *region,
|
|||||||
gboolean flip)
|
gboolean flip)
|
||||||
{
|
{
|
||||||
MetaRegionBuilder builder;
|
MetaRegionBuilder builder;
|
||||||
MetaRegionIterator iter;
|
MtkRegionIterator iter;
|
||||||
MtkRectangle extents;
|
MtkRectangle extents;
|
||||||
int last_x;
|
int last_x;
|
||||||
|
|
||||||
@ -775,9 +775,9 @@ expand_region_inverse (MtkRegion *region,
|
|||||||
x_amount, y_amount, flip);
|
x_amount, y_amount, flip);
|
||||||
|
|
||||||
last_x = extents.x;
|
last_x = extents.x;
|
||||||
for (meta_region_iterator_init (&iter, region);
|
for (mtk_region_iterator_init (&iter, region);
|
||||||
!meta_region_iterator_at_end (&iter);
|
!mtk_region_iterator_at_end (&iter);
|
||||||
meta_region_iterator_next (&iter))
|
mtk_region_iterator_next (&iter))
|
||||||
{
|
{
|
||||||
if (iter.rectangle.x > last_x)
|
if (iter.rectangle.x > last_x)
|
||||||
add_expanded_rect (&builder,
|
add_expanded_rect (&builder,
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "compositor/region-utils.h"
|
#include "mtk/mtk-region.h"
|
||||||
|
|
||||||
struct _MetaWindowShape
|
struct _MetaWindowShape
|
||||||
{
|
{
|
||||||
@ -43,7 +43,7 @@ MetaWindowShape *
|
|||||||
meta_window_shape_new (MtkRegion *region)
|
meta_window_shape_new (MtkRegion *region)
|
||||||
{
|
{
|
||||||
MetaWindowShape *shape;
|
MetaWindowShape *shape;
|
||||||
MetaRegionIterator iter;
|
MtkRegionIterator iter;
|
||||||
MtkRectangle extents;
|
MtkRectangle extents;
|
||||||
int max_yspan_y1 = 0;
|
int max_yspan_y1 = 0;
|
||||||
int max_yspan_y2 = 0;
|
int max_yspan_y2 = 0;
|
||||||
@ -66,9 +66,9 @@ meta_window_shape_new (MtkRegion *region)
|
|||||||
return shape;
|
return shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (meta_region_iterator_init (&iter, region);
|
for (mtk_region_iterator_init (&iter, region);
|
||||||
!meta_region_iterator_at_end (&iter);
|
!mtk_region_iterator_at_end (&iter);
|
||||||
meta_region_iterator_next (&iter))
|
mtk_region_iterator_next (&iter))
|
||||||
{
|
{
|
||||||
int max_line_xspan_x1 = -1;
|
int max_line_xspan_x1 = -1;
|
||||||
int max_line_xspan_x2 = -1;
|
int max_line_xspan_x2 = -1;
|
||||||
@ -117,9 +117,9 @@ meta_window_shape_new (MtkRegion *region)
|
|||||||
shape->rectangles = g_new (MtkRectangle, shape->n_rectangles);
|
shape->rectangles = g_new (MtkRectangle, shape->n_rectangles);
|
||||||
|
|
||||||
hash = 0;
|
hash = 0;
|
||||||
for (meta_region_iterator_init (&iter, region);
|
for (mtk_region_iterator_init (&iter, region);
|
||||||
!meta_region_iterator_at_end (&iter);
|
!mtk_region_iterator_at_end (&iter);
|
||||||
meta_region_iterator_next (&iter))
|
mtk_region_iterator_next (&iter))
|
||||||
{
|
{
|
||||||
int x1, x2, y1, y2;
|
int x1, x2, y1, y2;
|
||||||
|
|
||||||
|
@ -126,56 +126,6 @@ meta_region_builder_finish (MetaRegionBuilder *builder)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* MetaRegionIterator */
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_region_iterator_init (MetaRegionIterator *iter,
|
|
||||||
MtkRegion *region)
|
|
||||||
{
|
|
||||||
iter->region = region;
|
|
||||||
iter->i = 0;
|
|
||||||
iter->n_rectangles = mtk_region_num_rectangles (region);
|
|
||||||
iter->line_start = TRUE;
|
|
||||||
|
|
||||||
if (iter->n_rectangles > 1)
|
|
||||||
{
|
|
||||||
iter->rectangle = mtk_region_get_rectangle (region, 0);
|
|
||||||
iter->next_rectangle = mtk_region_get_rectangle (region, 1);
|
|
||||||
|
|
||||||
iter->line_end = iter->next_rectangle.y != iter->rectangle.y;
|
|
||||||
}
|
|
||||||
else if (iter->n_rectangles > 0)
|
|
||||||
{
|
|
||||||
iter->rectangle = mtk_region_get_rectangle (region, 0);
|
|
||||||
iter->line_end = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
|
||||||
meta_region_iterator_at_end (MetaRegionIterator *iter)
|
|
||||||
{
|
|
||||||
return iter->i >= iter->n_rectangles;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
meta_region_iterator_next (MetaRegionIterator *iter)
|
|
||||||
{
|
|
||||||
iter->i++;
|
|
||||||
iter->rectangle = iter->next_rectangle;
|
|
||||||
iter->line_start = iter->line_end;
|
|
||||||
|
|
||||||
if (iter->i + 1 < iter->n_rectangles)
|
|
||||||
{
|
|
||||||
iter->next_rectangle = mtk_region_get_rectangle (iter->region, iter->i + 1);
|
|
||||||
iter->line_end = iter->next_rectangle.y != iter->rectangle.y;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
iter->line_end = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
MtkRegion *
|
MtkRegion *
|
||||||
meta_region_transform (const MtkRegion *region,
|
meta_region_transform (const MtkRegion *region,
|
||||||
MetaMonitorTransform transform,
|
MetaMonitorTransform transform,
|
||||||
|
@ -26,41 +26,6 @@
|
|||||||
#include "clutter/clutter.h"
|
#include "clutter/clutter.h"
|
||||||
#include "core/boxes-private.h"
|
#include "core/boxes-private.h"
|
||||||
|
|
||||||
/**
|
|
||||||
* MetaRegionIterator:
|
|
||||||
* @region: region being iterated
|
|
||||||
* @rectangle: current rectangle
|
|
||||||
* @line_start: whether the current rectangle starts a horizontal band
|
|
||||||
* @line_end: whether the current rectangle ends a horizontal band
|
|
||||||
*
|
|
||||||
* MtkRegion is a yx banded region; sometimes its useful to iterate through
|
|
||||||
* such a region treating the start and end of each horizontal band in a distinct
|
|
||||||
* fashion.
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
*
|
|
||||||
* MetaRegionIterator iter;
|
|
||||||
* for (meta_region_iterator_init (&iter, region);
|
|
||||||
* !meta_region_iterator_at_end (&iter);
|
|
||||||
* meta_region_iterator_next (&iter))
|
|
||||||
* {
|
|
||||||
* [ Use iter.rectangle, iter.line_start, iter.line_end ]
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
typedef struct _MetaRegionIterator MetaRegionIterator;
|
|
||||||
|
|
||||||
struct _MetaRegionIterator {
|
|
||||||
MtkRegion *region;
|
|
||||||
MtkRectangle rectangle;
|
|
||||||
gboolean line_start;
|
|
||||||
gboolean line_end;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/*< private >*/
|
|
||||||
int n_rectangles;
|
|
||||||
MtkRectangle next_rectangle;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct _MetaRegionBuilder MetaRegionBuilder;
|
typedef struct _MetaRegionBuilder MetaRegionBuilder;
|
||||||
|
|
||||||
#define META_REGION_BUILDER_MAX_LEVELS 16
|
#define META_REGION_BUILDER_MAX_LEVELS 16
|
||||||
@ -87,11 +52,6 @@ void meta_region_builder_add_rectangle (MetaRegionBuilder *builder,
|
|||||||
int height);
|
int height);
|
||||||
MtkRegion * meta_region_builder_finish (MetaRegionBuilder *builder);
|
MtkRegion * meta_region_builder_finish (MetaRegionBuilder *builder);
|
||||||
|
|
||||||
void meta_region_iterator_init (MetaRegionIterator *iter,
|
|
||||||
MtkRegion *region);
|
|
||||||
gboolean meta_region_iterator_at_end (MetaRegionIterator *iter);
|
|
||||||
void meta_region_iterator_next (MetaRegionIterator *iter);
|
|
||||||
|
|
||||||
MtkRegion * meta_region_transform (const MtkRegion *region,
|
MtkRegion * meta_region_transform (const MtkRegion *region,
|
||||||
MetaMonitorTransform transform,
|
MetaMonitorTransform transform,
|
||||||
int width,
|
int width,
|
||||||
|
Loading…
Reference in New Issue
Block a user