[gtk/deprecate-render: 31/48] Use the new caret rendering api
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/deprecate-render: 31/48] Use the new caret rendering api
- Date: Tue, 11 Oct 2022 21:20:00 +0000 (UTC)
commit c9f7fb8b178785de37506ba8171bca6cbcbc7510
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Oct 8 16:36:20 2022 -0400
Use the new caret rendering api
Implement the deprecated gtk_snapshot_render api
for carets with the new one.
gtk/deprecated/gtkrender.c | 242 ++-------------------------------------------
1 file changed, 6 insertions(+), 236 deletions(-)
---
diff --git a/gtk/deprecated/gtkrender.c b/gtk/deprecated/gtkrender.c
index 3c9012ec49..56242cf15d 100644
--- a/gtk/deprecated/gtkrender.c
+++ b/gtk/deprecated/gtkrender.c
@@ -680,171 +680,6 @@ gtk_snapshot_render_layout (GtkSnapshot *snapshot,
gtk_css_style_snapshot_layout (&boxes, snapshot, x, y, layout);
}
-static void
-draw_insertion_cursor (GtkStyleContext *context,
- cairo_t *cr,
- double x,
- double y,
- double width,
- double height,
- double aspect_ratio,
- gboolean is_primary,
- PangoDirection direction,
- gboolean draw_arrow)
-{
- GdkRGBA primary_color;
- GdkRGBA secondary_color;
- int stem_width;
- double angle;
- double dx, dy;
- double xx1, yy1, xx2, yy2;
-
- cairo_save (cr);
- cairo_new_path (cr);
-
- _gtk_style_context_get_cursor_color (context, &primary_color, &secondary_color);
- gdk_cairo_set_source_rgba (cr, is_primary ? &primary_color : &secondary_color);
-
- stem_width = height * aspect_ratio + 1;
-
- yy1 = y;
- yy2 = y + height;
-
- if (width < 0)
- {
- xx1 = x;
- xx2 = x - width;
- }
- else
- {
- xx1 = x + width;
- xx2 = x;
- }
-
- angle = atan2 (height, width);
-
- dx = (stem_width/2.0) * cos (M_PI/2 - angle);
- dy = (stem_width/2.0) * sin (M_PI/2 - angle);
-
- if (draw_arrow)
- {
- if (direction == PANGO_DIRECTION_RTL)
- {
- double x0, y0, x1, y1, x2, y2;
-
- x0 = xx2 - dx + 2 * dy;
- y0 = yy2 - dy - 2 * dx;
-
- x1 = x0 + 4 * dy;
- y1 = y0 - 4 * dx;
- x2 = x0 + 2 * dy - 3 * dx;
- y2 = y0 - 2 * dx - 3 * dy;
-
- cairo_move_to (cr, xx1 + dx, yy1 + dy);
- cairo_line_to (cr, xx2 + dx, yy2 + dy);
- cairo_line_to (cr, x2, y2);
- cairo_line_to (cr, x1, y1);
- cairo_line_to (cr, xx1 - dx, yy1 - dy);
- }
- else if (direction == PANGO_DIRECTION_LTR)
- {
- double x0, y0, x1, y1, x2, y2;
-
- x0 = xx2 + dx + 2 * dy;
- y0 = yy2 + dy - 2 * dx;
-
- x1 = x0 + 4 * dy;
- y1 = y0 - 4 * dx;
- x2 = x0 + 2 * dy + 3 * dx;
- y2 = y0 - 2 * dx + 3 * dy;
-
- cairo_move_to (cr, xx1 - dx, yy1 - dy);
- cairo_line_to (cr, xx2 - dx, yy2 - dy);
- cairo_line_to (cr, x2, y2);
- cairo_line_to (cr, x1, y1);
- cairo_line_to (cr, xx1 + dx, yy1 + dy);
- }
- else
- g_assert_not_reached();
- }
- else
- {
- cairo_move_to (cr, xx1 + dx, yy1 + dy);
- cairo_line_to (cr, xx2 + dx, yy2 + dy);
- cairo_line_to (cr, xx2 - dx, yy2 - dy);
- cairo_line_to (cr, xx1 - dx, yy1 - dy);
- }
-
- cairo_fill (cr);
-
- cairo_restore (cr);
-}
-
-static void
-get_insertion_cursor_bounds (double width,
- double height,
- double aspect_ratio,
- PangoDirection direction,
- gboolean draw_arrow,
- graphene_rect_t *bounds)
-{
- int stem_width;
-
- if (width < 0)
- width = - width;
-
- stem_width = height * aspect_ratio + 1;
-
- graphene_rect_init (bounds,
- - 2 * stem_width, - stem_width,
- width + 4 * stem_width, height + 2 * stem_width);
-}
-
-static void
-snapshot_insertion_cursor (GtkSnapshot *snapshot,
- GtkStyleContext *context,
- double width,
- double height,
- double aspect_ratio,
- gboolean is_primary,
- PangoDirection direction,
- gboolean draw_arrow)
-{
- if (width != 0 || draw_arrow)
- {
- cairo_t *cr;
- graphene_rect_t bounds;
-
- get_insertion_cursor_bounds (width, height, aspect_ratio, direction, draw_arrow, &bounds);
- cr = gtk_snapshot_append_cairo (snapshot, &bounds);
-
- draw_insertion_cursor (context, cr, 0, 0, width, height, aspect_ratio, is_primary, direction,
draw_arrow);
-
- cairo_destroy (cr);
- }
- else
- {
- GdkRGBA primary_color;
- GdkRGBA secondary_color;
- int stem_width;
- int offset;
-
- _gtk_style_context_get_cursor_color (context, &primary_color, &secondary_color);
-
- stem_width = height * aspect_ratio + 1;
-
- /* put (stem_width % 2) on the proper side of the cursor */
- if (direction == PANGO_DIRECTION_LTR)
- offset = stem_width / 2;
- else
- offset = stem_width - stem_width / 2;
-
- gtk_snapshot_append_color (snapshot,
- is_primary ? &primary_color : &secondary_color,
- &GRAPHENE_RECT_INIT (- offset, 0, stem_width, height));
- }
-}
-
/**
* gtk_snapshot_render_insertion_cursor:
* @snapshot: snapshot to render to
@@ -868,83 +703,18 @@ gtk_snapshot_render_insertion_cursor (GtkSnapshot *snapshot,
int index,
PangoDirection direction)
{
+ GtkCssBoxes boxes;
GdkDisplay *display;
- gboolean split_cursor;
- double aspect_ratio;
- PangoRectangle strong_pos, weak_pos;
- PangoRectangle *cursor1, *cursor2;
- GdkSeat *seat;
- PangoDirection keyboard_direction;
- PangoDirection direction2;
g_return_if_fail (snapshot != NULL);
g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
g_return_if_fail (PANGO_IS_LAYOUT (layout));
g_return_if_fail (index >= 0);
- display = gtk_style_context_get_display (context);
+ gtk_css_boxes_init_border_box (&boxes,
+ gtk_style_context_lookup_style (context),
+ x, y, 0, 0);
- g_object_get (gtk_settings_get_for_display (display),
- "gtk-split-cursor", &split_cursor,
- "gtk-cursor-aspect-ratio", &aspect_ratio,
- NULL);
-
- keyboard_direction = PANGO_DIRECTION_LTR;
- seat = gdk_display_get_default_seat (display);
- if (seat)
- {
- GdkDevice *keyboard = gdk_seat_get_keyboard (seat);
-
- if (keyboard)
- keyboard_direction = gdk_device_get_direction (keyboard);
- }
-
- pango_layout_get_caret_pos (layout, index, &strong_pos, &weak_pos);
-
- direction2 = PANGO_DIRECTION_NEUTRAL;
-
- if (split_cursor)
- {
- cursor1 = &strong_pos;
-
- if (strong_pos.x != weak_pos.x || strong_pos.y != weak_pos.y)
- {
- direction2 = (direction == PANGO_DIRECTION_LTR) ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR;
- cursor2 = &weak_pos;
- }
- }
- else
- {
- if (keyboard_direction == direction)
- cursor1 = &strong_pos;
- else
- cursor1 = &weak_pos;
- }
-
- gtk_snapshot_save (snapshot);
- gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x + PANGO_PIXELS (MIN (cursor1->x, cursor1->x +
cursor1->width)), y + PANGO_PIXELS (cursor1->y)));
- snapshot_insertion_cursor (snapshot,
- context,
- PANGO_PIXELS (cursor1->width),
- PANGO_PIXELS (cursor1->height),
- aspect_ratio,
- TRUE,
- direction,
- direction2 != PANGO_DIRECTION_NEUTRAL);
- gtk_snapshot_restore (snapshot);
-
- if (direction2 != PANGO_DIRECTION_NEUTRAL)
- {
- gtk_snapshot_save (snapshot);
- gtk_snapshot_translate (snapshot, &GRAPHENE_POINT_INIT (x + PANGO_PIXELS (MIN (cursor2->x, cursor2->x
+ cursor2->width)), y + PANGO_PIXELS (cursor2->y)));
- snapshot_insertion_cursor (snapshot,
- context,
- PANGO_PIXELS (cursor2->width),
- PANGO_PIXELS (cursor2->height),
- aspect_ratio,
- FALSE,
- direction2,
- TRUE);
- gtk_snapshot_restore (snapshot);
- }
+ display = gtk_style_context_get_display (context);
+ gtk_css_style_snapshot_caret (&boxes, display, snapshot, x, y, layout, index, direction);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]