From 1ceaa0bbcfccb83dbf7f51d7f80a733ff2aa8c22 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 23 Sep 2022 20:45:39 +0400 Subject: [PATCH] Fix crash in empty text state resolving. --- ui/text/text_renderer.cpp | 76 ++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/ui/text/text_renderer.cpp b/ui/text/text_renderer.cpp index 7d1e7a5..ec3fc64 100644 --- a/ui/text/text_renderer.cpp +++ b/ui/text/text_renderer.cpp @@ -399,48 +399,52 @@ void Renderer::enumerate() { } StateResult Renderer::getState(QPoint point, int w, StateRequest request) { - if (!_t->isNull() && point.y() >= 0) { - _lookupRequest = request; - _lookupX = point.x(); - _lookupY = point.y(); - - _breakEverywhere = (_lookupRequest.flags & StateRequest::Flag::BreakEverywhere); - _lookupSymbol = (_lookupRequest.flags & StateRequest::Flag::LookupSymbol); - _lookupLink = (_lookupRequest.flags & StateRequest::Flag::LookupLink); - if (_lookupSymbol || (_lookupX >= 0 && _lookupX < w)) { - _w = w; - _yFrom = _lookupY; - _yTo = _lookupY + 1; - _align = _lookupRequest.align; - enumerate(); - } + if (_t->isEmpty() || point.y() < 0) { + return {}; } + _lookupRequest = request; + _lookupX = point.x(); + _lookupY = point.y(); + + _breakEverywhere = (_lookupRequest.flags & StateRequest::Flag::BreakEverywhere); + _lookupSymbol = (_lookupRequest.flags & StateRequest::Flag::LookupSymbol); + _lookupLink = (_lookupRequest.flags & StateRequest::Flag::LookupLink); + if (!_lookupSymbol && (_lookupX < 0 || _lookupX >= w)) { + return {}; + } + _w = w; + _yFrom = _lookupY; + _yTo = _lookupY + 1; + _align = _lookupRequest.align; + enumerate(); return _lookupResult; } StateResult Renderer::getStateElided(QPoint point, int w, StateRequestElided request) { - if (!_t->isNull() && point.y() >= 0 && request.lines > 0) { - _lookupRequest = request; - _lookupX = point.x(); - _lookupY = point.y(); - - _breakEverywhere = (_lookupRequest.flags & StateRequest::Flag::BreakEverywhere); - _lookupSymbol = (_lookupRequest.flags & StateRequest::Flag::LookupSymbol); - _lookupLink = (_lookupRequest.flags & StateRequest::Flag::LookupLink); - if (_lookupSymbol || (_lookupX >= 0 && _lookupX < w)) { - int yTo = _lookupY + 1; - if (yTo < 0 || (request.lines - 1) * _t->_st->font->height < yTo) { - yTo = request.lines * _t->_st->font->height; - _elideLast = true; - _elideRemoveFromEnd = request.removeFromEnd; - } - _w = w; - _yFrom = _lookupY; - _yTo = _lookupY + 1; - _align = _lookupRequest.align; - enumerate(); - } + if (_t->isEmpty() || point.y() < 0 || request.lines <= 0) { + return {}; } + _lookupRequest = request; + _lookupX = point.x(); + _lookupY = point.y(); + + _breakEverywhere = (_lookupRequest.flags & StateRequest::Flag::BreakEverywhere); + _lookupSymbol = (_lookupRequest.flags & StateRequest::Flag::LookupSymbol); + _lookupLink = (_lookupRequest.flags & StateRequest::Flag::LookupLink); + if (!_lookupSymbol && (_lookupX < 0 || _lookupX >= w)) { + return {}; + } + int yTo = _lookupY + 1; + if (yTo < 0 || (request.lines - 1) * _t->_st->font->height < yTo) { + yTo = request.lines * _t->_st->font->height; + _elideLast = true; + _elideRemoveFromEnd = request.removeFromEnd; + } + _w = w; + _yFrom = _lookupY; + _yTo = _lookupY + 1; + _align = _lookupRequest.align; + enumerate(); return _lookupResult; }