6#include <cairomm/context.h>
7#include <cairomm/surface.h>
20Cairo::RefPtr<Cairo::Pattern> rgba_to_pattern(std::uint32_t
const rgba)
29 auto color = Colors::Color(rgba);
31 color.enableOpacity(
false);
33 auto surface = Cairo::ImageSurface::create(Cairo::Surface::Format::ARGB32, 2 *
w, 2 * h);
35 auto cr = Cairo::Context::create(
surface);
36 cr->set_operator(Cairo::Context::Operator::SOURCE);
40 cr->rectangle(0, 0,
w, h);
41 cr->rectangle(
w, h,
w, h);
44 auto pattern = Cairo::SurfacePattern::create(
surface);
45 pattern->set_extend(Cairo::Pattern::Extend::REPEAT);
46 pattern->set_filter(Cairo::SurfacePattern::Filter::NEAREST);
55 std::uint32_t
const page, std::uint32_t
const desk,
56 Cairo::RefPtr<Cairo::Context>
const &cr)
59 cr->set_operator(Cairo::Context::Operator::SOURCE);
65 cr->set_source(rgba_to_pattern(
page));
70 cr->set_source(rgba_to_pattern(
desk));
71 cr->set_fill_rule(Cairo::Context::FillRule::EVEN_ODD);
75 for (
auto &rect : pi.pages) {
76 cr->rectangle(rect.left(), rect.top(), rect.width(), rect.height());
83 cr->set_source(rgba_to_pattern(
page));
86 for (
auto &rect : pi.pages) {
87 cr->rectangle(rect.left(), rect.top(), rect.width(), rect.height());
100 auto content = window;
103 int s = std::round(split_frac[dim] *
size[dim]);
108 switch (split_direction) {
113 default: assert(
false);
break;
116 return std::make_pair(content,
outline);
121 auto split_position = (split_frac *
size).round();
124 cr->set_source_rgb(0.0, 0.0, 0.0);
125 cr->set_line_width(1.0);
128 cr->move_to(split_position.x() + 0.5, 0.0 );
129 cr->line_to(split_position.x() + 0.5,
size.y());
132 cr->move_to(0.0 , split_position.y() + 0.5);
133 cr->line_to(
size.x(), split_position.y() + 0.5);
139 cr->set_source_rgba(0.2, 0.2, 0.2, a);
140 cr->arc(split_position.x(), split_position.y(), 20, 0, 2 * M_PI);
143 for (
int i = 0; i < 4; i++) {
148 cr->translate(split_position.x(), split_position.y());
149 cr->rotate((i + 2) * M_PI / 2);
157 double b = (int)hover_direction == (i + 1) ? 0.9 : 0.7;
158 cr->set_source_rgba(b, b, b, a);
168 return std::any_of(pi.pages.begin(), pi.pages.end(), [&] (
auto &rect) {
169 return Geom::Parallelogram(rect).contains(pl);
void ink_cairo_set_source_color(Cairo::RefPtr< Cairo::Context > ctx, Inkscape::Colors::Color const &color, double opacity)
The following functions interact between Inkscape color model, and cairo surface rendering.
Cairo integration helpers.
Cairo::RefPtr< Cairo::ImageSurface > surface
Affine inverse() const
Compute the inverse matrix.
Axis aligned, non-empty, generic rectangle.
Two-dimensional point with integer coordinates.
Paralellogram, representing a linear transformation of a rectangle.
Two-dimensional point that doubles as a vector.
constexpr double SP_RGBA32_G_F(uint32_t v)
constexpr double SP_RGBA32_R_F(uint32_t v)
constexpr uint32_t SP_RGBA32_A_U(uint32_t v)
constexpr double SP_RGBA32_B_F(uint32_t v)
Dim2
2D axis enumeration (X or Y).
Specific geometry functions for Inkscape, not provided my lib2geom.
GenericRect< IntCoord > IntRect
Geom::PathVector outline(Geom::Path const &input, double width, double miter, LineJoinType join, LineCapType butt, double tolerance)
Strokes the path given by input.
Cairo::RectangleInt geom_to_cairo(const Geom::IntRect &rect)