summaryrefslogtreecommitdiff
path: root/src/cairo-gstate.c
diff options
context:
space:
mode:
authorRick Yorgason <rick@firefang.com>2021-08-15 06:58:54 +0000
committerAdrian Johnson <ajohnson@redneon.com>2021-08-15 06:58:54 +0000
commitecec0419f8e178d71e449b52acfdfe9ac03aed37 (patch)
treee6ede3cdc9a0ae02a6f56dfec38ff8b05cdcf9bb /src/cairo-gstate.c
parent4dd48f0979f693dfc515eb3eff266ec6429f8b33 (diff)
downloadcairo-ecec0419f8e178d71e449b52acfdfe9ac03aed37.tar.gz
Added hairline support to cairo
Diffstat (limited to 'src/cairo-gstate.c')
-rw-r--r--src/cairo-gstate.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c
index 64060c4fc..a8c67e718 100644
--- a/src/cairo-gstate.c
+++ b/src/cairo-gstate.c
@@ -470,7 +470,10 @@ _cairo_gstate_get_fill_rule (cairo_gstate_t *gstate)
cairo_status_t
_cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width)
{
- gstate->stroke_style.line_width = width;
+ if (gstate->stroke_style.is_hairline)
+ gstate->stroke_style.pre_hairline_line_width = width;
+ else
+ gstate->stroke_style.line_width = width;
return CAIRO_STATUS_SUCCESS;
}
@@ -482,6 +485,29 @@ _cairo_gstate_get_line_width (cairo_gstate_t *gstate)
}
cairo_status_t
+_cairo_gstate_set_hairline (cairo_gstate_t *gstate, cairo_bool_t set_hairline)
+{
+ if (gstate->stroke_style.is_hairline != set_hairline) {
+ gstate->stroke_style.is_hairline = set_hairline;
+
+ if (set_hairline) {
+ gstate->stroke_style.pre_hairline_line_width = gstate->stroke_style.line_width;
+ gstate->stroke_style.line_width = 0.0;
+ } else {
+ gstate->stroke_style.line_width = gstate->stroke_style.pre_hairline_line_width;
+ }
+ }
+
+ return CAIRO_STATUS_SUCCESS;
+}
+
+cairo_bool_t
+_cairo_gstate_get_hairline (cairo_gstate_t *gstate)
+{
+ return gstate->stroke_style.is_hairline;
+}
+
+cairo_status_t
_cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap)
{
gstate->stroke_style.line_cap = line_cap;
@@ -1172,7 +1198,7 @@ _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path)
if (gstate->op == CAIRO_OPERATOR_DEST)
return CAIRO_STATUS_SUCCESS;
- if (gstate->stroke_style.line_width <= 0.0)
+ if (gstate->stroke_style.line_width <= 0.0 && !gstate->stroke_style.is_hairline)
return CAIRO_STATUS_SUCCESS;
if (_cairo_clip_is_all_clipped (gstate->clip))