Commit Graph

58 Commits

Author SHA1 Message Date
Aleix Pol
d9b907e953 Reduce double and triple lookups to the frames hash
Test Plan: Everything runs, tests pass

Reviewers: #plasma, davidedmundson, broulik

Reviewed By: #plasma, davidedmundson, broulik

Subscribers: broulik, kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D16060
2018-10-11 17:27:02 +02:00
Aleix Pol
0698c65a83 No point in including an empty foreach when NDEBUG isn't defined 2018-10-09 01:20:10 +02:00
Vlad Zagorodniy
0c8dd9dc2b FrameSvg: Update mask frame if image path has been changed
Summary:
A FrameSvg can have wrong mask frame if image path has been changed after
the mask frame was generated. Take image path into account when deciding
whether the mask frame should be updated to address that problem.

Depends on D13384

Reviewers: #plasma, #frameworks, mart

Reviewed By: #plasma, mart

Subscribers: kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D13496
2018-06-27 15:37:05 +03:00
Vlad Zagorodniy
412a517576 FrameSvg: Do not wreck shared mask frames
Summary:
When trying to update the maskFrame, there is a chance that it is already
shared by several instances of FrameSvg. In that case, do not wreck maskFrame
and instead act as follows:

* deref it
* try to lookup a matching frame in the shared frames
* if there is the matching frame, use it
* otherwise create a new one

Reviewers: #plasma, #frameworks, mart

Reviewed By: #plasma, mart

Subscribers: mart, kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D13384
2018-06-27 15:36:59 +03:00
Vlad Zagorodniy
acdaefa221 FrameSvg: Simplify updateSizes
Summary:
```lang=cpp
if (hintXXXMargin > -1) {
    // ...
} else {
    // ...
}
```

are redundant because fixedXXXMargin already hold correct margin values.

Test Plan: Manually

Reviewers: #plasma, #frameworks, mart

Reviewed By: #plasma, mart

Subscribers: kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D13402
2018-06-27 15:34:25 +03:00
Vlad Zagorodniy
dce258bee3 FrameSvg: Recache maskFrame if enabledBorders has been changed
Summary:
In some cases, when rendering frame svg background, measures & margins
do not correspond to `enabledBorders`. I.e. `bottomHeight` may be equal to 5,
but the bottom border is disabled. This causes visual artifacts like this

{F5878318, layout=center, size=full}

//Pay close attention to the bottom of the Task switcher. It has a transparent strip at the bottom, which shouldn't be there.//

The cause of this problem is that FrameSVGPrivate::alphaMask doesn't take enabledBorders
into account when it's making decision whether it should update maskFrame.

Just for reference, this is "after"

{F5878319, layout=center, size=full}

BUG: 382324
BUG: 390632
BUG: 391659

Test Plan:
* Triggered the Breeze task switcher (with compositing on and off)
* Didn't see any transparent strips

---

* Tried running FrameSvgTest, still passes

Reviewers: #plasma, #frameworks, mart

Reviewed By: #plasma, mart

Subscribers: abetts, mart, aseigo, broulik, kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D13215
2018-06-06 20:52:01 +03:00
Vlad Zagorodniy
a46cd14553 FrameSvg: Draw corners only if both borders in both directions are enabled
Summary:
FrameSVG documentation states

> ... topleft and topright will be ignored if top does not exist,
> and similarly for bottomleft and bottomright ...

Someone would assume that the same behaviour applies to the case
when left(or right) does not exist.

This change makes FrameSVG to comply with such expected behaviour.

### Before

{F5878439, layout=center, size=full}

The bottom border doesn't exist so the bottom-right corner should not
be drawn.

### After

{F5878440, layout=center, size=full}

Reviewers: #plasma, #frameworks, mart

Reviewed By: #plasma, mart

Subscribers: mart, kde-frameworks-devel

Tags: #frameworks, #plasma

Differential Revision: https://phabricator.kde.org/D13218
2018-06-06 20:51:40 +03:00
Vlad Zagorodniy
b169aa50f9 FrameSVG: Delete redundant checks
Summary:
There is no need to check whether `cachedBackground` is null, and if
it's null, return a null pixmap.

Reviewers: #plasma, #frameworks, apol

Reviewed By: apol

Subscribers: kde-frameworks-devel

Tags: #frameworks

Differential Revision: https://phabricator.kde.org/D13287
2018-06-04 19:41:32 +03:00
Laurent Montel
e690c4726e Warning-- 2018-04-13 13:58:44 +02:00
Aleix Pol
b8b8a69fd1 Remove implicit string casting
Summary: Follow the KF5 guidelines

Test Plan: Plasma shell starts

Reviewers: #plasma, #frameworks, sebas

Reviewed By: #plasma, sebas

Subscribers: plasma-devel

Tags: #plasma, #frameworks

Differential Revision: https://phabricator.kde.org/D9108
2017-12-02 15:44:14 +01:00
Aleix Pol
11c9206bf6 Reduce spurious signal emissions
Summary:
We were reporting that the margins were changing whenever anything changed
in a FrameSvg, this patch makes sure we are only reporting the changes
when it actually changes.
This also fixes a binding loop in Desktop.qml from plasma-desktop.

BUG: 382233

Reviewers: #plasma, davidedmundson

Reviewed By: #plasma, davidedmundson

Subscribers: broulik, davidedmundson, plasma-devel, #frameworks

Tags: #plasma, #frameworks

Differential Revision: https://phabricator.kde.org/D8809
2017-11-16 16:18:04 +01:00
Kai Uwe Broulik
dea8a1ed5f [FrameSvg] Optimize updateSizes
frame->fooHeight is the same as frame->fooFixedHeight if the border is enabled, we only meddle
with margins, not heights. Thus we can just do the lookup once and re-use the value.

Also store the hintFooMargin instead of doing the same exact lookup once for fixed
and once for non-fixed margins.

Differential Revision: https://phabricator.kde.org/D8135
2017-10-16 11:38:09 +02:00
Kai Uwe Broulik
46a8d86ee8 [FrameSvg] Use new-style connect
Reviwed-By: d_ed
2017-09-21 14:33:28 +02:00
Marco Martin
3942c5279e don't recreate a null pixmap
if we already have a null pixmap, don't recreate a new one

this saves some pixmap ceation on destructors
reviewed-by:davidedmundson
2017-09-19 13:57:12 +02:00
Kai Uwe Broulik
5921b2a70c [FrameSvg] Use QPixmap::mask() instead of deprecated convoluted way via alphaChannel()
QPixmap::alphaChannel() is deprecated.

Differential Revision: https://phabricator.kde.org/D7614
2017-08-30 12:05:59 +02:00
Marco Martin
6ffe068b80 generate the old key before updating enabledborders
Summary:
sometimes a frame changed enabled borders causing a dangling
pointer in s_sharedFrames, since oldkey was generated
with the new enabled borders, it generated a key not present
in the hash, tryed to remove it and left the one associated
with the old key in the hash.
if the need to reuse a frame with that key ever arised again,
we had a crash
BUG:378508

Test Plan:
couldn't reproduce the crash neither with or without patch,
with the patch, if i put debug in every place a framedata is removed,
searching if the key is in the hash before removing it, now
it's always true, before sometimes it was false

Reviewers: #plasma, davidedmundson

Reviewed By: #plasma, davidedmundson

Subscribers: plasma-devel, #frameworks

Tags: #plasma, #frameworks

Differential Revision: https://phabricator.kde.org/D6162
2017-06-09 16:16:16 +02:00
Marco Martin
088a79d131 correct maskRequestedPrefix when no prefix is used
requestedprefix requires to not have the "-", don't fail anymore in
q->hasElementPrefix(frame->requestedPrefix) in
FrameSvgPrivate::generateBackground

BUG:377893
2017-03-22 14:11:37 +01:00
Marco Martin
2b3e8dfe86 move setImagePath logic into updateFrameData()
Summary:
make sure the framedata creation/destruction is
completely in updateFrameData, makes easier to track
and possible to use the repaintsblocked logic.
now only one framedata instance should be created at startup.

CCBUG:376754

Test Plan:
* autotests pass, plasma runs ok, crash on 376754 not reproducible anymore
* possible to have a plasmashell session start without the creation of a single svg renderer (startups after the first when the cache is generated)
* on qml profiler, framesvgitem creation is ~12 msecs the first one created, ~2-300 musecs the subsequent ones, seems to be a bit better than before the whole refactor started
* tried against the latest patches that remove the binding loops, still correct rendering and no binding loop
* tried with both empty and existing cache in place

Reviewers: #plasma, davidedmundson

Reviewed By: #plasma, davidedmundson

Subscribers: davidedmundson, plasma-devel, #frameworks

Tags: #frameworks, #plasma

Differential Revision: https://phabricator.kde.org/D4707
2017-02-28 13:35:09 +01:00
David Edmundson
e301b63685 Fix binding loop regression in FrameSVGItem
Summary:
d8a1a9eb08 introduces an unintended code
change, resizeFrame() updates the margins and in turns calls
repaintNeeded. This isn't needed and is a binding loop if we ever have a
frameSVGItem whose size depends on it's own margins.

resizeFrame is different from setEnabledBorders / setElementPrefix /
theme changes because even though we need to create a new FrameData we
know any hints and margins won't change. FrameSvgItem::updateSizes
doesn't depend on the size in any way, so always gives the same result
as before. We still, however, need to call updateSizes to populate our
FrameData structure even if the results will be the same as the previous
FrameData.

This patch that introduces a flag to updateFrameData to determine if we
should emit that size hints may have changed or not.

Test Plan:
GDB showed where the loop was.

Read the old code, and looked for differences

Ran plasmashell, checked I had no binding loop, frames including button
which have
composeOverBorder which need the new FrameData all rendered correctly.

Reviewers: #plasma, #frameworks, mart

Subscribers: mart, broulik, plasma-devel

Tags: #plasma, #frameworks

Differential Revision: https://phabricator.kde.org/D4713
2017-02-22 12:31:44 +00:00
Marco Martin
d8a1a9eb08 don't regenerate frames when setting every property
Summary:
give frameSvg the concept of repaintBlocked(), that enables and
disables the regeneration of the frame data when a property is set.
the use case is when often, a lot of properties are set one after
the other (such as prefix, enabled borders, size)
collapse the formely similar, but a bit different logic of frame
regeneration is a single function for better maintanability.
QML FrameSvgItem sets repaintblocked when it starts and releases it just on oncomponentCompleted

Test Plan:
plasmashell still starts, autotests still work, all frames are rendered correctly
the destruction of old frames is cutted by 50%. in the qml profiler
the creation time of a framesvgitem slightly improved, on this machine from around 26 msecs to around 21, can still be improved, but at least the code is a bit simpler

Reviewers: #plasma

Subscribers: davidedmundson, plasma-devel, #frameworks

Tags: #plasma, #frameworks

Differential Revision: https://phabricator.kde.org/D4414
2017-02-07 13:08:27 +01:00
Kai Uwe Broulik
d38be811e8 [FrameData] Avoid iterating keys()
Instead use iterators. Could be changed to using keyBegin or something like that potentially.

The destructor is called 400 times on plasmashell startup for me.
Before: 250,000ns
After: 110,000ns

Differential Revision: https://phabricator.kde.org/D4350
2017-01-30 15:08:09 +01:00
David Rosca
974a2b5071 FrameSvg: Fix dangling pointers in sharedFrames when theme changes
Store theme pointer in FrameData and set it when adding to sharedFrames.

REVIEW: 127344
2016-03-12 13:02:34 +01:00
Aleix Pol
9f62532674 Fix most of Clazy warnings in plasma-framework
REVIEW: 126672
2016-02-29 00:13:41 +01:00
Michael Pyne
600bdda045 Fix potential use-after-free in FrameSVG.
Plasma framework's FrameSVG class uses cached regions for efficiency. However
Coverity caught a mis-use of QCache in FrameSvg::mask(), which could lead to a
use-after-free situation. (CID 1291560)

Basically, any pointer passed into QCache::insert must be assumed to be deleted
after insert() has been called -- we can't then return that pointer to the
caller.

Moreover we were simply returning a pointer to calling code that had been (and
still would be) owned by QCache, which is unsafe as it can be deleted at any
time. The fix in both cases is to make a local copy of the QRegion from out of
the cache and return that.

REVIEW:126411
FIXED-IN:5.18
2015-12-17 21:34:04 -05:00
Martin Klapetek
76186339f6 [libplasma] Add categorized debug output 2015-12-15 16:56:40 -05:00
Nick Shaforostoff
c7c2980f14 qstring optimizations
REVIEW: 126148
2015-11-27 20:03:48 +00:00
Marco Martin
285224a2ea don't risk to mix up frames with different pixelratio
BUG:345155
Change-Id: I0b2384831d755e02b944a49259ffeacd0d2fb71e
2015-03-25 17:06:47 +01:00
Marco Martin
148e0022f6 Make Svg,FrameSvg work qith QT_DEVICE_PIXELRATIO
when QT_DEVICE_PIXELRATIO is something different from 1,
the pixmaps generated by Svg will be scaled up to give a proper texture.

This is complementary but not replacing our current approach:
the pixelratio that can be accessed by units is now in relation to the qt pixel ratio,
spacings are also adjusted accordingly (therefore, spaces and sizes won't
need an integer value like pixelratio)

svg introduces also a scaleFactor property (that is pretty much like its old pixelRatio)
basically, scalefactor, will scale both the textures and all the reported sizes,
(old method) pixelratio just scales textures without altering measures
(like qt pixelratio likes)

Change-Id: I304aa0d80abf76abafac239be185dd3b2ab741b7
REVIEW:122673
2015-03-10 18:02:15 +01:00
Aleix Pol
e613662ab5 Make framesvg unit test pass
Revert the changes in contentsRect, it was clearly not the best place to
put the code that contains the code that computes the content size.
Instead move the code in FrameSvgItem, duplicates data and code but works.
2014-07-22 03:14:26 +02:00
Aleix Pol
dca3958b44 Stop exposing that many things in FrameSvgItem
Move the shared code between FrameSvg and FrameSvgItem into a separate file
that both can link to.

Reviewed by David Edmundson
2014-07-21 18:01:26 +02:00
Aleix Pol
47c7688d02 Move some of the code and make some API public
It's unreasonable to use private API, so make everything public API so that
every user of FrameSvg have as much features exposed as possible.

Reviewed by David Edmundson
2014-07-21 15:44:25 +02:00
Aleix Pol
a1d7863f4f Fix scrollbar display, polish sectionRect function
While debugging a glitch I found out a bug in the painting code that hide
behind QRect documentation. See comment in sectionRect. This never rendered
correctly.
2014-07-18 02:42:46 +02:00
Aleix Pol
a30afb9c34 Ensure we don't overlap the center with the right and bottom borders 2014-07-16 13:51:25 +02:00
Aleix Pol
0a94e1b1b8 Take composeOverBorder into accoun 2014-07-15 19:56:04 +02:00
Aleix Pol
c4d9bcb362 don't let the contentRect overlap the borders 2014-07-15 16:27:34 +02:00
Aleix Pol
83895d8e26 Use proper sizes and positions 2014-07-14 20:02:47 +02:00
Aleix Pol
a8b37129d0 Refactor a contentGeometry method out of generateFrameBackground
Given the FrameData and the total size, we get to know where is the
contents going to be and gives us the information to extrapolate where to
put all the borders and corners.

Reviewed by David Edmundson
2014-07-14 18:13:40 +02:00
Aleix Pol
d574f51108 Move the central space painting into a separate function
Reviewed by David Edmundson
2014-07-14 17:00:39 +02:00
Aleix Pol
33aa8e406d cleanups
Move variable declarations closer to its uses
Prefer using QSize than width and height separately, so we can pass it
around directly and use isEmpty
Remove duplicated code in the central piece drawing
2014-07-14 16:49:12 +02:00
Aleix Pol
ae56796cb9 Move corner painting into a paintCorner function 2014-07-14 16:47:56 +02:00
Aleix Pol
f62b357b62 Prefer passing a size rather than a width and height 2014-07-14 16:37:00 +02:00
Aleix Pol
df1d44407a cleanup
Reduce type casts from QSizeF to QSize, we're always using it as a QSize,
so just make the cast once.
Remove redundant constructions like checking whether it's null and returning
null or unneeded arithmetics
2014-07-14 16:32:10 +02:00
Aleix Pol
5b1fc96329 Small internal code refactoring
Create a paintBorder function that can generically paint framesvg borders.
This helps us reduce duplicated code as well as improving the readability
of the code.

Reviewed by David Edmundson
2014-07-14 14:16:16 +02:00
Aleix Pol
804a0d34da Fix cache implementation
It was weird.

Reviewed by the Handa-man.
2014-07-11 18:37:55 +02:00
Marco Martin
100b60a7fb return the prefix that has ben set even if not avail
symmetricity++ between setelementprefix and prefix
2014-07-11 16:55:59 +02:00
Marco Martin
c77b2bf9a8 fix switch from a less complete to a more complete
if the old theme didn't have a prefix, but the new one has,
set the old (formerly nonexisting) prefix again
2014-07-11 16:42:55 +02:00
Marco Martin
c6e7961088 ensure mask and normal frame have the same borders 2014-06-13 17:15:06 +02:00
Marco Martin
3fdf999ba0 bit more complex bookeeping
since it is now possible to have different svg/framesvg with
different themes, s_sharedFrames must be indexed by theme first
what it's really the identifying thing is ThemePrivate, so it's indexed by that
this fixes a crash that occurs the second thime the theme gets changed

BUG:335472
2014-05-28 20:27:58 +02:00
Marco Martin
72239e7f3c apps can use more than one theme.
add the name in s_sharedFrames
CCBUG:335003
CCBUG:335004
2014-05-19 15:24:36 +02:00
Marco Martin
bbed0411b6 don't use another Thmeme copy 2014-05-19 14:58:19 +02:00