22 #include "private/framesvg_p.h" 26 #include <QCryptographicHash> 30 #include <QStringBuilder> 37 #include <private/svg_p.h> 43 QHash<QString, FrameData *> FrameSvgPrivate::s_sharedFrames;
51 d(new FrameSvgPrivate(this))
53 connect(
this, SIGNAL(
repaintNeeded()),
this, SLOT(updateNeeded()));
54 d->frames.insert(QString(),
new FrameData(
this));
68 bool updateNeeded =
true;
71 FrameData *fd = d->frames[d->prefix];
72 if (fd->refcount() == 1) {
75 const QString oldKey = d->cacheId(fd, d->prefix);
76 FrameSvgPrivate::s_sharedFrames.remove(oldKey);
83 Svg::d->setImagePath(path);
87 FrameData *oldFd = d->frames[d->prefix];
88 const QString key = d->cacheId(oldFd, d->prefix);
89 fd = FrameSvgPrivate::s_sharedFrames.value(key);
100 fd =
new FrameData(*oldFd,
this);
103 d->frames.insert(d->prefix, fd);
109 const QString key = d->cacheId(fd, d->prefix);
110 FrameSvgPrivate::s_sharedFrames.insert(key, fd);
113 d->updateAndSignalSizes();
121 if (borders == d->frames[d->prefix]->enabledBorders) {
125 FrameData *fd = d->frames[d->prefix];
127 const QString oldKey = d->cacheId(fd, d->prefix);
128 const EnabledBorders oldBorders = fd->enabledBorders;
129 fd->enabledBorders = borders;
130 const QString newKey = d->cacheId(fd, d->prefix);
131 fd->enabledBorders = oldBorders;
134 FrameData *newFd = FrameSvgPrivate::s_sharedFrames.value(newKey);
139 d->frames.insert(d->prefix, newFd);
142 if (fd->deref(
this)) {
145 FrameSvgPrivate::s_sharedFrames.remove(oldKey);
152 if (fd->refcount() == 1) {
155 FrameSvgPrivate::s_sharedFrames.remove(oldKey);
161 fd =
new FrameData(*fd,
this);
162 d->frames.insert(d->prefix, fd);
165 fd->enabledBorders = borders;
166 d->updateAndSignalSizes();
171 if (d->frames.isEmpty()) {
175 QHash<QString, FrameData*>::const_iterator it = d->frames.constFind(d->prefix);
177 if (it != d->frames.constEnd()) {
178 return it.value()->enabledBorders;
204 d->location = location;
209 const QString oldPrefix(d->prefix);
215 if (!d->prefix.isEmpty()) {
220 FrameData *oldFrameData = d->frames.value(oldPrefix);
221 if (oldPrefix == d->prefix && oldFrameData) {
225 if (!d->frames.contains(d->prefix)) {
227 FrameData *newFd = 0;
228 if (!oldFrameData->frameSize.isEmpty()) {
229 const QString key = d->cacheId(oldFrameData, d->prefix);
230 newFd = FrameSvgPrivate::s_sharedFrames.value(key);
235 const bool cache = !newFd && !oldFrameData->frameSize.isEmpty();
239 newFd =
new FrameData(*oldFrameData,
this);
242 d->frames.insert(d->prefix, newFd);
247 const QString key = d->cacheId(oldFrameData, d->prefix);
250 FrameSvgPrivate::s_sharedFrames.insert(key, newFd);
255 FrameData *newFd =
new FrameData(
this);
256 d->frames.insert(d->prefix, newFd);
263 d->frames.remove(oldPrefix);
265 if (oldFrameData->deref(
this)) {
266 const QString oldKey = d->cacheId(oldFrameData, oldPrefix);
267 FrameSvgPrivate::s_sharedFrames.remove(oldKey);
280 if (prefix.isEmpty()) {
310 if (d->prefix.isEmpty()) {
314 return d->prefix.left(d->prefix.size() - 1);
323 if (size.isEmpty()) {
328 FrameData *fd = d->frames[d->prefix];
329 if (size == fd->frameSize) {
333 const QString oldKey = d->cacheId(fd, d->prefix);
334 const QSize currentSize = fd->frameSize;
335 fd->frameSize = size.toSize();
336 const QString newKey = d->cacheId(fd, d->prefix);
337 fd->frameSize = currentSize;
340 FrameData *newFd = FrameSvgPrivate::s_sharedFrames.value(newKey);
345 d->frames.insert(d->prefix, newFd);
348 if (fd->deref(
this)) {
351 FrameSvgPrivate::s_sharedFrames.remove(oldKey);
358 if (fd->refcount() == 1) {
361 FrameSvgPrivate::s_sharedFrames.remove(oldKey);
367 fd =
new FrameData(*fd,
this);
368 d->frames.insert(d->prefix, fd);
372 fd->frameSize = size.toSize();
374 FrameSvgPrivate::s_sharedFrames.insert(newKey, fd);
379 QHash<QString, FrameData*>::const_iterator it = d->frames.constFind(d->prefix);
381 if (it == d->frames.constEnd()) {
382 return QSize(-1, -1);
384 return d->frameSize(it.value());
390 if (d->frames[d->prefix]->noBorderPadding) {
396 return d->frames[d->prefix]->topMargin;
400 return d->frames[d->prefix]->leftMargin;
404 return d->frames[d->prefix]->rightMargin;
409 return d->frames[d->prefix]->bottomMargin;
416 FrameData *frame = d->frames[d->prefix];
418 if (frame->noBorderPadding) {
419 left = top = right = bottom = 0;
423 top = frame->topMargin;
424 left = frame->leftMargin;
425 right = frame->rightMargin;
426 bottom = frame->bottomMargin;
433 if (size.isValid()) {
434 QRectF rect(QPointF(0, 0), size);
435 FrameData *frame = d->frames[d->prefix];
437 return rect.adjusted(frame->leftMargin, frame->topMargin,
438 -frame->rightMargin, -frame->bottomMargin);
447 return d->alphaMask();
452 FrameData *frame = d->frames[d->prefix];
453 QString
id = d->cacheId(frame, QString());
454 if (!frame->cachedMasks.contains(
id)) {
456 if (frame->cachedMasks.count() > frame->MAX_CACHED_MASKS) {
457 frame->cachedMasks.clear();
459 frame->cachedMasks.insert(
id, QRegion(QBitmap(d->alphaMask().alphaChannel().createMaskFromColor(Qt::black))));
461 return frame->cachedMasks[id];
466 if (d->cacheAll && !cache) {
480 FrameData *frame = d->frames[d->prefix];
483 QMutableHashIterator<QString, FrameData*> it(d->frames);
484 while (it.hasNext()) {
485 FrameData *p = it.next().value();
488 if (p->deref(
this)) {
489 const QString key = d->cacheId(p, it.key());
490 FrameSvgPrivate::s_sharedFrames.remove(key);
491 p->cachedBackground = QPixmap();
501 FrameData *frame = d->frames[d->prefix];
502 if (frame->cachedBackground.isNull()) {
503 d->generateBackground(frame);
504 if (frame->cachedBackground.isNull()) {
509 return frame->cachedBackground;
514 FrameData *frame = d->frames[d->prefix];
515 if (frame->cachedBackground.isNull()) {
516 d->generateBackground(frame);
517 if (frame->cachedBackground.isNull()) {
522 painter->drawPixmap(target, frame->cachedBackground, source.isValid() ? source : target);
527 FrameData *frame = d->frames[d->prefix];
528 if (frame->cachedBackground.isNull()) {
529 d->generateBackground(frame);
530 if (frame->cachedBackground.isNull()) {
535 painter->drawPixmap(pos, frame->cachedBackground);
539 FrameSvgPrivate::~FrameSvgPrivate()
541 #ifdef DEBUG_FRAMESVG_CACHE 542 kDebug() <<
"*************" << q << q->imagePath() <<
"****************";
545 QHashIterator<QString, FrameData *> it(frames);
546 while (it.hasNext()) {
551 if (it.value()->removeRefs(q)) {
552 const QString key = cacheId(it.value(), it.key());
553 #ifdef DEBUG_FRAMESVG_CACHE 554 kDebug() <<
"2. Removing it" << key << it.value() << it.value()->refcount() << s_sharedFrames.contains(key);
556 s_sharedFrames.remove(key);
559 #ifdef DEBUG_FRAMESVG_CACHE 561 kDebug() <<
"still shared:" << cacheId(it.value(), it.key()) << it.value() << it.value()->refcount() << it.value()->isUsed();
564 kDebug() <<
"lost our value for" << it.key();
569 #ifdef DEBUG_FRAMESVG_CACHE 570 QHashIterator<QString, FrameData *> it2(s_sharedFrames);
572 while (it2.hasNext()) {
574 const int rc = it2.value()->refcount();
576 kDebug() <<
" LOST!" << it2.key() << rc << it2.value();
578 kDebug() <<
" " << it2.key() << rc << it2.value();
579 foreach (
FrameSvg *data, it2.value()->references.keys()) {
580 kDebug( )<<
" " << (
void*)data << it2.value()->references[data];
585 kDebug() <<
"#####################################" << s_sharedFrames.count() <<
", pixmaps saved:" << shares;
591 QPixmap FrameSvgPrivate::alphaMask()
593 FrameData *frame = frames[
prefix];
596 if (q->hasElement(
"mask-" %
prefix %
"center")) {
597 maskPrefix =
"mask-";
600 if (maskPrefix.isNull()) {
601 if (frame->cachedBackground.isNull()) {
602 generateBackground(frame);
603 if (frame->cachedBackground.isNull()) {
608 return frame->cachedBackground;
610 QString oldPrefix =
prefix;
614 prefix = maskPrefix % oldPrefix;
616 if (!frames.contains(
prefix)) {
617 const QString key = cacheId(frame,
prefix);
621 FrameData *maskFrame = s_sharedFrames.value(key);
626 maskFrame =
new FrameData(*frame, q);
627 s_sharedFrames.insert(key, maskFrame);
630 frames.insert(
prefix, maskFrame);
634 FrameData *maskFrame = frames[
prefix];
635 if (maskFrame->cachedBackground.isNull() || maskFrame->frameSize !=
frameSize(frame)) {
636 const QString oldKey = cacheId(maskFrame,
prefix);
637 maskFrame->frameSize =
frameSize(frame).toSize();
638 const QString newKey = cacheId(maskFrame,
prefix);
639 if (s_sharedFrames.contains(oldKey)) {
640 s_sharedFrames.remove(oldKey);
641 s_sharedFrames.insert(newKey, maskFrame);
644 maskFrame->cachedBackground = QPixmap();
646 generateBackground(maskFrame);
647 if (maskFrame->cachedBackground.isNull()) {
653 return maskFrame->cachedBackground;
657 void FrameSvgPrivate::generateBackground(FrameData *frame)
659 if (!frame->cachedBackground.isNull() || !q->hasElementPrefix(q->prefix())) {
663 const QString
id = cacheId(frame,
prefix);
666 bool frameCached = !frame->cachedBackground.isNull();
667 bool overlayCached =
false;
668 const bool overlayAvailable = !
prefix.startsWith(QLatin1String(
"mask-")) && q->hasElement(
prefix %
"overlay");
670 if (q->isUsingRenderingCache()) {
671 frameCached = theme->
findInCache(
id, frame->cachedBackground) && !frame->cachedBackground.isNull();
673 if (overlayAvailable) {
674 overlayCached = theme->
findInCache(
"overlay_" %
id, overlay) && !overlay.isNull();
679 generateFrameBackground(frame);
684 QPoint actualOverlayPos = QPoint(0, 0);
685 if (overlayAvailable && !overlayCached) {
686 QPoint pos = QPoint(0, 0);
687 overlaySize = q->elementSize(
prefix %
"overlay");
690 if (q->hasElement(
prefix %
"hint-overlay-random-pos")) {
691 actualOverlayPos = overlayPos;
692 }
else if (q->hasElement(
prefix %
"hint-overlay-pos-right")) {
693 actualOverlayPos.setX(frame->frameSize.width() - overlaySize.width());
694 }
else if (q->hasElement(
prefix %
"hint-overlay-pos-bottom")) {
695 actualOverlayPos.setY(frame->frameSize.height() - overlaySize.height());
697 }
else if (q->hasElement(
prefix %
"hint-overlay-stretch")) {
700 if (q->hasElement(
prefix %
"hint-overlay-tile-horizontal")) {
701 overlaySize.setWidth(
frameSize(frame).width());
703 if (q->hasElement(
prefix %
"hint-overlay-tile-vertical")) {
704 overlaySize.setHeight(
frameSize(frame).height());
709 QPainter overlayPainter(&overlay);
710 overlayPainter.setCompositionMode(QPainter::CompositionMode_SourceIn);
712 if (q->hasElement(
prefix %
"hint-overlay-tile-horizontal") ||
713 q->hasElement(
prefix %
"hint-overlay-tile-vertical")) {
716 q->resize(q->elementSize(
prefix %
"overlay"));
718 overlayPainter.drawTiledPixmap(QRect(QPoint(0,0), overlaySize), q->pixmap(
prefix %
"overlay"));
721 q->paint(&overlayPainter, QRect(actualOverlayPos, overlaySize),
prefix %
"overlay");
724 overlayPainter.end();
728 cacheFrame(
prefix, frame->cachedBackground, overlayCached ? overlay : QPixmap());
731 if (!overlay.isNull()) {
732 QPainter p(&frame->cachedBackground);
733 p.setCompositionMode(QPainter::CompositionMode_SourceOver);
734 p.drawPixmap(actualOverlayPos, overlay, QRect(actualOverlayPos, overlaySize));
738 void FrameSvgPrivate::generateFrameBackground(FrameData *frame)
742 const int topWidth = q->elementSize(
prefix %
"top").width();
743 const int leftHeight = q->elementSize(
prefix %
"left").height();
744 const int topOffset = 0;
745 const int leftOffset = 0;
748 if (!size.isValid()) {
749 kDebug() <<
"Invalid frame size" <<
size;
752 if (size.width() >= MAX_FRAME_SIZE || size.height() >=
MAX_FRAME_SIZE) {
753 kWarning() <<
"Not generating frame background for a size whose width or height is more than" << MAX_FRAME_SIZE <<
size;
757 const int contentWidth = size.width() - frame->leftWidth - frame->rightWidth;
758 const int contentHeight = size.height() - frame->topHeight - frame->bottomHeight;
761 int rightOffset = contentWidth;
762 int bottomOffset = contentHeight;
764 frame->cachedBackground = QPixmap(frame->leftWidth + contentWidth + frame->rightWidth,
765 frame->topHeight + contentHeight + frame->bottomHeight);
766 frame->cachedBackground.fill(Qt::transparent);
767 QPainter p(&frame->cachedBackground);
768 p.setCompositionMode(QPainter::CompositionMode_Source);
769 p.setRenderHint(QPainter::SmoothPixmapTransform);
772 if (frame->tileCenter) {
773 if (contentHeight > 0 && contentWidth > 0) {
774 const int centerTileHeight = q->elementSize(
prefix %
"center").height();
775 const int centerTileWidth = q->elementSize(
prefix %
"center").width();
776 QPixmap center(centerTileWidth, centerTileHeight);
777 center.fill(Qt::transparent);
780 QPainter centerPainter(¢er);
781 centerPainter.setCompositionMode(QPainter::CompositionMode_Source);
782 q->paint(¢erPainter, QRect(QPoint(0, 0), q->elementSize(
prefix %
"center")),
prefix %
"center");
785 if (frame->composeOverBorder) {
786 p.drawTiledPixmap(QRect(QPoint(0, 0), size.toSize()), center);
788 p.drawTiledPixmap(QRect(frame->leftWidth, frame->topHeight,
789 contentWidth, contentHeight), center);
793 if (contentHeight > 0 && contentWidth > 0) {
794 if (frame->composeOverBorder) {
795 q->paint(&p, QRect(QPoint(0, 0), size.toSize()),
798 q->paint(&p, QRect(frame->leftWidth, frame->topHeight,
799 contentWidth, contentHeight),
805 if (frame->composeOverBorder) {
806 p.setCompositionMode(QPainter::CompositionMode_DestinationIn);
807 p.drawPixmap(QRect(QPoint(0, 0), size.toSize()),
alphaMask());
808 p.setCompositionMode(QPainter::CompositionMode_SourceOver);
812 rightOffset += frame->leftWidth;
817 contentTop = frame->topHeight;
818 bottomOffset += frame->topHeight;
821 q->paint(&p, QRect(leftOffset, topOffset, frame->leftWidth, frame->topHeight),
prefix %
"topleft");
823 contentLeft = frame->leftWidth;
827 q->paint(&p, QRect(rightOffset, topOffset, frame->rightWidth, frame->topHeight),
prefix %
"topright");
833 q->paint(&p, QRect(leftOffset, bottomOffset, frame->leftWidth, frame->bottomHeight),
prefix %
"bottomleft");
835 contentLeft = frame->leftWidth;
839 q->paint(&p, QRect(rightOffset, bottomOffset, frame->rightWidth, frame->bottomHeight),
prefix %
"bottomright");
844 if (frame->stretchBorders) {
846 if (q->hasElement(
prefix %
"left") &&
849 q->paint(&p, QRect(leftOffset, contentTop, frame->leftWidth, contentHeight),
prefix %
"left");
852 if (q->hasElement(
prefix %
"right") &&
855 q->paint(&p, QRect(rightOffset, contentTop, frame->rightWidth, contentHeight),
prefix %
"right");
862 q->paint(&p, QRect(contentLeft, topOffset, contentWidth, frame->topHeight),
prefix %
"top");
867 q->paint(&p, QRect(contentLeft, bottomOffset, contentWidth, frame->bottomHeight),
prefix %
"bottom");
872 && leftHeight > 0 && frame->leftWidth > 0) {
873 QPixmap left(frame->leftWidth, leftHeight);
874 left.fill(Qt::transparent);
876 QPainter sidePainter(&left);
877 sidePainter.setCompositionMode(QPainter::CompositionMode_Source);
878 q->paint(&sidePainter, QRect(QPoint(0, 0), left.size()),
prefix %
"left");
880 p.drawTiledPixmap(QRect(leftOffset, contentTop, frame->leftWidth, contentHeight), left);
884 leftHeight > 0 && frame->rightWidth > 0) {
885 QPixmap right(frame->rightWidth, leftHeight);
886 right.fill(Qt::transparent);
888 QPainter sidePainter(&right);
889 sidePainter.setCompositionMode(QPainter::CompositionMode_Source);
890 q->paint(&sidePainter, QRect(QPoint(0, 0), right.size()),
prefix %
"right");
892 p.drawTiledPixmap(QRect(rightOffset, contentTop, frame->rightWidth, contentHeight), right);
896 && topWidth > 0 && frame->topHeight > 0) {
897 QPixmap top(topWidth, frame->topHeight);
898 top.fill(Qt::transparent);
900 QPainter sidePainter(&top);
901 sidePainter.setCompositionMode(QPainter::CompositionMode_Source);
902 q->paint(&sidePainter, QRect(QPoint(0, 0), top.size()),
prefix %
"top");
904 p.drawTiledPixmap(QRect(contentLeft, topOffset, contentWidth, frame->topHeight), top);
908 && topWidth > 0 && frame->bottomHeight > 0) {
909 QPixmap bottom(topWidth, frame->bottomHeight);
910 bottom.fill(Qt::transparent);
912 QPainter sidePainter(&bottom);
913 sidePainter.setCompositionMode(QPainter::CompositionMode_Source);
914 q->paint(&sidePainter, QRect(QPoint(0, 0), bottom.size()),
prefix %
"bottom");
916 p.drawTiledPixmap(QRect(contentLeft, bottomOffset, contentWidth, frame->bottomHeight), bottom);
922 QString FrameSvgPrivate::cacheId(FrameData *frame,
const QString &prefixToSave)
const 925 const QLatin1Char s(
'_');
926 return QString::number(frame->enabledBorders) % s % QString::number(size.width()) % s % QString::number(size.height()) % s % prefixToSave % s % q->imagePath();
929 void FrameSvgPrivate::cacheFrame(
const QString &prefixToSave,
const QPixmap &background,
const QPixmap &overlay)
931 if (!q->isUsingRenderingCache()) {
936 FrameData *frame = frames.value(prefixToSave);
942 const QString
id = cacheId(frame, prefixToSave);
948 if (!overlay.isNull()) {
954 void FrameSvgPrivate::updateSizes()
const 957 FrameData *frame = frames[
prefix];
962 frame->cachedBackground = QPixmap();
965 frame->topHeight = q->elementSize(
prefix %
"top").height();
967 if (q->hasElement(
prefix %
"hint-top-margin")) {
968 frame->topMargin = q->elementSize(
prefix %
"hint-top-margin").height();
970 frame->topMargin = frame->topHeight;
973 frame->topMargin = frame->topHeight = 0;
977 frame->leftWidth = q->elementSize(
prefix %
"left").width();
979 if (q->hasElement(
prefix %
"hint-left-margin")) {
980 frame->leftMargin = q->elementSize(
prefix %
"hint-left-margin").width();
982 frame->leftMargin = frame->leftWidth;
985 frame->leftMargin = frame->leftWidth = 0;
989 frame->rightWidth = q->elementSize(
prefix %
"right").width();
991 if (q->hasElement(
prefix %
"hint-right-margin")) {
992 frame->rightMargin = q->elementSize(
prefix %
"hint-right-margin").width();
994 frame->rightMargin = frame->rightWidth;
997 frame->rightMargin = frame->rightWidth = 0;
1001 frame->bottomHeight = q->elementSize(
prefix %
"bottom").height();
1003 if (q->hasElement(
prefix %
"hint-bottom-margin")) {
1004 frame->bottomMargin = q->elementSize(
prefix %
"hint-bottom-margin").height();
1006 frame->bottomMargin = frame->bottomHeight;
1009 frame->bottomMargin = frame->bottomHeight = 0;
1012 frame->composeOverBorder = (q->hasElement(
prefix %
"hint-compose-over-border") &&
1013 q->hasElement(
"mask-" %
prefix %
"center"));
1017 frame->tileCenter = (q->hasElement(
"hint-tile-center") || q->hasElement(
prefix %
"hint-tile-center"));
1018 frame->noBorderPadding = (q->hasElement(
"hint-no-border-padding") || q->hasElement(
prefix %
"hint-no-border-padding"));
1019 frame->stretchBorders = (q->hasElement(
"hint-stretch-borders") || q->hasElement(
prefix %
"hint-stretch-borders"));
1023 void FrameSvgPrivate::updateNeeded()
1029 void FrameSvgPrivate::updateAndSignalSizes()
1032 emit q->repaintNeeded();
1035 QSizeF FrameSvgPrivate::frameSize(FrameData *frame)
const 1037 if (!frame->frameSize.isValid()) {
1039 frame->frameSize = q->size();
1042 return frame->frameSize;
1047 references[svg] = references[svg] + 1;
1051 bool FrameData::deref(
FrameSvg *svg)
1053 references[svg] = references[svg] - 1;
1055 if (references[svg] < 1) {
1056 references.remove(svg);
1059 return references.isEmpty();
1062 bool FrameData::removeRefs(
FrameSvg *svg)
1064 references.remove(svg);
1065 return references.isEmpty();
1068 bool FrameData::isUsed()
const 1070 return !references.isEmpty();
1073 int FrameData::refcount()
const 1075 return references.count();
1080 #include "framesvg.moc" Q_INVOKABLE void paintFrame(QPainter *painter, const QRectF &target, const QRectF &source=QRectF())
Paints the loaded SVG with the elements that represents the border.
Q_INVOKABLE QRegion mask() const
Returns a mask that tightly contains the fully opaque areas of the svg.
Q_INVOKABLE void setCacheAllRenderedFrames(bool cache)
Sets whether saving all the rendered prefixes in a cache or not.
void repaintNeeded()
Emitted whenever the SVG data has changed in such a way that a repaint is required.
bool findInCache(const QString &key, QPixmap &pix)
Tries to load pixmap with the specified key from cache.
Q_INVOKABLE QRectF contentsRect() const
QSize size() const
The size of the SVG.
QString imagePath() const
The SVG file to render.
Provides an SVG with borders.
Namespace for everything in libplasma.
FrameSvg(QObject *parent=0)
Constructs a new FrameSvg that paints the proper named subelements as borders.
Q_INVOKABLE bool hasElement(const QString &elementId) const
Check whether an element exists in the loaded SVG.
Q_INVOKABLE void resizeFrame(const QSizeF &size)
Resize the frame maintaining the same border size.
QPixmap alphaMask() const
Location
The Location enumeration describes where on screen an element, such as an Applet or its managing cont...
Q_INVOKABLE bool hasElementPrefix(const QString &prefix) const
Q_INVOKABLE QString prefix()
Returns the prefix for SVG elements of the FrameSvg.
static const int MAX_FRAME_SIZE
Q_INVOKABLE void setImagePath(const QString &path)
Loads a new Svg.
Along the top of the screen.
void setContainsMultipleImages(bool multiple)
Set whether the SVG contains a single image or multiple ones.
Q_INVOKABLE void clearCache()
Deletes the internal cache freeing memory: use this if you want to switch the rendered element and yo...
Q_INVOKABLE bool cacheAllRenderedFrames() const
Along the bottom of the screen.
Theme * theme() const
The Plasma::Theme used by this Svg object.
Interface to the Plasma theme.
Q_INVOKABLE QPixmap framePixmap()
Returns a pixmap of the SVG represented by this object.
static Theme * defaultTheme()
Singleton pattern accessor.
EnabledBorders enabledBorders() const
Convenience method to get the enabled borders.
Q_INVOKABLE QSizeF frameSize() const
void insertIntoCache(const QString &key, const QPixmap &pix)
Insert specified pixmap into the cache.
Q_INVOKABLE void setElementPrefix(Plasma::Location location)
Sets the prefix (.
Q_INVOKABLE void getMargins(qreal &left, qreal &top, qreal &right, qreal &bottom) const
Convenience method that extracts the size of the four margins in the four output parameters.
Along the right side of the screen.
Q_INVOKABLE qreal marginSize(const Plasma::MarginEdge edge) const
Returns the margin size given the margin edge we want.
Along the left side of the screen.
A theme aware image-centric SVG class.
void setEnabledBorders(const EnabledBorders borders)
Sets what borders should be painted.