fix(renderer): Falloff gradient
Before it did not take into account borders or a tray on the left. It also sometimes rendered the gradient way to large
This commit is contained in:
parent
ec2bad004a
commit
00274c57a9
@ -108,10 +108,9 @@ namespace cairo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
context& operator<<(const linear_gradient& l) {
|
context& operator<<(const linear_gradient& l) {
|
||||||
if (l.steps.size() >= 2) {
|
|
||||||
auto pattern = cairo_pattern_create_linear(l.x1, l.y1, l.x2, l.y2);
|
|
||||||
*this << pattern;
|
|
||||||
auto stops = l.steps.size();
|
auto stops = l.steps.size();
|
||||||
|
if (stops >= 2) {
|
||||||
|
auto pattern = cairo_pattern_create_linear(l.x1, l.y1, l.x2, l.y2);
|
||||||
auto step = 1.0 / (stops - 1);
|
auto step = 1.0 / (stops - 1);
|
||||||
auto offset = 0.0;
|
auto offset = 0.0;
|
||||||
for (auto&& color : l.steps) {
|
for (auto&& color : l.steps) {
|
||||||
@ -124,6 +123,7 @@ namespace cairo {
|
|||||||
// clang-format on
|
// clang-format on
|
||||||
offset += step;
|
offset += step;
|
||||||
}
|
}
|
||||||
|
*this << pattern;
|
||||||
cairo_pattern_destroy(pattern);
|
cairo_pattern_destroy(pattern);
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
|
@ -341,7 +341,7 @@ void renderer::flush(alignment a) {
|
|||||||
double w = static_cast<int>(block_w(a) + 0.5);
|
double w = static_cast<int>(block_w(a) + 0.5);
|
||||||
double h = static_cast<int>(block_h(a) + 0.5);
|
double h = static_cast<int>(block_h(a) + 0.5);
|
||||||
double xw = x + w;
|
double xw = x + w;
|
||||||
bool fits{xw <= m_rect.x + m_rect.width};
|
bool fits{xw <= m_rect.width};
|
||||||
|
|
||||||
m_log.trace("renderer: flush(%i geom=%gx%g+%g+%g, falloff=%i)", static_cast<int>(a), w, h, x, y, !fits);
|
m_log.trace("renderer: flush(%i geom=%gx%g+%g+%g, falloff=%i)", static_cast<int>(a), w, h, x, y, !fits);
|
||||||
|
|
||||||
@ -359,19 +359,34 @@ void renderer::flush(alignment a) {
|
|||||||
*m_context << m_blocks[a].pattern;
|
*m_context << m_blocks[a].pattern;
|
||||||
m_context->paint();
|
m_context->paint();
|
||||||
|
|
||||||
if (!fits) {
|
|
||||||
// Paint falloff gradient at the end of the visible block
|
|
||||||
// to indicate that the content expands past the canvas
|
|
||||||
double fx = w - (xw - m_rect.width);
|
|
||||||
double fsize = std::max(5.0, std::min(std::abs(fx), 30.0));
|
|
||||||
m_log.trace("renderer: Drawing falloff (pos=%g, size=%g)", fx, fsize);
|
|
||||||
*m_context << cairo::linear_gradient{fx - fsize, 0.0, fx, 0.0, {0x00000000, 0xFF000000}};
|
|
||||||
m_context->paint(0.25);
|
|
||||||
}
|
|
||||||
|
|
||||||
*m_context << cairo::abspos{0.0, 0.0};
|
*m_context << cairo::abspos{0.0, 0.0};
|
||||||
m_context->destroy(&m_blocks[a].pattern);
|
m_context->destroy(&m_blocks[a].pattern);
|
||||||
m_context->restore();
|
m_context->restore();
|
||||||
|
|
||||||
|
if (!fits) {
|
||||||
|
// Paint falloff gradient at the end of the visible block
|
||||||
|
// to indicate that the content expands past the canvas
|
||||||
|
|
||||||
|
/*
|
||||||
|
* How many pixels are hidden
|
||||||
|
*/
|
||||||
|
double overflow = xw - m_rect.width;
|
||||||
|
double visible_width = w - overflow;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Width of the falloff gradient. Depends on how much of the block is hidden
|
||||||
|
*/
|
||||||
|
double fsize = std::max(5.0, std::min(std::abs(overflow), 30.0));
|
||||||
|
m_log.trace("renderer: Drawing falloff (pos=%g, size=%g, overflow=%g)", visible_width - fsize, fsize, overflow);
|
||||||
|
m_context->save();
|
||||||
|
*m_context << cairo::translate{(double) m_rect.x, (double) m_rect.y};
|
||||||
|
*m_context << cairo::abspos{0.0, 0.0};
|
||||||
|
*m_context << cairo::rect{x + visible_width - fsize, y, fsize, h};
|
||||||
|
m_context->clip(true);
|
||||||
|
*m_context << cairo::linear_gradient{x + visible_width - fsize, y, x + visible_width, y, {0x00000000, 0xFF000000}};
|
||||||
|
m_context->paint(0.25);
|
||||||
|
m_context->restore();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user