Compare commits
7 Commits
install-fr
...
wip/radial
Author | SHA1 | Date | |
---|---|---|---|
|
210e031316 | ||
|
752fa801a6 | ||
|
d763b1f847 | ||
|
7842f77ac5 | ||
|
3e5c4b9e17 | ||
|
c780fc73be | ||
|
28e168e559 |
@@ -3384,6 +3384,8 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
case GSK_CAIRO_NODE:
|
case GSK_CAIRO_NODE:
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
|
@@ -30,6 +30,8 @@
|
|||||||
* @GSK_COLOR_NODE: A node drawing a single color rectangle
|
* @GSK_COLOR_NODE: A node drawing a single color rectangle
|
||||||
* @GSK_LINEAR_GRADIENT_NODE: A node drawing a linear gradient
|
* @GSK_LINEAR_GRADIENT_NODE: A node drawing a linear gradient
|
||||||
* @GSK_REPEATING_LINEAR_GRADIENT_NODE: A node drawing a repeating linear gradient
|
* @GSK_REPEATING_LINEAR_GRADIENT_NODE: A node drawing a repeating linear gradient
|
||||||
|
* @GSK_RADIAL_GRADIENT_NODE: A node drawing a radial gradient
|
||||||
|
* @GSK_REPEATING_RADIAL_GRADIENT_NODE: A node drawing a repeating radial gradient
|
||||||
* @GSK_BORDER_NODE: A node stroking a border around an area
|
* @GSK_BORDER_NODE: A node stroking a border around an area
|
||||||
* @GSK_TEXTURE_NODE: A node drawing a #GdkTexture
|
* @GSK_TEXTURE_NODE: A node drawing a #GdkTexture
|
||||||
* @GSK_INSET_SHADOW_NODE: A node drawing an inset shadow
|
* @GSK_INSET_SHADOW_NODE: A node drawing an inset shadow
|
||||||
@@ -56,6 +58,8 @@ typedef enum {
|
|||||||
GSK_COLOR_NODE,
|
GSK_COLOR_NODE,
|
||||||
GSK_LINEAR_GRADIENT_NODE,
|
GSK_LINEAR_GRADIENT_NODE,
|
||||||
GSK_REPEATING_LINEAR_GRADIENT_NODE,
|
GSK_REPEATING_LINEAR_GRADIENT_NODE,
|
||||||
|
GSK_RADIAL_GRADIENT_NODE,
|
||||||
|
GSK_REPEATING_RADIAL_GRADIENT_NODE,
|
||||||
GSK_BORDER_NODE,
|
GSK_BORDER_NODE,
|
||||||
GSK_TEXTURE_NODE,
|
GSK_TEXTURE_NODE,
|
||||||
GSK_INSET_SHADOW_NODE,
|
GSK_INSET_SHADOW_NODE,
|
||||||
|
@@ -104,6 +104,8 @@ GskRenderNode * gsk_render_node_deserialize (GBytes
|
|||||||
#define GSK_TYPE_TEXTURE_NODE (gsk_texture_node_get_type())
|
#define GSK_TYPE_TEXTURE_NODE (gsk_texture_node_get_type())
|
||||||
#define GSK_TYPE_LINEAR_GRADIENT_NODE (gsk_linear_gradient_node_get_type())
|
#define GSK_TYPE_LINEAR_GRADIENT_NODE (gsk_linear_gradient_node_get_type())
|
||||||
#define GSK_TYPE_REPEATING_LINEAR_GRADIENT_NODE (gsk_repeating_linear_gradient_node_get_type())
|
#define GSK_TYPE_REPEATING_LINEAR_GRADIENT_NODE (gsk_repeating_linear_gradient_node_get_type())
|
||||||
|
#define GSK_TYPE_RADIAL_GRADIENT_NODE (gsk_radial_gradient_node_get_type())
|
||||||
|
#define GSK_TYPE_REPEATING_RADIAL_GRADIENT_NODE (gsk_repeating_radial_gradient_node_get_type())
|
||||||
#define GSK_TYPE_BORDER_NODE (gsk_border_node_get_type())
|
#define GSK_TYPE_BORDER_NODE (gsk_border_node_get_type())
|
||||||
#define GSK_TYPE_INSET_SHADOW_NODE (gsk_inset_shadow_node_get_type())
|
#define GSK_TYPE_INSET_SHADOW_NODE (gsk_inset_shadow_node_get_type())
|
||||||
#define GSK_TYPE_OUTSET_SHADOW_NODE (gsk_outset_shadow_node_get_type())
|
#define GSK_TYPE_OUTSET_SHADOW_NODE (gsk_outset_shadow_node_get_type())
|
||||||
@@ -126,6 +128,8 @@ typedef struct _GskColorNode GskColorNode;
|
|||||||
typedef struct _GskTextureNode GskTextureNode;
|
typedef struct _GskTextureNode GskTextureNode;
|
||||||
typedef struct _GskLinearGradientNode GskLinearGradientNode;
|
typedef struct _GskLinearGradientNode GskLinearGradientNode;
|
||||||
typedef struct _GskRepeatingLinearGradientNode GskRepeatingLinearGradientNode;
|
typedef struct _GskRepeatingLinearGradientNode GskRepeatingLinearGradientNode;
|
||||||
|
typedef struct _GskRadialGradientNode GskRadialGradientNode;
|
||||||
|
typedef struct _GskRepeatingRadialGradientNode GskRepeatingRadialGradientNode;
|
||||||
typedef struct _GskBorderNode GskBorderNode;
|
typedef struct _GskBorderNode GskBorderNode;
|
||||||
typedef struct _GskInsetShadowNode GskInsetShadowNode;
|
typedef struct _GskInsetShadowNode GskInsetShadowNode;
|
||||||
typedef struct _GskOutsetShadowNode GskOutsetShadowNode;
|
typedef struct _GskOutsetShadowNode GskOutsetShadowNode;
|
||||||
@@ -196,6 +200,45 @@ GskRenderNode * gsk_repeating_linear_gradient_node_new (const graph
|
|||||||
const GskColorStop *color_stops,
|
const GskColorStop *color_stops,
|
||||||
gsize n_color_stops);
|
gsize n_color_stops);
|
||||||
|
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
GType gsk_radial_gradient_node_get_type (void) G_GNUC_CONST;
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
GskRenderNode * gsk_radial_gradient_node_new (const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *color_stops,
|
||||||
|
gsize n_color_stops);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
gsize gsk_radial_gradient_node_get_n_color_stops (GskRenderNode *node);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
const GskColorStop * gsk_radial_gradient_node_peek_color_stops (GskRenderNode *node,
|
||||||
|
gsize *n_stops);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
const graphene_point_t *gsk_radial_gradient_node_peek_center (GskRenderNode *node);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
float gsk_radial_gradient_node_get_hradius (GskRenderNode *node);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
float gsk_radial_gradient_node_get_vradius (GskRenderNode *node);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
float gsk_radial_gradient_node_get_start (GskRenderNode *node);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
float gsk_radial_gradient_node_get_end (GskRenderNode *node);
|
||||||
|
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
GType gsk_repeating_radial_gradient_node_get_type (void) G_GNUC_CONST;
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
GskRenderNode * gsk_repeating_radial_gradient_node_new (const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *color_stops,
|
||||||
|
gsize n_color_stops);
|
||||||
|
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
GType gsk_border_node_get_type (void) G_GNUC_CONST;
|
GType gsk_border_node_get_type (void) G_GNUC_CONST;
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
@@ -386,6 +386,261 @@ gsk_linear_gradient_node_peek_color_stops (GskRenderNode *node,
|
|||||||
return self->stops;
|
return self->stops;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*** GSK_RADIAL_GRADIENT_NODE ***/
|
||||||
|
|
||||||
|
struct _GskRadialGradientNode
|
||||||
|
{
|
||||||
|
GskRenderNode render_node;
|
||||||
|
|
||||||
|
graphene_point_t center;
|
||||||
|
|
||||||
|
gboolean circle;
|
||||||
|
|
||||||
|
float hradius;
|
||||||
|
float vradius;
|
||||||
|
float start;
|
||||||
|
float end;
|
||||||
|
|
||||||
|
gsize n_stops;
|
||||||
|
GskColorStop *stops;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
gsk_radial_gradient_node_finalize (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
GskRenderNodeClass *parent_class = g_type_class_peek (g_type_parent (GSK_TYPE_RADIAL_GRADIENT_NODE));
|
||||||
|
|
||||||
|
g_free (self->stops);
|
||||||
|
|
||||||
|
parent_class->finalize (node);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gsk_radial_gradient_node_draw (GskRenderNode *node,
|
||||||
|
cairo_t *cr)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
cairo_pattern_t *pattern;
|
||||||
|
cairo_matrix_t matrix;
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
pattern = cairo_pattern_create_radial (0, 0, self->hradius * self->start,
|
||||||
|
0, 0, self->hradius * self->end);
|
||||||
|
|
||||||
|
if (self->hradius != self->vradius)
|
||||||
|
{
|
||||||
|
cairo_matrix_init_scale (&matrix, 1.0, self->hradius / self->vradius);
|
||||||
|
cairo_pattern_set_matrix (pattern, &matrix);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gsk_render_node_get_node_type (node) == GSK_REPEATING_RADIAL_GRADIENT_NODE)
|
||||||
|
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
|
||||||
|
else
|
||||||
|
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
|
||||||
|
|
||||||
|
for (i = 0; i < self->n_stops; i++)
|
||||||
|
cairo_pattern_add_color_stop_rgba (pattern,
|
||||||
|
self->stops[i].offset,
|
||||||
|
self->stops[i].color.red,
|
||||||
|
self->stops[i].color.green,
|
||||||
|
self->stops[i].color.blue,
|
||||||
|
self->stops[i].color.alpha);
|
||||||
|
|
||||||
|
gsk_cairo_rectangle (cr, &node->bounds);
|
||||||
|
cairo_translate (cr, self->center.x, self->center.y);
|
||||||
|
cairo_set_source (cr, pattern);
|
||||||
|
cairo_fill (cr);
|
||||||
|
|
||||||
|
cairo_pattern_destroy (pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gsk_radial_gradient_node_diff (GskRenderNode *node1,
|
||||||
|
GskRenderNode *node2,
|
||||||
|
cairo_region_t *region)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self1 = (GskRadialGradientNode *) node1;
|
||||||
|
GskRadialGradientNode *self2 = (GskRadialGradientNode *) node2;
|
||||||
|
|
||||||
|
if (graphene_point_equal (&self1->center, &self2->center) &&
|
||||||
|
self1->hradius == self2->hradius &&
|
||||||
|
self1->vradius == self2->vradius &&
|
||||||
|
self1->start == self2->start &&
|
||||||
|
self1->end == self2->end &&
|
||||||
|
self1->n_stops == self2->n_stops)
|
||||||
|
{
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
for (i = 0; i < self1->n_stops; i++)
|
||||||
|
{
|
||||||
|
GskColorStop *stop1 = &self1->stops[i];
|
||||||
|
GskColorStop *stop2 = &self2->stops[i];
|
||||||
|
|
||||||
|
if (stop1->offset == stop2->offset &&
|
||||||
|
gdk_rgba_equal (&stop1->color, &stop2->color))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
gsk_render_node_diff_impossible (node1, node2, region);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsk_render_node_diff_impossible (node1, node2, region);
|
||||||
|
}
|
||||||
|
|
||||||
|
GskRenderNode *
|
||||||
|
gsk_radial_gradient_node_new (const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *color_stops,
|
||||||
|
gsize n_color_stops)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self;
|
||||||
|
GskRenderNode *node;
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
g_return_val_if_fail (bounds != NULL, NULL);
|
||||||
|
g_return_val_if_fail (center != NULL, NULL);
|
||||||
|
g_return_val_if_fail (hradius > 0., NULL);
|
||||||
|
g_return_val_if_fail (vradius > 0., NULL);
|
||||||
|
g_return_val_if_fail (start > 0., NULL);
|
||||||
|
g_return_val_if_fail (end > 0., NULL);
|
||||||
|
g_return_val_if_fail (color_stops != NULL, NULL);
|
||||||
|
g_return_val_if_fail (n_color_stops >= 2, NULL);
|
||||||
|
g_return_val_if_fail (color_stops[0].offset >= 0, NULL);
|
||||||
|
for (i = 1; i < n_color_stops; i++)
|
||||||
|
g_return_val_if_fail (color_stops[i].offset >= color_stops[i - 1].offset, NULL);
|
||||||
|
g_return_val_if_fail (color_stops[n_color_stops - 1].offset <= 1, NULL);
|
||||||
|
|
||||||
|
self = gsk_render_node_alloc (GSK_RADIAL_GRADIENT_NODE);
|
||||||
|
node = (GskRenderNode *) self;
|
||||||
|
|
||||||
|
graphene_rect_init_from_rect (&node->bounds, bounds);
|
||||||
|
graphene_point_init_from_point (&self->center, center);
|
||||||
|
|
||||||
|
self->hradius = hradius;
|
||||||
|
self->vradius = vradius;
|
||||||
|
self->start = start;
|
||||||
|
self->end = end;
|
||||||
|
|
||||||
|
self->n_stops = n_color_stops;
|
||||||
|
self->stops = g_malloc_n (n_color_stops, sizeof (GskColorStop));
|
||||||
|
memcpy (self->stops, color_stops, n_color_stops * sizeof (GskColorStop));
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
GskRenderNode *
|
||||||
|
gsk_repeating_radial_gradient_node_new (const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *color_stops,
|
||||||
|
gsize n_color_stops)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self;
|
||||||
|
GskRenderNode *node;
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
g_return_val_if_fail (bounds != NULL, NULL);
|
||||||
|
g_return_val_if_fail (center != NULL, NULL);
|
||||||
|
g_return_val_if_fail (hradius > 0., NULL);
|
||||||
|
g_return_val_if_fail (vradius > 0., NULL);
|
||||||
|
g_return_val_if_fail (start > 0., NULL);
|
||||||
|
g_return_val_if_fail (end > 0., NULL);
|
||||||
|
g_return_val_if_fail (color_stops != NULL, NULL);
|
||||||
|
g_return_val_if_fail (n_color_stops >= 2, NULL);
|
||||||
|
g_return_val_if_fail (color_stops[0].offset >= 0, NULL);
|
||||||
|
for (i = 1; i < n_color_stops; i++)
|
||||||
|
g_return_val_if_fail (color_stops[i].offset >= color_stops[i - 1].offset, NULL);
|
||||||
|
g_return_val_if_fail (color_stops[n_color_stops - 1].offset <= 1, NULL);
|
||||||
|
|
||||||
|
self = gsk_render_node_alloc (GSK_REPEATING_RADIAL_GRADIENT_NODE);
|
||||||
|
node = (GskRenderNode *) self;
|
||||||
|
|
||||||
|
graphene_rect_init_from_rect (&node->bounds, bounds);
|
||||||
|
graphene_point_init_from_point (&self->center, center);
|
||||||
|
|
||||||
|
self->hradius = hradius;
|
||||||
|
self->vradius = vradius;
|
||||||
|
self->start = start;
|
||||||
|
self->end = end;
|
||||||
|
|
||||||
|
self->n_stops = n_color_stops;
|
||||||
|
self->stops = g_malloc_n (n_color_stops, sizeof (GskColorStop));
|
||||||
|
memcpy (self->stops, color_stops, n_color_stops * sizeof (GskColorStop));
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
gsize
|
||||||
|
gsk_radial_gradient_node_get_n_color_stops (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
return self->n_stops;
|
||||||
|
}
|
||||||
|
|
||||||
|
const GskColorStop *
|
||||||
|
gsk_radial_gradient_node_peek_color_stops (GskRenderNode *node,
|
||||||
|
gsize *n_stops)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
if (n_stops != NULL)
|
||||||
|
*n_stops = self->n_stops;
|
||||||
|
|
||||||
|
return self->stops;
|
||||||
|
}
|
||||||
|
|
||||||
|
const graphene_point_t *
|
||||||
|
gsk_radial_gradient_node_peek_center (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
return &self->center;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
gsk_radial_gradient_node_get_hradius (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
return self->hradius;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
gsk_radial_gradient_node_get_vradius (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
return self->vradius;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
gsk_radial_gradient_node_get_start (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
return self->start;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
gsk_radial_gradient_node_get_end (GskRenderNode *node)
|
||||||
|
{
|
||||||
|
GskRadialGradientNode *self = (GskRadialGradientNode *) node;
|
||||||
|
|
||||||
|
return self->end;
|
||||||
|
}
|
||||||
|
|
||||||
/*** GSK_BORDER_NODE ***/
|
/*** GSK_BORDER_NODE ***/
|
||||||
|
|
||||||
struct _GskBorderNode
|
struct _GskBorderNode
|
||||||
@@ -4191,6 +4446,8 @@ GSK_DEFINE_RENDER_NODE_TYPE (gsk_cairo_node, GSK_CAIRO_NODE)
|
|||||||
GSK_DEFINE_RENDER_NODE_TYPE (gsk_color_node, GSK_COLOR_NODE)
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_color_node, GSK_COLOR_NODE)
|
||||||
GSK_DEFINE_RENDER_NODE_TYPE (gsk_linear_gradient_node, GSK_LINEAR_GRADIENT_NODE)
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_linear_gradient_node, GSK_LINEAR_GRADIENT_NODE)
|
||||||
GSK_DEFINE_RENDER_NODE_TYPE (gsk_repeating_linear_gradient_node, GSK_REPEATING_LINEAR_GRADIENT_NODE)
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_repeating_linear_gradient_node, GSK_REPEATING_LINEAR_GRADIENT_NODE)
|
||||||
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_radial_gradient_node, GSK_RADIAL_GRADIENT_NODE)
|
||||||
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_repeating_radial_gradient_node, GSK_REPEATING_RADIAL_GRADIENT_NODE)
|
||||||
GSK_DEFINE_RENDER_NODE_TYPE (gsk_border_node, GSK_BORDER_NODE)
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_border_node, GSK_BORDER_NODE)
|
||||||
GSK_DEFINE_RENDER_NODE_TYPE (gsk_texture_node, GSK_TEXTURE_NODE)
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_texture_node, GSK_TEXTURE_NODE)
|
||||||
GSK_DEFINE_RENDER_NODE_TYPE (gsk_inset_shadow_node, GSK_INSET_SHADOW_NODE)
|
GSK_DEFINE_RENDER_NODE_TYPE (gsk_inset_shadow_node, GSK_INSET_SHADOW_NODE)
|
||||||
@@ -4291,6 +4548,38 @@ gsk_render_node_init_types_once (void)
|
|||||||
gsk_render_node_types[GSK_REPEATING_LINEAR_GRADIENT_NODE] = node_type;
|
gsk_render_node_types[GSK_REPEATING_LINEAR_GRADIENT_NODE] = node_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const GskRenderNodeTypeInfo node_info =
|
||||||
|
{
|
||||||
|
GSK_RADIAL_GRADIENT_NODE,
|
||||||
|
sizeof (GskRadialGradientNode),
|
||||||
|
NULL,
|
||||||
|
gsk_radial_gradient_node_finalize,
|
||||||
|
gsk_radial_gradient_node_draw,
|
||||||
|
NULL,
|
||||||
|
gsk_radial_gradient_node_diff,
|
||||||
|
};
|
||||||
|
|
||||||
|
GType node_type = gsk_render_node_type_register_static (I_("GskRadialGradientNode"), &node_info);
|
||||||
|
gsk_render_node_types[GSK_RADIAL_GRADIENT_NODE] = node_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const GskRenderNodeTypeInfo node_info =
|
||||||
|
{
|
||||||
|
GSK_REPEATING_RADIAL_GRADIENT_NODE,
|
||||||
|
sizeof (GskRadialGradientNode),
|
||||||
|
NULL,
|
||||||
|
gsk_radial_gradient_node_finalize,
|
||||||
|
gsk_radial_gradient_node_draw,
|
||||||
|
NULL,
|
||||||
|
gsk_radial_gradient_node_diff,
|
||||||
|
};
|
||||||
|
|
||||||
|
GType node_type = gsk_render_node_type_register_static (I_("GskRepeatingRadialGradientNode"), &node_info);
|
||||||
|
gsk_render_node_types[GSK_REPEATING_RADIAL_GRADIENT_NODE] = node_type;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const GskRenderNodeTypeInfo node_info =
|
const GskRenderNodeTypeInfo node_info =
|
||||||
{
|
{
|
||||||
|
@@ -2003,6 +2003,42 @@ render_node_print (Printer *p,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
{
|
||||||
|
const gsize n_stops = gsk_radial_gradient_node_get_n_color_stops (node);
|
||||||
|
const GskColorStop *stops = gsk_radial_gradient_node_peek_color_stops (node, NULL);
|
||||||
|
gsize i;
|
||||||
|
|
||||||
|
if (gsk_render_node_get_node_type (node) == GSK_REPEATING_RADIAL_GRADIENT_NODE)
|
||||||
|
start_node (p, "repeating-radial-gradient");
|
||||||
|
else
|
||||||
|
start_node (p, "radial-gradient");
|
||||||
|
|
||||||
|
append_rect_param (p, "bounds", &node->bounds);
|
||||||
|
append_point_param (p, "center", gsk_radial_gradient_node_peek_center (node));
|
||||||
|
append_float_param (p, "hradius", gsk_radial_gradient_node_get_hradius (node), 0.0f);
|
||||||
|
append_float_param (p, "vradius", gsk_radial_gradient_node_get_vradius (node), 0.0f);
|
||||||
|
append_float_param (p, "start", gsk_radial_gradient_node_get_start (node), 0.0f);
|
||||||
|
append_float_param (p, "end", gsk_radial_gradient_node_get_end (node), 1.0f);
|
||||||
|
|
||||||
|
_indent (p);
|
||||||
|
g_string_append (p->str, "stops: ");
|
||||||
|
for (i = 0; i < n_stops; i ++)
|
||||||
|
{
|
||||||
|
if (i > 0)
|
||||||
|
g_string_append (p->str, ", ");
|
||||||
|
|
||||||
|
string_append_double (p->str, stops[i].offset);
|
||||||
|
g_string_append_c (p->str, ' ');
|
||||||
|
append_rgba (p->str, &stops[i].color);
|
||||||
|
}
|
||||||
|
g_string_append (p->str, ";\n");
|
||||||
|
|
||||||
|
end_node (p);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case GSK_OPACITY_NODE:
|
case GSK_OPACITY_NODE:
|
||||||
{
|
{
|
||||||
start_node (p, "opacity");
|
start_node (p, "opacity");
|
||||||
|
@@ -257,6 +257,8 @@ gsk_vulkan_render_pass_add_node (GskVulkanRenderPass *self,
|
|||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
return;
|
return;
|
||||||
case GSK_SHADOW_NODE:
|
case GSK_SHADOW_NODE:
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
default:
|
default:
|
||||||
FALLBACK ("Unsupported node '%s'", g_type_name_from_instance ((GTypeInstance *) node));
|
FALLBACK ("Unsupported node '%s'", g_type_name_from_instance ((GTypeInstance *) node));
|
||||||
|
|
||||||
|
@@ -80,18 +80,13 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
|||||||
double height)
|
double height)
|
||||||
{
|
{
|
||||||
GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
|
GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
|
||||||
cairo_pattern_t *pattern;
|
GskColorStop *stops;
|
||||||
cairo_matrix_t matrix;
|
|
||||||
double x, y;
|
double x, y;
|
||||||
double radius, yscale;
|
double hradius, vradius;
|
||||||
double start, end;
|
double start, end;
|
||||||
double r1, r2, r3, r4, r;
|
double r1, r2, r3, r4, r;
|
||||||
double offset;
|
double offset;
|
||||||
int i, last;
|
int i, last;
|
||||||
cairo_t *cr;
|
|
||||||
|
|
||||||
cr = gtk_snapshot_append_cairo (snapshot,
|
|
||||||
&GRAPHENE_RECT_INIT (0, 0, width, height));
|
|
||||||
|
|
||||||
x = _gtk_css_position_value_get_x (radial->position, width);
|
x = _gtk_css_position_value_get_x (radial->position, width);
|
||||||
y = _gtk_css_position_value_get_y (radial->position, height);
|
y = _gtk_css_position_value_get_y (radial->position, height);
|
||||||
@@ -101,13 +96,13 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
|||||||
switch (radial->size)
|
switch (radial->size)
|
||||||
{
|
{
|
||||||
case GTK_CSS_EXPLICIT_SIZE:
|
case GTK_CSS_EXPLICIT_SIZE:
|
||||||
radius = _gtk_css_number_value_get (radial->sizes[0], width);
|
hradius = _gtk_css_number_value_get (radial->sizes[0], width);
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_CLOSEST_SIDE:
|
case GTK_CSS_CLOSEST_SIDE:
|
||||||
radius = MIN (MIN (x, width - x), MIN (y, height - y));
|
hradius = MIN (MIN (x, width - x), MIN (y, height - y));
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_FARTHEST_SIDE:
|
case GTK_CSS_FARTHEST_SIDE:
|
||||||
radius = MAX (MAX (x, width - x), MAX (y, height - y));
|
hradius = MAX (MAX (x, width - x), MAX (y, height - y));
|
||||||
break;
|
break;
|
||||||
case GTK_CSS_CLOSEST_CORNER:
|
case GTK_CSS_CLOSEST_CORNER:
|
||||||
case GTK_CSS_FARTHEST_CORNER:
|
case GTK_CSS_FARTHEST_CORNER:
|
||||||
@@ -119,19 +114,17 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
|||||||
r = MIN ( MIN (r1, r2), MIN (r3, r4));
|
r = MIN ( MIN (r1, r2), MIN (r3, r4));
|
||||||
else
|
else
|
||||||
r = MAX ( MAX (r1, r2), MAX (r3, r4));
|
r = MAX ( MAX (r1, r2), MAX (r3, r4));
|
||||||
radius = sqrt (r);
|
hradius = sqrt (r);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
radius = MAX (1.0, radius);
|
hradius = MAX (1.0, hradius);
|
||||||
yscale = 1.0;
|
vradius = hradius;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double hradius, vradius;
|
|
||||||
|
|
||||||
switch (radial->size)
|
switch (radial->size)
|
||||||
{
|
{
|
||||||
case GTK_CSS_EXPLICIT_SIZE:
|
case GTK_CSS_EXPLICIT_SIZE:
|
||||||
@@ -160,27 +153,14 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
|||||||
|
|
||||||
hradius = MAX (1.0, hradius);
|
hradius = MAX (1.0, hradius);
|
||||||
vradius = MAX (1.0, vradius);
|
vradius = MAX (1.0, vradius);
|
||||||
|
|
||||||
radius = hradius;
|
|
||||||
yscale = vradius / hradius;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gtk_css_image_radial_get_start_end (radial, radius, &start, &end);
|
gtk_css_image_radial_get_start_end (radial, hradius, &start, &end);
|
||||||
|
|
||||||
pattern = cairo_pattern_create_radial (0, 0, radius * start, 0, 0, radius * end);
|
|
||||||
if (yscale != 1.0)
|
|
||||||
{
|
|
||||||
cairo_matrix_init_scale (&matrix, 1.0, 1.0 / yscale);
|
|
||||||
cairo_pattern_set_matrix (pattern, &matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (radial->repeating)
|
|
||||||
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
|
|
||||||
else
|
|
||||||
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
|
|
||||||
|
|
||||||
offset = start;
|
offset = start;
|
||||||
last = -1;
|
last = -1;
|
||||||
|
stops = g_newa (GskColorStop, radial->n_stops);
|
||||||
|
|
||||||
for (i = 0; i < radial->n_stops; i++)
|
for (i = 0; i < radial->n_stops; i++)
|
||||||
{
|
{
|
||||||
const GtkCssImageRadialColorStop *stop = &radial->color_stops[i];
|
const GtkCssImageRadialColorStop *stop = &radial->color_stops[i];
|
||||||
@@ -196,39 +176,44 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pos = _gtk_css_number_value_get (stop->offset, radius) / radius;
|
pos = _gtk_css_number_value_get (stop->offset, hradius) / hradius;
|
||||||
|
|
||||||
pos = MAX (pos, 0);
|
pos = MAX (pos, 0);
|
||||||
step = (pos - offset) / (i - last);
|
step = (pos - offset) / (i - last);
|
||||||
for (last = last + 1; last <= i; last++)
|
for (last = last + 1; last <= i; last++)
|
||||||
{
|
{
|
||||||
const GdkRGBA *rgba;
|
|
||||||
|
|
||||||
stop = &radial->color_stops[last];
|
stop = &radial->color_stops[last];
|
||||||
|
|
||||||
rgba = gtk_css_color_value_get_rgba (stop->color);
|
|
||||||
offset += step;
|
offset += step;
|
||||||
|
|
||||||
cairo_pattern_add_color_stop_rgba (pattern,
|
stops[last].offset = (offset - start) / (end - start);
|
||||||
(offset - start) / (end - start),
|
stops[last].color = *gtk_css_color_value_get_rgba (stop->color);
|
||||||
rgba->red,
|
|
||||||
rgba->green,
|
|
||||||
rgba->blue,
|
|
||||||
rgba->alpha);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
offset = pos;
|
offset = pos;
|
||||||
last = i;
|
last = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_rectangle (cr, 0, 0, width, height);
|
if (radial->repeating)
|
||||||
cairo_translate (cr, x, y);
|
gtk_snapshot_append_repeating_radial_gradient (snapshot,
|
||||||
cairo_set_source (cr, pattern);
|
&GRAPHENE_RECT_INIT (0, 0, width, height),
|
||||||
cairo_fill (cr);
|
&GRAPHENE_POINT_INIT (x, y),
|
||||||
|
hradius,
|
||||||
cairo_pattern_destroy (pattern);
|
vradius,
|
||||||
|
start,
|
||||||
cairo_destroy (cr);
|
end,
|
||||||
|
stops,
|
||||||
|
radial->n_stops);
|
||||||
|
else
|
||||||
|
gtk_snapshot_append_radial_gradient (snapshot,
|
||||||
|
&GRAPHENE_RECT_INIT (0, 0, width, height),
|
||||||
|
&GRAPHENE_POINT_INIT (x, y),
|
||||||
|
hradius,
|
||||||
|
vradius,
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
stops,
|
||||||
|
radial->n_stops);
|
||||||
}
|
}
|
||||||
|
|
||||||
static guint
|
static guint
|
||||||
|
@@ -1967,6 +1967,82 @@ gtk_snapshot_append_repeating_linear_gradient (GtkSnapshot *snapshot,
|
|||||||
gtk_snapshot_append_node_internal (snapshot, node);
|
gtk_snapshot_append_node_internal (snapshot, node);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_snapshot_append_radial_gradient (GtkSnapshot *snapshot,
|
||||||
|
const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *stops,
|
||||||
|
gsize n_stops)
|
||||||
|
{
|
||||||
|
GskRenderNode *node;
|
||||||
|
graphene_rect_t real_bounds;
|
||||||
|
graphene_point_t real_center;
|
||||||
|
float scale_x, scale_y, dx, dy;
|
||||||
|
|
||||||
|
g_return_if_fail (snapshot != NULL);
|
||||||
|
g_return_if_fail (center != NULL);
|
||||||
|
g_return_if_fail (stops != NULL);
|
||||||
|
g_return_if_fail (n_stops > 1);
|
||||||
|
|
||||||
|
gtk_snapshot_ensure_affine (snapshot, &scale_x, &scale_y, &dx, &dy);
|
||||||
|
gtk_graphene_rect_scale_affine (bounds, scale_x, scale_y, dx, dy, &real_bounds);
|
||||||
|
real_center.x = scale_x * center->x + dx;
|
||||||
|
real_center.y = scale_y * center->y + dy;
|
||||||
|
|
||||||
|
node = gsk_radial_gradient_node_new (&real_bounds,
|
||||||
|
&real_center,
|
||||||
|
hradius * scale_x,
|
||||||
|
vradius * scale_y,
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
stops,
|
||||||
|
n_stops);
|
||||||
|
|
||||||
|
gtk_snapshot_append_node_internal (snapshot, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gtk_snapshot_append_repeating_radial_gradient (GtkSnapshot *snapshot,
|
||||||
|
const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *stops,
|
||||||
|
gsize n_stops)
|
||||||
|
{
|
||||||
|
GskRenderNode *node;
|
||||||
|
graphene_rect_t real_bounds;
|
||||||
|
graphene_point_t real_center;
|
||||||
|
float scale_x, scale_y, dx, dy;
|
||||||
|
|
||||||
|
g_return_if_fail (snapshot != NULL);
|
||||||
|
g_return_if_fail (center != NULL);
|
||||||
|
g_return_if_fail (stops != NULL);
|
||||||
|
g_return_if_fail (n_stops > 1);
|
||||||
|
|
||||||
|
gtk_snapshot_ensure_affine (snapshot, &scale_x, &scale_y, &dx, &dy);
|
||||||
|
gtk_graphene_rect_scale_affine (bounds, scale_x, scale_y, dx, dy, &real_bounds);
|
||||||
|
real_center.x = scale_x * center->x + dx;
|
||||||
|
real_center.y = scale_y * center->y + dy;
|
||||||
|
|
||||||
|
node = gsk_repeating_radial_gradient_node_new (&real_bounds,
|
||||||
|
&real_center,
|
||||||
|
hradius * scale_x,
|
||||||
|
vradius * scale_y,
|
||||||
|
start,
|
||||||
|
end,
|
||||||
|
stops,
|
||||||
|
n_stops);
|
||||||
|
|
||||||
|
gtk_snapshot_append_node_internal (snapshot, node);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gtk_snapshot_append_border:
|
* gtk_snapshot_append_border:
|
||||||
* @snapshot: a #GtkSnapshot
|
* @snapshot: a #GtkSnapshot
|
||||||
|
@@ -165,6 +165,26 @@ void gtk_snapshot_append_repeating_linear_gradient (GtkSnapshot
|
|||||||
const GskColorStop *stops,
|
const GskColorStop *stops,
|
||||||
gsize n_stops);
|
gsize n_stops);
|
||||||
GDK_AVAILABLE_IN_ALL
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
void gtk_snapshot_append_radial_gradient (GtkSnapshot *snapshot,
|
||||||
|
const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *stops,
|
||||||
|
gsize n_stops);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
|
void gtk_snapshot_append_repeating_radial_gradient (GtkSnapshot *snapshot,
|
||||||
|
const graphene_rect_t *bounds,
|
||||||
|
const graphene_point_t *center,
|
||||||
|
float hradius,
|
||||||
|
float vradius,
|
||||||
|
float start,
|
||||||
|
float end,
|
||||||
|
const GskColorStop *stops,
|
||||||
|
gsize n_stops);
|
||||||
|
GDK_AVAILABLE_IN_ALL
|
||||||
void gtk_snapshot_append_border (GtkSnapshot *snapshot,
|
void gtk_snapshot_append_border (GtkSnapshot *snapshot,
|
||||||
const GskRoundedRect *outline,
|
const GskRoundedRect *outline,
|
||||||
const float border_width[4],
|
const float border_width[4],
|
||||||
|
@@ -131,6 +131,8 @@ create_list_model_for_render_node (GskRenderNode *node)
|
|||||||
case GSK_COLOR_NODE:
|
case GSK_COLOR_NODE:
|
||||||
case GSK_LINEAR_GRADIENT_NODE:
|
case GSK_LINEAR_GRADIENT_NODE:
|
||||||
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
case GSK_BORDER_NODE:
|
case GSK_BORDER_NODE:
|
||||||
case GSK_INSET_SHADOW_NODE:
|
case GSK_INSET_SHADOW_NODE:
|
||||||
case GSK_OUTSET_SHADOW_NODE:
|
case GSK_OUTSET_SHADOW_NODE:
|
||||||
@@ -234,6 +236,10 @@ node_type_name (GskRenderNodeType type)
|
|||||||
return "Linear Gradient";
|
return "Linear Gradient";
|
||||||
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
||||||
return "Repeating Linear Gradient";
|
return "Repeating Linear Gradient";
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
return "Radial Gradient";
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
|
return "Repeating Radial Gradient";
|
||||||
case GSK_BORDER_NODE:
|
case GSK_BORDER_NODE:
|
||||||
return "Border";
|
return "Border";
|
||||||
case GSK_TEXTURE_NODE:
|
case GSK_TEXTURE_NODE:
|
||||||
@@ -279,6 +285,8 @@ node_name (GskRenderNode *node)
|
|||||||
case GSK_CAIRO_NODE:
|
case GSK_CAIRO_NODE:
|
||||||
case GSK_LINEAR_GRADIENT_NODE:
|
case GSK_LINEAR_GRADIENT_NODE:
|
||||||
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
case GSK_BORDER_NODE:
|
case GSK_BORDER_NODE:
|
||||||
case GSK_INSET_SHADOW_NODE:
|
case GSK_INSET_SHADOW_NODE:
|
||||||
case GSK_OUTSET_SHADOW_NODE:
|
case GSK_OUTSET_SHADOW_NODE:
|
||||||
@@ -625,6 +633,11 @@ populate_render_node_properties (GtkListStore *store,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case GSK_RADIAL_GRADIENT_NODE:
|
||||||
|
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
|
||||||
|
/* TODO */
|
||||||
|
break;
|
||||||
|
|
||||||
case GSK_TEXT_NODE:
|
case GSK_TEXT_NODE:
|
||||||
{
|
{
|
||||||
const PangoFont *font = gsk_text_node_peek_font (node);
|
const PangoFont *font = gsk_text_node_peek_font (node);
|
||||||
|
Reference in New Issue
Block a user