• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdegraphics API Reference
  • KDE Home
  • Contact Us
 

okular

  • sources
  • kde-4.12
  • kdegraphics
  • okular
  • core
area.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2004-05 by Enrico Ros <eros.kde@email.it> *
3  * Copyright (C) 2005 by Piotr Szymanski <niedakh@gmail.com> *
4  * This program is free software; you can redistribute it and/or modify *
5  * it under the terms of the GNU General Public License as published by *
6  * the Free Software Foundation; either version 2 of the License, or *
7  * (at your option) any later version. *
8  ***************************************************************************/
9 
10 #ifndef _OKULAR_AREA_H_
11 #define _OKULAR_AREA_H_
12 
13 #include <QtCore/QList>
14 #include <QtGui/QColor>
15 #include <QtGui/QPainterPath>
16 #include <QtGui/QTransform>
17 #include <kdebug.h>
18 #include <math.h>
19 
20 #include "global.h"
21 #include "okular_export.h"
22 
23 class QPolygonF;
24 class QRect;
25 
26 namespace Okular {
27 
28 class Annotation;
29 class Action;
30 class NormalizedShape;
31 
47 class OKULAR_EXPORT NormalizedPoint
48 {
49  public:
53  NormalizedPoint();
54 
58  NormalizedPoint( double x, double y );
59 
64  NormalizedPoint( int x, int y, int xScale, int yScale );
65 
69  NormalizedPoint& operator=( const NormalizedPoint& );
70 
74  void transform( const QTransform &matrix );
75 
80  double distanceSqr( double x, double y, double xScale, double yScale ) const;
81 
82 
87  static double distanceSqr( double x, double y, double xScale, double yScale, const NormalizedPoint& start, const NormalizedPoint& end );
88 
92  double x;
93 
97  double y;
98 };
99 
100 
105 class OKULAR_EXPORT NormalizedRect
106 {
107  public:
112  NormalizedRect();
113 
126  NormalizedRect( double left, double top, double right, double bottom );
127 
132  NormalizedRect( const QRect &rectangle, double xScale, double yScale );
133 
137  NormalizedRect( const NormalizedRect& );
138 
142  NormalizedRect& operator=( const NormalizedRect &other );
143 
147  static NormalizedRect fromQRectF( const QRectF &rect );
148 
152  bool isNull() const;
153 
158  bool contains( double x, double y ) const;
159 
164  bool intersects( const NormalizedRect &other ) const;
165 
170  bool intersects( const NormalizedRect *other ) const;
171 
176  bool intersects( double left, double top, double right, double bottom ) const;
177 
182  QRect geometry( int xScale, int yScale ) const;
183 
188  QRect roundedGeometry( int xScale, int yScale ) const;
189 
194  NormalizedRect operator|( const NormalizedRect &other ) const;
195 
200  NormalizedRect& operator|=( const NormalizedRect &other );
201 
208  NormalizedRect operator&( const NormalizedRect &other ) const;
209 
214  bool operator==( const NormalizedRect &other ) const;
215 
220  NormalizedPoint center() const;
221 
225  void transform( const QTransform &matrix );
226 
231  bool isBottom(const NormalizedPoint& pt) const
232  {
233  return bottom < pt.y;
234  }
235 
240  bool isTop(const NormalizedPoint& pt) const
241  {
242  return top > pt.y;
243  }
244 
249  bool isBottomOrLevel(const NormalizedPoint& pt) const
250  {
251  return top < pt.y;
252  }
253 
258  bool isTopOrLevel(const NormalizedPoint& pt) const
259  {
260  return bottom > pt.y;
261  }
262 
267  bool isLeft(const NormalizedPoint& pt) const
268  {
269  return left < pt.x;
270  }
271 
276  bool isRight(const NormalizedPoint& pt) const
277  {
278  return right > pt.x;
279  }
280 
286  double distanceSqr(double x, double y, double xScale, double yScale) const
287  {
288  double distX = 0;
289  if ( x < left )
290  distX = left - x;
291  else if ( x > right )
292  distX = x - right;
293 
294  double distY = 0;
295  if ( top > y )
296  distY = top - y;
297  else if (bottom < y)
298  distY = y - bottom;
299  return pow( distX * xScale, 2 ) + pow( distY * yScale, 2 );
300  }
301 
305  double left;
306 
310  double top;
311 
315  double right;
316 
320  double bottom;
321 };
322 KDE_DUMMY_QHASH_FUNCTION(NormalizedRect)
323 
324 
337 class OKULAR_EXPORT ObjectRect
338 {
339  public:
343  enum ObjectType
344  {
345  Action,
346  Image,
347  OAnnotation,
348  SourceRef
349  };
350 
362  ObjectRect( double left, double top, double right, double bottom, bool ellipse, ObjectType type, void *object );
363 
367  ObjectRect( const NormalizedRect &rect, bool ellipse, ObjectType type, void *object );
368 
372  ObjectRect( const QPolygonF &poly, ObjectType type, void *object );
373 
377  virtual ~ObjectRect();
378 
383  ObjectType objectType() const;
384 
388  const void *object() const;
389 
393  const QPainterPath &region() const;
394 
399  virtual QRect boundingRect( double xScale, double yScale ) const;
400 
405  virtual bool contains( double x, double y, double xScale, double yScale ) const;
406 
410  virtual void transform( const QTransform &matrix );
411 
418  // FIXME this should most probably be a virtual method
419  double distanceSqr( double x, double y, double xScale, double yScale ) const;
420 
421  protected:
422  ObjectType m_objectType;
423  void * m_object;
424  QPainterPath m_path;
425  QPainterPath m_transformedPath;
426 };
427 
431 class OKULAR_EXPORT AnnotationObjectRect : public ObjectRect
432 {
433  public:
438  AnnotationObjectRect( Annotation *annotation );
439 
443  virtual ~AnnotationObjectRect();
444 
448  Annotation *annotation() const;
449 
454  virtual QRect boundingRect( double xScale, double yScale ) const;
455 
460  virtual bool contains( double x, double y, double xScale, double yScale ) const;
461 
465  virtual void transform( const QTransform &matrix );
466 
467  private:
468  Annotation * m_annotation;
469 };
470 
474 class OKULAR_EXPORT SourceRefObjectRect : public ObjectRect
475 {
476  friend class ObjectRect;
477 
478  public:
485  SourceRefObjectRect( const NormalizedPoint& point, void *reference );
486 
491  virtual QRect boundingRect( double xScale, double yScale ) const;
492 
497  virtual bool contains( double x, double y, double xScale, double yScale ) const;
498 
499  private:
500  NormalizedPoint m_point;
501 };
502 
504 
505 template <typename T>
506 void doDelete( T& t )
507 {
508  (void)t;
509 }
510 
512 template <typename T>
513 T* givePtr( T& t )
514 {
515  return &t;
516 }
517 
519 template <typename T>
520 T& deref( T& t )
521 {
522  return t;
523 }
524 
526 template <typename T>
527 static void doDelete( T* t )
528 {
529  delete t;
530 }
531 
533 template <typename T>
534 static T* givePtr( T* t )
535 {
536  return t;
537 }
538 
540 template <typename T>
541 static T& deref( T* t )
542 {
543  return *t;
544 }
546 
557 template <class NormalizedShape, class Shape> class RegularArea : public QList<NormalizedShape>
558 {
559  public:
563  ~RegularArea();
564 
569  bool contains( double x, double y ) const;
570 
575  bool contains( const NormalizedShape& shape ) const;
576 
580  bool intersects( const RegularArea<NormalizedShape,Shape> *area ) const;
581 
585  bool intersects( const NormalizedShape& shape ) const;
586 
590  void appendArea( const RegularArea<NormalizedShape,Shape> *area );
591 
595  void appendShape( const NormalizedShape& shape, MergeSide side = MergeAll );
596 
600  void simplify();
601 
605  bool isNull() const;
606 
611  QList<Shape> geometry( int xScale, int yScale, int dx = 0, int dy = 0 ) const;
612 
616  void transform( const QTransform &matrix );
617 };
618 
619 template <class NormalizedShape, class Shape>
620 RegularArea<NormalizedShape, Shape>::~RegularArea()
621 {
622  int size = this->count();
623  for ( int i = 0; i < size; ++i )
624  doDelete( (*this)[i] );
625 }
626 
627 template <class NormalizedShape, class Shape>
628 void RegularArea<NormalizedShape, Shape>::simplify()
629 {
630 #ifdef DEBUG_REGULARAREA
631  int prev_end = this->count();
632 #endif
633  int end = this->count() - 1, x = 0;
634  for ( int i = 0; i < end; ++i )
635  {
636  if ( givePtr( (*this)[x] )->intersects( deref( (*this)[i+1] ) ) )
637  {
638  deref((*this)[x]) |= deref((*this)[i+1]);
639  NormalizedShape& tobedeleted = (*this)[i+1];
640  this->removeAt( i + 1 );
641  doDelete( tobedeleted );
642  --end;
643  --i;
644  }
645  else
646  {
647  x=i+1;
648  }
649  }
650 #ifdef DEBUG_REGULARAREA
651  kDebug() << "from" << prev_end << "to" << this->count();
652 #endif
653 }
654 
655 template <class NormalizedShape, class Shape>
656 bool RegularArea<NormalizedShape, Shape>::isNull() const
657 {
658  if ( !this )
659  return false;
660 
661  if ( this->isEmpty() )
662  return false;
663 
664  typename QList<NormalizedShape>::const_iterator it = this->begin(), itEnd = this->end();
665  for ( ; it != itEnd; ++it )
666  if ( !givePtr( *it )->isNull() )
667  return false;
668 
669  return true;
670 }
671 
672 template <class NormalizedShape, class Shape>
673 bool RegularArea<NormalizedShape, Shape>::intersects( const NormalizedShape& rect ) const
674 {
675  if ( !this )
676  return false;
677 
678  if ( this->isEmpty() )
679  return false;
680 
681  typename QList<NormalizedShape>::const_iterator it = this->begin(), itEnd = this->end();
682  for ( ; it != itEnd; ++it )
683  if ( !givePtr( *it )->isNull() && givePtr( *it )->intersects( rect ) )
684  return true;
685 
686  return false;
687 }
688 
689 template <class NormalizedShape, class Shape>
690 bool RegularArea<NormalizedShape, Shape>::intersects( const RegularArea<NormalizedShape,Shape> *area ) const
691 {
692  if ( !this )
693  return false;
694 
695  if ( this->isEmpty() )
696  return false;
697 
698  typename QList<NormalizedShape>::const_iterator it = this->begin(), itEnd = this->end();
699  for ( ; it != itEnd; ++it )
700  {
701  typename QList<NormalizedShape>::const_iterator areaIt = area->begin(), areaItEnd = area->end();
702  for ( ; areaIt != areaItEnd; ++areaIt )
703  {
704  if ( !( *it ).isNull() && ( *it ).intersects( *areaIt ) )
705  return true;
706  }
707  }
708 
709  return false;
710 }
711 
712 template <class NormalizedShape, class Shape>
713 void RegularArea<NormalizedShape, Shape>::appendArea( const RegularArea<NormalizedShape, Shape> *area )
714 {
715  if ( !this )
716  return;
717 
718  typename QList<NormalizedShape>::const_iterator areaIt = area->begin(), areaItEnd = area->end();
719  for ( ; areaIt != areaItEnd; ++areaIt )
720  this->append( *areaIt );
721 }
722 
723 
724 template <class NormalizedShape, class Shape>
725 void RegularArea<NormalizedShape, Shape>::appendShape( const NormalizedShape& shape, MergeSide side )
726 {
727  if ( !this )
728  return;
729 
730  int size = this->count();
731  // if the list is empty, adds the shape normally
732  if ( size == 0 )
733  {
734  this->append( shape );
735  }
736  else
737  {
738  bool intersection = false;
739  NormalizedShape& last = (*this)[size - 1];
740 #define O_LAST givePtr( last )
741 # define O_LAST_R O_LAST->right
742 # define O_LAST_L O_LAST->left
743 # define O_LAST_T O_LAST->top
744 # define O_LAST_B O_LAST->bottom
745 #define O_NEW givePtr( shape )
746 # define O_NEW_R O_NEW->right
747 # define O_NEW_L O_NEW->left
748 # define O_NEW_T O_NEW->top
749 # define O_NEW_B O_NEW->bottom
750  switch ( side )
751  {
752  case MergeRight:
753  intersection = ( O_LAST_R >= O_NEW_L ) && ( O_LAST_L <= O_NEW_R )
754  && ( ( O_LAST_T <= O_NEW_T && O_LAST_B >= O_NEW_B )
755  || ( O_LAST_T >= O_NEW_T && O_LAST_B <= O_NEW_B ) );
756  break;
757  case MergeBottom:
758  intersection = ( O_LAST_B >= O_NEW_T ) && ( O_LAST_T <= O_NEW_B )
759  && ( ( O_LAST_R <= O_NEW_R && O_LAST_L >= O_NEW_L )
760  || ( O_LAST_R >= O_NEW_R && O_LAST_L <= O_NEW_L ) );
761  break;
762  case MergeLeft:
763  intersection = ( O_LAST_L <= O_NEW_R ) && ( O_LAST_R >= O_NEW_L )
764  && ( ( O_LAST_T <= O_NEW_T && O_LAST_B >= O_NEW_B )
765  || ( O_LAST_T >= O_NEW_T && O_LAST_B <= O_NEW_B ) );
766  break;
767  case MergeTop:
768  intersection = ( O_LAST_T <= O_NEW_B ) && ( O_LAST_B >= O_NEW_T )
769  && ( ( O_LAST_R <= O_NEW_R && O_LAST_L >= O_NEW_L )
770  || ( O_LAST_R >= O_NEW_R && O_LAST_L <= O_NEW_L ) );
771  break;
772  case MergeAll:
773  intersection = O_LAST->intersects( shape );
774  break;
775  }
776 #undef O_LAST
777 # undef O_LAST_R
778 # undef O_LAST_L
779 # undef O_LAST_T
780 # undef O_LAST_B
781 #undef O_NEW
782 # undef O_NEW_R
783 # undef O_NEW_L
784 # undef O_NEW_T
785 # undef O_NEW_B
786  // if the new shape intersects with the last shape in the list, then
787  // merge it with that and delete the shape
788  if ( intersection )
789  {
790  deref((*this)[size - 1]) |= deref( shape );
791  doDelete( const_cast<NormalizedShape&>( shape ) );
792  }
793  else
794  this->append( shape );
795  }
796 }
797 
798 
799 template <class NormalizedShape, class Shape>
800 bool RegularArea<NormalizedShape, Shape>::contains( double x, double y ) const
801 {
802  if ( !this )
803  return false;
804 
805  if ( this->isEmpty() )
806  return false;
807 
808  typename QList<NormalizedShape>::const_iterator it = this->begin(), itEnd = this->end();
809  for ( ; it != itEnd; ++it )
810  if ( ( *it ).contains( x, y ) )
811  return true;
812 
813  return false;
814 }
815 
816 template <class NormalizedShape, class Shape>
817 bool RegularArea<NormalizedShape, Shape>::contains( const NormalizedShape& shape ) const
818 {
819  if ( !this )
820  return false;
821 
822  if ( this->isEmpty() )
823  return false;
824 
825  return QList<NormalizedShape>::contains( shape );
826 }
827 
828 template <class NormalizedShape, class Shape>
829 QList<Shape> RegularArea<NormalizedShape, Shape>::geometry( int xScale, int yScale, int dx, int dy ) const
830 {
831  if ( !this || this->isEmpty() )
832  return QList<Shape>();
833 
834  QList<Shape> ret;
835  Shape t;
836  typename QList<NormalizedShape>::const_iterator it = this->begin(), itEnd = this->end();
837  for ( ; it != itEnd; ++it )
838  {
839  t = givePtr( *it )->geometry( xScale, yScale );
840  t.translate( dx, dy );
841  ret.append( t );
842  }
843 
844  return ret;
845 }
846 
847 template <class NormalizedShape, class Shape>
848 void RegularArea<NormalizedShape, Shape>::transform( const QTransform &matrix )
849 {
850  if ( !this )
851  return;
852 
853  if ( this->isEmpty() )
854  return;
855 
856  for ( int i = 0; i < this->count(); ++i )
857  givePtr( (*this)[i] )->transform( matrix );
858 }
859 
860 class OKULAR_EXPORT RegularAreaRect : public RegularArea< NormalizedRect, QRect >
861 {
862  public:
863  RegularAreaRect();
864  RegularAreaRect( const RegularAreaRect& rar );
865  ~RegularAreaRect();
866 
867  RegularAreaRect& operator=( const RegularAreaRect& rar );
868 
869  private:
870  class Private;
871  Private * const d;
872 };
873 
878 class HighlightAreaRect : public RegularAreaRect
879 {
880  public:
885  HighlightAreaRect( const RegularAreaRect *area = 0 );
886 
890  int s_id;
891 
895  QColor color;
896 };
897 
898 }
899 
900 #ifndef QT_NO_DEBUG_STREAM
901 
904 OKULAR_EXPORT QDebug operator<<( QDebug str, const Okular::NormalizedPoint &point );
905 
909 OKULAR_EXPORT QDebug operator<<( QDebug str, const Okular::NormalizedRect &rect );
910 #endif
911 
912 #endif
Okular::NormalizedPoint
NormalizedPoint is a helper class which stores the coordinates of a normalized point.
Definition: area.h:47
Okular::ObjectRect::OAnnotation
An annotation.
Definition: area.h:347
Okular::MergeBottom
Merge only if the bottom side of the first area intersect.
Definition: global.h:67
Okular::MergeLeft
Merge only if the left side of the first area intersect.
Definition: global.h:68
Okular::RegularArea::appendArea
void appendArea(const RegularArea< NormalizedShape, Shape > *area)
Appends the given area to the regular area.
Definition: area.h:713
Okular::RegularArea::geometry
QList< Shape > geometry(int xScale, int yScale, int dx=0, int dy=0) const
Returns the subareas of the regular areas as shapes for the given scaling factor xScale and yScale...
Definition: area.h:829
Okular::NormalizedRect::isRight
bool isRight(const NormalizedPoint &pt) const
Returns true if the point pt is located to the left of the right arm of rectangle.
Definition: area.h:276
Okular::MergeSide
MergeSide
The side(s) to be considered when merging areas.
Definition: global.h:64
Okular::SourceRefObjectRect
This class describes the object rectangle for a source reference.
Definition: area.h:474
Okular::RegularArea::contains
bool contains(double x, double y) const
Returns whether the regular area contains the normalized point x, y.
Definition: area.h:800
Okular::MergeTop
Merge only if the top side of the first area intersect.
Definition: global.h:69
Okular::NormalizedRect::left
double left
The normalized left coordinate.
Definition: area.h:305
Okular::NormalizedRect
NormalizedRect is a helper class which stores the coordinates of a normalized rect, which is a rectangle of.
Definition: area.h:105
Okular::RegularArea::appendShape
void appendShape(const NormalizedShape &shape, MergeSide side=MergeAll)
Appends the given shape to the regular area.
Definition: area.h:725
Okular::RegularAreaRect
Definition: area.h:860
O_NEW_L
#define O_NEW_L
O_LAST_T
#define O_LAST_T
Okular::MergeRight
Merge only if the right side of the first area intersect.
Definition: global.h:66
Okular::ObjectRect::Image
An image.
Definition: area.h:346
Okular::NormalizedPoint::y
double y
The normalized y coordinate.
Definition: area.h:97
Okular::RegularArea::intersects
bool intersects(const RegularArea< NormalizedShape, Shape > *area) const
Returns whether the regular area intersects with the given area.
Definition: area.h:690
global.h
okular_export.h
O_LAST
#define O_LAST
O_LAST_B
#define O_LAST_B
O_NEW_R
#define O_NEW_R
Okular::ObjectRect::m_path
QPainterPath m_path
Definition: area.h:424
Okular::AnnotationObjectRect
This class describes the object rectangle for an annotation.
Definition: area.h:431
Okular::NormalizedRect::right
double right
The normalized right coordinate.
Definition: area.h:315
Okular::RegularArea::isNull
bool isNull() const
Returns whether the regular area is a null area.
Definition: area.h:656
operator<<
OKULAR_EXPORT QDebug operator<<(QDebug str, const Okular::NormalizedPoint &point)
Debug operator for normalized point.
Definition: area.cpp:118
Okular::HighlightAreaRect::color
QColor color
The color of the highlight.
Definition: area.h:895
distanceSqr
static double distanceSqr(double x, double y, double xScale, double yScale, const QLinkedList< NormalizedPoint > &path)
Calculates distance of the given point x y xScale yScale to the path.
Definition: annotations.cpp:45
Okular::ObjectRect
NormalizedRect that contains a reference to an object.
Definition: area.h:337
Okular::HighlightAreaRect::s_id
int s_id
The search ID of the highlight owner.
Definition: area.h:890
Okular::NormalizedRect::isTopOrLevel
bool isTopOrLevel(const NormalizedPoint &pt) const
Returns true if the point pt is located above the bottom of the rectangle.
Definition: area.h:258
Okular::NormalizedRect::distanceSqr
double distanceSqr(double x, double y, double xScale, double yScale) const
Returns the distance of the point x y xScale yScale to the closest edge or 0 if the point is within t...
Definition: area.h:286
Okular::ObjectRect::m_objectType
ObjectType m_objectType
Definition: area.h:422
Okular::RegularArea
A regular area of NormalizedShape which normalizes a Shape.
Definition: area.h:557
Okular::ObjectRect::m_transformedPath
QPainterPath m_transformedPath
Definition: area.h:425
Okular::NormalizedRect::isBottom
bool isBottom(const NormalizedPoint &pt) const
Returns true if the point pt is located to the bottom of the rectangle.
Definition: area.h:231
Okular::MergeAll
Merge if the areas intersects, no matter which side(s).
Definition: global.h:70
Okular::ObjectRect::Action
An action.
Definition: area.h:345
O_LAST_L
#define O_LAST_L
Okular::RegularArea::transform
void transform(const QTransform &matrix)
Transforms the regular area with the operations defined by matrix.
Definition: area.h:848
Okular::NormalizedRect::isBottomOrLevel
bool isBottomOrLevel(const NormalizedPoint &pt) const
Returns true if the point pt is located under the top of the rectangle.
Definition: area.h:249
O_LAST_R
#define O_LAST_R
Okular::NormalizedRect::top
double top
The normalized top coordinate.
Definition: area.h:310
Okular::ObjectRect::ObjectType
ObjectType
Describes the type of storable object.
Definition: area.h:343
O_NEW_T
#define O_NEW_T
Okular::NormalizedPoint::x
double x
The normalized x coordinate.
Definition: area.h:92
Okular::NormalizedRect::isTop
bool isTop(const NormalizedPoint &pt) const
Returns true if the point pt is located on the top of the rectangle.
Definition: area.h:240
Okular::RegularArea::~RegularArea
~RegularArea()
Destroys a regular area.
Definition: area.h:620
Okular::Annotation
Annotation struct holds properties shared by all annotations.
Definition: annotations.h:90
Okular::RegularArea::simplify
void simplify()
Simplifies the regular area by merging its intersecting subareas.
Definition: area.h:628
Okular::HighlightAreaRect::HighlightAreaRect
HighlightAreaRect(const RegularAreaRect *area=0)
Creates a new highlight area rect with the coordinates of the given area.
Definition: area.cpp:297
O_NEW_B
#define O_NEW_B
OKULAR_EXPORT
#define OKULAR_EXPORT
Definition: okular_export.h:30
Okular::ObjectRect::m_object
void * m_object
Definition: area.h:423
Okular::NormalizedRect::bottom
double bottom
The normalized bottom coordinate.
Definition: area.h:320
Okular::NormalizedRect::isLeft
bool isLeft(const NormalizedPoint &pt) const
Returns true if the point pt is located to the right of the left arm of rectangle.
Definition: area.h:267
Okular::HighlightAreaRect
This class stores the coordinates of a highlighting area together with the id of the highlight owner ...
Definition: area.h:878
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:45:02 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

okular

Skip menu "okular"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdegraphics API Reference

Skip menu "kdegraphics API Reference"
  •     libkdcraw
  •     libkexiv2
  •     libkipi
  •     libksane
  • okular

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal